diff --git a/.gitignore b/.gitignore index 9f55abdaa41bb4e342a69e1ed6c4218e4cbf5fa2..fa83eeab1df6aa64a90c29a91222e6ca627859d2 100644 --- a/.gitignore +++ b/.gitignore @@ -10,12 +10,16 @@ Thumbs.db .directory .vscode DoxyGen/Function/doxy_build/* +doxyoutput build *.bak Doxygen.log # autogenerated by cmake -sim/doc/version.txt +sim/doc/source/version.txt + +# autogenerated by sphinx +sim/doc/source/api.rst # third party references deps/* diff --git a/CMakeLists.txt b/CMakeLists.txt index 98d3b5f847319b40322bf89a14d2a7c44dde4495..0255c9b5087e11847aef387a5d4960417597edf0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ ################################################################################ -# Copyright (c) 2020 in-tech GmbH +# Copyright (c) 2020, 2021 in-tech GmbH # # This program and the accompanying materials are made # available under the terms of the Eclipse Public License 2.0 @@ -31,9 +31,21 @@ set(CPACK_PACKAGE_VERSION_PATCH 0) set(CPACK_PACKAGE_CHECKSUM "SHA1") set(CPACK_STRIP_FILES TRUE) +if(SIMCORE_VERSION_MAJOR MATCHES "^[0-9]+$" AND + SIMCORE_VERSION_MINOR MATCHES "^[0-9]+$" AND + SIMCORE_VERSION_PATCH MATCHES "^[0-9]+$") + set(OPENPASS_VERSION "${SIMCORE_VERSION_MAJOR},${SIMCORE_VERSION_MINOR},${SIMCORE_VERSION_PATCH}") +elseif(DEFINED SIMCORE_VERSION_TAG) + set(OPENPASS_VERSION "\"${SIMCORE_VERSION_TAG}\"") +else() + set(OPENPASS_VERSION "9999,9999,9999") +endif() + +include_directories(.) + # descend to sources if(WITH_SIMCORE) - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/sim) + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/sim/src) endif() if(WITH_GUI) @@ -42,6 +54,17 @@ endif() if(WITH_TESTS) enable_testing() + add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/sim/tests) +endif() + +if(WITH_DOC OR WITH_API_DOC) + string(REPLACE "," "." OPENPASS_DOC_VERSION ${OPENPASS_VERSION}) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/sim/doc/source/version.txt.in + ${CMAKE_CURRENT_SOURCE_DIR}/sim/doc/source/version.txt + ) + + add_subdirectory(sim/doc) endif() # copies runtime dependencies to installation directory (on running 'make install') diff --git a/cmake/global.cmake b/cmake/global.cmake index 77c5b8a49537f69b8075cf22da30f1f123b3d5b9..ffdffbc8144372a2138f251f7f916082b0921805 100644 --- a/cmake/global.cmake +++ b/cmake/global.cmake @@ -69,39 +69,48 @@ set_property(GLOBAL PROPERTY AUTOGEN_TARGETS_FOLDER "generated") set_property(GLOBAL PROPERTY USE_FOLDERS ON) -find_package(Protobuf REQUIRED) -add_compile_definitions(PROTOBUF_USE_DLLS) - -find_package(OSI REQUIRED) - -if(MINGW AND WITH_MINGW_BOOST_1_72_FIX) - # Bug in boost-install 1.72.0 - # setting boost mingw version manually - # https://github.com/boostorg/boost_install/issues/33 - string(REGEX MATCHALL "[0-9]+" _CVER_COMPONENTS ${CMAKE_CXX_COMPILER_VERSION}) - list(GET _CVER_COMPONENTS 0 _CVER_MAJOR) - list(GET _CVER_COMPONENTS 1 _CVER_MINOR) - set(Boost_COMPILER "mgw${_CVER_MAJOR}${_CVER_MINOR}") -endif() -set(Boost_USE_STATIC_LIBS OFF) -find_package(Boost COMPONENTS filesystem REQUIRED) +if(WITH_SIMCORE OR WITH_TESTS) + + find_package(Protobuf REQUIRED) + add_compile_definitions(PROTOBUF_USE_DLLS) + + find_package(OSI REQUIRED) + + if(MINGW AND WITH_MINGW_BOOST_1_72_FIX) + # Bug in boost-install 1.72.0 + # setting boost mingw version manually + # https://github.com/boostorg/boost_install/issues/33 + string(REGEX MATCHALL "[0-9]+" _CVER_COMPONENTS ${CMAKE_CXX_COMPILER_VERSION}) + list(GET _CVER_COMPONENTS 0 _CVER_MAJOR) + list(GET _CVER_COMPONENTS 1 _CVER_MINOR) + set(Boost_COMPILER "mgw${_CVER_MAJOR}${_CVER_MINOR}") + endif() + set(Boost_USE_STATIC_LIBS OFF) + find_package(Boost COMPONENTS filesystem REQUIRED) + + find_package(Qt5 COMPONENTS Concurrent Core Widgets Xml) + find_package(FMILibrary) + + if(WITH_EXTENDED_OSI) + add_compile_definitions(USE_EXTENDED_OSI) + endif() -find_package(Qt5 COMPONENTS Concurrent Core Widgets Xml) -find_package(FMILibrary) + if(WITH_PROTOBUF_ARENA) + add_compile_definitions(USE_PROTOBUF_ARENA) + endif() +endif() if(WITH_TESTS) find_package(GTest) # as GMock currently doesn't provide a find_package config, gmock file location is derived from gtest in HelperMacros.cmake #find_package(GMock) + if(WITH_COVERAGE) + find_package(Gcov REQUIRED) + find_package(Fastcov REQUIRED) + find_package(Genhtml REQUIRED) + endif() endif() -if(WITH_EXTENDED_OSI) - add_compile_definitions(USE_EXTENDED_OSI) -endif() - -if(WITH_PROTOBUF_ARENA) - add_compile_definitions(USE_PROTOBUF_ARENA) -endif() if(WIN32) set(CMAKE_INSTALL_PREFIX "C:/OpenPASS" CACHE PATH "Destination directory") @@ -165,12 +174,6 @@ if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd4250") endif() -if(WITH_COVERAGE) - find_package(Gcov REQUIRED) - find_package(Fastcov REQUIRED) - find_package(Genhtml REQUIRED) -endif() - ############################################################################### # Documentation ############################################################################### diff --git a/sim/CMakeLists.txt b/sim/CMakeLists.txt index 5b0bd545990da43ef906167e32773c5b5232fb10..49707b6c119ae3295cafcfb8d86cec8c832b24b0 100644 --- a/sim/CMakeLists.txt +++ b/sim/CMakeLists.txt @@ -1,5 +1,5 @@ ################################################################################ -# Copyright (c) 2020 in-tech GmbH +# Copyright (c) 2020, 2021 in-tech GmbH # # This program and the accompanying materials are made # available under the terms of the Eclipse Public License 2.0 @@ -8,6 +8,21 @@ # SPDX-License-Identifier: EPL-2.0 ################################################################################ +if(SIMCORE_VERSION_MAJOR MATCHES "^[0-9]+$" AND + SIMCORE_VERSION_MINOR MATCHES "^[0-9]+$" AND + SIMCORE_VERSION_PATCH MATCHES "^[0-9]+$") + set(OPENPASS_VERSION "${SIMCORE_VERSION_MAJOR},${SIMCORE_VERSION_MINOR},${SIMCORE_VERSION_PATCH}") +elseif(DEFINED SIMCORE_VERSION_TAG) + set(OPENPASS_VERSION "\"${SIMCORE_VERSION_TAG}\"") +else() + set(OPENPASS_VERSION "9999,9999,9999") +endif() + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h.in + ${CMAKE_CURRENT_SOURCE_DIR}/src/common/version.h +) + include_directories( ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/.. @@ -21,3 +36,13 @@ if(WITH_TESTS) enable_testing() add_subdirectory(tests) endif() + +if(WITH_DOC) + string(REPLACE "," "." OPENPASS_DOC_VERSION ${OPENPASS_VERSION}) + configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/doc/source/version.txt.in + ${CMAKE_CURRENT_SOURCE_DIR}/doc/source/version.txt + ) + + add_subdirectory(doc) +endif() diff --git a/sim/contrib/examples/DefaultConfigurations/slaveConfig.xml b/sim/contrib/examples/DefaultConfigurations/slaveConfig.xml index 6857b4edd1c150476c3b3e55f330338694db8606..26573cd1884dc85a29657fa0b0f0e19498955326 100644 --- a/sim/contrib/examples/DefaultConfigurations/slaveConfig.xml +++ b/sim/contrib/examples/DefaultConfigurations/slaveConfig.xml @@ -46,6 +46,14 @@ <Observation> <Library>Observation_EntityRepository</Library> <Parameters> + <!-- If "FilenamePrefix" is skipped, defaults to Value="Repository" --> + <String Key="FilenamePrefix" Value="Repository"/> + <!-- If "WritePersistentEntities" is skipped, defaults to Value="Consolidated" + Options: + - Consolidated: Concatenate with {FilenamePrefix}_Run_###.csv for each run + - Separate: Write to {FilenamePrefix}_Persistent.csv + - Skip: No output for persistent entities + --> <String Key="WritePersistentEntities" Value="Consolidated"/> </Parameters> </Observation> @@ -69,4 +77,4 @@ <Profile>DefaultRuntimeCommon</Profile> </Spawner> </Spawners> -</slaveConfig> +</slaveConfig> \ No newline at end of file diff --git a/sim/doc/CMakeLists.txt b/sim/doc/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..fbd6c74f9bcd03b7e6684d6497a34895db6bf094 --- /dev/null +++ b/sim/doc/CMakeLists.txt @@ -0,0 +1,38 @@ +################################################################################ +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +################################################################################ + +if(WITH_DOC) + if(TARGET doc) + message(STATUS "Target doc already defined. Skipping.") + else() + add_custom_target(doc + COMMAND ${CMAKE_COMMAND} + -DSRC=${CMAKE_CURRENT_LIST_DIR}/source + -DDST=${CMAKE_BINARY_DIR}/doc + -P ${CMAKE_CURRENT_SOURCE_DIR}/PrepareDoc.cmake + COMMENT "Copy OS documentation and replace placeholders" + COMMAND ${SPHINX_EXECUTABLE} # sphinx-build + -M html # generate HTML + ${CMAKE_BINARY_DIR}/doc/source # source path + ${CMAKE_BINARY_DIR}/doc # destination path + -DWITH_API_DOC=${WITH_API_DOC} # turn exhale ON/OFF + COMMENT "Build Sphinx documentation" + COMMAND ${CMAKE_COMMAND} + -E cmake_echo_color --green + "The HTML pages are in ${CMAKE_BINARY_DIR}/doc/html.") + + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + ${CMAKE_BINARY_DIR}/doc) + + # make HTML doc available on install + install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/html/ + DESTINATION ${CMAKE_INSTALL_PREFIX}/doc) + endif() +endif() diff --git a/sim/doc/OSI World Setup Guide.pdf b/sim/doc/OSI World Setup Guide.pdf deleted file mode 100644 index 5d0fcf3b9143016e5b206566571c858c184da6fd..0000000000000000000000000000000000000000 Binary files a/sim/doc/OSI World Setup Guide.pdf and /dev/null differ diff --git a/sim/doc/PrepareDoc.cmake b/sim/doc/PrepareDoc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..dc82652075f4864c3c509223b467c91c490f4340 --- /dev/null +++ b/sim/doc/PrepareDoc.cmake @@ -0,0 +1,55 @@ +################################################################################ +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +################################################################################ + +# The rst files of the sphinx documentation contain PLACEHOLDERS for referencing +# files outside the source folder of the documentation. This makes references +# into the repository "as a whole" easier, but also introduces a step for +# resolving these references before building. To prevent changes in the original +# documentation source, the this file copies the original source folder ${SRC} +# into a new ${DST} folder. After that, the PLACEHOLDERS are updated w.r.t +# to the the new origin. +# +# Currently supported PLACEHOLDERS +# - @OP_REL_SIM@ => relative path to the "op sim" root (e.g. deps/os/sim if +# using a git submodule with the openPASS open source code at deps/os inside +# the local repository) + +macro(copy_documentation source destination) + message(VERBOSE "Copy ${source} to ${destination}") + file(COPY ${source} DESTINATION ${destination}) +endmacro() + +macro(update_placeholder source destination) + message(VERBOSE "Updating ${source} to ${destination}") + file(RELATIVE_PATH target ${destination} ${source}/../..) + + # Remove potential trailing "/" + string(REGEX REPLACE "(.*)/$" "\\1" target ${target}) + + # Placeholder for conf.py: no initial '/' => real relative paths + set(OP_REL_SIM ../${target}) # relative path to the openPASS open source code + + configure_file(${destination}/source/conf.py + ${destination}/source/conf.py @ONLY) + + # Placeholder for RST files: use initial '/' => sphinx style for "from source" + # Override old one, because we want to use the same placeholder in both contexts + set(OP_REL_SIM /${OP_REL_SIM}) + + file(GLOB_RECURSE rstFiles LIST_DIRECTORIES false ${destination}/*.rst) + + foreach(rstFile IN LISTS rstFiles) + message(DEBUG "Replacing placeholders in ${rstFile}") + configure_file(${rstFile} ${rstFile} @ONLY) + endforeach() +endmacro() + +copy_documentation(${SRC} ${DST}) +update_placeholder(${SRC} ${DST}) diff --git a/sim/doc/source/_static/css/custom.css b/sim/doc/source/_static/css/custom.css new file mode 100644 index 0000000000000000000000000000000000000000..5fccaa2c2157dec55f536171770415f4793282c1 --- /dev/null +++ b/sim/doc/source/_static/css/custom.css @@ -0,0 +1,4 @@ +/* see https://knowyourtoolset.com/2018/02/controlling-the-width-of-a-table-with-read-the-docs/ */ +.tight-table td { + white-space: normal !important; +} diff --git a/sim/doc/source/_static/openPASS.ico b/sim/doc/source/_static/openPASS.ico new file mode 100644 index 0000000000000000000000000000000000000000..95b96573de86a50a12602db7cc25d1ddd673cf93 Binary files /dev/null and b/sim/doc/source/_static/openPASS.ico differ diff --git a/sim/doc/source/_static/openPASS.png b/sim/doc/source/_static/openPASS.png new file mode 100644 index 0000000000000000000000000000000000000000..8ee7f8747cdd3d2c5725f3972f65543d445acd7f Binary files /dev/null and b/sim/doc/source/_static/openPASS.png differ diff --git a/sim/doc/source/_static/resources/fmil/fmil203.patch b/sim/doc/source/_static/resources/fmil/fmil203.patch new file mode 100644 index 0000000000000000000000000000000000000000..21fd3a25c08d6b36c42a8064eba5c81d9758566a --- /dev/null +++ b/sim/doc/source/_static/resources/fmil/fmil203.patch @@ -0,0 +1,68 @@ +diff --git a/src/Import/src/FMI1/fmi1_import_capi.c b/src/Import/src/FMI1/fmi1_import_capi.c +index 842c998..807cdae 100644 +--- a/src/Import/src/FMI1/fmi1_import_capi.c ++++ b/src/Import/src/FMI1/fmi1_import_capi.c +@@ -67,18 +67,8 @@ jm_status_enu_t fmi1_import_create_dllfmu(fmi1_import_t* fmu, fmi1_callback_func +return jm_status_error; +} +- if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) { +- jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath); +- if(ENOENT == errno) +- jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform."); +- else +- jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno)); +- } +- else { +- /* Allocate memory for the C-API struct */ +- fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, +callBackFunctions, standard); +- } +- ++ /* Allocate memory for the C-API struct */ ++ fmu -> capi = fmi1_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, +standard); +/* Load the DLL handle */ +if (fmu -> capi) { +diff --git a/src/Import/src/FMI2/fmi2_import_capi.c b/src/Import/src/FMI2/fmi2_import_capi.c +index e794775..a2a68ba 100644 +--- a/src/Import/src/FMI2/fmi2_import_capi.c ++++ b/src/Import/src/FMI2/fmi2_import_capi.c +@@ -88,18 +88,8 @@ jm_status_enu_t fmi2_import_create_dllfmu(fmi2_import_t* fmu, fmi2_fmu_kind_enu_ +callBackFunctions = &defaultCallbacks; +} +- if(jm_portability_set_current_working_directory(dllDirPath) != jm_status_success) { +- jm_log_fatal(fmu->callbacks, module, "Could not change to the DLL directory %s", dllDirPath); +- if(ENOENT == errno) +- jm_log_fatal(fmu->callbacks, module, "The FMU contains no binary for this platform."); +- else +- jm_log_fatal(fmu->callbacks, module, "System error: %s", strerror(errno)); +- } +- else { +- /* Allocate memory for the C-API struct */ +- fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, +callBackFunctions, fmuKind); +- } +- ++ /* Allocate memory for the C-API struct */ ++ fmu -> capi = fmi2_capi_create_dllfmu(fmu->callbacks, dllFileName, modelIdentifier, callBackFunctions, +fmuKind); +/* Load the DLL handle */ +if (fmu -> capi) { +diff --git a/src/Util/include/JM/jm_portability.h b/src/Util/include/JM/jm_portability.h +index 82e472a..3e50603 100644 +--- a/src/Util/include/JM/jm_portability.h ++++ b/src/Util/include/JM/jm_portability.h +@@ -65,6 +65,7 @@ jm_status_enu_t jm_portability_get_current_working_directory(char* buffer, size_ +jm_status_enu_t jm_portability_set_current_working_directory(const char* cwd); +/** \brief Get system-wide temporary directory */ ++FMILIB_EXPORT + +const char* jm_get_system_temp_dir(); +/** +@@ -118,6 +119,7 @@ jm_status_enu_t jm_mkdir(jm_callbacks* cb, const char* dir); +/** +\brief Remove directory and all it contents. +*/ ++FMILIB_EXPORT +jm_status_enu_t jm_rmdir(jm_callbacks* cb, const char* dir); +/** \ No newline at end of file diff --git a/sim/doc/source/advanced_topics/10_documentation.rst b/sim/doc/source/advanced_topics/10_documentation.rst new file mode 100644 index 0000000000000000000000000000000000000000..0c883f644d58f8143db886e71d0653b4b60cd2ff --- /dev/null +++ b/sim/doc/source/advanced_topics/10_documentation.rst @@ -0,0 +1,92 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _documentation: + +Documentation Concept +===================== + +|Op_oss| is developed under the Eclipse Public License and as such private and commercial use is allowed under certain rules (see `EPL 2.0 <https://www.eclipse.org/legal/epl-2.0/>`_). +The basic documentation concept facilitates this by providing a way to include custom content which is not necessarily part of the |op_oss| distribution. +This results in certain restrictions on how documentation is to be written. +The following sections describe this restrictions and the process of integrating proprietary documentation into the |op_oss| documentation build. + +Basic Build Mechanics +--------------------- + +The required steps to build the documentation are described in :ref:`sphinx`, provided by CMake files. +Before building, a temporary copy of the original documentation is made. +This temporary copy acts as *seam* for custom extension, as proprietary content is simply copied into the temporary folder (see below). +This mechanism keeps contents clearly separated during development and allows easy transition from closed to open source if desired. + +References to files located outside of the documentation root is used at various places, as this allows to keep documentation as close to the source as possible. +These references normally would become invalid when the documentation source is copied or moved to another location. +Thus, a placeholder is used to have a fixed reference to the |op_oss| tree: *@*\ *OP_REL_SIM*\ *@*. +This placeholder must be used when referencing files outside of the documentation root. +Note that this also makes sources more readable. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/doc/source/user_guide/sim_user_guide/input/scenery.rst + :start-at: OP_REL_SIM + :lines: 1 + +.. warning:: + + Generally, when moving or deleting files, make sure to run ``make clean`` prior to ``make doc`` to remove any outdated files from the build directory. + +Adding Custom Content +--------------------- + +#. **Write the documentation** + + As custom documentation simply integrates into the |op_oss| documentation, it is also written in the *reStructuredText* file format. + Thereby files have to reside in a directory structure that is a clone of the open source documentation directory structure (starting from ``sim/doc/source``). + During the build your documentation and the open source documentation will both be copied to a temporary directory. + + .. note:: Files existing in both source directories will be overwritten at the destination, with the custom files having higher precedence. + + On the TOC tree level, the **seam** to custom files is made through *globbing* using wildcards, such as ``folder/*.rst``. + Ordering of the files (and to avoid file name collisions) is established through a two digit number prefix and an underscore, e.g. ``10_quickstart.rst``. + This allows injection of proprietary documentation at any position in the TOC tree, as the order of headings is determined by the (ASCII) sorting of the filenames. + +#. **Referencing files** + + Sphinx uses some special path format when referencing files from documentation. + All paths are relative to a single documentation root directory, but are specified like absolute paths (i.e. with a leading slash). + Due to the documentation source files being copied to a temporary directory during build, all file references have to be prefixed with a well-known path constant: + + - When specifying a file reference to the |op_oss| repository, the file path has to be prefixed with *@*\ *OP_REL_SIM*\ *@*. + - When referencing files relative to a custom root, an additional placeholder can be introduced in a custom ``PrepareDocCustom.cmake`` (see next steps). + - These placeholders will then coexist and will be replaced by the correct paths during build. + +#. **Add a cmake file for documentation preparation** + + The file :download:`PrepareDocCustom.cmake<_static/custom_doc/PrepareDocCustom.cmake>` can be used as a template. + Just add the placeholders used in your proprietary documentation. + + This diff highlights the important parts in comparison to the original ``PrepareDoc.cmake``, used in the open source documentation build: + + .. literalinclude:: @OP_REL_SIM@/doc/source/advanced_topics/_static/custom_doc/PrepareDocCustom.cmake + :diff: @OP_REL_SIM@/doc/PrepareDoc.cmake + +#. **Add a ``doc`` CMake target to your custom build** + + To add your custom build target, the following ``CMakeLists.txt`` snippet can be used as template. + Note the usage of the ``PrepareDocCustom.cmake``. + + .. literalinclude:: @OP_REL_SIM@/doc/source/advanced_topics/_static/custom_doc/CMakeLists_doc.cmake + :emphasize-lines: 23 + +#. **Provide a config file for Sphinx** + + Sphinx allows to specify a configuration residing in ``conf.py`` in the documentation source directory. + Customization is done by providing a customized file here, with the open source version as template (:download:`conf.py<@OP_REL_SIM@/doc/source/conf.py>`). diff --git a/sim/doc/source/advanced_topics/20_simulator_advanced.rst b/sim/doc/source/advanced_topics/20_simulator_advanced.rst new file mode 100644 index 0000000000000000000000000000000000000000..0749669f4fb7b1e3ac9aea20f4e4c98af089e71f --- /dev/null +++ b/sim/doc/source/advanced_topics/20_simulator_advanced.rst @@ -0,0 +1,22 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _simulator_advanced: + +Simulator +========= + + +.. toctree:: + :glob: + :maxdepth: 3 + + simulator/* diff --git a/sim/doc/source/advanced_topics/_static/custom_doc/CMakeLists_doc.cmake b/sim/doc/source/advanced_topics/_static/custom_doc/CMakeLists_doc.cmake new file mode 100644 index 0000000000000000000000000000000000000000..54b44867b165507e297202d6be4bff0f85bcef34 --- /dev/null +++ b/sim/doc/source/advanced_topics/_static/custom_doc/CMakeLists_doc.cmake @@ -0,0 +1,41 @@ +################################################################################ +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +################################################################################ + +if(WITH_DOC) + add_custom_target(doc + # Copy documentation and change placeholders + # (see PrepareDoc for more information) + COMMAND ${CMAKE_COMMAND} + -DSRC=${OPENPASS_OS_DIR}/sim/doc/source + -DDST=${CMAKE_BINARY_DIR}/doc + -P ${OPENPASS_OS_DIR}/sim/doc/PrepareDoc.cmake + COMMENT "Copy OS documentation and replace placeholders" + COMMAND ${CMAKE_COMMAND} + -DSRC=${CMAKE_CURRENT_LIST_DIR}/source + -DDST=${CMAKE_BINARY_DIR}/doc + -P ${CMAKE_CURRENT_LIST_DIR}/PrepareDocCustom.cmake + COMMENT "Copy custom documentation and replace placeholders (overrides!)" + COMMAND ${SPHINX_EXECUTABLE} # sphinx-build + -M html # generate HTML + ${CMAKE_BINARY_DIR}/doc/source # source path + ${CMAKE_BINARY_DIR}/doc # destination path + -DWITH_API_DOC=${WITH_API_DOC} # turn exhale ON/OFF + COMMENT "Build sphinx documentation" + COMMAND ${CMAKE_COMMAND} + -E cmake_echo_color --green + "The HTML pages are in ${CMAKE_BINARY_DIR}/doc/html.") + + set_property(DIRECTORY APPEND PROPERTY ADDITIONAL_MAKE_CLEAN_FILES + ${CMAKE_BINARY_DIR}/doc) + + # make HTML doc available on install + install(DIRECTORY ${CMAKE_BINARY_DIR}/doc/html/ + DESTINATION ${CMAKE_INSTALL_PREFIX}/doc) +endif() diff --git a/sim/doc/source/advanced_topics/_static/custom_doc/PrepareDocCustom.cmake b/sim/doc/source/advanced_topics/_static/custom_doc/PrepareDocCustom.cmake new file mode 100644 index 0000000000000000000000000000000000000000..a1de749c7d60f032f911eacce8657c8b7bc1c9ed --- /dev/null +++ b/sim/doc/source/advanced_topics/_static/custom_doc/PrepareDocCustom.cmake @@ -0,0 +1,58 @@ +################################################################################ +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +################################################################################ + +# The rst files of the sphinx documentation contain PLACEHOLDERS for referencing +# files outside the source folder of the documentation. This makes references +# into the repository "as a whole" easier, but also introduces a step for +# resolving these references before building. To prevent changes in the original +# documentation source, the this file copies the original source folder ${SRC} +# into a new ${DST} folder. After that, the PLACEHOLDERS are updated w.r.t +# to the the new origin. +# +# Currently supported PLACEHOLDERS +# - @OP_REL_SIM@ => relative path to the "op sim" root (e.g. deps/os/sim if +# using a git submodule with the openPASS open source code at deps/os inside +# the local repository) +# - @CUSTOM_REL_SIM@ => relative path to the "custom sim" root (.) + +macro(copy_documentation source destination) + message(VERBOSE "Copy ${source} to ${destination}") + file(COPY ${source} DESTINATION ${destination}) +endmacro() + +macro(update_placeholder source destination) + message(VERBOSE "Updating ${source} to ${destination}") + file(RELATIVE_PATH target ${destination} ${source}/../..) + + # Remove potential trailing "/" + string(REGEX REPLACE "(.*)/$" "\\1" target ${target}) + + # Placeholder for conf.py: no initial '/' => real relative paths + set(OP_REL_SIM ../${target}/deps/os/sim) # relative path to the openPASS open source code, with prefix '../${target}' pointing to the custom repository root if this file is located at <root>/doc + set(CUSTOM_REL_SIM ../${target}) # relative path to the custom repository root (equal to custom sim root in this example) + + configure_file(${destination}/source/conf.py + ${destination}/source/conf.py @ONLY) + + # Placeholder for RST files: use initial '/' => sphinx style for "from source" + # Override old one, because we want to use the same placeholder in both contexts + set(OP_REL_SIM /${OP_REL_SIM}) + set(CUSTOM_REL_SIM /${CUSTOM_REL_SIM}) + + file(GLOB_RECURSE rstFiles LIST_DIRECTORIES false ${destination}/*.rst) + + foreach(rstFile IN LISTS rstFiles) + message(DEBUG "Replacing placeholders in ${rstFile}") + configure_file(${rstFile} ${rstFile} @ONLY) + endforeach() +endmacro() + +copy_documentation(${SRC} ${DST}) +update_placeholder(${SRC} ${DST}) diff --git a/sim/doc/source/advanced_topics/simulator/agent_components.rst b/sim/doc/source/advanced_topics/simulator/agent_components.rst new file mode 100644 index 0000000000000000000000000000000000000000..6e401bfc5840cec4357bf3762ba3ce312c95dca8 --- /dev/null +++ b/sim/doc/source/advanced_topics/simulator/agent_components.rst @@ -0,0 +1,306 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _agentcomponents: + +Agent Components +================ + +An agent in openPASS is composed of multiple modules, which are connected by corresponding signals. +As shown in the next figure, the modules can be roughly divided into the groups drivers, vehicle components, algorithms, dynamic modules, and prioritizers. +Thereby, modules can consist of several submodules, such as sensor (reading from an interface) and action (writing to an interface). + +.. figure:: ./images/DynamicsModules.png + + Modules for longitudinal and lateral dynamics + +By statistic means, based on corresponding probabilities defined in the :ref:`profilescatalog`, each individual agent is composed from a superset of all possible (valid) combinations, which is defined by the :ref:`systemconfigblueprint`. +This config defines all available framework modules and agent modules and connects them by corresponding channels, which in turn have a specific signal type. + +The next figure gives an exhaustive overview over the current superset: + +.. figure:: ./images/ComponentsChannelCommunicationDiagram.svg + + Components and channel communication + +:download:`./images/ComponentsChannelCommunicationDiagram.svg` + +Modules that can be paramerized by the user are explained in the :ref:`Simulation User Guide <simuserguide_components>`. +Therefor the following section only contains the components not listed in the user guide. + +Action_LongitudinalDriver +------------------------- + +Updates the agents pedal positions and gear. +The input for this module is prepared by the AlgorithmLongitudinal Module. + +Action_SecondaryDriver +----------------------- + +Updates the agents BrakingLight, Indicator, Horn and all Lightswitches (Headlight, HighBeam, Flasher). +The input for this module is prepared by the driver module. + +AgentUpdater +------------ + +The AgentUpdater executes all Set-Methods of the agent dynamics after the DynamicsPrioritizer. This includes position, velocity, acceleration and rotation. + +Algorithm_Lateral +----------------- + +This module converts the lateral input of the driver module into a steeringwheel angle. + +Algorithm_Longitudinal +---------------------- + +This module converts the acceleration input of the driver module into pedal positions and gear. + +Dynamics_Collision +------------------ + +If the number of collision partners of the agent is bigger than in the previous timestep, the DynamicsCollision module calculates the collision. +Currently the collision is implemented fully inelastic, i.e. all agents will have the same velocity after the collision, while the momentum is conserved. +After the collision the agents slow down with a fixed deceleration until fully stopped. + +Dynamics_RegularDriving +------------------------ + +The module takes care that the motion of the agent fit to the physical limitations, such as friction or maximum possible acceleration based on the current gear. +This module uses both the world friction and the vehiclemodelparameter friction. +Thereby it calculates the dynamics of the agents in every time step. +The currently covered dynamics are *Acceleration*, *Velocity*, and consequently *Position*, *Yaw angle* and *Yaw rate*. +The input for this module is the steeringwheel angle and the new acceleration of the vehicle. + +LimiterAccelerationVehicleComponents +------------------------------------- + +This module limits the AccelerationSignal from the PrioritizerAccelerationVehicleComponents to the constraints given by the vehicle. The DynamicsTrajectoryFollower can then use this signal to calculate a trajectory. + +The limit is calculated by :math:`a_{\text{lim}} = \frac {F_{\text{wheel}} - F_{\text{roll}} - F_{\text{air}}} {m_{\text{veh}}}`, where the symbols meanings are: + +======================== ================================================ +Symbol Decription +======================== ================================================ +:math:`a_{\text{lim}}` Resulting acceleration limit [m/s²] +:math:`F_{\text{wheel}}` Force at wheel (provided by drivetrain) [N] +:math:`F_{\text{roll}}` Force resulting from rolling resistance [N] +:math:`F_{\text{air}}` Force resulting from air drag [N] +:math:`m_{\text{veh}}` Mass of the vehicle [kg] +======================== ================================================ + +The components are calculated as follows: + +**Driving force** + +:math:`F_{\text{wheel}} = \frac {T_{\text{engine}} \cdot r_{\text{axle}}} {r_{\text{wheel}}}` + +========================= ============================================================================================ +Symbol Decription +========================= ============================================================================================ +:math:`T_{\text{engine}}` Resulting torque from drivetrain at current velocity (assumung best gearing selected) [Nm] +:math:`r_{\text{axle}}` Axle transmission ratio [1] +:math:`r_{\text{wheel}}` Static radius of the wheels [m] +========================= ============================================================================================ + +The engine torque :math:`T_{\text{engine}}` is calculated by a simple model, where the torque scales proportional with the current engine speed between 1350 and 5000 rpm, up to maximum engine torque. +From minimum engine speed up to 1350 rpm the torque scales proportional with the engine speed up to half the maximum torque. +From 5000 rpm up to maximum engine speed, the torque scales with 5000 / maxEngineSpeed, up to maximum torque. + +**Rolling resistance** + +:math:`F_{\text{roll}} = m_{\text{veh}} \cdot c_{\text{fric}} \cdot g` + +========================= ============================================================================================ +Symbol Decription +========================= ============================================================================================ +:math:`m_{\text{veh}}` Mass of the vehicle [kg] +:math:`c_{\text{fric}}` Rolling friction coefficient (constant 0.015) [1] +========================= ============================================================================================ + + +**Air drag** + +:math:`F_{\text{air}} = \frac {\rho_{\text{air}}} {2} \cdot A_{\text{front}} \cdot c_w \cdot v^2` + +========================= ============================================================================================ +Symbol Decription +========================= ============================================================================================ +:math:`\rho_{\text{air}}` Densitiy of air [kg/m³] +:math:`A_{\text{front}}` Vehicle front surface area [m²] +:math:`c_w` Drag coefficient [1] +:math:`v` Vehicle's current velocity [m/s] +========================= ============================================================================================ + +OpenScenarioActions +------------------- + +As defined by openSCENARIO, OpenScenarioActions is the relaying module for: + +- Trajectory-actions +- LaneChange-actions +- UserDefined-actions. + +If a + +- TrajectoryManipulator +- LaneChangeManipulator + +or a user defined manipulator + +raises such an event for the specified agent, the module forwards it as signal to all interested module of the corresponding agent. The modules can than react on the signals content without time delay. + +Parameters_Vehicle +------------------- + +The ParametersVehicle module forwards the VehicleModelParamters to all other moduls that need them via the ParametersVehicleSignal + +Sensor_Driver +-------------- + +The SensorDriver performs queries on the AgentInterface to gather information about the own agent and its surroundings. These are forwarded to the driver modules and the Algorithm modules, which use them for their calculations. + +SensorFusionOSI +--------------- + +The SensorFusionOSI module allows unsorted aggregation of any data provided by sensors. All sampled detected objects can then be broadcasted to connected ADAS. + +It collects all SensorDataSignals and merges them into a single SensorDataSignal. + +SignalPrioritizer +----------------- + +All channels can only have one source. +If one modul can have the same input type from multiple sources a prioritizer modul is needed in between. +All sources then get an output channel to the prioritizer modul and the prioritizer gets an output to the modul, which uses this signal. +If more than an component sends an active signal during the same timestep, the prioritizer forwards only the signal from the input channel with the highest priority. +These priorities are set as parameters in the systemconfigblueprint.xml, where the key corresponds the the id of the input channel and the value is the priority (higher value is prioritized). +In the following example the channel with id 102 has the highest priority (3) and the channel with id 100 has the lowest priority (1). + +.. code-block:: xml + + <component> + <id>PrioritizerName</id> + <schedule> + <priority>150</priority> + <offset>0</offset> + <cycle>100</cycle> + <response>0</response> + </schedule> + <library>SignalPrioritizer</library> + <parameters> + <parameter> + <id>100</id> + <type>int</type> + <unit/> + <value>1</value> + </parameter> + <parameter> + <id>101</id> + <type>int</type> + <unit/> + <value>2</value> + </parameter> + <parameter> + <id>102</id> + <type>int</type> + <unit/> + <value>3</value> + </parameter> + </parameters> + </component> + +One prioritizer modul can only handle signals of the same type and the signal class must be derived from ComponentStateSignal. +If there is no signal in one timestep, then the signal of the previos timestep is hold. + +**Existing prioritizer modules** + +* PrioritizerAccelerationVehicleComponents +* PrioritizerSteeringVehicleComponents +* PrioritizerTurningIndicator +* PrioritizerLongitudinal +* PrioritizerSteering +* PrioritizerDynamics + + +ComponentController +------------------- + +Overview +~~~~~~~~~ + +The ComponentControoler (CC) is used to configure and handle dependencies between other vehicle components. + +Example use cases could be: + +- Cruise control: + + - driver requesting higher acceleration than cruise control overrides the latter + - driver braking deactivates cruise control + +- Lane keeping assistant: + + - cannot be activated by driver, if emergency braking is currently active + - stays active, when emergency braking occours (i. e. by other ADAS) + +The responsibilies of the CC are: + +- Handling of all dependencies between *VehicleComponents* in case a component wants to activate +- Make information about driver, *TrajectoryFollower* and other *VehicleComponents* available to each other +- Determine the highest allowed activation state of a component and notify the affected component about this state + +To achieve this tasks, each component is assigned a maximum allowed state in each timestep. This state is of type ComponentState, +which defines *Disabled*, *Armed* or *Active* as allowed states. +Drivers can be in a state of either *Active* or *Passive*. + +State handling inside Vehicle Component +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Within a vehicle component, the information flow should be implemented as follows: + +1. The vehicle component retrieves the information of other components and the current maximum allowed state from the CC. + Other components include drivers, trajectory followers and all other vehicle components connected to the CC. +2. Based on that information the vehicle component determines its current desired state. +3. The desired state is sent to the CC. + +The CC handles all the dependencies between different components and determines the maximum allowed state for each component based +on the configuration of the CC. + +Used signals +~~~~~~~~~~~~~ + +The CC communicates with the controlled components via framework signals. + +Inputs to the ComponentController: + +.. table:: + :class: tight-table + + ================== ===================================================== ============================= + Source Contents Signal + ================== ===================================================== ============================= + TrajectoryFollower Current state ComponentStateSignal + Driver Current state, pedal activity DriverStateSignal + VehicleComponent Current state, desired state, generic ADAS parameters VehicleCompToCompCtrlSignal + ================== ===================================================== ============================= + + +Output to other components: + +.. table:: + :class: tight-table + + ================== ========================================================================== ============================= + Destination Contents Signal + ================== ========================================================================== ============================= + TrajectoryFollower Current max. reachable state ComponentStateSignal + Driver List of all ADAS with names, stati and types AdasStateSignal + VehicleComponent Current max. reachable state, list of all ADAS with names, stati and types CompCtrlToVehicleCompSignal + ================== ========================================================================== ============================= diff --git a/sim/doc/source/advanced_topics/simulator/images/AgentCoordinateSystem.png b/sim/doc/source/advanced_topics/simulator/images/AgentCoordinateSystem.png new file mode 100644 index 0000000000000000000000000000000000000000..0ab97404279a66a696a36508234ee1692058ce1b Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/AgentCoordinateSystem.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/ComponentsChannelCommunicationDiagram.svg b/sim/doc/source/advanced_topics/simulator/images/ComponentsChannelCommunicationDiagram.svg new file mode 100644 index 0000000000000000000000000000000000000000..b9220df892dc42f3b8e1bf4f425c4051d7b362da --- /dev/null +++ b/sim/doc/source/advanced_topics/simulator/images/ComponentsChannelCommunicationDiagram.svg @@ -0,0 +1 @@ +<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1984.6000000000001" height="3010.5"><style xmlns="http://www.w3.org/1999/xhtml"></style><defs/><g transform="translate(0,0)"><g><rect fill="#FFFFFF" stroke="none" x="0" y="0" width="1984.6000000000001" height="3010.5"/></g><g transform="translate(0,0) matrix(1,0,0,1,1839,1482.5)"><g><g transform="translate(0,0) scale(1.2,0.75)"><g><path fill="#6aa84f" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.8333333333333334,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1849,1505)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.100006103515625" y="0.5" width="98" height="29" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="1.100006103515625" y="12.5">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="8.100006103515625" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="14.100006103515625" y="12.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="17.100006103515625" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="20.100006103515625" y="12.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="27.100006103515625" y="12.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="34.100006103515625" y="12.5">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="41.100006103515625" y="12.5">S</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="49.100006103515625" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="56.100006103515625" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="62.100006103515625" y="12.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69.10000610351562" y="12.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="76.10000610351562" y="12.5">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="83.10000610351562" y="12.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="90.10000610351562" y="12.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="94.10000610351562" y="12.5">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="17.583328247070312" y="27.5">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26.583328247070312" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="30.583328247070312" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="33.58332824707031" y="27.5">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="38.58332824707031" y="27.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="45.58332824707031" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="49.58332824707031" y="27.5">T</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="55.58332824707031" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="62.58332824707031" y="27.5">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69.58332824707031" y="27.5">k</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="75.58332824707031" y="27.5">s</text></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1269,1712.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1279,1729)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.5" y="0" width="76" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.5" y="0" width="76" height="42" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="2.5" y="12">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.5" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="12.5" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19.5" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.5" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.5" y="12">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43.5" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54.5" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61.5" y="12">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68.5" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="75.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="2.5" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.5" y="26">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13.5" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.5" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.5" y="26">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.5" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.5" y="26">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43.5" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.5" y="26">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52.5" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55.5" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.5" y="26">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71.5" y="26">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="12.48333740234375" y="40">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.48333740234375" y="40">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.48333740234375" y="40">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.48333740234375" y="40">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44.48333740234375" y="40">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="51.48333740234375" y="40">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="58.48333740234375" y="40">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61.48333740234375" y="40">s</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1040,342.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1050,366)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.5" y="0" width="80" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.5" y="0" width="80" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.5" y="12">S</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="8.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.5" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22.5" y="12">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.5" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40.5" y="12">R</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56.5" y="12">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.5" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.5" y="12">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">S</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34.48333740234375" y="26">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.48333740234375" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44.48333740234375" y="26">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47.48333740234375" y="26">e</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,839,1995)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,849,2019)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1" y="0" width="79" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1" y="0" width="79" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1" y="12">P</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36" y="12">z</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52" y="12">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.48333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.48333740234375" y="26">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.48333740234375" y="26">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40.48333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43.48333740234375" y="26">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50.48333740234375" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.48333740234375" y="26">l</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,350,240)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,271)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Sensor</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="58.48333740234375" y="12">1</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,480,240)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,490,271)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Sensor</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="58.48333740234375" y="12">2</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1849,1320)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1859,1356)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">3319</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1869,1405)"><image width="60" height="107" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABrCAYAAAArd+E9AAAA10lEQVR4nO3RwQmDQBgF4deCFVmQZWhDaSodKLmZg/ujmLNIxvlgYUUPDi+RJEmSJOk2azuPYTCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzAdPnhI8k7St+djcN/eDTf812WmbIGv9nwMfrX7eMN/XaZLsmQL67MH131p36AcV15Pd9S6pUsyZ4+tMwe4bhnzG4xct5xXRq9bjiuj1y1dkk87+HXLlIesW7o8aF1JkiRJkiRJkiTpL3wBswaVXIzalMMAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1869,1245)"><image width="60" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABpCAYAAABmv0A2AAAAzklEQVR4nO3RwQmDQBRF0U8WKc4mbMN+0oZpKE2YRWZwcC+G5zkwMIoLL68KAAAALrO1cxuC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4DSPqpqH52Pw3L6J8apf4NKex+Cl3V8X/NdppvpFfarqWXvws73b2jdR3rWvvB3u64X/dZpx5e1wj1u3W2uP7Sdy3a6vPJ7Ydbtx5eh1u3Hl+HW7tW6ybjfVjdYFAAAAAAAA/tEX0WmP4uj468YAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1269,1827.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1279,1864)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">1412</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1289,1772.5)"><image width="60" height="85" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABVCAYAAAAVB4fgAAAAuElEQVR4nO3RwQmEMBRF0ccsLM4mbMN+bCM2NE1kFuaTT/aS4eUeCERx4eVJAAAAAABMU9tZBsHuCHZHsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7I5gNx9JR3oeg4/2jY1LT+DZnnPw2e7XhP96za4n6itpUw/e2rvavrFyq69ch3uZ+F+vySvX4W63bijqsXEs1w2xcj6264a8svW6Ia9sv24oWmTdsGuhdQEAAAAAAAAAAAD8ox+PAmgKJB8EKgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1304,1912.5)"><image width="144" height="100" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJAAAABkCAYAAABpRbm3AAACF0lEQVR4nO3crYtUURzH4a9rcIL4B2gUtQoLgkWwiGwVg2mLeRGLqMEtgixatFs1WHVBLNYFxbxrWky+NEEwrIZzh7trkZmzcDjD88Bh7m2/8OHcO3deEgAAAAAAAAAAFsSfYcFcBEQVAVFFQFQREFUERBUBUUVAVBEQVQREFQFRRUBUERBVBEQVAVFFQFQREFWmAS21HoQ+7aQEdLb1IPRpMyWgldaD0KenKQGttR6EPq2lBPSh9SD0aTnjjfRy41no1EZKQJutB6FPx5LspkS0MZzDTFYzXsp2h3PPhpjJcpI3GUPaS7Kdcml7lmTdmnvdTXI9yfkkx7PgVlPC2csYk3W460uSh1nwXX4p5Qn1Ssrb/XVr7vUoyaskn5L8zBjS5yQ3AjO6mORdxpCetx2HXt1M8jsloiuNZ6FTd1IC2mo9CP36mBLR7daD0KcH8WkAFc6kBLTTehD6dCTjc7ejjWehU9spAZ1rPQh9+hrfDqXC6wiICgKiioCoIiCqCIgqAmJm15KcGI7/DehSktMthqIPl1OCeTuc7w/oQvzxBf8xSfIjJZKrORjQy+H4cbPp6ML9jLvQNKBbGXefk+1Gowf7d6Gt4fX98Pqk4Vx0ZLoLfcvBX26cajkU/Zgk+Z6D8dh9mMm92H2oMEnyKyWeF41noVPTeyG7D3OZxL0PlTz3AQAAAAAAAAAAAAAAAAAAADhsfwGAeTyml/YwSQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,350,347.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,360,384)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">9901</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,370,300)"><image width="60" height="77" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABNCAYAAAD6ggcWAAAAtUlEQVR4nO3RwQmEMBRF0ddCKkpBlqEN2ZQdKLNzFv6PwVlLmJd7IBDRhZcnAQAAAADQzRlnGAS7I9gdwe4IdkewO4LdEeyOYHcEuyPYnX3wJGmTVOO5Da7xburwX69ZdAWu8dwGr3GfO/zXa4qkQ1dY1R2c9yO+sdKufD7uVuumImnXHZtnl+G6adZvsOW66bmy9bqpXdl63VQkfeLYr5sWDbJuKhpoXQAAAAAAAAAAAOAvfAGj11mYFfMKHQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,500,300)"><image width="60" height="77" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABNCAYAAAD6ggcWAAAAtUlEQVR4nO3RwQmEMBRF0ddCKkpBlqEN2ZQdKLNzFv6PwVlLmJd7IBDRhZcnAQAAAADQzRlnGAS7I9gdwe4IdkewO4LdEeyOYHcEuyPYnX3wJGmTVOO5Da7xburwX69ZdAWu8dwGr3GfO/zXa4qkQ1dY1R2c9yO+sdKufD7uVuumImnXHZtnl+G6adZvsOW66bmy9bqpXdl63VQkfeLYr5sWDbJuKhpoXQAAAAAAAAAAAOAvfAGj11mYFfMKHQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,385,432.5)"><image width="225" height="127" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAAB/CAYAAAAZ36VJAAACVklEQVR4nO3dMU5UURiG4a+nGqzp6VyBIguw0i1QKAuwMppA4wKkYQlGE1agbMHGBWjsKCF2Y3FmwgRq58Oc50lOciczxU/x5k+4dzIJAAAAAAAAAAAAAAAAwIO2XB2gRIRQJkIoEyGUiRDKRAhlIoQyEUKZCKFMhFAmQigTIZSJEMpECGUihDIRQpkIoUyEUCZCKBMhlIkQykQIZSKEMhFCmQihTIRQJkIoEyGUiRDKRAhlIoSym4wId9qDwKy+Z0T4uD0IzOpzRoQv2oPArD5kRPimPQjM6igjwk/tQWBWj5JcZYT4sjwLTOtVRoQ/2oPAzC4zQrxM8rQ8C0zpScYmXN+8/5jkMMlecyiY0fvchrg+Nxn3E786TvF8yfhv/lEmWBD7Sc4z/vCfuR+l4zyUc5ZkNxPYyXii5pnjFM+LjPvZ6wWxDvEqyesAW7efcX97HeO77jgwr7e5DXG/PAtM6ywjQk9+Qclubp/8el6eBablywhQtv4ywnl7EJjVYUaE38pzwLT2MiL81R4EZra+VQGUiBDKRAhlIoQyEUKZCKFMhFAmQigTIZSJEMpECGUihDIRQpkIoUyEUCZCKBMhlIkQykQIZSKEMhHClh0n+Z3kYPV6M8KD1XvHhblgGqcZ0V2sXm9GeLG6PinMBdNYZPyS9DJj8y3vXN+sPgP8Q5vbcHnn2haELVgkuc79n9K+ji0IW3OS+xHagrBFd7ehLQgFm9vQFoSCRZI/q2MLQslpbEGoWsQWBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPi//QVLkRQQXf0L7AAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1265,685)"><image width="223" height="1095" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAN8AAARHCAYAAABzg7YRAAAMo0lEQVR4nO3ZP4pddQCG4Q8L2zRxLRmXkGQLA9lEAtrdpUTMMrRPYFaiTJ8uFodhYNBKvG/MeR749R+H+3LPnw0AAAAAAAAAAAAAAOD/6IvjfKPnftvHbR+2Xbbd7itTXyDHuea52/ZywH/q+babHf94lx3hPUT4y7Zn2TI4obfbPu8I8H07Bc7nxR4DdAsKV/Zuj8+AwJU9PAN+dW9B4Vt32RHfpZ0B53O7I74P9RA4m5sd8X2qh8DZPN8R3309BM7o4aM7cGXig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oOI+CAiPoiIDyLig4j4ICI+iIgPIuKDiPggIj6IiA8i4oPA8x3h3ddD4GxudsT3sR4CZ3O7I74P9RA4m8uO+C7tDDifux3x3dZD6Lze9uu27+ohJ/J2R3h39RAar7f9vsfX3W/aOafxYtvnHdf8ZbyFK3sa3R/bfkoXnce7PYb3vp3CNf1TdN+Xo75hP2z7cccz3WWPz3gP4T2rhnE9T6NzunM3t5qn8mrbb+t/eGc799s+7fiOd5m3mqf2NMI/t/08t51wNX8XoRcucEVPI3zTzoHzeTUf2QEAAAAAAAAAAAAAAAAAAAAAAAAAAIB/4y9u4oRinw3lJAAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1269,1185)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1279,1201)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="43" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="15" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="13.5" y="0.5" width="54" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="16.5" y="12.5">Prioritizer</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="13.5" y="0.5" width="3" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="15" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2" y="15" width="77" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2" y="15" width="77" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="2" y="27">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="27">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16" y="27">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19" y="27">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26" y="27">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="27">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37" y="27">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="27">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46" y="27">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53" y="27">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="60" y="27">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="27">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69" y="27">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="72" y="27">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="4.48333740234375" y="41">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="13.48333740234375" y="41">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.48333740234375" y="41">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.48333740234375" y="41">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="38.48333740234375" y="41">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.48333740234375" y="41">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52.48333740234375" y="41">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.48333740234375" y="41">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.48333740234375" y="41">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.48333740234375" y="41">s</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1269,1420)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1279,1456)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">2414</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1289,1245)"><image width="60" height="205" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAADNCAYAAADkMhPOAAABO0lEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gmu+ZuZyeH4OvuzfZHzPPfC6Px+Dr/v9+w3/9TLnuUf9zsxpHsGn/d22f5PyM4+Vt6f77Y3/9TLHlbene27d5TaP2HWS6y5r5ePJrrscV06vuxxXzq+73OZD1l3O80HrAgAAAAAAAP/RH3AjVykV/PZOAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1289,1505)"><image width="60" height="237" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAADtCAYAAADjnhb4AAABZUlEQVR4nO3RwWkCURhG0b8FK7Igy9CG0lQ6ULIzC+ehmLVIrufAgzfMLObyzQAAAMDbXLfzMQTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuywcfZuZ7Zvbb82Pwfnt3eMN/vcxpboFf2/Nj8Nd2P77hv15mNzOXuYXt5x687pftm5THla9P99S6y25mznOPXec8wXWX4/wNTq67PK+cXnd5XDm97rKbmZ/t5NddTvMh6y67+aB1AQAAAAAA4F/4BYQMmGezAuIFAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,989,1712.5)"><g><g transform="translate(0,0) scale(1.2,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.8333333333333334,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,999,1736)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.100006103515625" y="0" width="100" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.100006103515625" y="0" width="100" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.100006103515625" y="12">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7.100006103515625" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="10.100006103515625" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17.100006103515625" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24.100006103515625" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28.100006103515625" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.100006103515625" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34.100006103515625" y="12">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41.100006103515625" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52.100006103515625" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.100006103515625" y="12">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.10000610351562" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.10000610351562" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80.10000610351562" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87.10000610351562" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90.10000610351562" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93.10000610351562" y="12">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22.583328247070312" y="26">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.583328247070312" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="32.58332824707031" y="26">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39.58332824707031" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.58332824707031" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49.58332824707031" y="26">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56.58332824707031" y="26">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.58332824707031" y="26">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.58332824707031" y="26">m</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,689,1185)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,699,1200)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="45" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="45" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.5" y="0.5" width="80" height="44" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="0.5" y="12.5">P</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="8.5" y="12.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="12.5" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="15.5" y="12.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="22.5" y="12.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26.5" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="29.5" y="12.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="32.5" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="35.5" y="12.5">z</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40.5" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="47.5" y="12.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="51.5" y="12.5">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="58.5" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="64.5" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="70.5" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="77.5" y="12.5">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="2" y="27.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="9" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="13" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="20" y="27.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="23" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26" y="27.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="33" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40" y="27.5">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="46" y="27.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="53" y="27.5">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="60" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="63" y="27.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69" y="27.5">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="72" y="27.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="4.5" y="42.5">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="13.5" y="42.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="20.5" y="42.5">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="31.5" y="42.5">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="38.5" y="42.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="45.5" y="42.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="52.5" y="42.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="59.5" y="42.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="66.5" y="42.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69.5" y="42.5">s</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,689,1320)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,699,1356)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">2313</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,709,1405)"><image width="60" height="70" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABGCAYAAACQRffVAAAAp0lEQVR4nO3RwQnDMBBE0SEHF+cU4Tbcj9uIG0oTysG7eNHdKIz+g4WV0EHDSAAAAAAADNNipkFgdwR2R2B3BHZHYHcEdmcf+CVpK+c+8BZvbBy6Au5xroH32I8B/3rMqivUV9KiO/ASdy3eWDl1t9y6/TPwX4+pLbdut2s3Zct1LNtN2XId23ZTbdm63fTWRO2mU5O0m1ZN1C4AAAAAAAAAAACAf/QDhh5KLBC6bCYAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,709,1245)"><image width="60" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABpCAYAAABmv0A2AAAA0UlEQVR4nO3RwQmDQBRF0U8WKS4pwjbSj23EhtKEWWQGB/dieJ4DA6O48PKqAAAA4DRrO5chOJ3gdILTCU4nOJ3gdILTCU4nOJ3gdILTCU4nOJ3gdILTCU4nOJ3gdILTCU4nOJ3gdILTCU5zq6ppeN4HT+2bGHP9Al/teQx+tft8wn8d5lG/qE9V3WsLvrd3a/smylLbyuvuvpz4X4cZV1539+eJ/3Wod22x/USu2/WVxxO7bjeuHL1uN64cv273rous2z3qQusCAAAAAAAA/+gL0TyP6qL9Q2cAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,989,2155)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#6aa84f" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,999,2178)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0.5" width="81" height="29" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="0" y="12.5">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="7" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="13" y="12.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="16" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="19" y="12.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26" y="12.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="33" y="12.5">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40" y="12.5">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="47" y="12.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="54" y="12.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="61" y="12.5">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="68" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="71" y="12.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="74" y="12.5">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="10.98333740234375" y="27.5">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="17.98333740234375" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="20.98333740234375" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="27.98333740234375" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="34.98333740234375" y="27.5">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="37.98333740234375" y="27.5">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="46.98333740234375" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="50.98333740234375" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="53.98333740234375" y="27.5">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="58.98333740234375" y="27.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="65.98333740234375" y="27.5">r</text></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,999,1827.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1009,1864)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.98333740234375" y="14" width="27" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.98333740234375" y="14" width="27" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.98333740234375" y="26">1211</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1019,1772.5)"><image width="60" height="85" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABVCAYAAAAVB4fgAAAAuElEQVR4nO3RwQmEMBRF0ccsLM4mbMN+bCM2NE1kFuaTT/aS4eUeCERx4eVJAAAAAABMU9tZBsHuCHZHsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7I5gNx9JR3oeg4/2jY1LT+DZnnPw2e7XhP96za4n6itpUw/e2rvavrFyq69ch3uZ+F+vySvX4W63bijqsXEs1w2xcj6264a8svW6Ia9sv24oWmTdsGuhdQEAAAAAAAAAAAD8ox+PAmgKJB8EKgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,894.7106781186548,2055)"><image width="174" height="130" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAACCCAYAAADfYvOjAAACgklEQVR4nO3dsYtUVxjG4VdTuIX4B8RSkrTCgmATSCOyraRIZWMtIY2YFG4jBImN9rZa2BohpEmZQCS1phIrY7pAIMVqcWa5u4Gs3OrkXZ4HDnNv9xU/zty5l5lJAAAAAAAAAAAAAOq93SyoIlwqCZdKwqWScKkkXCoJl0rCpZJwqSRcKgmXSsKlknCpJFwqCZdKwqWScKkkXCoJl0rCpZJwqSRcKgmXSsKlknCpJFwqCZdKwqWScKkkXCoJl0rCpdJ+uCdnDwJrvMgI9+PZg8AaTzPC3Zk9CKxxLyPc67MHgTWuZ4T76+xBYI3tLB/QtifPAqvcyQj36exBYI1TSV5mxHtncw4Vrma5ZHi5OXdvlwrbSb7PEvBekucZlxD3k+xadetmks+TnE9yOsfc1Yxg97JEbB2P9SrJ7Rzzd9OTGU/UdjJum+1adevbJI+T/JbkrywB/57ki0CJi0l+zBLwg7njwDrXkvyTEe+lybPAKjcywv159iCw1rOMeL+aPQiscSsjXE9NqfJRRrgvZg8Ca5zIcr/+g8mzwCrPM8L9ZPYgsMbrjHB9C4YqTyJcCgmXSsKlknCpJFwqCZdKwqWScKkkXCoJl0rCpZJwqSRcKgmXSsKlknCpJFwqCZdKwqWScKkkXGpcSXJmc/zvcD9Ncm7GUHCUzzJC/WFzfjDcC1l+ghT+V7aS/JkR5+UcDvfR5vi7adPBEb7Jsuvuh/tllt32w3mjwX87uOv+snn9afN6d+Jc8F77u+4fOfwHJ2dnDgXvs5XkTQ5Ha7elwtex21JoK8nfGdE+nDwLrLJ/rWu3pcpWXNtSyn1bAAAAAAAAAAAAAAAAAAAAAAAAAI6Xd29FtEuZqkvWAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,879.7106781186548,1912.5)"><image width="184" height="112" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAABwCAYAAACtiLoeAAACQUlEQVR4nO3dv2qTYRjG4RvXOhhcddbJOrpodVTcFM9AEIvQzdGhdXBTFBcPQRwKCg6C9hB0KQ5Oios4NrjF4U1IaDf5Pl76eF3wwheS4Qn88kD+lCYAAAAAAAAAAAAAAHTyLsksyY3eg8AYBE5pAqc0gVOawClN4JQmcEoTOKUJnNIETmkCpzSBU5rAKU3glCZwShM4pQmc0gROaQKnNIFTmsApTeCUJnBKEzilfU4L/GLvQWAMB2mBn+w9CAztTFrcP3oPAmO4mhb4p75jwDjepAX+vPcgMLQ7aXH/SnKq8ywwqAtJvqYFfq/zLDCYE0kep4U9S/Kx7zjjWkuynvZGw6l5rid5kORZkrdJvmUZ99MU+2jwfJJXaa/a71k+Uef/Oh+SXEoxj3L0iU6TfEkL3ql53id5kWQryc0k51LM5ST7WUb9Msm1JGd7DgVD2UsLey/Jlc6zwKDup8W933sQGNrpJL/TAr/deRYY3N20uF/3HgTG8CQt8Ie9B4ExLH5Ec6v3IDCGxV9prPceBMYwTQt8rfcgMIbFFztQksApTeCUJnBKEzilCZzSBE5pAqc0gVOawClN4JQmcEoTOKVsJvmZZGN+ezXwjfl9mx3mgkHspAW9O7+9Gvju/Hq7w1wwiEmWvwHfyDLwxfV0/hg4tla3+OzQte3NsTfJ8v+trJ6D2N4UsZ2jgdvelHF4i9velLO6xW1vypkk+TM/tjcl7cT2prBJbG8AAAAAAAAAAAAAAAAAAAAAAAAAAIB/9xeyDqSu6q6J3QAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1849,1185)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1859,1200)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="45" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="15" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15" y="0.5" width="51" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="15" y="12.5">Prioritizer</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="15" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.5" y="15.5" width="78" height="29" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="1.5" y="27.5">T</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="8.5" y="27.5">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="15.5" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="19.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="29.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="36.5" y="27.5">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="43.5" y="27.5">I</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="46.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="53.5" y="27.5">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="60.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="63.5" y="27.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69.5" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="76.5" y="27.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="34.98333740234375" y="42.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="41.98333740234375" y="42.5">r</text></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,420,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,430,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">5213</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,550,2310)"><g><g transform="translate(0,0) scale(1.1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.9090909090909091,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 110.00000000000001 0 Q 110.00000000000001 0 110.00000000000001 0 L 110.00000000000001 75 Q 110.00000000000001 75 110.00000000000001 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 110.00000000000001 0 Q 110.00000000000001 0 110.00000000000001 0 L 110.00000000000001 75 Q 110.00000000000001 75 110.00000000000001 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,560,2334)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="91" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="91" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.3000030517578125" y="0" width="90" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.3000030517578125" y="12">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.300003051757812" y="12">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14.300003051757812" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21.300003051757812" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28.300003051757812" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39.30000305175781" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42.30000305175781" y="12">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.30000305175781" y="12">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55.30000305175781" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.30000305175781" y="12">T</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="9.283340454101562" y="0" width="81" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.30000305175781" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.30000305175781" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80.30000305175781" y="12">j</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="83.30000305175781" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.283340454101562" y="26">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.283340454101562" y="26">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="18.283340454101562" y="26">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25.283340454101562" y="26">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.283340454101562" y="26">y</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="34.28334045410156" y="14" width="47" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="34.28334045410156" y="14" width="47" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34.28334045410156" y="26">Follower</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,455,1082.5)"><image width="314" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAToAAACECAYAAAAA9eftAAACoklEQVR4nO3cMU5UYRSG4a+nAmt6O1ag6AKscAsUygJoTDSRxgVo4xKIJqxA2QINC9DYUUq0wuKfydxgy80NH8+TnGQmUByaN2dgmAQAAAAAAAAAAAAAAAAAAAAAAIA7drMagFpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9T7mRG63aUXAZjL94zQPV94D4DZfM4I3eHSiwDM5TgjdB+WXgRgLi8yQneVZGfhXQBmc5oRu49LLwIwl8fZvM3kzcK7AMzmbTaxO82IH0Cd1xm/q1sH71vGX2WPkxwkeWaMqZ69JFt5AHaSfMomdsaYhzc/sjl0ql/d7Wa8ifgw460nXzN+cGNM71wkuc7/4XsXgDLrQ2f66u4yyZMllwKYy9Mk5xmxO194F4BZXWbE7tXSiwDM5WVG6K6SPFp4F4DZrP+LyoeAALV8CAhQ7yAjdF+WXgRgLnsZobtYehGAuWxlhO566UUA5rR+AzFALaED6gkdUE/ogHpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9QTOqCe0AH1hA6oJ3RAPaED6gkdUE/ogHpCB9QTOqCe0AF1jpL8SrK/ej4N3f7qa0cL7AVwZ04ywna2ej4N3dnq8fsF9gK4M9tJrjOCtp9N6NaPr1ffA3CvTa+6m1uPXXNAhelVN53fcc0BRdZX3XRcc0CV21edaw6oNL3qXHNApe0kf5P8iWsOKHYS1xxQbjuuOQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACA++8fEMHPWEP7MNoAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,419,862.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,429,893)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29" y="0" width="23" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29" y="12">AEB</text></g></g><g transform="matrix(1,0,0,1,439,732.5)"><image width="156" height="160" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJwAAACgCAYAAAD5AAWbAAACcUlEQVR4nO3dvW0iURSG4SMCuxMaoAuaoANih86d0YJ7IGJLcAPrzOEWYTa4MxqEU+a71szzSFcCRxfx+swPwVQBAAAAAAAAAADAr3AdFkQIjijBESU4ogRHlOCIEhxRgiNKcEQJjijBESU4ogRHlOCIEhxRgiNKcEQJjijBESU4ogRHlOCIEhxRgiNKcEQJjijBESU4ogRHlOCIEhxRgiNKcEQJjijBESU4ogRHlOCIEhxRgiNKcEQJjijBESU4ogRHlOCIEhwxmxIcQdtqsX323gjrsK8W3Ln3RliHY7XgTr03wjp8VAvu2HsjLN+upguGXee9sALnarG99d4Iy/ZcLbJrVX0N7+HhNlV1qBbZeCg9dN3RTDbV7vfsq52cvlqxdap26PxbVd81hXauBZ63HernB7X6re/h+1jcVNvVdEJ6+0HP1f7jXq3YOlY7smyrHWkW51BTaF/D+0V+UPp7rumE9K1c/TCz8VLb73LMzl1rosYfgT96b4R1OJUfgQkab4Pse2+EdfisFty290ZYh/GCwT03IsbgIEJwRAmOKMERJTiiBEeU4IgSHFGCI0pwRAmOKMERJTiiBEeU4IgSHFGCI0pwRAmOKMERJTiiBEeU4IgSHFGCI0pwRAmOKMERJTiiBEeU4IgSHFGCI0pwRAmOKMExq/Fhr6P74DzUjYd6rxbYy/D+NriX4fV7h32xUPtqUf2rqqeagnsa/uYhITzcn5qm3PXu9aXjvlio2yl3vXttujGLS/18trrpxmzGKXe7TDdmdTvlTDdmdzvlTDciLmW6EbQv0w0AAAAAAAAAAAAAAAAAAAAAAIBf7z8Wd8t0tvJqdQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,439,922.5)"><image width="60" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABpCAYAAABmv0A2AAAAx0lEQVR4nO3RwQmEMBRF0b+xuqnBOuzHPixoqnAWJhjci8PzHAhEceHlVQEAAMBj9nZeQ3A6wekEpxOcTnA6wekEpxOcTnA6wekEpxOcTnA6wekEpxOcTnA6wekEpxOcTnA6wekEpxOcaB7u1+C5wqx1BC7teQxe2n194L9u86kj6ltVU53BU3u3t2+ibHWuvF/u24P/dZtx5f1yj1u36yuPJ3Ldrq88nth1u3Hl6HW7ceX4dbutXrJu96kXrQsAAAAAAAD8ox8Un4/fpb1TQgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,660,240)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,670,271)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Sensor</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="58.48333740234375" y="12">n</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,680,300)"><image width="60" height="77" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABNCAYAAAD6ggcWAAAAtUlEQVR4nO3RwQmEMBRF0ddCKkpBlqEN2ZQdKLNzFv6PwVlLmJd7IBDRhZcnAQAAAADQzRlnGAS7I9gdwe4IdkewO4LdEeyOYHcEuyPYnX3wJGmTVOO5Da7xburwX69ZdAWu8dwGr3GfO/zXa4qkQ1dY1R2c9yO+sdKufD7uVuumImnXHZtnl+G6adZvsOW66bmy9bqpXdl63VQkfeLYr5sWDbJuKhpoXQAAAAAAAAAAAOAvfAGj11mYFfMKHQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1180,650)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1190,686)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">9292</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1200,550)"><image width="60" height="130" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACCCAYAAAAaPKt3AAAA7ElEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa7LB3/NzOXw/Bx82b/J+J574HV/PgZf9/v3G/7rZc5zj/qdmdM8gk/7u23/JuVnHitvT/fbG//rZY4rb0/33LrLbR6x6yTXXdbKx5NddzmunF53Oa6cX3e5zYesu5zng9YFAAAAAAAA/qM/lDHBsHyyiiMAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,928,685)"><image width="267" height="1095" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQsAAARHCAYAAADk90biAAANq0lEQVR4nO3aMapdVQCF4YWFbZo4FYlDeDqFB04iAcs3lIhvGNon8EYipE+nxTFcjIn+jZ4Dfh/sfnGLn3v33RsAAAAAAAAAAAAAAAAAAPwb7rc9bHvc9nbbu22/OY5ziXMJd9uedv6H4TjO58+pnm17vduYpx3fLO63vdj2/KxhwLX8uCMS77e9OnkLcFF3u4Xi65O3ABf24Y7i5dlDgOu63+2OAuCzHnbE4uHcGcDVPe6Ixf3ZQ4Bre7MjFi/OHgJc24eXmd5RAH/rEi/CgOsTCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyARCyB5tyMWz88eAlzb2x2xeHH2EODaHnfE4v7sIcC1PeyIxcO5M4Cru98Ri6ezhwDX97QjGK/OHrLti20/bfv27CHAX93tiMX7bV+fvOX73f7O/WXbd+fOAT72erdgvDx3yn7Y9utEAy7p2W7B+HCH8bDjTuObbV/9x3u+nGjApd3tdodx1SMacCH3O75ZPG57s9tLzyucn+cCFPjDp36GiATwJyIB/KOP/zoVCeCTPMoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOD/53fsfWh570k2jwAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,530,530)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,540,561)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.48333740234375" y="0" width="78" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1.48333740234375" y="12">S</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="9.48333740234375" y="0" width="70" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.48333740234375" y="12">ensorFusion</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,530,647.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,540,684)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">9190</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,550,590)"><image width="60" height="87" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABXCAYAAABYzybrAAAAwElEQVR4nO3RwQmEMBRF0ddCKkpBlqEN2ZQdKLNzFv6PwVlLmJd7IBDRhZcnAQAAAADQzRlnGAS7I9gdwe4IdkewO4LdEeyOYHcEuyPYHcHuCHZHsDuC3RHszj54krRJqvHcBtd4N3X4r9csugLXeG6D17jPHf7rNUXSoSus6g7O+xHfWGlXPh93q3VTkbTrjs2zy3DdNOs32HLd9FzZet3Urmy9biqSPnHs102LBlk3FQ20LgAAAAAAAAAAAPAXvmeKbYSHBYFIAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,480,347.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,490,384)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">9902</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,660,347.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,670,384)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.48333740234375" y="14" width="48" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.48333740234375" y="14" width="48" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16.48333740234375" y="26">9900</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="44.48333740234375" y="26"> +</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="57.48333740234375" y="26">n</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,515,432.5)"><image width="95" height="127" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAF8AAAB/CAYAAACJ4B7DAAACDElEQVR4nO3cMU4UcRTH8V9PtVjTb+cJdOUAVngFCuQAVkYTaDyANBzBaMIJlCvQeACNHSUbOyzeTGbDVkZ3viTv+0kmmQ0Ub7//VzAbIJEkSZIkSZIkaefuh0sA44OMDzI+yPgg44OMDzI+yPgg44OMDzI+yPgg44OMDzI+yPgg44OMDzI+yPgg44OMDzI+yPgg44OMDzI+yPgg44OMD1qn4u/Rg3R0k4r/lB6ko8+p+Ef0IB19SMV/Qw/S0XEq/id6kI6eJLlNHcAreJaWTlLxv9ODdHWdOoDrJM/hWdp5ltr88aHrY5LDJAfkUN28z3QA47VOPQ98ha4vqZ/KjtNgIZZJLlNv/Ee2D+MxXBdJ9ncV4DHZSz0Bv4Cuo9RzyLgQ4wHcJnn9T+9Mf22Zei4ZD+EdO05PbzMdwBKepaWL+ISO2c/0hP4SnqUlPxwEjR8OXtKDdHSYiv8NnqOlg1T8n/QgXfmLACDjg4wPMj7I+CDjg4wPMj7I+CDjg4wPMj7I+CDjg4wPMj7I+CDjg4wPMj7I+DM6TfIryWp4vRl/NXztFJirhfNU7Kvh9Wb8q+H+DJirhUWmf12wyhR/vF8P36Md2dz++wf3bv2OLZLcZftPhu7i1s/iLNvx3fqZPNx+t35mm9vv1s9skeT3cLn1gPO49ZhF3HpJkiRJkiRJkiRJkiRJkiTp//kD8hcRBTeb9/MAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,550,432.5)"><image width="175" height="127" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK8AAAB/CAYAAACZrJJaAAACSUlEQVR4nO3cPWpUYRiG4ae3itbp7bICjVmAlW4hhboAK1FIGu1jkyX4A1lBcAnauADFLmWCXSy+GWZIingQOXmG64IPZkiK98A9L8ycYRIAAAAAAAAAAAAA4B9cLg7UES+1xEst8VJLvNQSL7XESy3xUku81BIvtcRLLfFSS7zUEi+1xEst8VJLvNQSL7XESy3xUku81BIvtcRLLfFSS7zUEi+1xEst8VJLvNQSL7XES6U7GeFezD0ITLWTEe/XuQeBqZ5kxPtp7kFgqpcZ8b6dexCY6kNGvPtzDwJTPM0I9yzJvZlngUm+Z8T7fO5B4G89TPIlI9wvM88CN9pOspfkfVY3Jb4neTDnUP/D8kL3k7xL8jnJqVN5vmXcgLi8cl5nw9xNcpTrF+r0nx8ZMR8nuZ8N8yzjXefyYpcX+jLjg+xHTuXZybgFvLHeZBXtx2zgK5PNdD+rcF/NPAtMsrzDcjT3IDDF44xwzzLerEENX8qg1nFGvL6UQZ3TjHj35h4EpvqZEe/23IPAVMuPyKCOeKklXmqJl1ripZZ4qSVeaomXWuKllnipJV5qiZda4qWWeKklXmqJl1ripZZ4qSVeaomXWuKlxoskv5LsLp6vx7u7+NuLGeaCGx1mxHqyeL4e78ni8cEMc8GNtrL6lezdrOJdPr5Y/A/cSuvb9/LKY1uXW20ryXmu/+z7eWxdChzkery2LhWubl9blyrr29fWpcpWkt+LY+tS5zC2LqW2YusCAAAAAAAAAAAAAAAAAAAAAAAAAKz8AU+qsGRX+vGGAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1619,850)"><g><g transform="translate(0,0) scale(1.2,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.8333333333333334,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1629,874)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="8.600006103515625" y="0" width="83" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="8.600006103515625" y="12">AlgorithmAgent</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="100" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="7.600006103515625" y="14" width="85" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7.600006103515625" y="26">FollowingDriver</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,1849,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1859,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="26">4119</text></g></g><g transform="matrix(1,0,0,1,1869,1082.5)"><image width="60" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACECAYAAADMZUhqAAAA8klEQVR4nO3RwQmDQBgF4deCFVmQZWhDaSodKLmZg/ujmLNIxvlgYUUPDi+RJEmSJOk2azuPYTCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwTRDkneSvj0fg/v2brjhvy4zZQt8tedj8Kvdxxv+6zJdkiVbWJ89uO5L+wbluPJ6uqPWLV2SOXtsnTnAdcuY32DkuuW8MnrdclwZvW7pknzawa9bpjxk3dLlQetKkiRJkiRJkiRJf+ELQSzHKjAh0dMAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1724,872.5)"><image width="205" height="155" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM0AAACbCAYAAADBax+DAAACO0lEQVR4nO3ZMWrbcBjG4ZcOWbvkLs0VmjMEcokWMvooLckx3L2FnqSQvZs7SEbCNIneIShyngf+IBkPH4Yfn2UnAAAAAAAAAAAAAADn5OA4r3Aek/xM8pBkl+QmZ2TtD9d5P+d3ks8B/usyyVWGDbPLEMwxnu9JPq42GWzIlyR/M4Tzbd1RYDs+ZQrHVzVY6GumZxxgoeMzzln9qgavaZchmt26Y8B23GSI5mHtQWArrjJE82vtQWArLjNE87j2ILAlxz87gYVEAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINlEQDJdFASTRQEg2URAMl0UBJNFASDZREAyXRQEk0UBINvOBDktvZ/Wk0t+N7gNF9hkjuxvt5NHfj9f0Kc8GbdZ0hjD9JLjJFczG+dhjfA8z8yLRtDifX+xXngjdrvm0OJ9e2DDxhnymY47Fl4BnHbTM/tgy8YL5tbBlYYL5tbBlYaB9bBirXsWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOCd+Qef/CpSumCKqAAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1629,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1639,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="26">4114</text></g></g><g transform="matrix(1,0,0,1,1649,910)"><image width="60" height="117" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAB1CAYAAAASq4LWAAAA4klEQVR4nO3RwQmDQBgF4deCFVmQZWhDaSodKLmZg/ujmLNIxvlgYUUPDi+RJEmSJOk2azuPYTCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXT44CHJO0nfno/BfXs33PBfl5myBb7a8zH41e7jDf91mS7Jki2szx5c96V9g3JceT3dUeuWLsmcPbbOHOC6ZcxvMHLdcl4ZvW45roxet3RJPu3g1y1THrJu6fKgdSVJkiRJkiRJkqS/8AU63qlImmK3KQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,999,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1009,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27" y="14" width="27" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27" y="26">4113</text></g></g><g transform="matrix(1,0,0,1,1019,1082.5)"><image width="60" height="660" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAKUCAYAAABYLFvYAAADH0lEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXJcP/pqZy+H5Ofiyf5PxPffA6/58DL7u9+83/NfLnOce9Tszp3kEn/Z32/5Nys88Vt6e7rc3/tfLHFfenu65dZfbPGLXSa67rJWPJ7vuclw5ve5yXDm/7nKbD1l3Oc8HrQsAAAAAAAD8R38BoeHIJ4lL3AAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1019,872.5)"><image width="615" height="155" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAmcAAACbCAYAAAAnfTxaAAADXUlEQVR4nO3cMWrbcBjG4ZcOWbv0LCVXSM5gyCVayOijtCTHcPcWcpJC927qIBkJQ6eG/F9XzwMfSMbD355+fAglAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8DeHJMckz0l+JPmVZDLGGGOMubK5endJXjL+jzTGGGOMeY25Wu+TfMn6Q14yb84OSW6TfBh1MACAPfqaOcp+J/k8+CwAALt2lzXMPg4+CwDA7p2fMfs0+iAAAHt3yPqMGQAAgx0zx9lx7DEAAEjm95hNmTdoAAAM9j1znN2OPggAAOub/73HDACgwNW/PRcA4H8izgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAoIs4AAIqIMwCAIuIMAKCIOAMAKCLOAACKiDMAgCLiDACgiDgDACgizgAAiogzAIAi4gwAoIg4AwAY6F2Sh839ZZw9LN8BAOANPGWOscflfhtnj8v104BzAQDs0n3mAPuZ5CZrnN0sn03LdwAAeCPfsm7Ppovr08BzAQDs0nZ7Nl1c25oBAAxwyhpm57E1AwAY5Lw9246tGQDAQNvtma0ZAMBg2+2ZrRkAQIFTbM0AAGrcx9YMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP7BH0haW0peTNUuAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1099,2915.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#6aa84f" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1109,2946)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.98333740234375" y="0" width="75" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="2.98333740234375" y="12">A</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="9.98333740234375" y="0" width="68" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.98333740234375" y="12">gentUpdater</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,859,2055)"><image width="60" height="117" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAB1CAYAAAASq4LWAAAA4klEQVR4nO3RwQmDQBgF4deCFVmQZWhDaSodKLmZg/ujmLNIxvlgYUUPDi+RJEmSJOk2azuPYTCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXQG0xlMZzCdwXT44CHJO0nfno/BfXs33PBfl5myBb7a8zH41e7jDf91mS7Jki2szx5c96V9g3JceT3dUeuWLsmcPbbOHOC6ZcxvMHLdcl4ZvW45roxet3RJPu3g1y1THrJu6fKgdSVJkiRJkiRJkqS/8AU63qlImmK3KQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,575,2370)"><image width="60" height="152" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACYCAYAAAC4cYqKAAAA/UlEQVR4nO3RsW0CQRRF0V8MIbVQHmTU4s5w4B15hewQI989RxppVpvM1ZsBAACAt3ls5zAE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gmsuM/MxM+ftex983v5d/vxVL3Sdr8D79r0Pvm/36xve9TKn+Y48/3I/ve11L7Jf+fF0T6277Fd+Prl1l7Xy/iTXXX5aObvucpuDrLvsV86vu9zmIOsupznQugAAAAAAAPAvfAKtL++npB3SEgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1319,2312.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1329,2336)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0" y="12">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9" y="12">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="39" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="42" y="12">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48" y="12">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62" y="12">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="71" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="78" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="25.48333740234375" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28.48333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.48333740234375" y="26">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="38.48333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41.48333740234375" y="26">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.48333740234375" y="26">n</text></g><g><g/></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1099,2662.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1109,2685)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="15" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15" y="0.5" width="51" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="15" y="12.5">Prioritizer</text></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="15" width="81" height="15" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="12.98333740234375" y="15.5" width="55" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="12.98333740234375" y="27.5">Dynamics</text></g><g><g/></g><g><g/></g><g><g/></g><g><g/></g></g><g transform="matrix(1,0,0,1,1339,2372.5)"><image width="60" height="150" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACWCAYAAACCe+v6AAABAklEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7guH/w1M5fD83PwZf8m43vugdf9+Rh83e/fb/ivlznPPep3Zk7zCD7t77b9m5Sfeay8Pd1vb/yvlzmuvD3dc+sut3nErpNcd1krH0923eW4cnrd5bhyft3lNh+y7nKeD1oXAAAAAAAA+I/+ACMH6Yh8SnTOAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,549,2492.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,559,2529)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.98333740234375" y="26">201</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,584,2577.5)"><image width="574" height="115" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAj4AAABzCAYAAACYawg3AAADJUlEQVR4nO3cv6sNYBzH8U+mWyRl82MysIhJFrdr82O88h9IBrEpFotBkYTJH0CJTUnququNRQYTkx+ja7yG55zOxXofT8739apP99i+tndP954EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAObE+GQDA3BM+AEAZwgcAKEP4AABlCB8AoAzhAwCUIXwAgDKEDwBQhvABAMoQPgBAGcIHAChD+AAAZQgfAKAM4QMAlCF8AIAyhA8AUIbwAQDKED4AQBnCBwAoQ/gAAGUIHwCgDOEDAJSxlhY+W0cfAgDQ27u08Dk0+hAAgN6epoXP8uhDAAB6u5kWPldGHwIA0Nu5tPB5MvoQAIDedib5nhY/ZwbfAgDQ3YW08Hk/+hAAgH9hNS1+VpMsDr4FAKCrY2kvPtMvNHyQ5HiSvSOPAgDo6Xpm8TPdWtr3/ayYmZlZib1Icj/JpSSnk+zPHDuQ5GHaf/xT/g4hMzMzq7dXSY6mgK1p3+y8ZGZmZiV2MsnFJHeTPE/yMbMAupNkWwAA5tSWJDcyi5+VsecAAPR3MMmHtPg5P/gWAIDuzqaFz5ckOwbfAgDQ3bO0+Lk3+hAAgN6W0sLn9dgzAAD625MWPp9HHwIA8C/8SIsff9oOAMy9t2nhc3j0IQAAvT1PC59Tow8BAOhN+AAAZQgfAKAM4QMAlCF8AIAyhA8AUIbwAQDKED4AQBnCBwAoQ/gAAGUIHwCgDOEDAJQhfACAMoQPAFCG8AEAyhA+AEAZwgcAmGvLSbZPPv8ZPotJ9o04CgBgsx1PC52Xk39vDJ8jk8/rY04DANhcC0m+p8XNifwePo8nn28Nuw4AYJNdy+zVZxo+lzN77dk17jQAgM218dXnzeTn6uTn7YF3AQB0MX31+ZrZS896kt0jjwIA6GEhybf8Hj1eewCAuXU1XnsAgCIWkvxMi55Hg28BAOhu+rs+XnsAgLm3EL/bAwAU4nt7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPg//AIltrJNSWYXOgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1099,2492.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1109,2529)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.98333740234375" y="26">301</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1119,2577.5)"><image width="60" height="115" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABzCAYAAADE8mHLAAAA2UlEQVR4nO3RwQmDQBRF0U8WKc4mbMN+0oZpKE2YRWZwcC+G5zkwMIoLL68KAAAALrO1cxuC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0zyqah6ej8Fz+ybGq36BS3seg5d2f13wX6eZ6hf1qapn7cHP9m5r30R5177ydrivF/7XacaVt8M9bt1urT22n8h1u77yeGLX7caVo9ftxpXj1+3Wusm63VQ3WhcAAAAAAAD4R1/Ur6POqsVM5gAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1139.7106781186549,2577.5)"><image width="244" height="115" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPQAAABzCAYAAACvmi+eAAACV0lEQVR4nO3dMWtTYRTH4T+CHVwcVPBTCA5qnZ2aRXAOdHN1UejYUSh+h0Krq5PgEFdR6KRfwFns4qJbHN6EG+qivZaXe3weeOGmZDgp/Di9bUgTAAAAAAAAAAAAAAAAAACAC/MmyTLJrPcgwHiChkIEDYUIGgoRNBQiaChE0FCIoKEQQUMhgoZCBA2FCBoKETQUImgoRNBQiKChEEFDIYKGQgQNhQgaChE0FCJoKETQUIigoRBBQyEf0oK+33sQYLxvaUHf6D0IMM61tJhPew8CjHcvLeiPvQcBxnuRFvTL3oMA49xJi3mZ5HbnWYCR3qbF/Lz3IMD5PUzyKS3mL0kud50G+GNXktxK8ijJsySvMvyY/T7Jg36jXYx5kv0kx2m/6TvN8IIdp+L5nuRJitlJcpL+31zHucjzI8nnJK+THCR5nORmCrma5DDDCz5J29DzJNtJrvcaDPh7h2kh/0y7pwAmaidDzHc7zwKMtL5nftp7EGCceYZ7ZmDi9tOC3u87BvAvHKcFPe89CDDe+lMZtnsPAoy3fgeYvzNDAes3kgAFCBoKETQUImgoRNBQiKChEEFDIYKGQgQNhQgaChE0FCJoKETQUIigYcIuJdndeHw26N3Vc4AJOEoLeG/1eDPovdX1UYe5gHOYpUX7NclWhqC3Vl9brp4DTMS7DFt6eeZ60XEu4Bw2t/TyzLXtDBO0yO//wMt2holab+nNYzvDhG1uadsZJm5zS9vOUMAitjOUMYvtDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8V34Bn7Ig2zhaHcIAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1319,2492.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1329,2529)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.98333740234375" y="26">401</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1119,2722.5)"><image width="60" height="83" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABTCAYAAADDXmT9AAAAtklEQVR4nO3RwQmEMBRF0ccsLM4mbMN+bCM2NE1kFuaTT/aS4eUeCERx4eVJAAAAAABMU9tZBsHuCHZHsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7OYj6UjPY/DRvrFx6Qk823MOPtv9mvBfr9n1RH0lberBW3tX2zdWbvWV63AvE//rNXnlOtzt1g1FPTaO5bohVs7Hdt2QV7ZeN+SV7dcNRYusG3YttC4AAAAAAAAAAACAf/QDs8FkDo2kwjgAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1099,2775.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1109,2812)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.98333740234375" y="26">501</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1119,2860.5)"><image width="60" height="85" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABVCAYAAAAVB4fgAAAAuElEQVR4nO3RwQmEMBRF0ccsLM4mbMN+bCM2NE1kFuaTT/aS4eUeCERx4eVJAAAAAABMU9tZBsHuCHZHsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7I5gNx9JR3oeg4/2jY1LT+DZnnPw2e7XhP96za4n6itpUw/e2rvavrFyq69ch3uZ+F+vySvX4W63bijqsXEs1w2xcj6264a8svW6Ia9sv24oWmTdsGuhdQEAAAAAAAAAAAD8ox+PAmgKJB8EKgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,592,264)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="54" height="41" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="54" height="41" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="22" width="20" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="22" width="20" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="11" width="20" height="27" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="24px" font-style="normal" font-weight="normal" text-decoration="" line-height="27px" x="16.98333740234375" y="33">...</text></g><g><g/></g><g><g/></g></g><g transform="matrix(1,0,0,1,592,384)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="54" height="41" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="54" height="41" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="22" width="20" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="22" width="20" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="16.98333740234375" y="11" width="20" height="27" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="24px" font-style="normal" font-weight="normal" text-decoration="" line-height="27px" x="16.98333740234375" y="33">...</text></g><g><g/></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,679,1712.5)"><g><g transform="translate(0,0) scale(1.2,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(0.8333333333333334,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 120 0 Q 120 0 120 0 L 120 75 Q 120 75 120 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,689,1729)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="100" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.100006103515625" y="0" width="100" height="42" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.100006103515625" y="0" width="100" height="42" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.100006103515625" y="12">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7.100006103515625" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="10.100006103515625" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17.100006103515625" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24.100006103515625" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28.100006103515625" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.100006103515625" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34.100006103515625" y="12">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41.100006103515625" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52.100006103515625" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.100006103515625" y="12">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.10000610351562" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.10000610351562" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="80.10000610351562" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="87.10000610351562" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="90.10000610351562" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93.10000610351562" y="12">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.100006103515625" y="26">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7.100006103515625" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="10.100006103515625" y="26">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="17.100006103515625" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24.100006103515625" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.100006103515625" y="26">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.100006103515625" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40.100006103515625" y="26">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47.100006103515625" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="50.100006103515625" y="26">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56.100006103515625" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.100006103515625" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.10000610351562" y="26">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="75.10000610351562" y="26">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="82.10000610351562" y="26">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="93.10000610351562" y="26">p</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.083328247070312" y="40">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="38.08332824707031" y="40">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.08332824707031" y="40">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="52.08332824707031" y="40">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.08332824707031" y="40">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.08332824707031" y="40">s</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,689,1827.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,699,1864)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27.98333740234375" y="14" width="25" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27.98333740234375" y="14" width="25" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.98333740234375" y="26">1111</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,709,1772.5)"><image width="60" height="85" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABVCAYAAAAVB4fgAAAAuElEQVR4nO3RwQ2DMBBE0VEOFEeKoA36oY3QUJpwDuyKle/I0fg/yZJBHPgaCQAAAACAYVqcaRDsjmB3BLsj2B3B7gh2R7A7gt0R7I5gdwS7I9gdwe4IdvOStJXnPniLb2wcugL3eK7Be9yPAf/1mFVX1FfSojt4iXctvrFy6l65dffPwP96TF25dXe7dVOuXI/luilXrsd23VRXtl43vTXRuunUJOumVROtCwAAAAAAAAAAAOAf/QAMWGgONGWO9gAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1099,2312.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1109,2335)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.5" y="0.5" width="78" height="29" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="1.5" y="12.5">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="10.5" y="12.5">y</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="15.5" y="12.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="22.5" y="12.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="29.5" y="12.5">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40.5" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="43.5" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="49.5" y="12.5">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="56.5" y="12.5">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="63.5" y="12.5">R</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="72.5" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="7.5" y="27.5">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="14.5" y="27.5">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="21.5" y="27.5">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="24.5" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="31.5" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="35.5" y="27.5">D</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="44.5" y="27.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="48.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="51.5" y="27.5">v</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="56.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="59.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="66.5" y="27.5">g</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,839,2142.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,849,2179)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27.48333740234375" y="14" width="26" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="27.48333740234375" y="14" width="26" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.48333740234375" y="26">2111</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1389,2142.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1399,2179)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">2212</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1409,2042.5)"><image width="60" height="130" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACCCAYAAAAaPKt3AAAA7ElEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa7LB3/NzOXw/Bx82b/J+J574HV/PgZf9/v3G/7rZc5zj/qdmdM8gk/7u23/JuVnHitvT/fbG//rZY4rb0/33LrLbR6x6yTXXdbKx5NddzmunF53Oa6cX3e5zYesu5zng9YFAAAAAAAA/qM/lDHBsHyyiiMAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1139.7106781186549,2227.5)"><image width="314" height="115" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAToAAABzCAYAAAAIYs5MAAACe0lEQVR4nO3cMWuTURTH4T+CHVwcVPBTCA5qnZ2aRXAOdHN1UejYURC/Q6HV1UlwqKsodNIv4Czq4KJbHG7CG7Ka67XH54ELb0qGkww/TtIkCQAAAAAAAAAAAAAAAAAAAAAAAADn1OskiySz0YMA9CJ0QHlCB5QndEB5QgeUJ3RAeUIHlCd0QHlCB5QndEB5QgeUJ3RAeUIHlCd0QHlCB5QndEB5QgeUJ3RAeUIHlCd0QHlCB5QndEB5QgeUJ3RAeUIHlPc+LXR3Rw8C0MvXtNBdGz0IQA9X0iL3ffQgAL3cSQvdh9GDAPTyPC10L0YPAtDDrbTILZLcHDwLQBdv0iL3dPQgANt2P8nHtMh9TnJx6DQAf+hSkhtJHiR5kuRlpper75LcGzdaH/Mkh0lO0v7D8i3TA3Yc5/85P5I8SjF7Sc4y/sl1HOfvn59JPiV5leRZkodJrqeQy0mOMj3gs7SNbp5kN8nVUYMBbMtRWuB+pb02ByhlL1Pkbg+eBaCL1Xtyj0cPAtDDPNN7cgAlHaaF7nDsGAD9nKSFbj56EIBeVr8Wujt6EIBeVt948Dk5oKzVB4QByhI6oDyhA8oTOqA8oQPKEzqgPKEDyhM6oDyhA8oTOqA8oQPKEzqgPKEDyhM6oJwLSfbXbm+Gbn95H4Bz6zgtbAfL2+uhO1heHw+YC2BrZmkx+5JkJ1PodpZ/WyzvA3Cuvc201S02rk8HzgWwNetb3WLj2jYHlHGaKXKrY5sDSlltdevHNgeUs77V2eaAkta3OtscUNZpbHNAcbPY5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD45/wGicmsUIm3WyQAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,874,2227.5)"><image width="284" height="115" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARwAAABzCAYAAABKIb3bAAACiklEQVR4nO3dL2vVURzH8U8RhkGDCqLRLhicWgSxOIugddmqQQ1aFkXcc1CYf5pJEJtFpizpA/AB6IplthnOHb9p3e73wLmvFxzuXfukN2e/XXYTAAAAAAAAAAAAAAAAAAAAAJiL3dkBmDvBAcoIDlBGcIAyggOUERygjOAAZQQHKCM4QBnBAcoIDlBGcIAyggOUERygjOAAZQQHKCM4QBnBAcoIDlBGcIAyggOUERygjOAAZQQHKCM4QJnttOCc7D0EGN+XtOBc7j0EGN9GWnBWew8BxreWFpy1vjOARbCaFpyt3kOAxbCVFp2HvYcA41tJC85OkuXOW4AF8CItOn+SPOg7BRjd8SQvM30QcCvtQfJq2p/MfU4HOHQrmZ7pOI7T5+wk+Z7kXZJnSe4mOZ2BrabdcDaSbGb6RLLjOH3O7yT3AnDIjiY5n+R2kkdJXmcKz+ck1/tNAxbBrSTf0qLzI8mRvnOARfAhLTpPew8Bxncx069XFzpvARbAelpwXvUeAozvUlpwvvQeAozvRFpwtnsPARbDr7TonOo9BBjfZlpwrvQeAozvfVpwbvYeAoxPcIAyggOUERygjOAAZQQHKCM4QBnBAcoIDlBGcIAyggOUERygjOAAZQQHmKs7SY7N3v8fnKtJzvUYBYznWlpgPs5+3h+c5Uz/WB3gwJYyfQPujfwbnLez98+7rQOG8yTTLWcvOPcz3W7O9JsGjGb/Lefr7PXT7HW94y5gUHu3nJ+Zbja7Sc72HAWMaSnTNzbsHbcbYG4ex+0GKLKUZCctNm86bwEWwN6zHLcbYO6W4tkNUMjnbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAg/sLETZwkCEFaMMAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1119,2372.5)"><image width="60" height="150" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACWCAYAAACCe+v6AAABAklEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7guH/w1M5fD83PwZf8m43vugdf9+Rh83e/fb/ivlznPPep3Zk7zCD7t77b9m5Sfeay8Pd1vb/yvlzmuvD3dc+sut3nErpNcd1krH0923eW4cnrd5bhyft3lNh+y7nKeD1oXAAAAAAAA+I/+ACMH6Yh8SnTOAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,604.7,1505)"><image width="729" height="835" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtkAAANDCAYAAAB4xwMPAAARd0lEQVR4nO3csYqm9R2G4YcVNpUnYbGFXdgmp+CCpU2aLey3SkCxsZKAnUcg2FopbBHXM1AsAwmxENKkTSMITopvhhm2UveWl3m5LnhgvmWK33T3/tmdDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4N74YtvVtrePPgQAAM5CZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBATGQDAEBMZAMAQExkAwBA7MuJbAAASP1jl8h+8+hDAADgLH7aJbIfHn0IAACcwRu7BPb3Rx8CAABn8cEukf33ow8BAICz+GaXyP7r0YcAAMAZ/GWXwP7m6EMAAOAM3t324y6R/dbBtwAAwL32p21f7RLXV9s+PfSa38mDbY+2Pdn2bNuHZmZmZmbh/rbt823fbfvfbuP639v+vJN5uu2f237e7Q9qZmZmZvZ77z/bPtr22k7k8bbnu/0hf94ltp9v+2TH/03HzMzMzM6197e9s+2P217fCT3dbVz/cP35waEXAQDAPfaHXcL6atvH158BAIBX8PEugf386EMAAOAMHu/2n4k8PvgWAAA4hWe7BPa3Rx8CAABn8ckukf3s6EMAAOAsbn5l35OjDwEAgLP41y6R/ejoQwAA4Cxu/tOj34kNAACRm8gGAAAiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAGIiGwAAYiIbAABiIhsAAF7Rg21P73x+ObKfXn8PAADwC322S1S/d/35bmS/d/31ZwfcBQAA99aTXUL6v9se7jayH17/2dX19wAAAL/C17t9zb566esXB94FAAD31t3X7KuXvvaKDQAAv9GL3Qb2zbxiAwDAK7h5zb47r9gAAPCK7r5me8UGAIDA3ddsr9gAABB5Ma/YAACQejKv2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzb/g+dXYT8RCwbagAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,689,1445)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,699,1468)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="30" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2" y="0.5" width="77" height="29" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="2" y="12.5">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="9" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="12" y="12.5">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="23" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="26" y="12.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="29" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="36" y="12.5">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40" y="12.5">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="46" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="53" y="12.5">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="60" y="12.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="63" y="12.5">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="69" y="12.5">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="72" y="12.5">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="6.5" y="27.5">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="13.5" y="27.5">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="20.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="27.5" y="27.5">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="34.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="37.5" y="27.5">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="40.5" y="27.5">u</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="47.5" y="27.5">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="54.5" y="27.5">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="57.5" y="27.5">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="64.5" y="27.5">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="15px" x="71.5" y="27.5">l</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,689,1540)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,699,1576)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.48333740234375" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.48333740234375" y="26">1713</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,709,1505)"><image width="60" height="65" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABBCAYAAACNQMdtAAAAoElEQVRoge3RwQnDMBBE0SEHF+cU4Tbcj9uIG0oTysG7eNHdKIz+g4WV0EHDSAAAAAAADNNipkFgdwR2R2B3BHbzkrSVcx94izc2Dl0B9zjXwHvsx4B/PWbVFeoradEdeIm7Fm+snLpbbt3+Gfivx9SWW7fbtZuy5TqW7aZsuY5tu6m2bN1uemuidtOpSdpNqyZqFwAAAAAAAAAAAMA/+gEkw0A2IUgGsgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,709,1625)"><image width="60" height="117" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAB1CAYAAAASq4LWAAAA4UlEQVR4nO3RwQmDQBgF4deCFVmQZcSGbCodRJKTObg/WbyLZJwPFlb04PASSZIkSZIus7VzGwbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUxnMJ3BdAbTGUyHD56SPJOM7bkPHtu76YL/Os2cPXBpz33w0u6PC/7rNEOSNXvYmF9w3df2DUq/8na4o9Yt/cr9eQW4bqmV+4NctxxXRq9b+pXR65YhySfJOzdYt8y5ybplyI3WlSRJkiRJkiRJkv7CF9ioqU0eWdoUAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,575,1575)"><image width="129" height="765" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIEAAAL9CAYAAAAM3wXDAAAGS0lEQVR4nO3YMWobURRA0UsKt26yluAt2NmCwJtIwKWW4mAvI+kT8EoCqZNOKWaEBlUBg37Gcw58GAkVT5rLQ0wBAAAAAAAA/M921b56rn5Uv6qD809n9W6rl8b/kGs+q3VdPXb6Ii9Nm2BX3VTvRw3G5Xxpuvl/qs+DZ2GA26YAflcfBs/CIMf/AJ9GD8IYu07/AdiofVME+7FjMNJzUwS70YMwzvemCG5GD8I4xyeBngNs2OqfcvF6IkAEiIBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhIBiYBEQCIgEZAISAQkAhLBJr2r7hevzyO4nz/DG/bUdNMf5tfLCB7m66cBc3FBd003+md11SmCq/m9w/wZ3rhvnbbB4ez668C5uKDlNjicXdsCG3LcBstjC2zMcRssjy2wQcttYAts1MdsAZq2gS2wcXfZAgAAAAAAAAAAAAAAAAAAACvxFzdMUmTQeXm7AAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,724,1912.5)"><image width="174" height="112" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAK4AAABwCAYAAACHOEuxAAACRUlEQVR4nO3cr2vVURzG8SeKRZgMLDMIgskqmNyioMH5H8iKCAqGJZFF/wBFMSvIYEUNpgmiYrWJyR9JUcPApMxw7rhOcXLS8TNfLzjce9sT3hy+3As3AQAAAAAAAAAAAChvc3KgFOFSknApSbiUJFxKEi4lCZeShEtJwqUk4VKScClJuJQkXEoSLiUJl5KES0nCpSThUpJwKUm4lCRcShIuJQmXkoRLSe/Twp0bPQR6PE4Ld37wDuhyOy3cpdFDoMdyWrjXRg+BHqfSwv2UZGbwFuiymhbvjdFDoMeRTL8WuzJ4C3S5mmm8q2kxQwnn0551twJeT/vWYTnJYpITTrlzPMls/gMzac+6m86uOp+TvEhyJ8np7GJzaT9KLKV9VbaWdgM7tc7zJB/ze8h3kxwK/OP2JzmW5FKSjbR4vye5PHIU9DiQ6S+mm0kOj50DfW6mhXtv9BDoMZvkS1q8ZwZvgS4X0sJdGz0EehxNC/fl6CHQY29auF9HD4Fe79LiPTh6CPRYTwt3YfQQ6PEwLdyTo4dAD+FSknApSbiUJFxKEi4lCZeShEtJwqUk4VKScClJuJQkXErYk+RpkpXJ51/DfZvk+oBdsKOFtFA3kuzL9nAvTt4/G7YOdvAgLdCVbA/3zeT94rhp8Gc/37qPJu9vxW1LAVu37uvJ64fJ69mRo+Bvtm7db5n+q43blhLuZ/uf4bltKWE+02hfDd4CXZ6khXtu9BDosRDPthTl2RYAAAAAAAAAAAAAAAAAAAAAAACA3eUHXJaQ2Ls8Dd0AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1389,1982.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#76a5af" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1399,2006)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.5" y="0" width="80" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0.5" y="0" width="80" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="0.5" y="12">P</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="8.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="12.5" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.5" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.5" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="32.5" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="35.5" y="12">z</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="47.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="51.5" y="12">S</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="69.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="76.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="31.98333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="34.98333740234375" y="26">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="41.98333740234375" y="26">g</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,769,685)"><image width="426" height="1095" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAaoAAARHCAYAAACibScNAAAQ9klEQVR4nO3cMW5UZxiG0U8UaWnIVoJZgmELI7EJkKCbpSDhZZAepFlJItfQJcWVNWRyaYji/wGfI339O7KlR5474xkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPgeh5k5zszNzHyamduZ+cs55+LHA3A9M6dZ/8vmnHPfc/zEHs/Muzn/sE+z/UV1mJmrmXmyahgAzJwj9WVmXq+dAgD/dD3nSP22eAsA/MvdM6lXq4cAwKXDnJ9JAUDOcbZQHdfOAIB9N7OF6rB6CADs+ThbqK5WDwGAPXf/ccL3pABI8m1uANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoA0oQIgTagASBMqANKECoCsJ7NF6nb1EADYczVbqD6uHgIAew6zhepm9RAA2HOcLVTHtTMAYN9ptlAdVg8B4NtezMz7mXm0esg9ezVbpE6rhwCw78XM/D7nj2e/XDvnXj2dmc+zve7rxVsAuHAZqD9m5s3SRffr9cx8me21v1s7BYCvfStQv6wc9T/7dWaezfYM6jjnZ1J3kXq8ahgAZ5eBeuh3Gm/3AaQ8n5kPsz4QK+52Zj7N9j2p4/h0H0DaZbD+nJm383O/9QfAD2gvWA/pwxQA/CAug/Vy7RwA2Pd8HuYXfgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOC/+xve7ivGEVIo1AAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,759,685)"><image width="436" height="827" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAbQAAAM7CAYAAAAiTWViAAANG0lEQVR4nO3cPapdBRiG0ZcUWto4hkwgIAFHkIwhkBmkUrAM2GmXEShkDKm0V4i1oJWWgqVglVhsk+u/eK+w731YC77idB+bw3nYf2cDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC4Lh5se7zt6bYvt/247aUxxlzzgdfubXu+87+UxhhzmYG9te2TXXwpnu84Q3uw7e62t89aDAD+i093hOznbe+fvAsAXMq9XcTsnZN3AYBLe3XP7L2zFwGAy3qwi3tmAHBjPd4RtMfnrgEAV/N0R9AenL0IAFzFFzuCdvfsRQDgKl79A4j3zAC40bxdD0CCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAGQIGgAJAgaAAmCBkCCoAFw492aoAEQcHtHzL49exEAuIr7O4L27OxFAOAqHu0I2pOzFwGAq/hqR9Aenb0IAFzWnV08EHLn5F0A+Bv3t32+48f63ZN3ua6e7Tg+H5+9CAB/9tuQvdz2w44n+bjw5raPdhyf73/9DMA1cX/bZ/t9yD7Y9saZS10zt7Y93PbdLo7Tw1M3AuC1+9u+3sUP9E87wvbhtsdmT3ZcWvxm24tdHKdnc98M4Fr446VF8+/zYkfYnJUBXEPO0P55Hu04Rrd3XHIE4JpzDw2AlL8Km6ccAbixvIcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP+HXwCR3ysEWJJ1SQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,215,1137.5)"><image width="110" height="565" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAAI1CAYAAAA3jc/mAAAFcElEQVR4nO3YMWoVURiG4Q8LWxv3olvQNQTchIJllqKYZWivkJUI9nZaXC+xEgOB4b15Hpj+P/MyZ+bMBgAAAAAAAAAAAABcnCfbPm17ffQg3M+bbb/+XJ8nYMr7bd8nYNLTPaKAV9uut91s+7btx+4WfUnXxQR8te12x99Q4f7Ts20fdreg252euKttL7c9P2qwB3DRW+XHnRb0c9u7g2d5SBcbbDttj+doLw6e5SH9fRz4sgsKdnZ+p709epAHdtEH8KvdvdMIud4p3PWxY3BfNzuFuzp6EO7n607hXh49CPdz/iNSPqc9SufPZWKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEixIuSrgo4aKEAwAAAAAAgH/7DWf8nfrIsnM8AAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,295,1130)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,305,1154)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1" y="0" width="79" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1" y="0" width="79" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1" y="12">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="7" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="14" y="12">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="21" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="24" y="12">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40" y="12">C</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="56" y="12">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="63" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="70" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="77" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.5" y="26">U</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="38.5" y="26">n</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.5" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.5" y="26">t</text></g></g><g transform="matrix(1,0,0,1,331,1772.5)"><image width="249" height="593" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPkAAAJRCAYAAACHnxE6AAAHMklEQVR4nO3ZIW4VURSA4ZMK2Ek38CQ76Ca6g2pkE1wl3Qs1ZQloEnCVeGxB3Ne8BIeYTPLP9yVHPHeu+PNm5s4AAAAAAAAAAAAAAAAAAMB/+3MeIErkECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQJ3KIEznEiRziRA5xIoc4kUOcyCFO5BAncogTOcSJHOJEDnEihziRQ5zIIU7kECdyiBM5xIkc4kQOcSKHOJFDnMghTuQQ9xb51d6LANv4OSvy670XAbbxNCvym70XAbbxeVbkd3svAmzjblbk3/ZeBNjGaS4f30477wJs5GFW5F/2XgR28mFWA18n+n3q/cy8zDrkw/k3HMn1zPyay1Pt8wRjv53LAV/Ov92dcyTvZubjxGM/zXpkfzvg68z8mHXN9jgz98YcYD7Nivv3XFr4PrHYb2fF/TqXQxpjgu/sV7PeVW5mXbXdG3OAOcQ/ORzRId7J4aj+/bqeeyyHo8vfkwMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGzqL57u7Jn33+fhAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,296,1687.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,306,1724)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.5" y="14" width="28" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="26.5" y="14" width="28" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.5" y="26">8301</text></g></g><g transform="matrix(1,0,0,1,314.99999999999994,1190)"><image width="60" height="527" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAIPCAYAAAAvjb1YAAACmUlEQVR4nO3RwWnDQBRF0d+C05ALchl2Q2kqHdhklyysIcJZG4ebc2BghLTQ5c0AAADAy3xt598QXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wXT74NDMfM3PcnvfBx+3d6QX/9TSXuQe+b8/74Pftfn7Bfz3NYWZucw87zk/wut+2b1L2K3893FPrLoeZuc5P7DrXCa67nOd3cHLd5XHl9LrLfuX0usthZj63k193ucw/WXd52w4AAAAAAADwV3wDFG/aQ2A+h6cAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,180,1687.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,190,1724)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="29.98333740234375" y="14" width="21" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="29.98333740234375" y="26">283</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,200,1757.5)"><image width="365" height="620" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAW0AAAJsCAYAAAA2tfIaAAAJJ0lEQVR4nO3aoYpUARSA4aNhg/gaZqv4Bm612AyCTYxuNxgMIj7CdoPJsPsSVm2CwQewapgd7rAIs0Xv/MP3wYE7TDnp53BnZgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBfOb0aAAIurgaAA3c6M7+vxrUNcOAuZom2axvggO1e2a5tgAO3e2W7tgEO2PbK/jlLsLfPrm2AA7O9ss9mifb2+XLFvQC4ZvfKPpkl2ifj2gY4OOezXNYzS7Rnlmv7fIW9APiL2zPzdOfzbrTn6rvb/3UjAG7serQBOGCiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRAi2gAhog0QItoAIaINECLaACGiDRCyjfattRcBYL9vs4n2vbUXAWC/z7OJ9qO1FwFgvw+zifaLtRcBYL+Xs4n2+7UXAWC/B7P8GHl/5V0AuIF3s4n2p7UXAWC/uzPzYzbhfr3yLgDcwLNZXpN8nZkn664DwD4PZ+Zylnj/mpkvM/NxZt7OzJkxxhzZHIXnM/N9lngbY8yxzlG5M5t/lDyemVcz88YYY45sAAAAAAAAAAAAAAAAAAAAAAAAOFZ/AJITCNUquJr0AAAAAElFTkSuQmCC" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1180,490)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1190,514)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.5" y="0" width="78" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="1.5" y="0" width="78" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="1.5" y="12">P</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.5" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="16.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20.5" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="27.5" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="38.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="45.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="48.5" y="12">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="55.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="59.5" y="12">s</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="66.5" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="73.5" y="12">V</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="23.98333740234375" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.98333740234375" y="26">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="37.98333740234375" y="26">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="40.98333740234375" y="26">c</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.98333740234375" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="49.98333740234375" y="26">e</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1629,1712.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#ffe599" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1639,1736)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.5" y="0" width="76" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="2.5" y="0" width="76" height="28" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="2.5" y="12">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="9.5" y="12">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="12.5" y="12">g</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19.5" y="12">o</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.5" y="12">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="30.5" y="12">i</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.5" y="12">h</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43.5" y="12">m</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54.5" y="12">_</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="61.5" y="12">L</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="68.5" y="12">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="75.5" y="12">t</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.98333740234375" y="26">e</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="22.98333740234375" y="26">r</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="26.98333740234375" y="26">a</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.98333740234375" y="26">l</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="36.98333740234375" y="26">A</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="43.98333740234375" y="26">f</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="46.98333740234375" y="26">d</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.98333740234375" y="26">m</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,1265,685)"><image width="394" height="1095" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYoAAARHCAYAAADtMCTdAAAPVklEQVR4nO3bMYpdBRiG4Q8L2zRxKxqXMLqFgWwiActZSsRZhvYJZCVC+nRaHIYhMLxNEs/N9Xng7//iwsu5/zkbAAAAAAAAAAAAAAAAAAAAAAAAAAAA1+cfY8w3Px+2vd12v+1u2+3gCzr7B26M+TrzftvNAGDb820vdjxJ3O2IxEMwft/27LTNALhYr7Z93BGLN+euAsCl+mmPsfA3FABPer3HmwUAPOnhZuFtKACedLcjFHfnrgHApbrdEYr7sxcB4DK92BGKd2cvAsBler4jFB/OXgSAy/XwAR4APEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKAJBQAJKEAIAkFAEkoAEhCAUASCgCSUACQhAKA9GFHKJ6fvQgAl+ndjlC8OHsRAC7T/Y5Q3J69CACX6W5HKO7OXQOAS3W7IxTvz14EgMv1fkcsXp+9yJX5btsf2345exGAz3WzIxQft/148i7X5OUeXz/+a9uv564D8Hne7DEWr85d5ar8tu3vCQZwBZ7tMRYPN4u7HTeMn7f9cNZiV+D7CQZwRW72eLMwX38EA/hm3e54orjf9naPX3CbLzt/zrEb4H/vqb+eBAKAbQIBQHi5T28RAgHAJ3xwBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADwX/sXgtrr9jGjfZ4AAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1429.7106781186549,1912.5)"><image width="264" height="100" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAABkCAYAAAB6t65qAAACLUlEQVR4nO3coW6TURjH4T8jGYbbYGgyxRWQ1CNQM+gKDEOBISHB7QIws1jAlBsggaA3FEGhUQg+xPnar2s5YgRyTrrnSd6kX9WrfjtdT5oAAAAAAAAAAAAAAAAAAAAA8I+9STIkmbVeBOiPQABVAgFUCQRQJRBAlUAAVQIBVAkEUCUQQJVAAFUCAVQJBFAlEECVQABVAgFUCQRQJRBAlUAAVQIBVAkEUCUQQNXbCARQcZYSiNutFwH6ci3Jr5RAXG+8C9CZWylxOG+9CNCfpymBeNd6EaA/n1IC8aj1IkBfHqfE4UPrRYC+PEzyMyUQ9xrvAnTibpJFShiGJK/arvN/7CU5SLnYMU/yzBjzx3mR5HWSz0l+ZArDlyQPsmOOUi51LL+3NcZcbr4leZ7yR3ZnHGa6DjqkBOJsfO8k7SttTK/zJMn9JHeS3MwOOsoUhq/j807VD/g7N1KiMCR5OT4DJClRGFI+SgCsHGb6aHHYeBegM/OUOHxsvQjQn5OUQMxbLwL0x6/cAFXnKYE4aL0I0J/lPyjdeQC2LAMBsEUggJW9lGvUS5uBcMUarrDTlCAcj8/rgTgeX5822AvowCwlAt+T7GcKxP74nq884Yp7n+kUMWy8XjTcC+jA+ili2Hjt9ABc+L285Tg9AEmmU8T6OD0AK+unCKcH4IL1U4TTA7BlEacHoGIWpwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuvEbvYUsAxNYgGAAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1629,1827.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="1.7976931348623157e+308" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1639,1864)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="25" y="14" width="31" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="25" y="14" width="31" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="28" y="26">1512</text></g></g><g transform="matrix(1,0,0,1,1649,1772.5)"><image width="60" height="85" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABVCAYAAAAVB4fgAAAAuElEQVR4nO3RwQmEMBRF0ccsLM4mbMN+bCM2NE1kFuaTT/aS4eUeCERx4eVJAAAAAABMU9tZBsHuCHZHsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7I5gNx9JR3oeg4/2jY1LT+DZnnPw2e7XhP96za4n6itpUw/e2rvavrFyq69ch3uZ+F+vySvX4W63bijqsXEs1w2xcj6264a8svW6Ia9sv24oWmTdsGuhdQEAAAAAAAAAAAD8ox+PAmgKJB8EKgAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1649,1082.5)"><image width="60" height="660" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAKUCAYAAABYLFvYAAADH0lEQVR4nO3RwW3CQBRF0a8sKI4maIN+0gZpKE04CzzCYo+ILudII40tL3z1ZgAAAOBttv18DMF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXCe4TnCd4DrBdYLrBNcJrhNcJ7hOcJ3gOsF1gusE1wmuE1wnuE5wneA6wXWC6wTXCa4TXJcP/pqZy+H5Ofiyf5PxPffA6/58DL7u9+83/NfLnOce9Tszp3kEn/Z32/5Nys88Vt6e7rc3/tfLHFfenu65dZfbPGLXSa67rJWPJ7vuclw5ve5yXDm/7nKbD1l3Oc8HrQsAAAAAAAD8R38BoeHIJ4lL3AAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,550,862.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#fff2cc" stroke="none" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,560,893)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="20" y="0" width="41" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="20" y="12">ADAS</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="54" y="12">1</text></g></g><g transform="translate(0,0) matrix(1,0,0,1,680,862.5)"><g><g transform="translate(0,0) scale(1,0.75)"><g><path fill="#fff2cc" stroke="none" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 100 Q 100 100 100 100 L 0 100 Q 0 100 0 100 L 0 0 Q 0 0 0 0 Z"/><g transform="scale(1,1.3333333333333333)"><path fill="none" stroke="none" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 0 0 L 100 0 Q 100 0 100 0 L 100 75 Q 100 75 100 75 L 0 75 Q 0 75 0 75 L 0 0 Q 0 0 0 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,690,893)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="19.98333740234375" y="0" width="41" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="19.98333740234375" y="12">ADAS</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="53.98333740234375" y="12">2</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,550,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,560,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.48333740234375" y="26">XY</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,570,922.5)"><image width="60" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABpCAYAAABmv0A2AAAAzklEQVR4nO3RwQmDQBRF0U8WKc4mbMN+0oZpKE2YRWZwcC+G5zkwMIoLL68KAAAALrO1cxuC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4DSPqpqH52Pw3L6J8apf4NKex+Cl3V8X/NdppvpFfarqWXvws73b2jdR3rWvvB3u64X/dZpx5e1wj1u3W2uP7Sdy3a6vPJ7Ydbtx5eh1u3Hl+HW7tW6ybjfVjdYFAAAAAAAA/tEX0WmP4uj468YAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,700,922.5)"><image width="60" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABpCAYAAABmv0A2AAAAzklEQVR4nO3RwQmDQBRF0U8WKc4mbMN+0oZpKE2YRWZwcC+G5zkwMIoLL68KAAAALrO1cxuC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4HSC0wlOJzid4DSPqpqH52Pw3L6J8apf4NKex+Cl3V8X/NdppvpFfarqWXvws73b2jdR3rWvvB3u64X/dZpx5e1wj1u3W2uP7Sdy3a6vPJ7Ydbtx5eh1u3Hl+HW7tW6ybjfVjdYFAAAAAAAA/tEX0WmP4uj468YAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,680,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,690,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.48333740234375" y="26">XY</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,585,1082.5)"><image width="184" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAACECAYAAAAji+ERAAACU0lEQVR4nO3dMU4UcRjG4benAmt6O06g6AGs8AoUygFoTDSRxgNo4xGMJpxAuQINB9DYUUq0wuK/m52gJZMJL8+T/JPZQPGR/PItmdlkEwAAAAAAAAAAAADgP65XByoJnGoCp5rAqSZwqgmcagKnmsCpJnCqCZxqAqeawKkmcKoJnGoCp5rAqSZwqgmcagKnmsCpJnCqCZxqAqeawKkmcKoJnGoCp5rAqSZwqgmcagKnmsCpJnCqCZxqPzIC3116EJjDt4zAny48B8ziY0bgh0sPAnM4zgj83dKDwByeZQR+mWRn4VlgFp8yIn+/9CAwh4fZ3C58tfAsMIvX2UT+KSN6qPIy43/xdehfM+6yHCc5SPLEqT17SbZyD+wk+ZBN5M79Ot+zWWzV7+K7GQ9/DjNuIX7J+MOdznOe5Cr/Bv8mUGS92Kbv4hdJHi05FMzhcZKzjMjPFp4FZnOREfmLpQeBOTzPCPwyyYOFZ4FZrJ92+1AelXwoj2oHGYF/XnoQmMNeRuDnSw8Cc9jKCPxq6UFgLusHP1BJ4FQTONUETjWBU03gVBM41QRONYFTTeBUEzjVBE41gVNN4FQTONUETjWBU03gVBM41QRONYFTTeBUEzhVjpL8TLK/ej0NfH/1s6MF5oJbcZIR9Onq9TTw09X12wXmgluxnc3XmuxnE/j6+mr1O3BnTbf49Y1r25s7b7rFp+dXbG9KrLf49Nje1Li5xW1v6ky3uO1Nne0kf5L8ju1NqZPY3hTbju0NAAAAAAAAAAAAAAAAAAAAAAAAAAC36y8Ay8xNAd4i7QAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,709,1082.5)"><image width="60" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAACECAYAAADMZUhqAAABrElEQVR4nO3aL0tkcRTG8afYtkwwyiIiJuumxcHo27AKNpNRwy5YfQEbjIap2owGg5qMBougwT8oG8Zw7o+52D0Hn/v9wIUZNDxfDqKoEgAAAAAAX2LaPYNBsDuC3RHsjmB3BLsj2B3B7gh2R7A7gt0R7I5gdwS7I9gdwe4Idje44CdF8I/qIVluFcEL1UOyXCqCV6uHZDlTBK9VD8lypAjeqh6SZVMRfFw9JMtPRfBj9ZBMV4roP9VDsvzW7AeQQ0kbtXNybGsWPZX0IOmfpMXKUV9tRdKOZt+qppJOSxclWpJ0rYj+W7wlTfvafq4ekulCEb1ePSTLgSJ4r3pIll1F8En1kCy/FMHn1UOyLCuCb6qHZJlXBN9XD8kypwj+Xz0k0+B+0UewO4LdEeyOYHcEuyPYHcHuCHZHsDuC3RHsZkvSnaRx974fPO4+ZvVvTvuKwEn3vh88keFfE0eSXhVhY82C2+vX7nOs9K88/fTa6rpN/8r950WG123alfuP5XWbz1e2vm7Tv7L1dZuRpHdJbxrAdZt9DeS6zUgDui4AAAAAAAAAAADwLXwA/kPPF0t0X/cAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="translate(0,0) matrix(1,0,0,1,1200,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1210,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.48333740234375" y="26">XY</text></g><g><g/></g></g><g transform="translate(0,0) matrix(1,0,0,1,1330,997.5)"><g><g transform="translate(0,0) scale(1,1)"><g><g transform="scale(1,1)"><path fill="#c9daf8" stroke="none" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z"/><path fill="none" stroke="#333333" stroke-dasharray="2,2" d="M 50 0 L 100 50 L 50 100 L 0 50 L 50 0 Z" stroke-miterlimit="10" stroke-width="2"/></g></g></g></g></g><g transform="matrix(1,0,0,1,1340,1034)"><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="28" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="0" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="15.48333740234375" y="0" width="50" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="15.48333740234375" y="12">Channel</text><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="62.48333740234375" y="12">:</text></g><g><g/></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="0" y="14" width="81" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g></g><g><g><rect fill="rgb(0,0,0)" stroke="none" x="33.48333740234375" y="14" width="14" height="14" fill-opacity="0"/></g><text fill="rgb(0, 0, 0)" stroke="none" font-family=""Arial"" font-size="12px" font-style="normal" font-weight="normal" text-decoration="" line-height="14px" x="33.48333740234375" y="26">XY</text></g><g><g/></g></g><g transform="matrix(1,0,0,1,735.7106781186548,922.5)"><image width="674" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqIAAABpCAYAAADhsUGtAAADEElEQVR4nO3dL4tUYRjG4bsIg0GDCqLRLhhctQhicS2C1snWNahBy0YR9zsorH+aSRCbRXZlk34AP4C7BsvYxvCe5ezadx6Z97rg4ZxpT/zxzpkzCQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIP5MAAAsFBCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJ7aSF6unoRAAD6sp0WolerFwEAoC+baSE6rV4EAIC+rKeF6HrtGgAA9GaaFqI71YsAANCfnbQYfVS9CAAAfVlNC9E/SVaKdwEAoDMv02J0luRh7SoAAPTkZJJXGV9wv5P2A6Zp2qudvGcUAIAjtZrxmVFjjDHGGFM/syTfk7xP8jzJ/SRns8SmaSeim0m2Mv4DkzHGGGOMqZ/fSdYCAABH6HiSi0nuJnmc5E3GIP2S5GbdagAA9OZOkm9pMfojybHadQAA6M3HtBh9Vr0IAAB9uZzxa/pLxbsAANCZjbQQfV29CAAAfbmSFqLb1YsAANCXU2kh+qt6EQAA+rObFqNnqhcBAKAvW2kheq16EQAA+vIhLURvVy8CAEBfhCgAACWEKAAAJYQoAAAlhCgAACWEKAAAJYQoAAAlhCgAACWEKAAAJYQoAAAlhCgAACWEKAAAJYQoAAAlhCgAACWEKAAAJYQoAAAlhCgAACWEKAAAJYQoAAALcy/JieH+3xC9nuRCxVIAACy3G2nh+Wn4fDBEV4b7ec1qAAAss0mSvbTYvJXDIfpuuH9Rth0AAEvtacZT0f0QfZDxNPRc3WoAACyzg6eiX4fr5+G6UbgXAAAd2D8V/ZnxJHSe5HzlUgAALL9Jkt0cjlCnoQAALMSTOA0FAKDAJMksLULfFu8CAEBn9p8VdRoKAMBCTeLZUAAAinhvKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPzP/gLjKWXGhJIHewAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,605.7106781186548,922.5)"><image width="674" height="105" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAqIAAABpCAYAAADhsUGtAAADDUlEQVR4nO3dP4+MURjG4buRTBQUSIRSL1FYNBLRWI2EdmotBQqaLUXsdyBZfzqVRHQa2ZWp+AA+AKvQjG4V5528S23nkTnXlTyZme4pfznzzpkEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAwd4wAACwVEIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAEkIUAIASQhQAgBJCFACAErtpIXq8ehEAAPqykxaiF6sXAQCgL1tpITqtXgQAgL5spIXoRu0aAAD0ZpoWorPqRQAA6M8sLUbvVy8CAEBf1tNC9FeSteJdAADozLO0GJ0nuVe7CgAAPTma5HnGC+5naT9gmqZd7eSeUQAADtR6xmdGjTHGGGNM/cyTfEnyJsmTJLeTnMwKm6adiG4l2c74D0zGGGOMMaZ+fia5EwAAOECHk5xNcjPJgyQvMwbpxyRX61YDAKA3N5J8TovRr0kO1a4DAEBv3qXF6OPqRQAA6Mv5jF/TnyveBQCAzmymheiL6kUAAOjLhbQQ3aleBACAvhxLC9Ef1YsAANCf72kxeqJ6EQAA+rKdFqKXqhcBAKAvb9NC9Hr1IgAArL5bSY4M7/8O0ctJzlQsBQDAaruSFp7vh8/7Q3Qt492iAADwT02S7KbF5rX8GaKvh/dPy7YDAGClPcp4KroI0bsZT0NP1a0GAMAq238q+ml4/TC8bhbuBQBABxanot8ynoTuJTlduRQAAKtvkvEy+8U4DQUAYCkexmkoAAAFJknmaRH6qngXAAA6s3hW1GkoAABLNYlnQwEAKOLeUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPif/QYndGXGk5Y5zQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1235,1082.5)"><image width="114" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHIAAACECAYAAABMFn95AAACL0lEQVR4nO3cMU5UURSH8a+nGqzp7ViBji7ACrdAoSyAymgCjQvQxiUQTFiBsgUaFqCxs2RiNxbnTd6EiQW5xJv7z/dLXvImUJzhm8MwbzKAJEmSJEmSJEmSFGU9HRqcIUMYMoQhQxgyhCFDGDKEIUMYMoQhQxgyhCFDGDKEIUMYMoQhQxgyhCFDGDKEIUMYMoQhQxgyhCFDGDKEIUMYMoQhQxgyhCFDGDKEIUMYMoQhQ/ykQh70HkRtvlMhX3aeQ42+UCGPew+iNqdUyI+9B1GbV1TI38B+51nU6IKK+bn3IGrzlPllyLvOs6jRe+aYF1RcDeot9Vy5CfqN+qv2FDgCXgQch8DeP+5/lH3quXIdfvxgfqBG//Y5oC4SHFMvTb5Sd3z04wZYsRv2w6P81PTfbR6on5hj3gLPeg6lNs+BayrmdedZ9AhuqZhveg+iNq+Zr3I96TyLGm2ucvkmwuB8EyHEERXysvcganNIhbzpPYja7FEhV70HUbvNBQINzpAhDBnCkCEMGcKQIQwZwpAhDBnCkCEMGcKQIQwZwpAhDBnCkCEMGcKQIQwZwpAhDBnCkCEMOagT4BewnG5vh1xOXzvpMJce6JwKdzXd3g55NZ2fdZhLD7Rg/jj6kjnk5nw1fY8GsL2V63vnbuNAFsAdu/8k4g63cThn7IZ0Gwd0fyvdxoFtb6XbOLAF8Gc63MbBneM2RljgNkqSJEmSJEmSJEmSJEmSJEmSJEmZ/gL4rEDVqaJRVQAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,1289,1082.5)"><image width="106" height="132" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAACECAYAAAB4b75lAAACKUlEQVR4nO3bPW4TYRRG4dOnMtT07rICMFkAVdgCBWQBVAikpIE+NFkCP1JWgLIEaLIAEF3KWHShuGONZeMRDfq+15xHGmksp7ijoyvNjByQJEmSJEmSJEmSJt0NhzpnqBCGCmGoEIYKYagQhgphqBCGCmGoEIYKYagQhgphqBCGCmGoEIYKYagQhgphqBCGCmGoEIYKYagQhgphqBCGCmGoEIYKYagQhgphqBCGCmGoAA+oSD9aD6JpR1SoL60H0bRnVKiL1oNo2lsq1MvWg2i3e8ANFepJ41k04ZyK9KH1INrtFeNt+bzxLPqDOfCRMdKbptP8YwfAIfA44DimbhQuqFvwVaAb4PlfXm+MOeOFfme82NTjnLqR2Cuv2b7QJfCNCtf78Rl4Rz0vHVFvIvbKQ+CaMc579vRC011Rga6AR41n0Q4vqEjXrQfRbvcZn9afNp5FE1YvKX1a75wvKUN8okIdtx5E075SoQ5bD6JpSyrUQetBNM0feoQwVAhDhTBUCEOFMFQIQ4UwVAhDhTBUCEOFMFQIQ4UwVAhDhTBUCEOFMFQIQ4UwVAhDhTBUCEN16gT4CSyGz+uhFsN3Jw3m0oYzKszl8Hk91OVwftpgLm2YMf46dsEYanW+HP5GHVjfqruNc7epIzPglu1/qr7FberOKduh3KYObW6V29Sx9a1ymzo2A34Nh9vUuTPcpggz3CZJkiRJkiRJkiRJkiRJkiRJkvQ/+g0eKDDk2DYzegAAAABJRU5ErkJggg==" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,565,732.5)"><image width="65" height="160" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAACgCAYAAABT7wFiAAAB+klEQVR4nO3bsU0jURRA0SMHSyc0QBdugg6IqYEQSqAHSNgSaGDJCLcIvMH37FhebeovMfdKI9lEz4fnsceyqaqqqqqqqqoLdTgemy4EISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAlaE3exBZvZhIFzPHmRmrwbCfvYgM3s0EO5mDzKzOwPhffYgM7uxnhxvJs8ytQcD4XX2IDO7wqcB8XC8v8lurU+Lz+P9Tb53uMGLFeMLv4ynyZNxEt0b7ym+PdCt8eC/rCDnxwJ0O2nGi7Uz/ut7YwuejK04B3qx0VeWnbEFywn1YANb8b+urC+xnzb8ysJ6DfIwe5CZ9c7z2Lsuxv5ejD3OHmRme12DuDYQPmYPMrOdPrhFCAgBISAEhIAQEAJCQAgIASEgBISAEBACQkAICAEhIASEgBAQAkJACAgBISAEhIAQEAJCQAgIASFgowjLF72XzhE28eORZ+NB3x/vnyLcH28/T5jroi1f4PyNH1aEH8e/beaHpz+t23A4u/02ca6LdroNh7Pbm9iCpTf//k5qM1uwtGzD6bGpLVg63YbNbcHS6TZscguW3mx4C5b2Nr4FVVVVVVVVVVVVVVVVVVX1HfsDNMUV02SCizcAAAAASUVORK5CYII=" transform="translate(0,0)"/></g><g transform="matrix(1,0,0,1,565,732.5)"><image width="195" height="160" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMMAAACgCAYAAACxH9heAAACcElEQVR4nO3dMU4bQRiG4U8u4CZcgFtwCd+AmpKakhwhd4CGHIELhI4yh8Ap5nPWIlGqiFGY55FG8iIXU/Duv16v5AQAAAAAAAAAAAAAgP/AoQuWJwYoMUCJAUoMUGKAEgOUGKDEACUGKDFAiQFKDFBigBIDlBigxAAlBigxQIkBSgxQYoASA5QYoMQAJQYoMUCJAUoMUGKAEgOUGKDEACUGKDFAiQFKDFBigBIDlBigxAAlBigxQIkBSgxQYoASA9Qxht3sjcBsLxkxXMzeCMz2mBHD1eyNwGz3GTFcz94IzHadEcPz7I3AbJfZPkRfTt4LTHeXEcPj7I3AbOdJXjOCuOsxLGuf7XLptce+e2BZl0keskXxluR7xuXTlyS3lpVx0+Uq47upT3/C3GdE8JYtDMv60zqeMPf55HYZ9V9lnA1uLSvjKuExv58wH+KOJAvbZUyF4w2YQxaYEvA359lu0b/GHUn49azb3eyNwGyeaIATzxkxePiT5R0f/ryfvRGY7SojBs+6sbyLjBheZm8EZttl+xANyxMDlBigxAAlBigxQIkBSgxQYoASA5QYoMQAJQYoMUCJAUoMUGKAEgOUGKDEACUGKDFAiQFKDFBigBIDlBigxAAlBigxQIkBSgxQYoASA5QYoMQAJQaWtUuyPzl+H8O+74FP72vGP/9Nj09juOnrrxP2BR/u+EPoP5KcZYvhrH879D2whG/ZpsPh3eunifuCD3c6HQ7vXpsKLOcpWwjHZSqwpON0OF2mAss6nQ6mAks7nQ6mAst7iqkAScZEMBUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4J/4CbDEGWCqGRLjAAAAAElFTkSuQmCC" transform="translate(0,0)"/></g></g></svg> \ No newline at end of file diff --git a/sim/doc/source/advanced_topics/simulator/images/DynamicsModules.png b/sim/doc/source/advanced_topics/simulator/images/DynamicsModules.png new file mode 100644 index 0000000000000000000000000000000000000000..e0d971fc1db70aa970ff1989066cf01a9aed4056 Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/DynamicsModules.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/GetObstruction.png b/sim/doc/source/advanced_topics/simulator/images/GetObstruction.png new file mode 100644 index 0000000000000000000000000000000000000000..2afac5cd2c1ce378dc2e8366837538a43b64a044 Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/GetObstruction.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/Localization1.png b/sim/doc/source/advanced_topics/simulator/images/Localization1.png new file mode 100644 index 0000000000000000000000000000000000000000..82ed72706556bc937ce0e3bce4a18970cd998123 Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/Localization1.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/Localization2.png b/sim/doc/source/advanced_topics/simulator/images/Localization2.png new file mode 100644 index 0000000000000000000000000000000000000000..4ff5b85151d8daa42a276dba6d5de343060fb521 Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/Localization2.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/LocalizationBasics.svg b/sim/doc/source/advanced_topics/simulator/images/LocalizationBasics.svg new file mode 100644 index 0000000000000000000000000000000000000000..0a01784a84b5740ea3d68a51ac88b5daf2611571 --- /dev/null +++ b/sim/doc/source/advanced_topics/simulator/images/LocalizationBasics.svg @@ -0,0 +1,1323 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg version="1.2" width="210.71mm" height="114.81mm" viewBox="1929 4700 21071 11481" preserveAspectRatio="xMidYMid" fill-rule="evenodd" stroke-width="28.222" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" xmlns:ooo="http://xml.openoffice.org/svg/export" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:presentation="http://sun.com/xmlns/staroffice/presentation" xmlns:smil="http://www.w3.org/2001/SMIL20/" xmlns:anim="urn:oasis:names:tc:opendocument:xmlns:animation:1.0" xml:space="preserve"> + <defs class="ClipPathGroup"> + <clipPath id="presentation_clip_path" clipPathUnits="userSpaceOnUse"> + <rect x="1929" y="4700" width="21071" height="11481"/> + </clipPath> + <clipPath id="presentation_clip_path_shrink" clipPathUnits="userSpaceOnUse"> + <rect x="1950" y="4711" width="21029" height="11459"/> + </clipPath> + </defs> + <defs> + <font id="EmbeddedFont_1" horiz-adv-x="2048"> + <font-face font-family="Liberation Sans embedded" units-per-em="2048" font-weight="normal" font-style="normal" ascent="1852" descent="423"/> + <missing-glyph horiz-adv-x="2048" d="M 0,0 L 2047,0 2047,2047 0,2047 0,0 Z"/> + <glyph unicode="‘" horiz-adv-x="239" d="M 127,952 L 127,1098 C 127,1163 133,1220 146,1269 158,1318 178,1364 207,1409 L 328,1409 C 265,1318 233,1230 233,1147 L 322,1147 322,952 127,952 Z"/> + <glyph unicode="y" horiz-adv-x="980" d="M 191,-425 C 142,-425 100,-421 67,-414 L 67,-279 C 92,-283 120,-285 151,-285 263,-285 352,-203 417,-38 L 434,5 5,1082 197,1082 425,484 C 428,475 432,464 437,451 442,438 457,394 482,320 507,246 521,205 523,196 L 593,393 830,1082 1020,1082 604,0 C 559,-115 518,-201 479,-257 440,-314 398,-356 351,-383 304,-411 250,-425 191,-425 Z"/> + <glyph unicode="x" horiz-adv-x="980" d="M 801,0 L 510,444 217,0 23,0 408,556 41,1082 240,1082 510,661 778,1082 979,1082 612,558 1002,0 801,0 Z"/> + <glyph unicode="u" horiz-adv-x="874" d="M 314,1082 L 314,396 C 314,325 321,269 335,230 349,191 371,162 402,145 433,128 478,119 537,119 624,119 692,149 742,208 792,267 817,350 817,455 L 817,1082 997,1082 997,231 C 997,105 999,28 1003,0 L 833,0 C 832,3 832,12 831,27 830,42 830,59 829,78 828,97 826,132 825,185 L 822,185 C 781,110 733,58 679,27 624,-4 557,-20 476,-20 357,-20 271,10 216,69 161,128 133,225 133,361 L 133,1082 314,1082 Z"/> + <glyph unicode="t" horiz-adv-x="531" d="M 554,8 C 495,-8 434,-16 372,-16 228,-16 156,66 156,229 L 156,951 31,951 31,1082 163,1082 216,1324 336,1324 336,1082 536,1082 536,951 336,951 336,268 C 336,216 345,180 362,159 379,138 408,127 450,127 474,127 509,132 554,141 L 554,8 Z"/> + <glyph unicode="s" horiz-adv-x="927" d="M 950,299 C 950,197 912,118 835,63 758,8 650,-20 511,-20 376,-20 273,2 200,47 127,91 79,160 57,254 L 216,285 C 231,227 263,185 311,158 359,131 426,117 511,117 602,117 669,131 712,159 754,187 775,229 775,285 775,328 760,362 731,389 702,416 654,438 589,455 L 460,489 C 357,516 283,542 240,568 196,593 162,624 137,661 112,698 100,743 100,796 100,895 135,970 206,1022 276,1073 378,1099 513,1099 632,1099 727,1078 798,1036 868,994 912,927 931,834 L 769,814 C 759,862 732,899 689,925 645,950 586,963 513,963 432,963 372,951 333,926 294,901 275,864 275,814 275,783 283,758 299,738 315,718 339,701 370,687 401,673 467,654 568,629 663,605 732,583 774,563 816,542 849,520 874,495 898,470 917,442 930,410 943,377 950,340 950,299 Z"/> + <glyph unicode="r" horiz-adv-x="530" d="M 142,0 L 142,830 C 142,906 140,990 136,1082 L 306,1082 C 311,959 314,886 314,861 L 318,861 C 347,954 380,1017 417,1051 454,1085 507,1102 575,1102 599,1102 623,1099 648,1092 L 648,927 C 624,934 592,937 552,937 477,937 420,905 381,841 342,776 322,684 322,564 L 322,0 142,0 Z"/> + <glyph unicode="q" horiz-adv-x="927" d="M 484,-20 C 347,-20 246,26 182,119 118,212 86,351 86,536 86,913 219,1102 484,1102 566,1102 634,1088 687,1059 740,1030 785,981 821,914 L 823,914 C 823,934 824,969 827,1018 830,1067 832,1093 835,1096 L 1008,1096 C 1003,1057 1001,958 1001,801 L 1001,-425 821,-425 821,14 825,178 823,178 C 787,107 743,56 690,26 637,-5 569,-20 484,-20 Z M 821,554 C 821,695 798,799 752,867 706,935 633,969 532,969 441,969 375,935 335,867 295,799 275,691 275,542 275,391 295,282 336,217 376,152 441,119 530,119 632,119 706,155 752,228 798,301 821,409 821,554 Z"/> + <glyph unicode="p" horiz-adv-x="927" d="M 1053,546 C 1053,169 920,-20 655,-20 488,-20 376,43 319,168 L 314,168 C 317,163 318,106 318,-2 L 318,-425 138,-425 138,861 C 138,972 136,1046 132,1082 L 306,1082 C 307,1079 308,1070 309,1054 310,1037 312,1012 314,978 315,944 316,921 316,908 L 320,908 C 352,975 394,1024 447,1055 500,1086 569,1101 655,1101 788,1101 888,1056 954,967 1020,878 1053,737 1053,546 Z M 864,542 C 864,693 844,800 803,865 762,930 698,962 609,962 538,962 482,947 442,917 401,887 371,840 350,777 329,713 318,630 318,528 318,386 341,281 386,214 431,147 505,113 607,113 696,113 762,146 803,212 844,277 864,387 864,542 Z"/> + <glyph unicode="o" horiz-adv-x="980" d="M 1053,542 C 1053,353 1011,212 928,119 845,26 724,-20 565,-20 407,-20 288,28 207,125 126,221 86,360 86,542 86,915 248,1102 571,1102 736,1102 858,1057 936,966 1014,875 1053,733 1053,542 Z M 864,542 C 864,691 842,800 798,868 753,935 679,969 574,969 469,969 393,935 346,866 299,797 275,689 275,542 275,399 298,292 345,221 391,149 464,113 563,113 671,113 748,148 795,217 841,286 864,395 864,542 Z"/> + <glyph unicode="n" horiz-adv-x="874" d="M 825,0 L 825,686 C 825,757 818,813 804,852 790,891 768,920 737,937 706,954 661,963 602,963 515,963 447,933 397,874 347,815 322,732 322,627 L 322,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 358,972 406,1025 461,1056 515,1087 582,1102 663,1102 782,1102 869,1073 924,1014 979,955 1006,857 1006,721 L 1006,0 825,0 Z"/> + <glyph unicode="m" horiz-adv-x="1457" d="M 768,0 L 768,686 C 768,791 754,863 725,903 696,943 645,963 570,963 493,963 433,934 388,875 343,816 321,734 321,627 L 321,0 142,0 142,851 C 142,977 140,1054 136,1082 L 306,1082 C 307,1079 307,1070 308,1055 309,1040 310,1024 311,1005 312,986 313,950 314,897 L 317,897 C 356,974 400,1027 450,1057 500,1087 561,1102 633,1102 715,1102 780,1086 828,1053 875,1020 908,968 927,897 L 930,897 C 967,970 1013,1022 1066,1054 1119,1086 1183,1102 1258,1102 1367,1102 1447,1072 1497,1013 1546,954 1571,856 1571,721 L 1571,0 1393,0 1393,686 C 1393,791 1379,863 1350,903 1321,943 1270,963 1195,963 1116,963 1055,934 1012,876 968,817 946,734 946,627 L 946,0 768,0 Z"/> + <glyph unicode="l" horiz-adv-x="187" d="M 138,0 L 138,1484 318,1484 318,0 138,0 Z"/> + <glyph unicode="i" horiz-adv-x="187" d="M 137,1312 L 137,1484 317,1484 317,1312 137,1312 Z M 137,0 L 137,1082 317,1082 317,0 137,0 Z"/> + <glyph unicode="g" horiz-adv-x="927" d="M 548,-425 C 430,-425 336,-402 266,-355 196,-309 151,-243 131,-158 L 312,-132 C 324,-182 351,-220 392,-247 433,-274 486,-288 553,-288 732,-288 822,-183 822,27 L 822,201 820,201 C 786,132 739,80 680,45 621,10 551,-8 472,-8 339,-8 242,36 180,124 117,212 86,350 86,539 86,730 120,872 187,963 254,1054 355,1099 492,1099 569,1099 635,1082 692,1047 748,1012 791,962 822,897 L 824,897 C 824,917 825,952 828,1001 831,1050 833,1077 836,1082 L 1007,1082 C 1003,1046 1001,971 1001,858 L 1001,31 C 1001,-273 850,-425 548,-425 Z M 822,541 C 822,629 810,705 786,769 762,832 728,881 685,915 641,948 591,965 536,965 444,965 377,932 335,865 293,798 272,690 272,541 272,393 292,287 331,222 370,157 438,125 533,125 590,125 640,142 684,175 728,208 762,256 786,319 810,381 822,455 822,541 Z"/> + <glyph unicode="e" horiz-adv-x="980" d="M 276,503 C 276,379 302,283 353,216 404,149 479,115 578,115 656,115 719,131 766,162 813,193 844,233 861,281 L 1019,236 C 954,65 807,-20 578,-20 418,-20 296,28 213,123 129,218 87,360 87,548 87,727 129,864 213,959 296,1054 416,1102 571,1102 889,1102 1048,910 1048,527 L 1048,503 276,503 Z M 862,641 C 852,755 823,838 775,891 727,943 658,969 568,969 481,969 412,940 361,882 310,823 282,743 278,641 L 862,641 Z"/> + <glyph unicode="d" horiz-adv-x="927" d="M 821,174 C 788,105 744,55 689,25 634,-5 565,-20 484,-20 347,-20 247,26 183,118 118,210 86,349 86,536 86,913 219,1102 484,1102 566,1102 634,1087 689,1057 744,1027 788,979 821,914 L 823,914 821,1035 821,1484 1001,1484 1001,223 C 1001,110 1003,36 1007,0 L 835,0 C 833,11 831,35 829,74 826,113 825,146 825,174 L 821,174 Z M 275,542 C 275,391 295,282 335,217 375,152 440,119 530,119 632,119 706,154 752,225 798,296 821,405 821,554 821,697 798,802 752,869 706,936 633,969 532,969 441,969 376,936 336,869 295,802 275,693 275,542 Z"/> + <glyph unicode="c" horiz-adv-x="901" d="M 275,546 C 275,402 298,295 343,226 388,157 457,122 548,122 612,122 666,139 709,174 752,209 778,262 788,334 L 970,322 C 956,218 912,135 837,73 762,11 668,-20 553,-20 402,-20 286,28 207,124 127,219 87,359 87,542 87,724 127,863 207,959 287,1054 402,1102 551,1102 662,1102 754,1073 827,1016 900,959 945,880 964,779 L 779,765 C 770,825 746,873 708,908 670,943 616,961 546,961 451,961 382,929 339,866 296,803 275,696 275,546 Z"/> + <glyph unicode="a" horiz-adv-x="1060" d="M 414,-20 C 305,-20 224,9 169,66 114,123 87,202 87,302 87,414 124,500 198,560 271,620 390,652 554,656 L 797,660 797,719 C 797,807 778,870 741,908 704,946 645,965 565,965 484,965 426,951 389,924 352,897 330,853 323,793 L 135,810 C 166,1005 310,1102 569,1102 705,1102 807,1071 876,1009 945,946 979,856 979,738 L 979,272 C 979,219 986,179 1000,152 1014,125 1041,111 1080,111 1097,111 1117,113 1139,118 L 1139,6 C 1094,-5 1047,-10 1000,-10 933,-10 885,8 855,43 824,78 807,132 803,207 L 797,207 C 751,124 698,66 637,32 576,-3 501,-20 414,-20 Z M 455,115 C 521,115 580,130 631,160 682,190 723,231 753,284 782,336 797,390 797,445 L 797,534 600,530 C 515,529 451,520 408,504 364,488 330,463 307,430 284,397 272,353 272,299 272,240 288,195 320,163 351,131 396,115 455,115 Z"/> + <glyph unicode="]" horiz-adv-x="424" d="M 16,-425 L 16,-296 249,-296 249,1355 16,1355 16,1484 423,1484 423,-425 16,-425 Z"/> + <glyph unicode="[" horiz-adv-x="425" d="M 146,-425 L 146,1484 553,1484 553,1355 320,1355 320,-296 553,-296 553,-425 146,-425 Z"/> + <glyph unicode="P" horiz-adv-x="1086" d="M 1258,985 C 1258,852 1215,746 1128,667 1041,588 922,549 773,549 L 359,549 359,0 168,0 168,1409 761,1409 C 919,1409 1041,1372 1128,1298 1215,1224 1258,1120 1258,985 Z M 1066,983 C 1066,1165 957,1256 738,1256 L 359,1256 359,700 746,700 C 959,700 1066,794 1066,983 Z"/> + <glyph unicode="3" horiz-adv-x="980" d="M 1049,389 C 1049,259 1008,158 925,87 842,16 724,-20 571,-20 428,-20 315,12 230,77 145,141 94,236 78,362 L 264,379 C 288,212 390,129 571,129 662,129 733,151 785,196 836,241 862,307 862,395 862,472 833,532 774,575 715,618 629,639 518,639 L 416,639 416,795 514,795 C 613,795 689,817 744,860 798,903 825,962 825,1038 825,1113 803,1173 759,1217 714,1260 648,1282 561,1282 482,1282 418,1262 369,1221 320,1180 291,1123 283,1049 L 102,1063 C 115,1178 163,1268 246,1333 328,1398 434,1430 563,1430 704,1430 814,1397 893,1332 971,1266 1010,1174 1010,1057 1010,967 985,894 935,838 884,781 811,743 715,723 L 715,719 C 820,708 902,672 961,613 1020,554 1049,479 1049,389 Z"/> + <glyph unicode="2" horiz-adv-x="980" d="M 103,0 L 103,127 C 137,205 179,274 228,334 277,393 328,447 382,496 436,544 490,589 543,630 596,671 643,713 686,754 729,795 763,839 790,884 816,929 829,981 829,1038 829,1115 806,1175 761,1218 716,1261 653,1282 572,1282 495,1282 432,1261 383,1220 333,1178 304,1119 295,1044 L 111,1061 C 124,1174 172,1263 255,1330 337,1397 443,1430 572,1430 714,1430 823,1397 900,1330 976,1263 1014,1167 1014,1044 1014,989 1002,935 977,881 952,827 914,773 865,719 816,665 721,581 582,468 505,405 444,349 399,299 354,248 321,200 301,153 L 1036,153 1036,0 103,0 Z"/> + <glyph unicode="1" horiz-adv-x="900" d="M 156,0 L 156,153 515,153 515,1237 197,1010 197,1180 530,1409 696,1409 696,153 1039,153 1039,0 156,0 Z"/> + <glyph unicode="0" horiz-adv-x="980" d="M 1059,705 C 1059,470 1018,290 935,166 852,42 729,-20 567,-20 405,-20 283,42 202,165 121,288 80,468 80,705 80,947 120,1128 199,1249 278,1370 402,1430 573,1430 739,1430 862,1369 941,1247 1020,1125 1059,944 1059,705 Z M 876,705 C 876,908 853,1056 806,1147 759,1238 681,1284 573,1284 462,1284 383,1239 335,1149 286,1059 262,911 262,705 262,505 287,359 336,266 385,173 462,127 569,127 675,127 753,174 802,269 851,364 876,509 876,705 Z"/> + </font> + </defs> + <defs class="TextShapeIndex"> + <g ooo:slide="id1" ooo:id-list="id3 id4 id5 id6 id7 id8 id9 id10 id11 id12 id13 id14 id15 id16 id17 id18 id19 id20 id21 id22 id23 id24 id25 id26 id27 id28 id29 id30 id31 id32 id33 id34 id35 id36 id37 id38 id39 id40 id41 id42 id43 id44 id45 id46 id47 id48 id49 id50 id51 id52 id53 id54 id55 id56 id57 id58 id59 id60 id61 id62 id63 id64 id65 id66 id67 id68 id69 id70 id71 id72 id73 id74 id75 id76 id77 id78 id79 id80 id81 id82 id83 id84 id85 id86"/> + </defs> + <defs class="EmbeddedBulletChars"> + <g id="bullet-char-template-57356" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 580,1141 L 1163,571 580,0 -4,571 580,1141 Z"/> + </g> + <g id="bullet-char-template-57354" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 8,1128 L 1137,1128 1137,0 8,0 8,1128 Z"/> + </g> + <g id="bullet-char-template-10146" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 174,0 L 602,739 174,1481 1456,739 174,0 Z M 1358,739 L 309,1346 659,739 1358,739 Z"/> + </g> + <g id="bullet-char-template-10132" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 2015,739 L 1276,0 717,0 1260,543 174,543 174,936 1260,936 717,1481 1274,1481 2015,739 Z"/> + </g> + <g id="bullet-char-template-10007" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 0,-2 C -7,14 -16,27 -25,37 L 356,567 C 262,823 215,952 215,954 215,979 228,992 255,992 264,992 276,990 289,987 310,991 331,999 354,1012 L 381,999 492,748 772,1049 836,1024 860,1049 C 881,1039 901,1025 922,1006 886,937 835,863 770,784 769,783 710,716 594,584 L 774,223 C 774,196 753,168 711,139 L 727,119 C 717,90 699,76 672,76 641,76 570,178 457,381 L 164,-76 C 142,-110 111,-127 72,-127 30,-127 9,-110 8,-76 1,-67 -2,-52 -2,-32 -2,-23 -1,-13 0,-2 Z"/> + </g> + <g id="bullet-char-template-10004" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 285,-33 C 182,-33 111,30 74,156 52,228 41,333 41,471 41,549 55,616 82,672 116,743 169,778 240,778 293,778 328,747 346,684 L 369,508 C 377,444 397,411 428,410 L 1163,1116 C 1174,1127 1196,1133 1229,1133 1271,1133 1292,1118 1292,1087 L 1292,965 C 1292,929 1282,901 1262,881 L 442,47 C 390,-6 338,-33 285,-33 Z"/> + </g> + <g id="bullet-char-template-9679" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 813,0 C 632,0 489,54 383,161 276,268 223,411 223,592 223,773 276,916 383,1023 489,1130 632,1184 813,1184 992,1184 1136,1130 1245,1023 1353,916 1407,772 1407,592 1407,412 1353,268 1245,161 1136,54 992,0 813,0 Z"/> + </g> + <g id="bullet-char-template-8226" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 346,457 C 273,457 209,483 155,535 101,586 74,649 74,723 74,796 101,859 155,911 209,963 273,989 346,989 419,989 480,963 531,910 582,859 608,796 608,723 608,648 583,586 532,535 482,483 420,457 346,457 Z"/> + </g> + <g id="bullet-char-template-8211" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M -4,459 L 1135,459 1135,606 -4,606 -4,459 Z"/> + </g> + <g id="bullet-char-template-61548" transform="scale(0.00048828125,-0.00048828125)"> + <path d="M 173,740 C 173,903 231,1043 346,1159 462,1274 601,1332 765,1332 928,1332 1067,1274 1183,1159 1299,1043 1357,903 1357,740 1357,577 1299,437 1183,322 1067,206 928,148 765,148 601,148 462,206 346,322 231,437 173,577 173,740 Z"/> + </g> + </defs> + <defs class="TextEmbeddedBitmaps"/> + <g class="SlideGroup"> + <g> + <g id="container-id1"> + <g id="id1" class="Slide" clip-path="url(#presentation_clip_path)"> + <g class="Page"> + <g class="com.sun.star.drawing.LineShape"> + <g id="id3"> + <rect class="BoundingBox" stroke="none" fill="none" x="22591" y="10991" width="19" height="1319"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,12300 L 22600,12265"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,12229 L 22600,12194"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,12158 L 22600,12123"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,12087 L 22600,12052"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,12016 L 22600,11981"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11945 L 22600,11910"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11874 L 22600,11839"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11804 L 22600,11768"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11733 L 22600,11697"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11662 L 22600,11626"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11591 L 22600,11555"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11520 L 22600,11484"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11449 L 22600,11414"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11378 L 22600,11343"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11307 L 22600,11272"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11236 L 22600,11201"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11165 L 22600,11130"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11094 L 22600,11059"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,11023 L 22600,11000"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id4"> + <rect class="BoundingBox" stroke="none" fill="none" x="3091" y="10291" width="19" height="2019"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,12300 L 3100,12265"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,12229 L 3100,12194"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,12158 L 3100,12123"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,12087 L 3100,12052"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,12016 L 3100,11981"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11945 L 3100,11910"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11874 L 3100,11839"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11804 L 3100,11768"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11733 L 3100,11697"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11662 L 3100,11626"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11591 L 3100,11555"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11520 L 3100,11484"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11449 L 3100,11414"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11378 L 3100,11343"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11307 L 3100,11272"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11236 L 3100,11201"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11165 L 3100,11130"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11094 L 3100,11059"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,11023 L 3100,10988"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10953 L 3100,10917"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10882 L 3100,10846"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10811 L 3100,10775"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10740 L 3100,10704"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10669 L 3100,10633"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10598 L 3100,10562"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10527 L 3100,10492"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10456 L 3100,10421"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10385 L 3100,10350"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 3100,10314 L 3100,10300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id5"> + <rect class="BoundingBox" stroke="none" fill="none" x="6691" y="10291" width="19" height="2019"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,12300 L 6700,12265"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,12229 L 6700,12194"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,12158 L 6700,12123"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,12087 L 6700,12052"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,12016 L 6700,11981"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11945 L 6700,11910"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11874 L 6700,11839"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11804 L 6700,11768"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11733 L 6700,11697"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11662 L 6700,11626"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11591 L 6700,11555"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11520 L 6700,11484"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11449 L 6700,11414"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11378 L 6700,11343"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11307 L 6700,11272"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11236 L 6700,11201"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11165 L 6700,11130"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11094 L 6700,11059"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,11023 L 6700,10988"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10953 L 6700,10917"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10882 L 6700,10846"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10811 L 6700,10775"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10740 L 6700,10704"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10669 L 6700,10633"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10598 L 6700,10562"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10527 L 6700,10492"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10456 L 6700,10421"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10385 L 6700,10350"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 6700,10314 L 6700,10300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id6"> + <rect class="BoundingBox" stroke="none" fill="none" x="10791" y="9391" width="19" height="2919"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,12300 L 10800,12265"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,12229 L 10800,12194"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,12158 L 10800,12123"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,12087 L 10800,12052"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,12016 L 10800,11981"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11945 L 10800,11910"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11874 L 10800,11839"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11804 L 10800,11768"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11733 L 10800,11697"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11662 L 10800,11626"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11591 L 10800,11555"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11520 L 10800,11484"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11449 L 10800,11414"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11378 L 10800,11343"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11307 L 10800,11272"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11236 L 10800,11201"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11165 L 10800,11130"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11094 L 10800,11059"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,11023 L 10800,10988"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10953 L 10800,10917"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10882 L 10800,10846"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10811 L 10800,10775"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10740 L 10800,10704"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10669 L 10800,10633"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10598 L 10800,10562"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10527 L 10800,10492"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10456 L 10800,10421"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10385 L 10800,10350"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10314 L 10800,10279"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10243 L 10800,10208"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10172 L 10800,10137"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10101 L 10800,10066"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,10031 L 10800,9995"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9960 L 10800,9924"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9889 L 10800,9853"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9818 L 10800,9782"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9747 L 10800,9711"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9676 L 10800,9640"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9605 L 10800,9570"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9534 L 10800,9499"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 10800,9463 L 10800,9428"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id7"> + <rect class="BoundingBox" stroke="none" fill="none" x="3100" y="10962" width="19501" height="801"/> + <path fill="rgb(0,0,0)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 12850,11762 L 3100,11762 3100,10962 22600,10962 22600,11762 12850,11762 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id8"> + <rect class="BoundingBox" stroke="none" fill="none" x="6699" y="7599" width="4103" height="2703"/> + <path fill="rgb(128,0,128)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 6700,10300 L 6700,7600 10800,7600 10800,9400 6700,10300 Z"/> + <path fill="none" stroke="rgb(52,101,164)" d="M 6700,10300 L 6700,7600 10800,7600 10800,9400 6700,10300 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id9"> + <rect class="BoundingBox" stroke="none" fill="none" x="3100" y="7600" width="3601" height="2701"/> + <path fill="rgb(129,212,26)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 4900,10300 L 3100,10300 3100,7600 6700,7600 6700,10300 4900,10300 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id10"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="7599" width="7703" height="3"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 3100,7600 L 10800,7600"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id11"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="8499" width="7703" height="3"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 3100,8500 L 10800,8500"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id12"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="9399" width="7703" height="3"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 3100,9400 L 10800,9400"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id13"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="10299" width="3603" height="3"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 3100,10300 L 6700,10300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id14"> + <rect class="BoundingBox" stroke="none" fill="none" x="3082" y="7582" width="37" height="2737"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 3100,7600 L 3100,10300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id15"> + <rect class="BoundingBox" stroke="none" fill="none" x="10782" y="7582" width="37" height="1837"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 10800,7600 L 10800,9400"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id16"> + <rect class="BoundingBox" stroke="none" fill="none" x="6682" y="7582" width="37" height="2737"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 6700,7600 L 6700,10300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id17"> + <rect class="BoundingBox" stroke="none" fill="none" x="6699" y="9399" width="4103" height="903"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 6700,10300 L 10800,9400"/> + </g> + </g> + <g class="com.sun.star.drawing.OpenBezierShape"> + <g id="id18"> + <rect class="BoundingBox" stroke="none" fill="none" x="10799" y="5299" width="8403" height="2303"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 10800,7600 C 14800,7600 16800,7600 19200,5300"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id19"> + <rect class="BoundingBox" stroke="none" fill="none" x="19182" y="5282" width="1337" height="1137"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 19200,5300 L 20500,6400"/> + </g> + </g> + <g class="com.sun.star.drawing.OpenBezierShape"> + <g id="id20"> + <rect class="BoundingBox" stroke="none" fill="none" x="10799" y="6399" width="9703" height="3003"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 10800,9400 C 15100,9400 17600,9200 20500,6400"/> + </g> + </g> + <g class="com.sun.star.drawing.ClosedBezierShape"> + <g id="id21"> + <rect class="BoundingBox" stroke="none" fill="none" x="10800" y="5300" width="9701" height="4101"/> + <path fill="rgb(255,84,41)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 10800,9400 C 10800,8800 10800,8200 10800,7600 14800,7600 16800,7600 19200,5300 19633,5667 20067,6033 20500,6400 17600,9200 15100,9400 10800,9400 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.OpenBezierShape"> + <g id="id22"> + <rect class="BoundingBox" stroke="none" fill="none" x="10799" y="5899" width="9103" height="2603"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 10800,8500 C 14800,8500 17100,8400 19900,5900"/> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id23"> + <rect class="BoundingBox" stroke="none" fill="none" x="3739" y="11000" width="2323" height="726"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="3989" y="11510"><tspan fill="rgb(0,0,0)" stroke="none">section[0]</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id24"> + <rect class="BoundingBox" stroke="none" fill="none" x="7589" y="11000" width="2323" height="726"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="7839" y="11510"><tspan fill="rgb(0,0,0)" stroke="none">section[1]</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id25"> + <rect class="BoundingBox" stroke="none" fill="none" x="15578" y="11000" width="2323" height="726"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="15828" y="11510"><tspan fill="rgb(0,0,0)" stroke="none">section[2]</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id26"> + <rect class="BoundingBox" stroke="none" fill="none" x="1929" y="11000" width="1472" height="726"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="423px" font-weight="400"><tspan class="TextPosition" x="2179" y="11510"><tspan fill="rgb(0,0,0)" stroke="none">road</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id27"> + <rect class="BoundingBox" stroke="none" fill="none" x="2700" y="6831" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="2950" y="7214"><tspan fill="rgb(0,0,0)" stroke="none">s0</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id28"> + <rect class="BoundingBox" stroke="none" fill="none" x="6300" y="6831" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="6550" y="7214"><tspan fill="rgb(0,0,0)" stroke="none">s1</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id29"> + <rect class="BoundingBox" stroke="none" fill="none" x="10397" y="6831" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="10647" y="7214"><tspan fill="rgb(0,0,0)" stroke="none">s2</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id30"> + <rect class="BoundingBox" stroke="none" fill="none" x="18497" y="4700" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="18747" y="5083"><tspan fill="rgb(0,0,0)" stroke="none">s3</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id31"> + <rect class="BoundingBox" stroke="none" fill="none" x="7700" y="8500" width="801" height="1583"/> + <path fill="rgb(141,29,117)" fill-opacity="0.4" stroke="rgb(255,255,255)" stroke-opacity="0.4" d="M 7700,10081 L 7700,8500 8500,8500 8500,9906 7700,10081 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id32"> + <rect class="BoundingBox" stroke="none" fill="none" x="7686" y="7586" width="829" height="929"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8100,8500 L 7700,8500 7700,7600 8500,7600 8500,8500 8100,8500 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8100,8500 L 7700,8500 7700,7600 8500,7600 8500,8500 8100,8500 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id33"> + <rect class="BoundingBox" stroke="none" fill="none" x="7634" y="7542" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7698,7556 C 7726,7556 7748,7578 7748,7606 7748,7634 7726,7656 7698,7656 7670,7656 7648,7634 7648,7606 7648,7578 7670,7556 7698,7556 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7698,7556 C 7726,7556 7748,7578 7748,7606 7748,7634 7726,7656 7698,7656 7670,7656 7648,7634 7648,7606 7648,7578 7670,7556 7698,7556 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id34"> + <rect class="BoundingBox" stroke="none" fill="none" x="8434" y="7542" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8498,7556 C 8526,7556 8548,7578 8548,7606 8548,7634 8526,7656 8498,7656 8470,7656 8448,7634 8448,7606 8448,7578 8470,7556 8498,7556 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8498,7556 C 8526,7556 8548,7578 8548,7606 8548,7634 8526,7656 8498,7656 8470,7656 8448,7634 8448,7606 8448,7578 8470,7556 8498,7556 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id35"> + <rect class="BoundingBox" stroke="none" fill="none" x="8434" y="8442" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8498,8456 C 8526,8456 8548,8478 8548,8506 8548,8534 8526,8556 8498,8556 8470,8556 8448,8534 8448,8506 8448,8478 8470,8456 8498,8456 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8498,8456 C 8526,8456 8548,8478 8548,8506 8548,8534 8526,8556 8498,8556 8470,8556 8448,8534 8448,8506 8448,8478 8470,8456 8498,8456 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id36"> + <rect class="BoundingBox" stroke="none" fill="none" x="7634" y="8442" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7698,8456 C 7726,8456 7748,8478 7748,8506 7748,8534 7726,8556 7698,8556 7670,8556 7648,8534 7648,8506 7648,8478 7670,8456 7698,8456 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7698,8456 C 7726,8456 7748,8478 7748,8506 7748,8534 7726,8556 7698,8556 7670,8556 7648,8534 7648,8506 7648,8478 7670,8456 7698,8456 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id37"> + <rect class="BoundingBox" stroke="none" fill="none" x="7638" y="9342" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7702,9356 C 7730,9356 7752,9378 7752,9406 7752,9434 7730,9456 7702,9456 7674,9456 7652,9434 7652,9406 7652,9378 7674,9356 7702,9356 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7702,9356 C 7730,9356 7752,9378 7752,9406 7752,9434 7730,9456 7702,9456 7674,9456 7652,9434 7652,9406 7652,9378 7674,9356 7702,9356 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id38"> + <rect class="BoundingBox" stroke="none" fill="none" x="7638" y="10017" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7702,10031 C 7730,10031 7752,10053 7752,10081 7752,10109 7730,10131 7702,10131 7674,10131 7652,10109 7652,10081 7652,10053 7674,10031 7702,10031 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7702,10031 C 7730,10031 7752,10053 7752,10081 7752,10109 7730,10131 7702,10131 7674,10131 7652,10109 7652,10081 7652,10053 7674,10031 7702,10031 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id39"> + <rect class="BoundingBox" stroke="none" fill="none" x="8438" y="9342" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8502,9356 C 8530,9356 8552,9378 8552,9406 8552,9434 8530,9456 8502,9456 8474,9456 8452,9434 8452,9406 8452,9378 8474,9356 8502,9356 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8502,9356 C 8530,9356 8552,9378 8552,9406 8552,9434 8530,9456 8502,9456 8474,9456 8452,9434 8452,9406 8452,9378 8474,9356 8502,9356 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id40"> + <rect class="BoundingBox" stroke="none" fill="none" x="8438" y="9842" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8502,9856 C 8530,9856 8552,9878 8552,9906 8552,9934 8530,9956 8502,9956 8474,9956 8452,9934 8452,9906 8452,9878 8474,9856 8502,9856 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8502,9856 C 8530,9856 8552,9878 8552,9906 8552,9934 8530,9956 8502,9956 8474,9956 8452,9934 8452,9906 8452,9878 8474,9856 8502,9856 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.OpenBezierShape"> + <g id="id41"> + <rect class="BoundingBox" stroke="none" fill="none" x="20491" y="6390" width="2120" height="4620"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20500,6400 C 20509,6408 20518,6416 20528,6424"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20555,6448 C 20564,6456 20573,6464 20582,6472"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20609,6496 C 20618,6504 20627,6512 20636,6520"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20662,6544 C 20671,6552 20680,6560 20688,6568"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20715,6592 C 20723,6600 20732,6608 20740,6616"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20766,6641 C 20775,6649 20783,6657 20792,6665"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20817,6689 C 20825,6697 20834,6705 20842,6713"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20867,6737 C 20875,6746 20883,6754 20892,6762"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20916,6786 C 20925,6795 20933,6803 20941,6811"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 20967,6837 C 20975,6846 20984,6855 20992,6863"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21017,6889 C 21025,6898 21034,6906 21042,6915"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21067,6941 C 21075,6949 21083,6958 21091,6967"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21115,6993 C 21123,7002 21131,7010 21139,7019"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21163,7045 C 21171,7054 21179,7062 21186,7071"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21210,7097 C 21217,7106 21225,7115 21233,7124"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21256,7150 C 21263,7159 21271,7167 21278,7176"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21301,7203 C 21309,7212 21317,7221 21324,7231"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21347,7258 C 21355,7267 21363,7277 21370,7286"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21393,7314 C 21400,7323 21408,7332 21415,7342"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21437,7370 C 21444,7379 21452,7388 21459,7397"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21481,7426 C 21488,7435 21495,7444 21502,7454"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21523,7482 C 21530,7491 21537,7500 21544,7510"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21565,7538 C 21572,7548 21579,7557 21586,7566"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21606,7595 C 21613,7604 21620,7614 21626,7624"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21647,7653 C 21654,7663 21660,7673 21667,7683"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21687,7712 C 21694,7722 21700,7732 21707,7742"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21727,7772 C 21733,7782 21740,7792 21746,7801"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21765,7831 C 21771,7841 21778,7851 21784,7861"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21803,7891 C 21809,7901 21815,7911 21821,7921"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21839,7952 C 21845,7962 21851,7972 21857,7982"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21875,8012 C 21881,8022 21887,8032 21892,8043"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21910,8074 C 21916,8084 21922,8094 21927,8105"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21944,8136 C 21950,8147 21956,8157 21961,8167"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 21978,8199 C 21983,8209 21989,8220 21994,8230"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22010,8262 C 22016,8272 22021,8283 22026,8293"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22042,8325 C 22047,8336 22052,8346 22058,8357"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22073,8389 C 22078,8400 22083,8410 22088,8421"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22103,8453 C 22107,8464 22112,8474 22117,8485"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22131,8518 C 22136,8528 22141,8539 22146,8550"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22159,8583 C 22164,8594 22169,8605 22173,8615"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22187,8648 C 22191,8659 22195,8670 22200,8681"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22213,8714 C 22217,8725 22221,8736 22226,8747"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22238,8780 C 22242,8791 22246,8803 22250,8814"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22262,8847 C 22266,8858 22270,8869 22274,8881"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22286,8914 C 22290,8925 22294,8937 22297,8948"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22308,8981 C 22312,8992 22316,9003 22319,9015"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22330,9048 C 22333,9060 22337,9071 22340,9082"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22350,9116 C 22354,9127 22357,9139 22360,9150"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22370,9184 C 22373,9195 22377,9207 22380,9218"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22389,9252 C 22392,9264 22395,9275 22398,9287"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22407,9321 C 22410,9333 22413,9344 22416,9356"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22424,9391 C 22427,9402 22430,9414 22433,9425"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22440,9459 C 22443,9471 22446,9482 22448,9494"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22456,9528 C 22458,9539 22461,9551 22463,9562"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22470,9597 C 22472,9608 22475,9620 22477,9632"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22484,9666 C 22486,9678 22488,9690 22490,9701"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22497,9736 C 22499,9748 22501,9760 22503,9771"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22509,9807 C 22511,9818 22512,9830 22514,9842"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22520,9878 C 22522,9889 22523,9901 22525,9913"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22530,9948 C 22532,9959 22533,9971 22535,9982"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22540,10017 C 22541,10028 22543,10040 22544,10052"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22548,10087 C 22550,10098 22551,10110 22553,10122"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22557,10157 C 22558,10168 22559,10180 22560,10192"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22564,10227 C 22565,10239 22566,10251 22567,10263"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22571,10298 C 22572,10310 22573,10322 22574,10334"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22577,10370 C 22577,10382 22578,10394 22579,10406"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22582,10442 C 22583,10454 22583,10465 22584,10477"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22586,10511 C 22587,10523 22588,10535 22588,10546"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22590,10581 C 22591,10593 22591,10604 22592,10616"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22593,10651 C 22594,10663 22594,10675 22595,10687"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22596,10722 C 22596,10734 22597,10746 22597,10757"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22598,10793 C 22598,10805 22599,10817 22599,10829"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22599,10865 C 22600,10877 22600,10889 22600,10901"/> + <path fill="none" stroke="rgb(153,153,153)" stroke-width="18" stroke-linejoin="round" d="M 22600,10937 C 22600,10949 22600,10961 22600,10973"/> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id42"> + <rect class="BoundingBox" stroke="none" fill="none" x="2700" y="12331" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="2950" y="12714"><tspan fill="rgb(0,0,0)" stroke="none">s0</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id43"> + <rect class="BoundingBox" stroke="none" fill="none" x="6300" y="12331" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="6550" y="12714"><tspan fill="rgb(0,0,0)" stroke="none">s1</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id44"> + <rect class="BoundingBox" stroke="none" fill="none" x="10397" y="12331" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="10647" y="12714"><tspan fill="rgb(0,0,0)" stroke="none">s2</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id45"> + <rect class="BoundingBox" stroke="none" fill="none" x="22197" y="12331" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="22447" y="12714"><tspan fill="rgb(0,0,0)" stroke="none">s3</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id46"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="14699" width="3603" height="903"/> + <path fill="rgb(0,169,51)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 4900,15600 L 3100,15600 3100,14700 6700,14700 6700,15600 4900,15600 Z"/> + <path fill="none" stroke="rgb(52,101,164)" d="M 4900,15600 L 3100,15600 3100,14700 6700,14700 6700,15600 4900,15600 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id47"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="13799" width="19503" height="903"/> + <path fill="rgb(114,159,207)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 12850,14700 L 3100,14700 3100,13800 22600,13800 22600,14700 12850,14700 Z"/> + <path fill="none" stroke="rgb(52,101,164)" d="M 12850,14700 L 3100,14700 3100,13800 22600,13800 22600,14700 12850,14700 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id48"> + <rect class="BoundingBox" stroke="none" fill="none" x="3099" y="12899" width="19503" height="903"/> + <path fill="rgb(255,128,0)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 12850,13800 L 3100,13800 3100,12900 22600,12900 22600,13800 12850,13800 Z"/> + <path fill="none" stroke="rgb(52,101,164)" d="M 12850,13800 L 3100,13800 3100,12900 22600,12900 22600,13800 12850,13800 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id49"> + <rect class="BoundingBox" stroke="none" fill="none" x="3082" y="12882" width="37" height="2737"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 3100,12900 L 3100,15600"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id50"> + <rect class="BoundingBox" stroke="none" fill="none" x="10782" y="12882" width="37" height="1837"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 10800,12900 L 10800,14700"/> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id51"> + <rect class="BoundingBox" stroke="none" fill="none" x="6699" y="14699" width="4103" height="903"/> + <path fill="rgb(0,169,51)" fill-opacity="0.2" stroke="rgb(255,255,255)" stroke-opacity="0.2" d="M 6700,15600 L 6700,14700 10800,14700 6700,15600 Z"/> + <path fill="none" stroke="rgb(52,101,164)" d="M 6700,15600 L 6700,14700 10800,14700 6700,15600 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id52"> + <rect class="BoundingBox" stroke="none" fill="none" x="6682" y="12882" width="37" height="2737"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 6700,12900 L 6700,15600"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id53"> + <rect class="BoundingBox" stroke="none" fill="none" x="22582" y="12882" width="37" height="1837"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 22600,12900 L 22600,14700"/> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id54"> + <rect class="BoundingBox" stroke="none" fill="none" x="14299" y="7429" width="1008" height="1826"/> + <path fill="rgb(141,29,117)" fill-opacity="0.4" stroke="rgb(255,255,255)" stroke-opacity="0.4" d="M 14500,9254 L 14300,7500 14953,7430 15306,9137 14500,9254 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id55"> + <rect class="BoundingBox" stroke="none" fill="none" x="14440" y="9186" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 14504,9200 C 14532,9200 14554,9222 14554,9250 14554,9278 14532,9300 14504,9300 14476,9300 14454,9278 14454,9250 14454,9222 14476,9200 14504,9200 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 14504,9200 C 14532,9200 14554,9222 14554,9250 14554,9278 14532,9300 14504,9300 14476,9300 14454,9278 14454,9250 14454,9222 14476,9200 14504,9200 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id56"> + <rect class="BoundingBox" stroke="none" fill="none" x="15242" y="9076" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 15306,9090 C 15334,9090 15356,9112 15356,9140 15356,9168 15334,9190 15306,9190 15278,9190 15256,9168 15256,9140 15256,9112 15278,9090 15306,9090 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 15306,9090 C 15334,9090 15356,9112 15356,9140 15356,9168 15334,9190 15306,9190 15278,9190 15256,9168 15256,9140 15256,9112 15278,9090 15306,9090 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id57"> + <rect class="BoundingBox" stroke="none" fill="none" x="14236" y="7435" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 14300,7449 C 14328,7449 14350,7471 14350,7499 14350,7527 14328,7549 14300,7549 14272,7549 14250,7527 14250,7499 14250,7471 14272,7449 14300,7449 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 14300,7449 C 14328,7449 14350,7471 14350,7499 14350,7527 14328,7549 14300,7549 14272,7549 14250,7527 14250,7499 14250,7471 14272,7449 14300,7449 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id58"> + <rect class="BoundingBox" stroke="none" fill="none" x="14878" y="7360" width="130" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 14942,7374 C 14970,7374 14992,7396 14992,7424 14992,7452 14970,7474 14942,7474 14914,7474 14892,7452 14892,7424 14892,7396 14914,7374 14942,7374 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 14942,7374 C 14970,7374 14992,7396 14992,7424 14992,7452 14970,7474 14942,7474 14914,7474 14892,7452 14892,7424 14892,7396 14914,7374 14942,7374 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id59"> + <rect class="BoundingBox" stroke="none" fill="none" x="14339" y="8302" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 14403,8316 C 14431,8316 14453,8338 14453,8366 14453,8394 14431,8416 14403,8416 14375,8416 14353,8394 14353,8366 14353,8338 14375,8316 14403,8316 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 14403,8316 C 14431,8316 14453,8338 14453,8366 14453,8394 14431,8416 14403,8416 14375,8416 14353,8394 14353,8366 14353,8338 14375,8316 14403,8316 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id60"> + <rect class="BoundingBox" stroke="none" fill="none" x="15069" y="8211" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 15133,8225 C 15161,8225 15183,8247 15183,8275 15183,8303 15161,8325 15133,8325 15105,8325 15083,8303 15083,8275 15083,8247 15105,8225 15133,8225 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 15133,8225 C 15161,8225 15183,8247 15183,8275 15183,8303 15161,8325 15133,8325 15105,8325 15083,8303 15083,8275 15083,8247 15105,8225 15133,8225 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id61"> + <rect class="BoundingBox" stroke="none" fill="none" x="8563" y="8531" width="1638" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="8813" y="8914"><tspan fill="rgb(128,0,128)" stroke="none">sampling</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.OpenBezierShape"> + <g id="id62"> + <rect class="BoundingBox" stroke="none" fill="none" x="8580" y="8856" width="5799" height="263"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 8594,9100 C 8600,9101 8613,9101 8632,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 8692,9102 C 8705,9103 8720,9103 8736,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 8787,9103 C 8806,9103 8825,9103 8846,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 8895,9104 C 8910,9104 8926,9104 8942,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 8992,9104 C 9009,9104 9026,9104 9045,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9100,9104 C 9117,9104 9135,9104 9153,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9200,9104 C 9216,9104 9233,9104 9249,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9299,9104 C 9316,9104 9334,9104 9351,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9404,9104 C 9422,9104 9441,9104 9459,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9510,9104 C 9526,9104 9542,9104 9558,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9608,9104 C 9624,9104 9641,9104 9658,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9709,9104 C 9726,9104 9744,9104 9761,9104"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9814,9103 C 9832,9103 9850,9103 9868,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 9919,9103 C 9935,9103 9951,9103 9968,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10018,9103 C 10034,9103 10051,9103 10068,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10119,9103 C 10136,9103 10153,9103 10170,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10222,9103 C 10239,9103 10257,9103 10274,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10327,9103 C 10344,9103 10361,9103 10378,9103"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10428,9102 C 10445,9102 10461,9102 10478,9102"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10529,9102 C 10545,9102 10562,9102 10579,9102"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10631,9102 C 10648,9102 10665,9102 10682,9102"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10734,9102 C 10751,9102 10768,9102 10786,9102"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10838,9102 C 10855,9102 10871,9102 10888,9102"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 10939,9102 C 10955,9102 10972,9101 10989,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11040,9101 C 11057,9101 11074,9101 11091,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11142,9101 C 11159,9101 11176,9101 11193,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11245,9101 C 11262,9101 11279,9101 11296,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11348,9101 C 11365,9101 11382,9101 11399,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11450,9101 C 11467,9101 11484,9101 11501,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11552,9101 C 11569,9101 11586,9101 11603,9101"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11654,9100 C 11671,9100 11688,9100 11705,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11756,9100 C 11773,9100 11790,9100 11807,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11858,9100 C 11875,9100 11892,9100 11909,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 11961,9100 C 11978,9100 11995,9100 12012,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12063,9100 C 12080,9100 12097,9100 12114,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12165,9100 C 12182,9100 12199,9100 12216,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12267,9100 C 12284,9100 12301,9100 12318,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12368,9100 C 12379,9100 12389,9100 12400,9100 12406,9100 12413,9100 12419,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12470,9100 C 12487,9100 12504,9100 12521,9100"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12572,9099 C 12589,9099 12606,9099 12623,9099"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12674,9098 C 12691,9098 12708,9097 12725,9097"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12776,9096 C 12793,9095 12810,9095 12827,9094"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12878,9092 C 12895,9092 12911,9091 12928,9091"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 12979,9088 C 12996,9088 13013,9087 13031,9086"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13081,9083 C 13098,9082 13115,9081 13132,9080"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13183,9077 C 13200,9076 13217,9074 13234,9073"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13285,9069 C 13302,9068 13319,9067 13336,9065"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13386,9061 C 13403,9059 13420,9058 13437,9056"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13488,9051 C 13505,9049 13522,9047 13539,9045"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13589,9040 C 13606,9038 13623,9036 13640,9034"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13691,9027 C 13707,9025 13724,9023 13741,9021"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13791,9014 C 13808,9012 13825,9009 13842,9007"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13893,8999 C 13909,8997 13926,8994 13942,8992"/> + <path fill="none" stroke="rgb(141,29,117)" stroke-width="28" stroke-linejoin="round" d="M 13993,8984 C 14010,8981 14027,8978 14044,8975"/> + <path fill="rgb(141,29,117)" stroke="none" d="M 14082,9065 L 14068,9094 14378,8912 14023,8856 14046,8877 14065,8902 14081,8932 14091,8965 14095,8999 14091,9033 14082,9065 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id63"> + <rect class="BoundingBox" stroke="none" fill="none" x="3138" y="15144" width="3577" height="29"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3152,15158 L 3203,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3254,15158 L 3305,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3356,15158 L 3407,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3458,15158 L 3509,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3560,15158 L 3611,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3662,15158 L 3713,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3764,15158 L 3815,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3866,15158 L 3917,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 3968,15158 L 4019,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4070,15158 L 4121,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4172,15158 L 4223,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4274,15158 L 4325,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4376,15158 L 4427,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4478,15158 L 4529,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4580,15158 L 4631,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4682,15158 L 4733,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4784,15158 L 4835,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4886,15158 L 4937,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 4988,15158 L 5039,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5090,15158 L 5141,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5192,15158 L 5243,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5294,15158 L 5345,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5396,15158 L 5447,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5498,15158 L 5549,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5600,15158 L 5651,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5702,15158 L 5753,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5804,15158 L 5855,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 5906,15158 L 5957,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6008,15158 L 6059,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6110,15158 L 6161,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6212,15158 L 6263,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6314,15158 L 6365,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6416,15158 L 6467,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6518,15158 L 6569,15158"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6620,15158 L 6671,15158"/> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id64"> + <rect class="BoundingBox" stroke="none" fill="none" x="7700" y="12900" width="801" height="2485"/> + <path fill="rgb(141,29,117)" fill-opacity="0.4" stroke="rgb(255,255,255)" stroke-opacity="0.4" d="M 7700,15384 L 7700,12900 8500,12900 8500,15209 7700,15384 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.PolyPolygonShape"> + <g id="id65"> + <rect class="BoundingBox" stroke="none" fill="none" x="15100" y="12900" width="801" height="1801"/> + <path fill="rgb(141,29,117)" fill-opacity="0.4" stroke="rgb(255,255,255)" stroke-opacity="0.4" d="M 15100,14700 L 15100,12900 15900,12900 15900,14700 15100,14700 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id66"> + <rect class="BoundingBox" stroke="none" fill="none" x="7686" y="12876" width="829" height="929"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8100,13790 L 7700,13790 7700,12890 8500,12890 8500,13790 8100,13790 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8100,13790 L 7700,13790 7700,12890 8500,12890 8500,13790 8100,13790 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id67"> + <rect class="BoundingBox" stroke="none" fill="none" x="7634" y="12832" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7698,12846 C 7726,12846 7748,12868 7748,12896 7748,12924 7726,12946 7698,12946 7670,12946 7648,12924 7648,12896 7648,12868 7670,12846 7698,12846 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7698,12846 C 7726,12846 7748,12868 7748,12896 7748,12924 7726,12946 7698,12946 7670,12946 7648,12924 7648,12896 7648,12868 7670,12846 7698,12846 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id68"> + <rect class="BoundingBox" stroke="none" fill="none" x="8434" y="12832" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8498,12846 C 8526,12846 8548,12868 8548,12896 8548,12924 8526,12946 8498,12946 8470,12946 8448,12924 8448,12896 8448,12868 8470,12846 8498,12846 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8498,12846 C 8526,12846 8548,12868 8548,12896 8548,12924 8526,12946 8498,12946 8470,12946 8448,12924 8448,12896 8448,12868 8470,12846 8498,12846 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id69"> + <rect class="BoundingBox" stroke="none" fill="none" x="8434" y="13732" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 8498,13746 C 8526,13746 8548,13768 8548,13796 8548,13824 8526,13846 8498,13846 8470,13846 8448,13824 8448,13796 8448,13768 8470,13746 8498,13746 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 8498,13746 C 8526,13746 8548,13768 8548,13796 8548,13824 8526,13846 8498,13846 8470,13846 8448,13824 8448,13796 8448,13768 8470,13746 8498,13746 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id70"> + <rect class="BoundingBox" stroke="none" fill="none" x="7634" y="13732" width="129" height="129"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 7698,13746 C 7726,13746 7748,13768 7748,13796 7748,13824 7726,13846 7698,13846 7670,13846 7648,13824 7648,13796 7648,13768 7670,13746 7698,13746 Z"/> + <path fill="none" stroke="rgb(255,255,255)" stroke-width="28" stroke-linejoin="round" d="M 7698,13746 C 7726,13746 7748,13768 7748,13796 7748,13824 7726,13846 7698,13846 7670,13846 7648,13824 7648,13796 7648,13768 7670,13746 7698,13746 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id71"> + <rect class="BoundingBox" stroke="none" fill="none" x="3186" y="13342" width="19429" height="29"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3200,13356 L 3251,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3302,13356 L 3353,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3404,13356 L 3455,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3506,13356 L 3557,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3608,13356 L 3659,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3710,13356 L 3761,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3812,13356 L 3863,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 3914,13356 L 3965,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4016,13356 L 4067,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4118,13356 L 4169,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4220,13356 L 4271,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4322,13356 L 4373,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4424,13356 L 4475,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4526,13356 L 4577,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4628,13356 L 4679,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4730,13356 L 4781,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4832,13356 L 4883,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 4934,13356 L 4985,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5036,13356 L 5087,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5138,13356 L 5189,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5240,13356 L 5291,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5342,13356 L 5393,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5444,13356 L 5495,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5546,13356 L 5597,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5648,13356 L 5699,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5750,13356 L 5801,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5852,13356 L 5903,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 5954,13356 L 6005,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6056,13356 L 6107,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6158,13356 L 6209,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6260,13356 L 6311,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6362,13356 L 6413,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6464,13356 L 6515,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6566,13356 L 6617,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6668,13356 L 6719,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6770,13356 L 6821,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6872,13356 L 6923,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 6974,13356 L 7025,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7076,13356 L 7127,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7178,13356 L 7229,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7280,13356 L 7331,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7382,13356 L 7433,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7484,13356 L 7535,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7586,13356 L 7637,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7688,13356 L 7739,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7790,13356 L 7841,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7892,13356 L 7943,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 7994,13356 L 8045,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8096,13356 L 8147,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8198,13356 L 8249,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8300,13356 L 8351,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8402,13356 L 8453,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8504,13356 L 8555,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8606,13356 L 8657,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8708,13356 L 8759,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8810,13356 L 8861,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 8912,13356 L 8963,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9014,13356 L 9065,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9116,13356 L 9167,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9218,13356 L 9269,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9320,13356 L 9371,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9422,13356 L 9473,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9524,13356 L 9575,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9626,13356 L 9677,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9728,13356 L 9779,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9830,13356 L 9881,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 9932,13356 L 9983,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10034,13356 L 10085,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10136,13356 L 10187,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10238,13356 L 10289,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10340,13356 L 10391,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10442,13356 L 10493,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10544,13356 L 10595,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10646,13356 L 10697,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10748,13356 L 10799,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10850,13356 L 10901,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 10952,13356 L 11003,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11054,13356 L 11105,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11156,13356 L 11207,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11258,13356 L 11309,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11360,13356 L 11411,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11462,13356 L 11513,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11564,13356 L 11615,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11666,13356 L 11717,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11768,13356 L 11819,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11870,13356 L 11921,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 11972,13356 L 12023,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12074,13356 L 12125,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12176,13356 L 12227,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12278,13356 L 12329,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12380,13356 L 12431,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12482,13356 L 12533,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12584,13356 L 12635,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12686,13356 L 12737,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12788,13356 L 12839,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12890,13356 L 12941,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 12992,13356 L 13043,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13094,13356 L 13145,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13196,13356 L 13247,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13298,13356 L 13349,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13400,13356 L 13451,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13502,13356 L 13553,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13604,13356 L 13655,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13706,13356 L 13757,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13808,13356 L 13859,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 13910,13356 L 13961,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14012,13356 L 14063,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14114,13356 L 14165,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14216,13356 L 14267,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14318,13356 L 14369,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14420,13356 L 14471,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14522,13356 L 14573,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14624,13356 L 14675,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14726,13356 L 14777,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14828,13356 L 14879,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 14930,13356 L 14981,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15032,13356 L 15083,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15134,13356 L 15185,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15236,13356 L 15287,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15338,13356 L 15389,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15440,13356 L 15491,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15542,13356 L 15593,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15644,13356 L 15695,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15746,13356 L 15797,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15848,13356 L 15899,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 15950,13356 L 16001,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16052,13356 L 16103,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16154,13356 L 16205,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16256,13356 L 16307,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16358,13356 L 16409,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16460,13356 L 16511,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16562,13356 L 16613,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16664,13356 L 16715,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16766,13356 L 16817,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16868,13356 L 16919,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 16970,13356 L 17021,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17072,13356 L 17123,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17174,13356 L 17225,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17276,13356 L 17327,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17378,13356 L 17429,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17480,13356 L 17531,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17582,13356 L 17633,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17684,13356 L 17735,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17786,13356 L 17837,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17888,13356 L 17939,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 17990,13356 L 18041,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18092,13356 L 18143,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18194,13356 L 18245,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18296,13356 L 18347,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18398,13356 L 18449,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18500,13356 L 18551,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18602,13356 L 18653,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18704,13356 L 18755,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18806,13356 L 18857,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 18908,13356 L 18959,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19010,13356 L 19061,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19112,13356 L 19163,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19214,13356 L 19265,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19316,13356 L 19367,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19418,13356 L 19469,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19520,13356 L 19571,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19622,13356 L 19673,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19724,13356 L 19775,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19826,13356 L 19877,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 19928,13356 L 19979,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20030,13356 L 20081,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20132,13356 L 20183,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20234,13356 L 20285,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20336,13356 L 20387,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20438,13356 L 20489,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20540,13356 L 20591,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20642,13356 L 20693,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20744,13356 L 20795,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20846,13356 L 20897,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 20948,13356 L 20999,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21050,13356 L 21101,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21152,13356 L 21203,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21254,13356 L 21305,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21356,13356 L 21407,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21458,13356 L 21509,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21560,13356 L 21611,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21662,13356 L 21713,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21764,13356 L 21815,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21866,13356 L 21917,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 21968,13356 L 22019,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22070,13356 L 22121,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22172,13356 L 22223,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22274,13356 L 22325,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22376,13356 L 22427,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22478,13356 L 22529,13356"/> + <path fill="none" stroke="rgb(255,64,0)" stroke-width="28" stroke-linejoin="round" d="M 22580,13356 L 22600,13356"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id72"> + <rect class="BoundingBox" stroke="none" fill="none" x="3186" y="14235" width="19429" height="29"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3200,14249 L 3251,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3302,14249 L 3353,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3404,14249 L 3455,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3506,14249 L 3557,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3608,14249 L 3659,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3710,14249 L 3761,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3812,14249 L 3863,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 3914,14249 L 3965,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4016,14249 L 4067,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4118,14249 L 4169,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4220,14249 L 4271,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4322,14249 L 4373,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4424,14249 L 4475,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4526,14249 L 4577,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4628,14249 L 4679,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4730,14249 L 4781,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4832,14249 L 4883,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 4934,14249 L 4985,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5036,14249 L 5087,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5138,14249 L 5189,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5240,14249 L 5291,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5342,14249 L 5393,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5444,14249 L 5495,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5546,14249 L 5597,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5648,14249 L 5699,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5750,14249 L 5801,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5852,14249 L 5903,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 5954,14249 L 6005,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6056,14249 L 6107,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6158,14249 L 6209,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6260,14249 L 6311,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6362,14249 L 6413,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6464,14249 L 6515,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6566,14249 L 6617,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6668,14249 L 6719,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6770,14249 L 6821,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6872,14249 L 6923,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 6974,14249 L 7025,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7076,14249 L 7127,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7178,14249 L 7229,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7280,14249 L 7331,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7382,14249 L 7433,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7484,14249 L 7535,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7586,14249 L 7637,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7688,14249 L 7739,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7790,14249 L 7841,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7892,14249 L 7943,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 7994,14249 L 8045,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8096,14249 L 8147,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8198,14249 L 8249,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8300,14249 L 8351,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8402,14249 L 8453,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8504,14249 L 8555,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8606,14249 L 8657,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8708,14249 L 8759,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8810,14249 L 8861,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 8912,14249 L 8963,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9014,14249 L 9065,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9116,14249 L 9167,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9218,14249 L 9269,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9320,14249 L 9371,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9422,14249 L 9473,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9524,14249 L 9575,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9626,14249 L 9677,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9728,14249 L 9779,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9830,14249 L 9881,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 9932,14249 L 9983,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10034,14249 L 10085,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10136,14249 L 10187,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10238,14249 L 10289,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10340,14249 L 10391,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10442,14249 L 10493,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10544,14249 L 10595,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10646,14249 L 10697,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10748,14249 L 10799,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10850,14249 L 10901,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 10952,14249 L 11003,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11054,14249 L 11105,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11156,14249 L 11207,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11258,14249 L 11309,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11360,14249 L 11411,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11462,14249 L 11513,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11564,14249 L 11615,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11666,14249 L 11717,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11768,14249 L 11819,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11870,14249 L 11921,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 11972,14249 L 12023,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12074,14249 L 12125,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12176,14249 L 12227,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12278,14249 L 12329,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12380,14249 L 12431,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12482,14249 L 12533,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12584,14249 L 12635,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12686,14249 L 12737,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12788,14249 L 12839,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12890,14249 L 12941,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 12992,14249 L 13043,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13094,14249 L 13145,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13196,14249 L 13247,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13298,14249 L 13349,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13400,14249 L 13451,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13502,14249 L 13553,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13604,14249 L 13655,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13706,14249 L 13757,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13808,14249 L 13859,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 13910,14249 L 13961,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14012,14249 L 14063,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14114,14249 L 14165,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14216,14249 L 14267,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14318,14249 L 14369,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14420,14249 L 14471,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14522,14249 L 14573,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14624,14249 L 14675,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14726,14249 L 14777,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14828,14249 L 14879,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 14930,14249 L 14981,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15032,14249 L 15083,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15134,14249 L 15185,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15236,14249 L 15287,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15338,14249 L 15389,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15440,14249 L 15491,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15542,14249 L 15593,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15644,14249 L 15695,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15746,14249 L 15797,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15848,14249 L 15899,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 15950,14249 L 16001,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16052,14249 L 16103,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16154,14249 L 16205,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16256,14249 L 16307,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16358,14249 L 16409,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16460,14249 L 16511,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16562,14249 L 16613,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16664,14249 L 16715,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16766,14249 L 16817,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16868,14249 L 16919,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 16970,14249 L 17021,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17072,14249 L 17123,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17174,14249 L 17225,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17276,14249 L 17327,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17378,14249 L 17429,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17480,14249 L 17531,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17582,14249 L 17633,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17684,14249 L 17735,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17786,14249 L 17837,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17888,14249 L 17939,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 17990,14249 L 18041,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18092,14249 L 18143,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18194,14249 L 18245,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18296,14249 L 18347,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18398,14249 L 18449,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18500,14249 L 18551,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18602,14249 L 18653,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18704,14249 L 18755,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18806,14249 L 18857,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 18908,14249 L 18959,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19010,14249 L 19061,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19112,14249 L 19163,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19214,14249 L 19265,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19316,14249 L 19367,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19418,14249 L 19469,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19520,14249 L 19571,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19622,14249 L 19673,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19724,14249 L 19775,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19826,14249 L 19877,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 19928,14249 L 19979,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20030,14249 L 20081,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20132,14249 L 20183,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20234,14249 L 20285,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20336,14249 L 20387,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20438,14249 L 20489,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20540,14249 L 20591,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20642,14249 L 20693,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20744,14249 L 20795,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20846,14249 L 20897,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 20948,14249 L 20999,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21050,14249 L 21101,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21152,14249 L 21203,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21254,14249 L 21305,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21356,14249 L 21407,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21458,14249 L 21509,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21560,14249 L 21611,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21662,14249 L 21713,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21764,14249 L 21815,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21866,14249 L 21917,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 21968,14249 L 22019,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22070,14249 L 22121,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22172,14249 L 22223,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22274,14249 L 22325,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22376,14249 L 22427,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22478,14249 L 22529,14249"/> + <path fill="none" stroke="rgb(42,96,153)" stroke-width="28" stroke-linejoin="round" d="M 22580,14249 L 22600,14249"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id73"> + <rect class="BoundingBox" stroke="none" fill="none" x="6686" y="14686" width="4129" height="487"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10800,14700 L 10749,14706"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10699,14711 L 10648,14717"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10597,14723 L 10547,14728"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10496,14734 L 10445,14740"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10395,14745 L 10344,14751"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10293,14757 L 10242,14762"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10192,14768 L 10141,14774"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 10090,14779 L 10040,14785"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9989,14791 L 9938,14796"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9888,14802 L 9837,14808"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9786,14813 L 9736,14819"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9685,14825 L 9634,14830"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9584,14836 L 9533,14842"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9482,14847 L 9432,14853"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9381,14859 L 9330,14864"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9279,14870 L 9229,14876"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9178,14881 L 9127,14887"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 9077,14893 L 9026,14898"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8975,14904 L 8925,14909"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8874,14915 L 8823,14921"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8773,14926 L 8722,14932"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8671,14938 L 8621,14943"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8570,14949 L 8519,14955"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8469,14960 L 8418,14966"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8367,14972 L 8316,14977"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8266,14983 L 8215,14989"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8164,14994 L 8114,15000"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 8063,15006 L 8012,15011"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7962,15017 L 7911,15023"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7860,15028 L 7810,15034"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7759,15040 L 7708,15045"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7658,15051 L 7607,15057"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7556,15062 L 7505,15068"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7455,15074 L 7404,15079"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7353,15085 L 7303,15091"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7252,15096 L 7201,15102"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7151,15108 L 7100,15113"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 7049,15119 L 6999,15125"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6948,15130 L 6897,15136"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6847,15142 L 6796,15147"/> + <path fill="none" stroke="rgb(6,154,46)" stroke-width="28" stroke-linejoin="round" d="M 6745,15153 L 6700,15158"/> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id74"> + <rect class="BoundingBox" stroke="none" fill="none" x="18100" y="7986" width="1400" height="1115"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="18350" y="8560"><tspan fill="rgb(0,0,0)" stroke="none">P</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id75"> + <rect class="BoundingBox" stroke="none" fill="none" x="19800" y="14600" width="1315" height="1115"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="494px" font-weight="400"><tspan class="TextPosition" x="20050" y="15174"><tspan fill="rgb(0,0,0)" stroke="none">P‘</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id76"> + <rect class="BoundingBox" stroke="none" fill="none" x="17799" y="7799" width="303" height="303"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 17950,7800 C 18035,7800 18100,7865 18100,7950 18100,8035 18035,8100 17950,8100 17865,8100 17800,8035 17800,7950 17800,7865 17865,7800 17950,7800 Z"/> + <path fill="none" stroke="rgb(0,0,0)" d="M 17950,7800 C 18035,7800 18100,7865 18100,7950 18100,8035 18035,8100 17950,8100 17865,8100 17800,8035 17800,7950 17800,7865 17865,7800 17950,7800 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.CustomShape"> + <g id="id77"> + <rect class="BoundingBox" stroke="none" fill="none" x="19701" y="14352" width="301" height="301"/> + <path fill="rgb(128,0,128)" stroke="none" d="M 19851,14352 C 19936,14352 20001,14417 20001,14502 20001,14587 19936,14652 19851,14652 19766,14652 19701,14587 19701,14502 19701,14417 19766,14352 19851,14352 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id78"> + <rect class="BoundingBox" stroke="none" fill="none" x="7549" y="7789" width="1130" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="7799" y="8172"><tspan fill="rgb(255,255,255)" stroke="none">quad</tspan></tspan></tspan></text> + </g> + </g> + <g class="Group"> + <g class="com.sun.star.drawing.LineShape"> + <g id="id79"> + <rect class="BoundingBox" stroke="none" fill="none" x="2782" y="10424" width="1219" height="353"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 2800,10600 L 3743,10600"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 4000,10600 L 3719,10424 3719,10776 4000,10600 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id80"> + <rect class="BoundingBox" stroke="none" fill="none" x="2624" y="9400" width="353" height="1219"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 2800,10600 L 2800,9657"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 2800,9400 L 2624,9681 2976,9681 2800,9400 Z"/> + </g> + </g> + </g> + <g class="Group"> + <g class="com.sun.star.drawing.LineShape"> + <g id="id81"> + <rect class="BoundingBox" stroke="none" fill="none" x="2782" y="15724" width="1219" height="353"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 2800,15900 L 3743,15900"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 4000,15900 L 3719,15724 3719,16076 4000,15900 Z"/> + </g> + </g> + <g class="com.sun.star.drawing.LineShape"> + <g id="id82"> + <rect class="BoundingBox" stroke="none" fill="none" x="2624" y="14700" width="353" height="1219"/> + <path fill="none" stroke="rgb(0,0,0)" stroke-width="35" stroke-linejoin="round" d="M 2800,15900 L 2800,14957"/> + <path fill="rgb(0,0,0)" stroke="none" d="M 2800,14700 L 2624,14981 2976,14981 2800,14700 Z"/> + </g> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id83"> + <rect class="BoundingBox" stroke="none" fill="none" x="2478" y="8788" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="2728" y="9171"><tspan fill="rgb(0,0,0)" stroke="none">y</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id84"> + <rect class="BoundingBox" stroke="none" fill="none" x="3897" y="10300" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="4147" y="10683"><tspan fill="rgb(0,0,0)" stroke="none">x</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id85"> + <rect class="BoundingBox" stroke="none" fill="none" x="2478" y="14100" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="2728" y="14483"><tspan fill="rgb(0,0,0)" stroke="none">t</tspan></tspan></tspan></text> + </g> + </g> + <g class="com.sun.star.drawing.TextShape"> + <g id="id86"> + <rect class="BoundingBox" stroke="none" fill="none" x="3897" y="15612" width="804" height="570"/> + <text class="TextShape"><tspan class="TextParagraph" font-family="Liberation Sans, sans-serif" font-size="282px" font-weight="400"><tspan class="TextPosition" x="4147" y="15995"><tspan fill="rgb(0,0,0)" stroke="none">s</tspan></tspan></tspan></text> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/sim/doc/source/advanced_topics/simulator/images/RoadCoordinateSystem.png b/sim/doc/source/advanced_topics/simulator/images/RoadCoordinateSystem.png new file mode 100644 index 0000000000000000000000000000000000000000..f055a37487915e85b7e13098c3adf831274a744c Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/RoadCoordinateSystem.png differ diff --git a/sim/doc/source/advanced_topics/simulator/images/WorldCoordinateSystem.png b/sim/doc/source/advanced_topics/simulator/images/WorldCoordinateSystem.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2065cde6c159db9195c1035e4c86f934f0c7cf Binary files /dev/null and b/sim/doc/source/advanced_topics/simulator/images/WorldCoordinateSystem.png differ diff --git a/sim/doc/source/advanced_topics/simulator/slave.rst b/sim/doc/source/advanced_topics/simulator/slave.rst new file mode 100644 index 0000000000000000000000000000000000000000..f147d37451b523d0d6b57009d04d1aff6bf7f6ca --- /dev/null +++ b/sim/doc/source/advanced_topics/simulator/slave.rst @@ -0,0 +1,115 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _slave: + +Slave +========== + +.. _slave_commandlinearguments: + +Command Line Arguments +----------------------- + +The slave can be configured by applying the following command line arguments. +Unspecified arguments will be defaulted (*default values in []*). + +The slave supports the following arguments: + +* *--logLevel* [0] : + Logging level between 0 (minimum) and 5 (maximum - debug core) +* *--logFile* [OpenPassSlave.log]* : + Name of the log file +* *--lib* [lib] : + Path of the libraries (relative or absolute) +* *--configs* [configs] : + Path for writing outputs (relative or absolute) +* *--results* [results] : + Path for writing outputs (relative or absolute) + +.. _slave_scheduler: + +Scheduler +--------- + +The Scheduler handles the sequence of agent based and common tasks before, during and after simulation. + +Executing phases +~~~~~~~~~~~~~~~~ + +Each simulation run splits up into 3 phases: Bootstrap tasks, Stepping and Finalize tasks. + +1. Initial task are grouped within the bootstrap tasks and are executed first and only once. + This includes updating the Observation modules and triggering all PreRun Spawners. + +2. After this Spawning, PreAgent, NonRecurring, Recurring and Syncronize Tasks are processed for each timestep. + First all Runtime Spawners are triggered. + Whenever a new agent is spawned, all its components are parsed to *Trigger* and *Update* tasks, grouped and sorted by execution time as non-recurring and recurring tasks. + Next all PreAgents task are executed, which includes publishing the world state to the DataStore in triggering all EventDetectors and Manipulators + Non-recurring tasks are executed just once and will be deleted afterwards (*init* flag in ComponentRepository). + Right after execution of all agent-based tasks, the Syncronize phase synchronizes all changes to the world as world state for the next timestep. + +3. The last phase is finalizing task, executed when an end condition is reached, such as end of simulation duration. Within this phase all EventDetectors and Manipulators are triggered and the Observation modules are updated one last time. + +Task type description +~~~~~~~~~~~~~~~~~~~~~ + +The scheduler handles 8 different task types: + +* **Spawning** - triggers agent spawning +* **EventDetector** - execute event detector +* **Manipulator** - execute manipulator +* **Observation** - update observation modules +* **Trigger** - execute trigger function of connected component +* **Update** - execute update output of connected component and resulting input +* **SyncWorld** - update world + +The following table gives an overview to all phases. + +.. table:: + :class: tight-table + + ================== ========== ======================================================== =================================================================================== + Phase Changeable Task types Notes + ================== ========== ======================================================== =================================================================================== + Bootstrap no Spawning (PreRun), Observation + Spawning no Spawning (Runtime), Observation + PreAgent no SyncWorld (publishing), EventDetector, Manipulator + Non recurring yes Trigger, Update Only components defined as "Init" + Recurring yes Trigger, Update Non Init components + Syncronize no SyncWorld Update the state of the agents and the virtual world (e.g. due to agent movements). + Finalize no EventDetector, Manipulator, Observation + ================== ========== ======================================================== =================================================================================== + +Task priorities +~~~~~~~~~~~~~~~ + +The order of the tasks within one phase depends on component priority and task type. +All tasks for a given timestamp are ordered by the SchedulerTasks priority, and divided into the aformentioned phases. + +The following table shows the priorities for the non-component task types: + +.. table:: + :class: tight-table + + =============== ======== ================================================================================================= + Task type Priority Notes + =============== ======== ================================================================================================= + Spawning 4 Highest priority, nothing can happen before any agent is instantiated. + EventDetector 3 + Manipulator 2 The manipulator task uses the event detector tasks as input. Therefore it is called afterwards. + SyncGlobalData 1 + Observation 0 Observation tasks have to be execute at the end. + =============== ======== ================================================================================================= + +The priority of trigger and update tasks depend on the priority within the SystemConfig. +They are independent of non-component priorities. +Since trigger tasks prepare output signals, output tasks are right called after the corresponding trigger tasks. diff --git a/sim/doc/source/advanced_topics/simulator/world_osi.rst b/sim/doc/source/advanced_topics/simulator/world_osi.rst new file mode 100644 index 0000000000000000000000000000000000000000..856ded16c340aeeef20c2614ccc04472f2a676be --- /dev/null +++ b/sim/doc/source/advanced_topics/simulator/world_osi.rst @@ -0,0 +1,259 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _world_osi: + +World_OSI +========== + +.. _world_coordinatesystems: + +Coordinate Systems +------------------ + +OpenPass uses 3 different coordinate systems. +All systems rotate counterclockwise and use radian. + +World Coordinate System +~~~~~~~~~~~~~~~~~~~~~~~ + +The world coordinate system is absolute. It is the parent coordinate system and all other systems are relative to the world coordinate system. +This system consists of *x*, *y* and *z* (*z* is currently unused). + +.. figure:: ./images/WorldCoordinateSystem.png + + World Coordinate System + +Road Coordinate System +~~~~~~~~~~~~~~~~~~~~~~ + +The road coordinate system is relative to the position of the road in the world coordinate system. +It consists of *s* and *t* coordinates, where *s* describes the longitudinal position along the road. +At the beginning of the road *s* = 0, increasing with the downstream direction of the road. +The coordinate *t* describes the lateral position relative to the center of the road, where *t* > 0 indicates left side and *t < 0* right side of the road with respect to the road direction. + +.. figure:: ./images/RoadCoordinateSystem.png + + Road Coordinate System + +Agent Coordinate System +~~~~~~~~~~~~~~~~~~~~~~~ + +The agent coordinate system is relative to the position of the agent in the world coordinate system. +It uses longitudinal, lateral and height (height currently unused). +The system originates at the *reference point*, which is located at the center of the rear axle. +The longitudinal axis is parallel to the length of the car and the lateral axis is parallel to the width of the car. + +.. figure:: ./images/AgentCoordinateSystem.png + + Agent Coordinate System + +.. _world_sampling: + +Sampling of World Geometries +---------------------------- + +.. _OpenDRIVE: https://www.asam.net/standards/detail/opendrive/ +.. _open simulation interface: https://github.com/OpenSimulationInterface +.. _Ramer-Douglas-Peucker algorithm: https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm + +Roads are described following the `OpenDRIVE`_ specification. +There the geometry of a road is defined algebraically as lines, clothoids and by means of cubic polynomials, whereby primarily only one reference line is defined. +The lanes can be understood as a stack of parallel lanes, which are given by the width and the offset, now in relation to this reference line, which acts as the underlying coordinate system ('s/t' road coordinates with s along the road). +Here, too, width and offset are defined algebraically, which means that almost any boundary lines can be defined. + +When the world is initialized, these boundary definitions (i.e. algebraic geometries) are converted into piecewise linear elements, which is called sampling. +The road is scanned at a constant interval along 's', which leads to four-sided (quadrangular) sections of the lanes at common 's' coordinates, so-called lane elements (see LaneElement). +The scanning is carried out at a scanning rate of 10 centimeters with the aim of achieving a total scanning error of less than 5 centimeters, as required by the representation used internally (c.f. `open simulation interface`_). +Note that this error is only guaranteed if geometries do not exhibit extreme curvatures, i.e. a deviation of more than 5 cm within two sampling points (10 cm along s). +The scanned points define so-called joints, which contain all scanned points at an 's' coordinate across all lane boundaries of the given road. +The number of these joints is reduced by a `Ramer-Douglas-Peucker algorithm`_, which ensures that the maximum lateral error of each individual point within a joint is less than 5 cm compared to the originally scanned points. +Note that (a) the boundary points of geometries are always retained and (b) additional points for lane marking transitions are also retained to ensure the maximum accuracy of these edge cases. +The lane elements are generated with two successive connections, which are ultimately used in the localization at runtime (see :ref:`world_localization`). + +Internally, each lane element receives a constant direction, which is defined by the direction of the vector spanned between the centers of the corresponding connections. +Each joint also holds the corresponding curvature of the road, so that the curvature can be interpolated linearly within a lane element along the 's' coordinate. + +.. _world_localization: + +Localization +------------ + +Generally, the position of an agent is stored with respect to [world coordinates (x,y)](\ref dev_concepts_coordinatesystems_world). +As queries on the world operates in [road coordinates (s,t)](\ref dev_concepts_coordinatesystems_road), the position of the agent needs to be transformed. + +This section describes the translation of coordinates (x,y) of an agent into RoadCoordinate (s,t), whereas the notion of (s,t) comes from the `OpenDRIVE`_ standard. + +Basics +~~~~~~ + +The following image depics the basic principes of the localization which is rooted on the specifics of the OSI World Layer (aka OWL). + +.. figure:: ./images/LocalizationBasics.svg + + Localization Basics + +Given is a point P in cartesian coordinates (x/y). +The task is to assign the point to a lane, defined by a general road geometry and calculate the transformed Point P' in road coordinates (s/t). + +Road geometry (based on OpenDRIVE): + + - A road consists of several sections + - Each section consists of several lanes + - Within a section, the number of lanes is constant + - Lanes can have one predecessor and one successor + - The road follows a reference line, which is the reference for the *s*\ -coordinate. + The *t*\ -coordinate is perpendicular to this line. + +OWL specifics: + + - All lanes are sampled, generating a stream of generic quadrilaterals (LaneGeometryElements). + - Within a section, the number of quads per lane is equal, and all lanes have the same length in s. + - This is realized by a variable sampling width, determined by a constant sampling width along the longest arc. + - Consequently, points perpendicular to the reference line (*t*\ -axis) have the same *s*\ -coordinate. + +Note, that the final *t*\ -coorindate is calculated with respect to a virtual reference line for each lane. +This means, that points on the center of a lane have *t*\ -coordinate of 0. + +Localization sequence +~~~~~~~~~~~~~~~~~~~~~ + +.. _r-tree: https://www.boost.org/doc/libs/1_65_0/libs/geometry/doc/html/geometry/reference/spatial_indexes/boost__geometry__index__rtree.html + +An `r-tree`_ is used to store each LaneGeometryElement. +Thereby, due to the nature of the r-tree, the bounding box of the LaneGeometryElement is described by its maximum Cartesian coordinates (x_min, x_max, y_min, y_max). +Objects are located by retrieving all intersecting bounding boxes from the r-tree. +The picture below shows an example of an agent (blue) with the corresponding Cartesian bounding box, and all located LaneGeometryElements. + +.. figure:: ./images/Localization1.png + + Example of bounding boxes of LaneGeometryElements and agent + +As the true boundary polygon may be smaller, the actual intersection polygon of the object and each LaneGeometryElement is calculated. +For each point of a non-empty intersection polygon, the s and t coordinates are calculated and aggregated with respect to the underlying lane. +For each touched lane, the minimum and maximum s coordinate, and the minimum and maximum lane remainder (delta t) is stored. + +.. figure:: ./images/Localization2.png + + Example for the calculation of s_min, s_max and delta_left + +In addition, if the reference point (i.e. the middle of the rear axle) or the mainLaneLocator (i.e. the middle of the agent front) are located within a LaneGeometryElement, s/t/yaw is calculated of each point, respectively. +Further aggregation is done with respect to each road by calculating the minimum and maximum s for each road the agent intersects with. +For the current route of an agent, the following information is stored: s/t/yaw of the reference point and mainLaneLocator on the route (roads along a route are not allowed to intersect), distance from the lane boundary to the left and right for the road(s) along the route, and OpenDRIVE Ids of the lanes on the route that the agent touches. +The results also holds information wether both the reference point and the mainLaneLocator lay on the route. +In the currently implementation, these points must be located - otherwise the agent is despawened, as the agent cannot execute distance queries without a relation to its current route. + + +.. _world_trafficsigns: + +Traffic Signs and Road Markings +------------------------------- + +The world currently supports a variety of traffic signs and road markings. +Both are defined in OpenDRIVE as "RoadSignal". +At the moment it can only interpret traffic signs according to the German regulations "StVo". +Traffic signs can contain optional supplementary traffic signs. Supplementary signs are dependent on a main traffic sign and contain additional information. +The following traffic signs are supported: + +.. table:: + :class: tight-table + + ============================================= ========= =========== ================================================================================= + TrafficSign StVo Type Subtype Value and Units + ============================================= ========= =========== ================================================================================= + GiveWay 205 + Stop 206 + DoNotEnter 267 + EnvironmentalZoneBegin 270.1 + EnvironmentalZoneEnd 270.2 + MaximumSpeedLimit 274 X The subtype "X" is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + SpeedLimitZoneBegin 274.1 -/20 The subtype is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + No subtype = 30km/h, 20 = 20km/h + SpeedLimitZoneEnd 274.2 -/20 The subtype is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + No subtype = 30km/h, 20 = 20km/h + MinimumSpeedLimit 275 X The subtype is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + OvertakingBanBegin 276 + OvertakingBanTrucksBegin 277 + EndOfMaximumSpeedLimit 278 X The subtype "X" is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + EndOfMinimumSpeedLimit 279 X The subtype "X" is used to define the speedlimit in km/h. + Afterwards the world converts it to m/s. + OvertakingBanEnd 280 + OvertakingBanTrucksEnd 281 + EndOffAllSpeedLimitsAndOvertakingRestrictions 282 + RightOfWayNextIntersection 301 + RightOfWayBegin 306 + RightOfWayEnd 307 + TownBegin 310 This sign contains a text describing the name of the town + TownEnd 311 This sign contains a text describing the name of the town + TrafficCalmedDistrictBegin 325.1 + TrafficCalmedDistrictEnd 325.2 + HighWayBegin 330.1 + HighWayEnd 330.2 + HighWayExit 333 + AnnounceHighwayExit 448 + HighwayExitPole 450 50/51/52 The subtype describes the distance to the highway exit in m. + 50 = 100m, 51 = 200m, 52 = 300m + AnnounceRightLaneEnd 531 10/11/12/13 The subtype describes the number of continuing lanes after the right lane ends. + 10 = 1 lane, 11 = 2 lanes, 12 = 3 lanes, 13 = 4 lanes + AnnounceLeftLaneEnd 531 20/21/22/23 The subtype describes the number of continuing lanes after the left lane ends. + 10 = 1 lane, 11 = 2 lanes, 12 = 3 lanes, 13 = 4 lanes + DistanceIndication 1004 30/31/32 For subtype 30 the value describes the distance in m. + For subtype 31 the value describes the distance in km. + Subtype 32 has a STOP in 100m. + ============================================= ========= =========== ================================================================================= + +The following road markings are supported: + +.. table:: + :class: tight-table + + ======================= ========= ======= ================ + RoadMarking StVo Type Subtype Value and Units + ======================= ========= ======= ================ + PedestrianCrossing 293 + Stop line 294 + ======================= ========= ======= ================ + +The pedestrian crossing can also be defined in OpenDRIVE as object with type "crosswalk". + +.. _world_lanemarkings: + +Lane Markings +------------- + +The world also supports lane markings (i.e. printed lines between two lanes) according to the OpenDRIVE standard. +The following attributes of the "roadMark" tag in the scenery file are stored in the world and can be retrieved by the GetLaneMarkings query: sOffset, type, weight, color. +The weight is converted into a width in meter: 0.15 for standard and 0.3 for bold. Lane markings are also converted to OSI LaneBoundaries. +For the OpenDRIVE type "solid solid", "solid broken", "broken solid", and "broken broken" two LaneBoundaries are created in OSI with a fixed lateral distance of 0.15m. + +.. _world_getobstruction: + +GetObstruction +-------------- + +The GetObstruction function calculates the lateral distance an agent must travel in order to align with either the left or right boundary of a target object occupying the same lane. + +The calculation adheres to the following process: + +#) Project the agent's MainLaneLocator along the lane to the nearest and furthest s-coordinate of the target object, capturing the projected points +#) Create a straight line from the two captured points +#) Calculate the Euclidean distance of each of the target object's corners to the created line +#) Return the left-most and right-most points with respect to the created line + + +.. figure:: ./images/GetObstruction.png + + Example for the calculation of GetObstruction diff --git a/sim/doc/source/api.rst.template b/sim/doc/source/api.rst.template new file mode 100644 index 0000000000000000000000000000000000000000..ba80037f24187cd8c0075d5ca42f271a32ba62eb --- /dev/null +++ b/sim/doc/source/api.rst.template @@ -0,0 +1,15 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. toctree:: + :caption: Developer Doc + + .. include:: api/index.rst \ No newline at end of file diff --git a/sim/doc/source/conf.py b/sim/doc/source/conf.py new file mode 100644 index 0000000000000000000000000000000000000000..623cb1002e62d7e54d3cf8b25d6132a220655f1e --- /dev/null +++ b/sim/doc/source/conf.py @@ -0,0 +1,130 @@ +#************************************************************* +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +#************************************************************* + +# Configuration file for the Sphinx documentation builder. See also: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +import os +import sys +import datetime +import sphinx_rtd_theme +import sphinxcontrib.spelling +from textwrap import dedent + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. + +# -- Project information ----------------------------------------------------- +project = 'openPASS' +copyright = f'{datetime.datetime.now().year} OpenPASS Working Group' +author = 'in-tech GmbH' + +generate_api_doc = '-DWITH_API_DOC=ON' in sys.argv +if generate_api_doc: + sys.argv.remove('-DWITH_API_DOC=ON') + +# -- Version is generated via cmake +version_file = 'version.txt' +if os.path.exists(version_file): + with open(version_file) as vf: + version = vf.read().strip() + release = version + +# -- General configuration --------------------------------------------------- +def setup(app): + app.add_css_file('css/custom.css') + +extensions = [] +extensions.append('sphinxcontrib.spelling') +extensions.append("sphinx_rtd_theme") +extensions.append('sphinx.ext.todo') +extensions.append('sphinx_tabs.tabs') +extensions.append('sphinx.ext.imgmath') + +templates_path = ['_templates'] + +exclude_patterns = [] + +todo_include_todos = True + +pdf_stylesheets = ['sphinx', 'kerning', 'a4'] +pdf_style_path = ['.', '_styles'] +pdf_fit_mode = "shrink" # literal blocks wider than frame +pdf_language = "en_US" +pdf_page_template = 'cutePage' + +# -- Options developer documentation -------------------------------------- +if generate_api_doc: + extensions.append('breathe') + extensions.append('exhale') + + breathe_projects = {"openpass":"doxyoutput/xml"} + breathe_default_project = "openpass" + + # -- Setup the exhale extension ---------------------------------------------- + exhale_args = { + # These arguments are required + "containmentFolder": "./api", + "rootFileName": "index.rst", + "rootFileTitle": "Source Code Documentation", + "doxygenStripFromPath": "@OP_REL_SIM@", + # Suggested optional arguments + "createTreeView": True, + # TIP: if using the sphinx-bootstrap-theme, you need + # "treeViewIsBootstrap": True, + "exhaleExecutesDoxygen": True, + "exhaleDoxygenStdin": dedent(''' + INPUT = @OP_REL_SIM@/src + WARN_AS_ERROR = NO + PREDEFINED += DOXYGEN_SHOULD_SKIP_THIS + GENERATE_HTML = NO + RECURSIVE = YES + FULL_PATH_NAMES = YES + QUIET = YES + FILE_PATTERNS = *.cpp *.h + ENABLE_PREPROCESSING = YES + MACRO_EXPANSION = YES + SKIP_FUNCTION_MACROS = NO + EXPAND_ONLY_PREDEF = NO + ''') + } + + # make TOC available + with open('api.rst.template', 'r') as api_toc_template: + with open('api.rst', 'w') as api_toc: + api_toc.write(api_toc_template.read()) +else: + # wipe TOC for developer doc by creating an empty file + open('api.rst', 'w').close() + +# -- Options for HTML output ------------------------------------------------- + +html_static_path = ['_static'] +html_theme = 'sphinx_rtd_theme' +html_title = 'OpenPASS Documentation' +html_short_title = 'OpenPASS|Doc' +html_favicon = '_static/openPASS.ico' +html_logo = '_static/openPASS.png' + +# -- Define global replacements ---------------------------------------------- +# See https://documentation.help/Sphinx/config.html +rst_epilog = """ + +.. |op| replace:: **openPASS** +.. |Op| replace:: **OpenPASS** +.. |opwg| replace:: **openPASS** Working Group +.. |op_oss| replace:: **openPASS** (Open Source) +.. |Op_oss| replace:: **OpenPASS** (Open Source) +.. |mingw_shell| replace:: ``MinGW 64-bit`` shell + +""" diff --git a/sim/doc/source/glossary.rst b/sim/doc/source/glossary.rst new file mode 100644 index 0000000000000000000000000000000000000000..78c6649e19da05fba40355551e8b8cf1b335ed28 --- /dev/null +++ b/sim/doc/source/glossary.rst @@ -0,0 +1,74 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Glossary +======== + +.. glossary:: + + ADAS + Advanced Driving Assistance Systems + + AEB + Autonomous Emergency Brake + preventive emergency braking in danger (support or independent launch) + + Channel + Connects components within an agent (using unique ID) + + Component + A module that is part of an agent's equipment + + COG + Center of gravity + + Dynamics + Calculation of dynamic parameters, e.g. position of Agent + + MinGW + Complete Open Source programming tool set, suitable for the development of native MS-Windows applications. + + Model + An abstract representation of a real object which might omit details e.g. ADAS, driving dynamics, pedestrian, environmental conditions. In the PreCASE framework, a model consists of one or more modules as well as channels connecting them. + + Module + A dynamic library that is loaded and whose interface functions are called by the framework. Modules contain models or other individual functionality necessary for the simulation. Modules are exchangeable and can be fitted to various purposes ensuring ahigh flexibility of the framework. + + MSYS + Collection of GNU utilities (e.g. bash, make, gcc) to allow building of programs which depend on traditionally UNIX tools to be present. It is intended to supplement :term:`MinGW`. + + MSYS2 + Independent rewrite of :term:`MSYS`, based on Cygwin (POSIX compatibility layer) and MinGW-w64. + + OD + openDRIVE + + openPASS + Open Platform for Assessment of Safety Systems + + OSI + A generic interface for the environmental perception of automated driving functions in virtual scenarios. + + PreCASE + Framework for the Simulative Evaluation of Active Safety Systems in Vehicles (OpenPASS predecessor). + + Scenario + A set of similar traffic situations. + + TTC + Time to collision + + + + + + + diff --git a/sim/doc/source/index.rst b/sim/doc/source/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..7a900070b7ac3dea46973a273f6cab055e0c8714 --- /dev/null +++ b/sim/doc/source/index.rst @@ -0,0 +1,59 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +OpenPASS Documentation +====================== + +The OpenPASS (Open Platform for Assessment of Safety Systems) tool is a developed framework for the simulation of interaction between traffic participants to evaluate and parametrize active safety systems. +The simulation is based on a specific situation configuration and can contain several simulation runs, which differ due to random parameters. + +The software suite of openPASS started as a set of stand-alone applications, which can be installed and configured individually. +Over time, especially the graphical user interface evolved to a single entry point, enabling the average user to use openPASS as a "monolithic" tool. + +This guide contains information about installation, configuration and usage of all tools in the |Op| environment. + +.. toctree:: + :caption: Installation Guides + :glob: + :maxdepth: 1 + + installation_guide/* + +The GUI lets the user configure the simulation and generate configuration files from all set parameters. +Based on these the simulation core calculates different simulation runs and compiles trace files for further processing. + +.. toctree:: + :caption: User Guides + :glob: + :maxdepth: 1 + + user_guide/* + +.. toctree:: + :caption: Advanced topics + :glob: + :maxdepth: 1 + + advanced_topics/* + +.. include:: api.rst + +.. toctree:: + :caption: Other Information + :maxdepth: 1 + + glossary.rst + license.rst + +Todolist +======== + +.. todolist:: diff --git a/sim/doc/source/installation_guide/10_gui_installation_guide.rst b/sim/doc/source/installation_guide/10_gui_installation_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..050160404a3f0836716006c9f21fb0e12ff359ae --- /dev/null +++ b/sim/doc/source/installation_guide/10_gui_installation_guide.rst @@ -0,0 +1,15 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +GUI Installation Guide +============================= + +.. todo:: Add GUI installation guide. diff --git a/sim/doc/source/installation_guide/20_sim_installation_guide.rst b/sim/doc/source/installation_guide/20_sim_installation_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..fedf91a3111a331233df062c2b52a5745f2b57d4 --- /dev/null +++ b/sim/doc/source/installation_guide/20_sim_installation_guide.rst @@ -0,0 +1,38 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _sim_install_guide: + +Simulation Installation Guide +============================= + +This guide summarizes all installation related topics, necessary to setup and build the |op| simulation core (|release|). + +.. toctree:: + :caption: Meta + :maxdepth: 1 + + sim_installation_guide/meta/sphinx + +.. toctree:: + :caption: Installation + :glob: + :maxdepth: 1 + + sim_installation_guide/installation/* + +.. toctree:: + :caption: IDEs + :glob: + :maxdepth: 1 + + sim_installation_guide/ides/* + \ No newline at end of file diff --git a/sim/doc/source/installation_guide/21_pcm_installation_guide.rst b/sim/doc/source/installation_guide/21_pcm_installation_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..201a7c392ce568a03b3b91483290fecc3475beed --- /dev/null +++ b/sim/doc/source/installation_guide/21_pcm_installation_guide.rst @@ -0,0 +1,15 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +PCM Installation Guide +============================= + +.. todo:: Add PCM installation guide. diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/10_vscode.rst b/sim/doc/source/installation_guide/sim_installation_guide/ides/10_vscode.rst new file mode 100644 index 0000000000000000000000000000000000000000..9cf5b19fc451cb2f72330b52d07fae47757def0c --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/ides/10_vscode.rst @@ -0,0 +1,196 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Working with VSCode +=================== + +This section describes the basic setup for Visual Studio Code. +Use it as a template for starting. + +.. figure:: _static/images/vscode.png + :align: center + :scale: 60% + + Proper setup VSCode showing **left**, debugging, testmate, and cmake pane selectors, and at the **bottom**, build type, kit, current target, and CTest runner. + +Assumptions +----------- + +- For Windows, it is expected, that a **MSYS2/MinGW 64 Bit** is used. +- For brevity, non-standard libraries are expected to be in the folder ``deps/thirdParty``. + +Install and Config +------------------ + +#. Install Visual Studio Code + +#. Install extensions + + - C/C++ + - CMake Tools + - C++ Testmate + +#. Open the repository as folder, e.g. by calling ``code simopenpass`` after checking out. + If CMakeTools are setup right, it should as, if you like to configure it now and always on opening. + Say yes to configuration, which will create a ``build`` folder, but fails to do more (config follows below). + +#. **Windows only** Make Kit available: + + #. ``Ctrk+Shift+P``: ``CMake: Edit User-Local CMake Kits`` + #. Insert/Update: + + .. code-block:: JSON + + { + "name": "MinGW64 GCC", + "compilers": { + "C": "C:\\msys64\\mingw64\\bin\\gcc.exe", + "CXX": "C:\\msys64\\mingw64\\bin\\g++.exe" + }, + "preferredGenerator": { + "name": "MinGW Makefiles" + }, + "environmentVariables": { + "PATH": "C:\\msys64\\mingw64\\bin" + } + } + + +. ``Ctrk+Shift+P``: ``CMake: Select a Kit`` = ``MinGW64 GCC`` + +#. Configure: + + #. ``Ctrk+Shift+P``: ``Preferences Open Workspace Settings (JSON)`` + + #. Insert/Update: + + .. tabs:: + + .. tab:: Windows + + .. code-block:: JSON + + { + "cmake.cmakePath": "C:\\msys64\\mingw64\\bin\\cmake.exe", + "cmake.mingwSearchDirs": [ + "C:\\msys64\\mingw64\\bin" + ], + "cmake.generator": "MinGW Makefiles", + "cmake.parallelJobs": 2, + "cmake.configureArgs": [ + "-DCMAKE_PREFIX_PATH=${workspaceRoot}/deps/thirdParty/win64/FMILibrary;${workspaceRoot}/deps/thirdParty/win64/osi", + "-DUSE_CCACHE=ON", + "-DWITH_EXTENDED_OSI=ON", + "-DWITH_DEBUG_POSTFIX=OFF", + "-DOPENPASS_ADJUST_OUTPUT=OFF" + ] + } + + .. tab:: Linux + + .. code-block:: JSON + + { + "cmake.parallelJobs": 2, + "cmake.configureArgs": [ + "-DCMAKE_PREFIX_PATH=${workspaceRoot}/deps/thirdParty/linux64/FMILibrary;${workspaceRoot}/deps/thirdParty/linux64/osi", + "-DUSE_CCACHE=ON", + "-DCMAKE_INSTALL_PREFIX=/OpenPASS/bin" + ] + } + + #. ``Ctrk+Shift+P``: ``CMake: Configure`` - cmake should now be able to configure the project. + If not, cmake should give you at least a hint, what's missing (normally external libraries). + Read :ref:`cmake` or :ref:`prerequisites` for more information. + + .. note:: + + When changing libraries, it's recommended to wipe the cmake cache before reconfiguration: + ``Ctrk+Shift+P`` > ``CMake: Delete Cache and Reconfigure`` + +Testing +------- + +Testmate discovers tests only after they are built for the first time. +It pays to run ``ctest`` on the console to build all test targets. +After this, you should see all tests in the testing pane on the left. +If not, check the extension setting ``testMate.cpp.test.executables`` and ``testMate.cpp.test.workingDirectory`` + +Debugging +--------- + +Cmake offers its own debugging functionality, but does not respect the dependencies between the |op| core and its components. +This means, it tries to run the executable from within the build folder, e.g. ``./build/sim/src/core/slave/OpenPassSlave``. +Unfortunately, in here, the core does not find any libraries or configurations. + +As a solution, setup a debug target, pointing at the installed executable instead: + +#. Got to "Run and Debug" (``Ctrl+Shift+D``) and *create a launch.json file*. + +#. Insert/Update: + +.. tabs:: + + .. tab:: Windows + + .. code-block:: JSON + + { + "configurations": [ + { + "name": "Debug OpenPass", + "type": "cppdbg", + "request": "launch", + "program": "C:/OpenPASS/bin/core/OpenPassSlave.exe", + "args": [], + "stopAtEntry": false, + "cwd": "c:/openpass/bin/core", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + } + + .. tab:: Linux + + .. code-block:: JSON + + { + "configurations": [ + { + "name": "Debug OpenPass", + "type": "cppdbg", + "request": "launch", + "program": "/openPASS/bin/core/OpenPassSlave", + "args": [], + "stopAtEntry": false, + "cwd": "/openPASS/bin/core/", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + } + +.. warning:: Don't forget to run the target ``install`` before debugging. \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/20_qt_creator.rst b/sim/doc/source/installation_guide/sim_installation_guide/ides/20_qt_creator.rst new file mode 100644 index 0000000000000000000000000000000000000000..8ffb4903ce4b74ead25dab3278d272082bf29fc0 --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/ides/20_qt_creator.rst @@ -0,0 +1,128 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Working with Qt Creator +======================= + +Settings (MSYS2) +---------------- + +Setup Cmake-Kit +~~~~~~~~~~~~~~~ + +#. Add Cmake under ``Tools -> Options -> Kits -> Cmake`` + + .. figure:: _static/images/qtcreator_settings_cmake.png + :align: center + :scale: 60% + + +#. Add C and C++ Compilers under ``Tools -> Options -> Kits -> Compilers`` + + .. figure:: _static/images/qtcreator_settings_g++.png + :align: center + :scale: 60% + + + .. figure:: _static/images/qtcreator_settings_gcc.png + :align: center + :scale: 60% + + +#. Add Debugger under ``Tools -> Options -> Kits -> Debuggers`` + + .. figure:: _static/images/qtcreator_settings_gdb.png + :align: center + :scale: 60% + + +#. Add Kit under ``Tools -> Options -> Kits -> Kits`` + + .. figure:: _static/images/qtcreator_settings_kit.png + :align: center + :scale: 60% + + +#. Adjust ``Cmake Generator`` under ``Tools -> Options -> Kits -> Kits`` to ``MinGW Makefiles`` + + .. figure:: _static/images/qtcreator_settings_cmake_generator.png + :align: center + :scale: 60% + + .. note:: + + Change the environment variable to ``MAKEFLAGS=-j4`` (or similar) to enable parallel building on the kit level. + +Setup Project +~~~~~~~~~~~~~~ + +#. Load the project by opening a ``CMakeLists.txt`` file and configure it to use the new kit. + +#. Setup missing Cmake flags (c.f. :ref:'Cmake') + + .. todo:: The configuration is still "itchy", as Qt creator changes the interface with every version + +#. Override the make command under ``Project -> Build -> Build Steps`` to ``mingw32-make`` + + .. figure:: _static/images/qtcreator_project_make.png + :align: center + :scale: 60% + + .. note:: + + Unfortunatly, there seems to be no way to enable ``mingw32-make`` on the kit level. + +Settings (Linux) +---------------- + +Setup Kit +~~~~~~~~~ + +Qt Creator should be able to come up with a suiteable kit for developing |op| on its own. +If not, check if all :ref:`prerequisites` are met. Also, the steps above should be a good indicator, where to look for potential troubles. + +Setup Project +~~~~~~~~~~~~~~ + +#. Load the project by opening a ``CmakeLists.txt`` file and configure it to use a proper kit. + +#. Setup missing Cmake flags (c.f. :ref:'Cmake') + + .. todo:: The configuration is still "itchy", as Qt creator changes the interface with every version + +Alternative Method +------------------ + +.. admonition:: Version Issues + + Qt Creator is constantly improving the Cmake integration. + Unfortunatly, some versions seem to be **buggy**. + + Tested Versions: 4.13.2 | 4.12.2 + +#. Follow the install instructions to invoke cmake from within your own build directory. + - Execute the step for ``build-release`` + - Execute the step for ``build-debug`` +#. Open Qt Creator +#. Open ``CMakeLists.txt`` +#. Qt Creator should find the configured build directories and create a temporary kit + + .. figure:: _static/images/qtcreator_project_cmake.png + :align: center + :scale: 60% + + .. figure:: _static/images/qtcreator_project_loaded.png + :align: center + :scale: 60% + + .. figure:: _static/images/qtcreator_project_cmake_settings.png + :align: center + :scale: 60% \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake.png new file mode 100644 index 0000000000000000000000000000000000000000..f85572ddff1635c471724f41989dff8f4a52f609 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake_settings.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake_settings.png new file mode 100644 index 0000000000000000000000000000000000000000..e3aa414fc839df7bcaddcc5b85f26dfdec84b4dc Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_cmake_settings.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_loaded.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_loaded.png new file mode 100644 index 0000000000000000000000000000000000000000..fa52f72ad0685763b17e3c31e3fd4f91f01be715 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_loaded.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_make.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_make.png new file mode 100644 index 0000000000000000000000000000000000000000..d02c0fac0845a3a9ee8020f2fe0d5c2ca65ee44f Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_project_make.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake.png new file mode 100644 index 0000000000000000000000000000000000000000..0e58da95f443fc06e38165273f9da2cb988f6aad Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake_generator.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake_generator.png new file mode 100644 index 0000000000000000000000000000000000000000..e6dae6a6de97d9eb45afb54940fc8fd8e4387712 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_cmake_generator.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_g++.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_g++.png new file mode 100644 index 0000000000000000000000000000000000000000..02b34b842f4b29cd3c8877cb9df313fc5a94bb1d Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_g++.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gcc.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gcc.png new file mode 100644 index 0000000000000000000000000000000000000000..8d70191a370b5c4c4527550f00da32ec8183b352 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gcc.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gdb.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gdb.png new file mode 100644 index 0000000000000000000000000000000000000000..e15ebd7b7a7bcdf940a435a6e672cd7fbcd697ff Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_gdb.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_kit.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_kit.png new file mode 100644 index 0000000000000000000000000000000000000000..31bc33df61772bc950680e7d0ebc500a1c190a52 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/qtcreator_settings_kit.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/vscode.png b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/vscode.png new file mode 100644 index 0000000000000000000000000000000000000000..19db1dda0ca301d5d67bb56dd70b1a63da5dbce8 Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/ides/_static/images/vscode.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/10_quickstart.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/10_quickstart.rst new file mode 100644 index 0000000000000000000000000000000000000000..1e7e31639a71a0b158bcb5c5dc6c216f5114c3cb --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/10_quickstart.rst @@ -0,0 +1,137 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Quick Start +=========== + +This section describes how compile and run |op| as quickly as possible. + +.. note: + + For **Windows**, an up-to-date MinGW 64-bit environment is assumed, for **Linux**, Debian Bullseye or Ubuntu 20.10 is recommended. + +#. Install :ref:`Prerequisites` + + For brevity, the following description assumes that prerequisites are located at within the repository at ``deps/thirdParty``. + +#. Get repository and submodules + + For brevity, the following description assumes that the checkout path is the default ``simopenpass``. + + .. code-block:: bash + + git clone https://gitlab.eclipse.org/eclipse/simopenpass/simopenpass.git + cd simopenpass + +#. Prepare build + + Starting from ``simopenpass`` + + .. tabs:: + + .. tab:: Windows + + .. code-block:: bash + + mkdir build + cd build + cmake -G "MinGW Makefiles"\ + -D CMAKE_PREFIX_PATH="/mingw64/bin;\ + ../deps/thirdParty/win64/FMILibrary;\ + ../deps/thirdParty/win64/osi;"\ + -D CMAKE_INSTALL_PREFIX=/C/OpenPASS/bin/core \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_WITH_DEBUG_POSTIX=OFF \ + -D OPENPASS_ADJUST_OUTPUT=OFF \ + -D USE_CCACHE=ON \ + -D CMAKE_C_COMPILER=gcc \ + -D CMAKE_CXX_COMPILER=g++ \ + .. + + .. tab:: Linux + + .. code-block:: bash + + mkdir build + cd build + cmake -D CMAKE_PREFIX_PATH=/opt/qt5.12.3/5.12.3/gcc_64\;\ + ../deps/thirdParty/linux64/FMILibrary\;\ + ../deps/thirdParty/linux64/boost\;\ + ../deps/thirdParty/linux64/osi\;\ + ../deps/thirdParty/linux64/protobuf\;\ + ../deps/thirdParty/linux64/googletest \ + -D CMAKE_INSTALL_PREFIX=/OpenPASS/bin/core \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_WITH_DEBUG_POSTIX=OFF \ + -D OPENPASS_ADJUST_OUTPUT=OFF \ + -D USE_CCACHE=ON \ + -D CMAKE_C_COMPILER=gcc-10 \ + -D CMAKE_CXX_COMPILER=g++-10 \ + .. + + .. note:: Adjust paths and options based on your system and needs. + +#. Optional: Build and execute unit tests + + Starting from ``simopenpass/build``: + + .. code-block:: bash + + make test ARGS="--output-on-failure -j3" + + .. note:: + + ARGS is optional, but recommended. + Adjust parallel build flag ``-j3`` based on your system. + +#. Build simulation core + + Starting from ``simopenpass/build``: + + .. code-block:: bash + + make -j3 install + + .. note:: Again, adjust parallel build flag ``-j3`` based on your system. + +#. Fix installation (we're working on that...) + + .. tabs:: + + .. tab:: Windows + + .. code-block:: bash + + cp /C/OpenPASS/bin/core/bin /C/OpenPASS/bin/core + + .. tab:: Linux + + .. code-block:: bash + + cp ./OpenPASS/bin/core/bin ./OpenPASS/bin/core + +#. Run simulation (example) + + Starting from ``simopenpass/build`` and using an example configuration: + + .. tabs:: + + .. tab:: Windows + + .. code-block:: bash + + ./C/OpenPASS/bin/core/OpenPassSlave --config ../sim/contrib/examples/AEB + + .. tab:: Linux + + .. code-block:: bash + + ./OpenPASS/bin/core/OpenPassSlave --config ../sim/contrib/examples/AEB \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/20_prerequisites.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/20_prerequisites.rst new file mode 100644 index 0000000000000000000000000000000000000000..13fe63f370ae71ca027ef9e33a7c8045a3ae4c5b --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/20_prerequisites.rst @@ -0,0 +1,188 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _prerequisites: + +Prerequisites +============= + +This section gives detailed information about the prerequisite and tested version. +In short: + +.. tabs:: + + .. tab:: Windows (MSYS2) + + .. literalinclude:: _static/msys2_packages.txt + :language: bash + + Details: :ref:`building_under_windows` + + .. tab:: Linux (Debian Bullseye) + + .. code-block:: bash + + apt install ccache + apt install cmake + apt install doxygen + apt install googletest + apt install gcc + apt install g++ + apt install graphviz + apt install libprotobuf-dev + apt install protobuf-compiler # when building osi + apt install qt5-default + + Details: :ref:`building_under_linux` + +GNU Compiler Collection (gcc) +----------------------------- + +**Version (latest tested):** 10.2.3 + +|Op| is developed on Linux and Windows (64-Bit) in `C++17 <https://isocpp.org/>`_ using the GNU Compiler Collection (`gcc <https://gcc.gnu.org/>`_). + +.. admonition:: Useful hints + + - | |op| has been developed using gcc 7.x, 8.x, 9.x, and more recently gcc 10.x. + | There are no known issues regarding the different versions. + - Since no compiler specific features are used, the source should also compile with `clang <https://clang.llvm.org/>`_. + - Generally, there is support for `MSVC <https://docs.microsoft.com/en-us/cpp/build/reference/c-cpp-building-reference>`_ , but currently not actively maintained by the |opwg|. + +GNU Debugger (gdb) +------------------ + +**Version (latest tested):** 9.2 + +Debugging tools for gcc: https://www.gnu.org/savannah-checkouts/gnu/gdb/index.html + +CMake +----- + +**Version (latest tested):** 3.18.4 + +|Op| uses `CMake <https://cmake.org/>`_ for building and testing. +For details on the provided options, see :ref:`cmake`. + +.. Note:: The former support for ``qmake`` is expiring and not documented anymore. + +.. _prerequisites_ccache: + +Ccache +------ + +**Version (latest tested):** 3.7.11 + +|Op| supports the compiler cache `Ccache <https://ccache.dev/>`_ for faster recompilation. +Use only, if you need to recompile regularly. + +.. admonition:: Useful hints + + - The first compilation is definilty slower (e.g. by 30%), as the cache needs to be built. + - If used regularily, increasing the cache size is recommended, e.g.: ``ccache -M 20G`` + +Doxygen +------- + +**Version (latest tested):** 1.8.20 + +Documentation is created using `Doxygen <https://www.doxygen.nl/index.html>`_. + +.. admonition:: Useful hints + + - Doxygen introduced support for Markdown with 1.8, which is still in use. + Don't use older versions. + +Qt Framework +------------ + +**Version (officially supported):** 5.12.3 + +|Op| uses some features from the `Qt <https://www.qt.io/>`_ framework. +While the GUI of |op_oss| heavily relies on it, the simulation core tries to stick to the C++ standard framework as far as possible. + +.. admonition:: Note on Versions + + | Versions starting from 5.4 should generally work, but are not officially supported anymore/yet. + | Version 5.15.1 has been reported to work well. + +Boost C++ Libraries +------------------- + +**Version (officially supported):** 1.72.0 + +Especially for geometrical calculations, |op| uses parts of the `Boost C++ Libraries <https://www.boost.org/>`_. + +.. admonition:: Note on Versions + + More recent versions should integrate without issues, but 1.74.0 already raise warnings for some deprecated headers. + +googletest +---------- + +**Version (officially supported)** 1.10.0 + +Tests are written in `googletest <https://github.com/google/googletest>`_ and |Op| makes use of the included *googletest* (gtest) C++ testing framework, as well as the included mocking framework *googlemock* (gmock). + +.. note:: + + The lastest major release brought several API changes, which made some code fixes necessary. + Use newer versions with precaution. + +.. _prerequisites_osi: + +Open Simulation Interface (OSI) +------------------------------- + +**Version (officially supported):** 3.2.0 + +The internal world representation uses the `Open Simulation Interface <https://github.com/OpenSimulationInterface>`_ (:term:`OSI`) as part of its ground truth (backend storage) and exchange format. + +.. figure:: _static/images/osi_in_openpass.png + :align: center + :scale: 60% + :alt: OSI in |op| + + Interaction between World and consumers of OSI messages. + +Thereby, OSI provides data structures for representation of various objects in traffic simulation environments. +Note that OSI is primarily developed in a sensor centric view, such as lane markings and object boundaries. +Beyond that, |op| holds data for non-sensor centric data, such as metainfo on lanes and roads. + +As shown, OSI itself depends on :ref:`prerequisites_protobuf`. +If not already installed, the library and headers have to be built prior to OSI. + +.. admonition:: Note on Versions + + |Op| supports **integration of custom made or experimental versions** of OSI (see :ref:`building_osi`). + For example, `Algorithm_FmuWrapper` and the wrapped `OSMP` FMUs use the proposed OSI messages `TrafficUpdate` and `TrafficCommand`, not yet defined in OSI 3.2.0. + +.. _prerequisites_protobuf: + +Protocol Buffers (protobuf) +--------------------------- + +**Supported Version (officially supported):** 3.12.2 + +:ref:`prerequisites_osi` uses `Protocol Buffers <https://developers.google.com/protocol-buffers>`_ for describing and serialization of its datastructures. + +.. admonition:: Note on Versions + + - So far, no version limitations known (including 2.x). + - |Op| lets you integrate your own protobuf libraries if necessary (see :ref:`building_protobuf`). + +Modelon FMI Library (FMIL) +-------------------------- + +**Supported Version:** 2.0.3 + +For integration of Functional Mock-up Units (FMUs) the `Algorithm_FmuWrapper` uses the `Modelon FMI Library <https://github.com/modelon-community/fmi-library>`_. +As there is no binary available, FMIL needs to be build from scratch before |op| can be compiled (see :ref:`building_fmil`). \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/30_build_prerequisites.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/30_build_prerequisites.rst new file mode 100644 index 0000000000000000000000000000000000000000..c45a9e6044b9258741492623739ed2addec1b51e --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/30_build_prerequisites.rst @@ -0,0 +1,263 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Building Prerequisites +====================== + +This section describes custom building of prerequisites of |op|. + +To keep this guide as slim as possible, it only describes the **Windows perspective**. +In general, this should work for Linux as well by adjusting paths and the ``make`` command accordingly. + +.. note:: + + If you are unfamiliar to ``Cmake`` or working within a |mingw_shell|, Section :ref:`cmake` and :ref:`msys2` might give you a short introduction on these topics in the scope of Building OpenPASS itself. + +.. _ref_prerequisites: + +Referencing Prerequisites +------------------------- + +With the migration from qmake to cmake, all prerequisite are independent of each other and simply can be refereced by using the right :ref:`CMAKE_PREFIX_PATH`. + +.. warning:: + + The following information is **DEPRECATED** and only needed if a ``qmake`` build shall be invoked. + +Historically, |op_oss| uses a **single entry-point** for libraries and headers, so all prerequisites must to be located within a common folder structure. +If ``qmake`` needs to be invoked, and more than one prerequisite is customized, **a manual step** is necessary to establish this structure. + +Example: + +#. Build prerequisite_1 +#. Build prerequisite_2 +#. Copy libraries of both prerequisites into e.g. ``C:\OpenPASS\thirdParty\lib`` +#. Copy common headers into e.g. ``C:\OpenPASS\thirdParty\include`` + +#. Reference the entry points by adding the following arguments to the qmake command + + .. code-block:: batch + + EXTRA_INCLUDE_PATH=c:\OpenPASS\thirdParty\include + EXTRA_LIB_PATH=c:\OpenPASS\thirdParty\lib + + .. warning:: + + Make sure that there is no linebreak between the two arguments. + Qmake cannot handle this, but does not complain. + +.. _building_osi: + +Building OSI +------------ + +As teased in :ref:`Prerequisites`, the core component ``World_OSI`` uses :term:`OSI` as backend storage. +OSI itself uses ``protobuf`` to describe data structures in a platform independent way by means of `*.proto` files. +When building OSI, these files are converted into C++ headers and sources, using the protobuf compiler ``protoc``. +Finally, the sources are then compiled into a library. +|Op| finally uses the library and the generated headers to interface the library. + +#. Download release 3.2.0 from https://github.com/OpenSimulationInterface/open-simulation-interface + +#. Extract to e.g. ``C:\OpenPASS\thirdParty\sources\open-simulationinterface`` + +#. Optional: Enable Arenas + + For better performance, |op| supports protobuf Arenas allocation (https://developers.google.com/protocol-buffers/docs/reference/arenas). + To use this feature, OSI and |op| needs to be compiled with Arenas support. + See :ref:`cmake_protobuf_arenas` how this feature is enabled in |op|. + + For OSI, ``option cc_enable_arenas = true;`` needs to be added **manually** to all OSI proto files before compilation. + If everything goes well, ``protoc`` will generate all the magic necessary, otherwise issue an error during compilation. + +#. Open |mingw_shell| and navigate to extracted folder + +#. Create build directory + + .. code-block:: bash + + mkdir build + cd build + +#. Run Cmake + + .. code-block:: bash + + cmake -G “MinGW Makefiles†\ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=C:/OpenPASS/thirdParty \ + -DProtobuf_INCLUDE_DIR=C:/OpenPASS/thirdParty/include \ + -DProtobuf_PROTOC_EXECUTABLE=C:/OpenPASS/thirdParty/bin/protoc.exe \ + -DProtobuf_LIBRARIES=C:/OpenPASS/thirdParty/lib \ + .. + + .. note:: + + Here protobuf is used in as customized prerequisite (see :ref:`building_protobuf`). + Adjust paths as needed, if already installed as system package. + +#. Add linker flags for protobuf + + Unfortunantly OSI does not allow for to hook in a custom protobuf library. + To force compilation against a custom library, edit ``CMakeFiles\open_simulation_interface.dir\linklibs.rsp`` + and add ``-LC:/OpenPASS/thirdParty/lib -lprotobuf`` to the end of the line. + + .. admonition:: A little bit hacky... + + If anybody knows how to avoid this step, please let us know. + +#. Compile + + .. code-block:: bash + + mingw32-make -j3 + +#. Install + + .. code-block:: bash + + mingw32-make install + +#. Deprecated: Establish unified layout for prerequisites (c.f. :ref:`ref_prerequisites`) + + .. code-block:: bash + + cd /C/OpenPASS/thirdParty + cp lib/osi3/libopen_simulation_interface.dll lib + +.. admonition:: Documentation + + The OSI class documentation is part of the source code and can be compiled using Doxygen. + Instructions are located in the OSI ``Readme.md``. A pre-compiled version is located `here <https://opensimulationinterface.github.io/open-simulation-interface/index.html>`_. + + So far, the documentation does not include the extensions from the openpass-trafficAgents branch. + +.. _building_protobuf: + +Building Protobuf +----------------- + +.. note:: + + Protobuf is already available as package for MSYS2 in different versions (see :ref:`msys2_packages`). + +If a custom build is necessary, adjust this guide to your needs. +Exemplarily, it gives instructions, how to compile version 3.11.4. and hook it into the |op| build. + +#. Download release 3.11.4 from https://github.com/protocolbuffers/protobuf/releases + +#. Extract to e.g. ``C:\OpenPASS\thirdParty\sources\protobuf-cpp-3.11.4`` + +#. Open |mingw_shell| and navigate to extracted folder + +#. Create build directory + + .. code-block:: bash + + cd cmake + mkdir build + cd build + +#. Run Cmake + + .. code-block:: bash + :emphasize-lines: 5 + + cmake -G "MinGW Makefiles" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=C:/OpenPASS/thirdParty \ + -Dprotobuf_BUILD_SHARED_LIBS=ON \ + -Dprotobuf_BUILD_TESTS=OFF \ + .. + + .. note:: + + Tests are disabled due to compiler warnings treated as errors (may vary with compiler version). + +#. Compile + + .. code-block:: bash + + mingw32-make -j3 + +#. Install + + .. code-block:: bash + + mingw32-make install + +#. Deprecated: Establish unified layout for prerequisites (c.f. :ref:`ref_prerequisites`) + + .. code-block:: bash + + cd /C/OpenPASS/thirdParty + cp bin/libprotobuf.dll lib + +.. note:: + + Please refer to :ref:`runmingwexe` to see how to run the protobuf compiler ``protoc.exe`` outside of the |mingw_shell|. + +.. _building_fmil: + +Building FMIL +------------- + +#. Download release 2.0.3 from https://github.com/modelon-community/fmi-library + +#. Extract to e.g. ``C:\OpenPASS\thirdParty\sources\fmi-library`` + +#. Open |mingw_shell| and navigate to extracted folder + +#. Create build directory + + .. code-block:: bash + + mkdir build + cd build + +#. Run Cmake + + .. code-block:: bash + + cmake -G "MinGW Makefiles" \ + -DFMILIB_INSTALL_PREFIX=C:/OpenPASS/thirdParty \ + -DCMAKE_BUILD_TYPE=Release \ + -DFMILIB_BUILD_STATIC_LIB=OFF \ + -DFMILIB_BUILD_SHARED_LIB=ON \ + .. + +#. Apply Patch (Linux only) + + As FMIL and the internally used `FMU Compliance Checker <https://github.com/modelica-tools/FMUComplianceChecker>`_ has issues with loading and private entry points under Linux, the following patch needs to be applied: :download:`Linux Patch </_static/resources/fmil/fmil203.patch>` + +#. Compile + + .. code-block:: bash + + mingw32-make -j3 + +#. Install + + .. code-block:: bash + + mingw32-make install + +#. Deprecated: Establish unified layout for prerequisites (c.f. :ref:`ref_prerequisites`) + + .. code-block:: bash + + cd /C/OpenPASS/thirdParty/include + mkdir FMILibrary + mv -r FMI FMILibrary + mv -r FMI2 FMILibrary + mv -r JM FMILibrary + mv fmilib.h FMILibrary + mv fmilib_config.h FMILibrary \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/40_cmake.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/40_cmake.rst new file mode 100644 index 0000000000000000000000000000000000000000..1171c3458236532c56d44dbddb80454bd88a37de --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/40_cmake.rst @@ -0,0 +1,296 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _cmake: + +Cmake Build Environment +======================= + +|Op| uses Cmake as default cross-platform build environment. +This section describes the available variables and options. +If available, recommended options are shown in bold. + +The first part of this section approaches Cmake from the *command line perspective*. +Adjustments for the corresponding IDEs will follow shortly. + +The result of a proper Cmake call is a Makefile, which acts as base for the actual build using ``make`` or, under Windows, ``mingw32-make`` (c.f. :ref:`msys2`). +Hence, the second part of this section describes best practices around the make commands. + +.. admonition:: See also + + Cmake Documentation: https://cmake.org/cmake/help/latest/index.html + +Generator (Windows only) +------------------------ + +To generate MinGW compatible makefiles use ``-G "MinGW Makefiles"`` (c.f. :ref:`msys2`). + +Cmake Variables +--------------- + +.. _cmake_prefix_path: + +CMAKE_PREFIX_PATH +~~~~~~~~~~~~~~~~~ + +This command makes the prerequisite available to |op| as semicolon-separated list of directories, specifying installation prefixes to be searched by cmake. +Please refer to :ref:`Prerequisites` for the list of mandatory packages and libraries. +Cmake will issue an error, if one prerequisite is missing. + +Generally, cmake recognizes installed libraries (e.g. googletest) on its own. +By setting an explicit ``CMAKE_PREFIX_PATH`` for a library, it is possible to override the system libraries. +Use this, when an exact library version, or a customized library shall be used instead. + +.. note:: + + In the following example, non-standard libraries are assumed to be in the folder ``deps/thirdParty``. + +**Example** (system libraries **not** set): + +.. tabs:: + + .. tab:: Windows + + .. code-block:: bash + + cmake -G "MinGW Makefiles" + -D CMAKE_PREFIX_PATH="\ + /mingw64/bin;\ + $PWD/../deps/thirdParty/win64/FMILibrary;\ + $PWD/../deps/thirdParty/win64/osi;\ + -D <other variables>\ + .. + + .. tab:: Linux + + .. code-block:: bash + + cmake -D CMAKE_PREFIX_PATH=\ + $PWD/../deps/thirdParty/linux64/FMILibrary\;\ + $PWD/../deps/thirdParty/linux64/osi\;\ + -D <other variables> \ + .. + + .. warning:: The semicolon ``;`` needs to be escaped (``\;``) unless the string is quoted. + +.. note:: Please also read through ref:`openpass_variables` for further useful hints, e.g. why explicitly setting the MinGW path might be a necessary in some situations. + +CMAKE_INSTALL_PREFIX +~~~~~~~~~~~~~~~~~~~~ + +- Install directory used by install, when invoking ``make install`` +- Recommendation: ``/OpenPASS/bin/core`` (Linux) | ``C:/OpenPASS/bin/core`` (Windows) + +CMAKE_WITH_DEBUG_POSTIX +~~~~~~~~~~~~~~~~~~~~~~~ + +- Used only in conjunction with *Visual Studio Debug Builds* (MSVC), as it distinguishes release/debug DLLs by a postfix ``d``. +- Options: **OFF** | ON + +CMAKE_BUILD_TYPE +~~~~~~~~~~~~~~~~ + +- Specifies the build type on single-configuration generators. +- Typical: Release | Debug +- See: https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html + +.. note:: + + IDEs, as Qt Creator, might set this variable base on the current build type on their own. + +CMAKE_C_COMPILER +~~~~~~~~~~~~~~~~ + +- Options: **gcc-10** | gcc-9 | gcc-8 +- See: https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html + +.. note:: + + IDEs, as Qt Creator, might set this variable via *kit* settings. + +CMAKE_CXX_COMPILER +~~~~~~~~~~~~~~~~~~ + +- Options: **g++-10** | g++-9 | g++-8 +- See: https://cmake.org/cmake/help/latest/variable/CMAKE_LANG_COMPILER.html + +.. note:: + + IDEs, as Qt Creator, might set this variable via *kit* settings. + +CMAKE_OBJECT_PATH_MAX +~~~~~~~~~~~~~~~~~~~~~ + +- Under windows, errors from too long paths could be prevented by setting this value to 255 (maximum). +- See: https://cmake.org/cmake/help/latest/variable/CMAKE_OBJECT_PATH_MAX.html + +.. _cmake_openpass_variables: + +OpenPASS Variables +------------------ + +USE_CCACHE +~~~~~~~~~~ + +- Activates ccache (see :ref:`prerequisites_ccache`) +- Options: **ON** | OFF + +WITH_SIMCORE +~~~~~~~~~~~~ + +- Build OSI based scenario simulation, also know as openPASS core (slave). +- Options: OFF | **ON** + +WITH_DOC +~~~~~~~~ + +- Build sphinx based documentation +- Options: OFF | **ON** + +WITH_API_DOC +~~~~~~~~~~~~ + +- Build sphinx based developer documentation +- Options: **OFF** | ON + +.. note:: Automatically activates ``WITH_DOC`` if ON + +.. warning:: Building the API doc takes pretty long. + +WITH_COVERAGE +~~~~~~~~~~~~~ + +- Add test targets for code coverage analysis (lcov) and HTML report generation (genhtml) +- Options: **OFF** | ON +- Use ``COVERAGE_EXCLUDE`` to remove folders from the analysis + +.. note:: + + The generated files are placed next to the test executable. + Each test will be built without optimization, which will increase the testing run-time. + +WITH_GUI +~~~~~~~~ + +- Activates the additional build of the GUI provided with |Op| (open source). +- Options: **OFF** | ON + +.. note:: + + Please refer to :ref:`gui_user_guide` for information on the GUI. + +WITH_TESTS +~~~~~~~~~~ + +- Build unit tests +- Options: OFF | **ON** + +WITH_MINGW_BOOST_1_72_FIX +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Options: **OFF** | ON +- This enables a fix for detection within the MinGW environment, necessary when using the (for compatibility reasons supported) boost version 1.72. +- See: https://github.com/boostorg/boost_install/issues/33. + +OPENPASS_ADJUST_OUTPUT +~~~~~~~~~~~~~~~~~~~~~~ + +- Adjusts if builds are executed in the (Cmake default) folder ``build`` or directly in the specified install directory. + Latter mimics the former qmake behavior let you skip the call ``make install``. +- Options: **OFF** | ON + +.. warning:: + + When skipping ``make install``, dependencies are not copied into the output folder, which could cause crashes due to missing or outdated libraries. + +.. _cmake_protobuf_arenas: + +WITH_EXTENDED_OSI +~~~~~~~~~~~~~~~~~ + +- When set, assumes that extended version of OSI is available, by enabling the ``USE_EXTENDED_OSI`` preprocessor variable. +- This variable can be used to enable e.g. customized OSI features: + + .. code-block:: c++ + + #ifdef USE_EXTENDED OSI + #include "osi3/osi_<custom_message>.pb.h" + #endif + +- Options: **OFF** | ON + +WITH_PROTOBUF_ARENA +~~~~~~~~~~~~~~~~~~~ + +- | *Arena allocation is a C++-only feature that helps you optimize your memory usage and improve performance when working with protocol buffers.* + | (from https://developers.google.com/protocol-buffers/docs/reference/arenas) +- Options: **ON** | OFF + +.. note:: + + This feature is only available, if protobuf related libraries are also compiled with arenas (see :ref:`building_osi`). + Fortunately, the implementation falls back to regular allocation if not, which simply results in less performance. + +INSTALL_SYSTEM_RUNTIME_DEPS +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Copy detected system runtime dependencies to install directory (i.e. MinGW system libraries) +- Options: ON | **OFF** + +.. warning:: + + Under windows, automatic resolution might fail if other MinGW instances are installed. + As several programs use MinGW under the hood, it is recommended to set the used MinGW path in the CMAKE_PREFIX_PATH explicitly: + + .. code-block:: bash + + CMAKE_PREFIX_PATH = mingw64/bin;\... + +INSTALL_EXTRA_RUNTIME_DEPS +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +- Copy detected third party runtime dependencies to install directory (i.e. required shared libraries found in specified CMAKE_PREFIX_PATH) +- Options: ON | **OFF** + +Make Targets/Commands +--------------------- + +|Op| defines build targets by major modules or components, such as ``OpenPassSlave`` or ``Algorithm_FmuWrapper``. +After calling Cmake, simply build |op| by calling ``make``. + +.. admonition:: See also + + https://www.tutorialspoint.com/unix_commands/make.htm + +Build and Install +~~~~~~~~~~~~~~~~~ + +- ``make`` + +- ``make install`` + + .. warning: + + - Right now, there is still an issue with an additinal ``bin`` folder. + After installing, the content of the `./bin` folder needs to be copied into `.`. + + - Make install seems to have troubles on some systems when copying the dependencies. + Check if the libraries of e.g. OSI are copied into the execution directory of the core. + + - MinGW system libraries are not a dependency visible to make (see :ref:`runmingwexe`). + +- ``make <target>``: Build a single target + +Executing Tests +~~~~~~~~~~~~~~~ + +- All tests: ``make test ARGS="--output-on-failure -j3"`` +- Single test: ``make test OpenPassSlave_Tests ARGS="--output-on-failure -j3"`` \ No newline at end of file diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/50_windows.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/50_windows.rst new file mode 100644 index 0000000000000000000000000000000000000000..98201ad96cd828a905dbd0acd1e8dad2c39b6c96 --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/50_windows.rst @@ -0,0 +1,174 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _building_under_windows: + +Building under Windows +====================== + +To compile |op| with gcc/g++ locally under Windows, :term:`MSYS2` programming tools are recommended. + +.. warning:: + | The windows programming tools suffer from a `path length restriction`. + | This error manifests as strange **file not found** compile errors. + +.. admonition:: Recommendation + + | Use a short path for source code checkout, or map it directly to a drive letter. + | This can be done by the windows command `subst <https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/subst>`_. + +.. _msys2: + +MSYS2 +~~~~~ + +| This is a condensed version of the original MSYS2 guide found `here <https://www.msys2.org/>`_. + +Download +-------- + +- Latest 64-bit packages are located at https://repo.msys2.org/distrib/x86_64/. +- Download a non-base package, i.e. `msys2-x86_64-20200903.exe <https://repo.msys2.org/distrib/x86_64/msys2-x86_64-20200903.exe>`_ + +.. _msys2_installation: + +Installation +------------ + +Run the downloaded executable and adjust suggested settings to your needs (defaults are fine). +In the following, it is assumed that MSYS2 is installed under ``C:\msys64``. + +Environments +------------- + +MSYS2 provides three different environments, located in the MSYS2 installation directory: + +.. _fig_msys2_environments: + +.. figure:: _static/images/msys2.png + :align: center + :alt: MSYS2 Apps + + MSYS2 Environments + +- MSYS2 MSYS: Common environment, i.e. for package management +- MSYS2 MinGW 32-bit: A MinGW 32-bit environment +- | MSYS2 MinGW 64-bit: A MinGW 64-bit environment + | This is **the** |op| development environment and will be referred to as |mingw_shell|. + +.. _msys2_packages: + +Packages +-------- + +Update and install required packages (see also :ref:`prerequisites`). + +#. Open ``MSYS2 MSYS`` and execute the following package manager ``pacman`` commands to update the package repository and upgrade system packages: + + .. code-block:: bash + + pacman -Syuu + + If the upgrade requires a restart of MSYS2, resume the upgrade by re-opening the shell and call: + + .. code-block:: bash + + pacman -Suu + +#. Required packages (can be specified in single command line if desired): + + .. literalinclude:: _static/msys2_packages.txt + :language: bash + + .. admonition:: Versions + + | MSYS2 provides rolling release versions, so some packages might be too "up-to-date". + | Tested packages - ate time of writing - have been listed above as comment. + | If in doubt, download the package in the right version from the `MSYS2 package repository <http://repo.msys2.org/mingw/x86_64/>`_. + | Install with ``pacman -U <package-filename>`` + +#. Optional Packages + + .. code-block:: bash + + pacman -S git + pacman -S diffutils + pacman -S patch + pacman -S dos2unix + pacman -S mingw-w64-x86_64-ag + pacman -S mingw-w64-x86_64-qt5-debug + +.. admonition:: GIT/SSH + + The |mingw_shell| does not access an already existing git installation or available SSH keys. + Make sure, to update/copy your configuration and credentials within the |mingw_shell| before working with git. + +Building OpenPASS +----------------- + +This snippet shows an example for building the |op_oss| simulation core from within the |mingw_shell|. +Refer to :ref:`cmake` for details on the arguments. + +.. code-block:: bash + + cmake -G "MinGW Makefiles" \ + -D CMAKE_BUILD_TYPE=Debug \ + -D OPENPASS_ADJUST_OUTPUT=OFF \ + -D USE_CCACHE=ON \ + -D WITH_DEBUG_POSTFIX=OFF \ + -D WITH_GUI=OFF \ + -D WITH_PROTOBUF_ARENA=ON \ + -D CMAKE_INSTALL_PREFIX=C:/OpenPASS/bin/core \ + -D CMAKE_PREFIX_PATH="PATH_FMIL;PATH_BOOST;PATH_OSI;PATH_PROTOBUF;PATH_GTEST" \ + .. + + mingw32-make -j3 + mingw32-make install + +.. note:: + + The call to mingw32-make might be misleading, but actually calls gcc/g++ 64-bit. + +.. _runmingwexe: + +Execution +--------- + +Files compiled within the |mingw_shell| depend on the :term:`MinGW` libraries. +Providing this libraries to the executable can be done by following means: + +- Execute within the |mingw_shell|. +- Add ``C:\msys64\mingw64\bin`` permanently to the *Windows Environment Variable* ``Path``. +- Temporarily set ``Path`` prior to the execution, e.g. in a wrapper: + + .. code-block:: batch + + # your_program.cmd + Path=C:\msys64\mingw64\bin;%Path% # set Path + your_program.exe # execute + +- | Copy the required libraries right next to your executable. + | For |op|, the following librares are required: + + - libdouble-conversion.dll + - libgcc_s_seh-1.dll + - libicudt67.dll + - libicuin67.dll + - libicuuc67.dll + - libpcre2-16-0.dll + - libstdc++-6.dll + - libwinpthread-1.dll + - libzstd.dll + - zlib1.dll + + .. warning:: + + You might need to update the some libraries manually, when package are upgraded. diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/60_linux.rst b/sim/doc/source/installation_guide/sim_installation_guide/installation/60_linux.rst new file mode 100644 index 0000000000000000000000000000000000000000..ce1390f96116bd9b2dcf8603fbfd827013c8c163 --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/60_linux.rst @@ -0,0 +1,43 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _building_under_linux: + +Building under Linux +==================== + +Before building |op|, install the according :ref:`prerequisites`. +OpenPass is developed under Debian 64-Bit, which means that developing under a recent Ubuntu distribution should also work. +Debian uses ``apt`` (or ``apt-get``) as package managing system, and most prerequisites should be installable via ``app install package``. + +This snippet shows an example for building |op_oss|. +Refer to :ref:`cmake` for details on the arguments. + +.. code-block:: bash + :emphasize-lines: 9 + + cmake + -D CMAKE_BUILD_TYPE=Debug \ + -D OPENPASS_ADJUST_OUTPUT=OFF \ + -D USE_CCACHE=ON \ + -D WITH_DEBUG_POSTFIX=OFF \ + -D WITH_GUI=OFF \ + -D WITH_PROTOBUF_ARENA=ON \ + -D CMAKE_INSTALL_PREFIX=/OpenPASS/bin/core \ + -D CMAKE_PREFIX_PATH=PATH_FMIL\;PATH_BOOST\;PATH_OSI\;PATH_PROTOBUF\;PATH_GTEST \ + .. + + make -j3 + make install + +.. note:: + + Don't forget to escape the semicolon ``;`` (see :ref:`CMAKE_PREFIX_PATH`) diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/msys2.png b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/msys2.png new file mode 100644 index 0000000000000000000000000000000000000000..e7c23e9bb641bb0ef53f68d1cda5a9d9ba4b0ccd Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/msys2.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/osi_in_openpass.png b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/osi_in_openpass.png new file mode 100644 index 0000000000000000000000000000000000000000..0b40bf49f7eb756e30d540237c64d5be615e827e Binary files /dev/null and b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/images/osi_in_openpass.png differ diff --git a/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/msys2_packages.txt b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/msys2_packages.txt new file mode 100644 index 0000000000000000000000000000000000000000..2457a23762e3dfd368c57f1ff4fa2db32e074549 --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/installation/_static/msys2_packages.txt @@ -0,0 +1,11 @@ +pacman -S mingw-w64-x86_64-boost #1.75.0-2 +pacman -S mingw-w64-x86_64-ccache #3.7.9-1 +pacman -S mingw-w64-x86_64-cmake #3.19.2-1 +pacman -S mingw-w64-x86_64-doxygen #1.8.20-1 +pacman -S mingw-w64-x86_64-gcc #10.2.0-6 +pacman -S mingw-w64-x86_64-gdb #10.1-2 +pacman -S mingw-w64-x86_64-graphviz #2.44.1-3 +pacman -S mingw-w64-x86_64-gtest #1.10.0-1 +pacman -S mingw-w64-x86_64-make #4.3-1 +pacman -S mingw-w64-x86_64-protobuf #3.12.4-1 +pacman -S mingw-w64-x86_64-qt5 #5.15.2-5 diff --git a/sim/doc/source/installation_guide/sim_installation_guide/meta/sphinx.rst b/sim/doc/source/installation_guide/sim_installation_guide/meta/sphinx.rst new file mode 100644 index 0000000000000000000000000000000000000000..df4b75f2b48c13b4fe9b9cd220e368af10fdee39 --- /dev/null +++ b/sim/doc/source/installation_guide/sim_installation_guide/meta/sphinx.rst @@ -0,0 +1,59 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _sphinx: + +Sphinx +====== + +What is Sphinx +-------------- + +Sphinx is a python based documentation generator, using `reStructuredText <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_ as primary import format. + +Who uses Sphinx +--------------- + +- Everybody who publishes on `ReadTheDocs <https://readthedocs.org/>`_ +- `OSI <https://github.com/OpenSimulationInterface/osi-documentation>`_ + +Why not markdown +---------------- + +- Markdown was not invented to write documentation +- Right now the doxygen implementation is not pure markdown, which makes it a bit nasty to use +- Markdown does not support true references (and reference checking), figures (and captions), toc, glossary, versioning, ... +- Markdown is also supported by sphinx, but does not integrate with the cool and fancy features. + +Resources +--------- + +- `reStructuredText Primer <https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html>`_ +- `A "How to" Guide for Sphinx + ReadTheDocs <https://sphinx-rtd-tutorial.readthedocs.io/en/latest/index.html>`_ +- `Sphinx Documentation <https://www.sphinx-doc.org>`_ +- `OSI Sphinx Config <https://github.com/OpenSimulationInterface/osi-documentation/blob/master/conf.py>`_ + +Building this Documentation (Linux/Debian) +------------------------------------------ + +.. code-block:: bash + + # install python, pip, sphinx, spellchecker, ... + sudo apt install doxygen python3 python3-pip python3-sphinx libenchant-2-2 dvipng + + # install sphinx extensions + pip3 install sphinx sphinx-rtd-theme sphinx-tabs breathe exhale sphinxcontrib-spelling + + # build doc (only) + mkdir build + cd build + cmake -DWITH_SIMCORE=OFF -DWITH_TESTS=OFF -DWITH_DOC=ON .. + make doc diff --git a/sim/doc/source/license.rst b/sim/doc/source/license.rst new file mode 100644 index 0000000000000000000000000000000000000000..0f970c8fa3b53b073ca499d18c24669c88f15090 --- /dev/null +++ b/sim/doc/source/license.rst @@ -0,0 +1,18 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +License +======= + +This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 which is available at https://www.eclipse.org/legal/epl-2.0/ + + +SPDX-License-Identifier: EPL-2.0 \ No newline at end of file diff --git a/sim/doc/source/user_guide/10_gui_user_guide.rst b/sim/doc/source/user_guide/10_gui_user_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..b8a42c0d1face4f601c90c6989cf1e7045e6fbcc --- /dev/null +++ b/sim/doc/source/user_guide/10_gui_user_guide.rst @@ -0,0 +1,17 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _gui_user_guide: + +GUI User Guide +============== + +.. todo:: Create GUI user guide diff --git a/sim/doc/source/user_guide/20_sim_user_guide.rst b/sim/doc/source/user_guide/20_sim_user_guide.rst new file mode 100644 index 0000000000000000000000000000000000000000..549b24996663d0eef8ecd1267a24730c5dd2b24e --- /dev/null +++ b/sim/doc/source/user_guide/20_sim_user_guide.rst @@ -0,0 +1,200 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Simulation User Guide +====================== + +.. admonition:: Before we start... + + The official Working Group website of |op_oss| (https://openpass.eclipse.org/) offers a lot of information, well suited for beginners. + + +|Op| is a tool for executing a traffic based Monte-Carlo simulation and provides capabilities for the following two levels of variation: + +#. **Experiment:** Topmost, an experiment defines the domains of possible inputs, which shall be compared, such as *"traffic at high volume"* with *"traffic at low volume"*. + In this sense, a parameter variation is done at a very coarse level, resulting in two sets of inputs. + Note that this level is covered by the GUI (see :ref:`gui_user_guide`). + +#. **Invocation:** When an input-set is available, |op| invokes a defined number of runs, resulting in a probabilistic sampling of the given state under parameterizable conditions. + For example, in the aforementioned situation *"traffic at high volume"*, it would generate participants at *"lower speeds"* and *"smaller gaps"*. + Thereby parameterizable means, that the user has the freedom to define probabilities defining *"lower speed"* and *"smaller gaps"*. + In each invocation, |op| samples from these probabilities to generate a possible traffic situation under the given parameter variation. + +This guide primarily covers the aspect of the second tier, describing the parts an input-set and the expected output. + +Intended Audience +----------------- + +This manual serves as an entry point for users who have an operational simulator at hand (see :ref:`sim_install_guide`) and want to carry out (first) experiments at the invocation level (*GUI-less mode*). +In this sense, it primarily tackles how input-sets are composed, their interdependencies and, finally, the generated outputs. + +.. image:: sim_user_guide/_static/images/workflow.png + :alt: |op| Workflow + +This image shows the *GUI-less* workflow, starting with the input-set, bundled together in a folder typically named ``configs``. +The ``core``, executed manually by the experimenter, processes these configs and generates an (configurable) output-set typically placed in a folder named ``results``. +Thereby, the **Simulation Output** is again a set of files. + +Primer +------ + +In the following the input and output sets are described with respect to the intended audience. +For detailed information please refer to the "in-depth" documentation of the individual files. + +Inputs +~~~~~~ + +The input is focused around the following files, with decreasing importance for the current audience. + +- **Scenario** + + This file describes the overall situation in terms of the **ASAM OpenSCENARIO 1.0** standard. + This includes placement of cars, the story (what happens when), how long the simulation will run. + + On top it contains links to additionally needed files, where the following might need modification with respect to the current audience: + + - **Scenery** (``*.xosc``) + + The **scenery** file, which follows the **ASAM OpenDRIVE 1.6** standard, describes the world in which the experiment runs, such as a highway, or a parking lot. + As such, it contains the description of the road network and any static object, such as traffic signs or obstacles. + + - **ProfilesCatalog** (``*.xml``) + + This catalog describes the profiles of moving participants and are the probabilistic heart of the simulation. + A profile could be a **MiddleClassCar**, and describes which components could be available with what probability. + Such components could be ADAS's or sensors and as such, their parametrization is also found here. + + .. note:: As **OpenSCENARIO** does not support probabilities (yet), this file is not conform to the standard. + + - **VehiclesCatalog** and **PedestriansCatalog**: (``*.xosc``) + + These catalogs, also based on **OpenSCENARIO**, describes the physical parameters of available vehicles or pedestrians, respectively. + + .. note:: + + Historically, the referenced files have carry an additional *Model* in the filename: ``VehicleModelsCatalog.xosc`` and ``PedestrianModelsCatalog.xosc`` + +- **SlaveConfig** (``slaveConfig.xml``) + + This is the entry point for the simulation, containing the setup of the core, such as active observers, reference to the scenario, the initial random seed, and the number or invocations. + + .. note:: + + This file is normally of limited interest. + Yet, some variations, such as *environmental conditions* are historically placed in here and not in the scenario description. + It is therefore recommended to study the contents of this file. + +- **SystemConfigBlueprint** (``systemConfigBlueprint.xml``) + + This file is contains a superset of all possible *components* and their valid connections. + Such components can be lateral and longitudinal controllers, assistance systems, prioritizers, driver models, and so on. + Depending on the configured profiles and their probabilities, the core picks a subset of components to create one complete *system*. + + .. warning:: This file should not be changed without the proper (developer) expertise. + + .. note:: + + Instead of using an overall blueprint, concrete (static) systems can be specified using the same format. + These files are simply referred to as ``SystemConfig`` files. + +Some components need their own input files (e.g. a configuration). +It is convention to put these files also into the ``configs`` folder, which is internally provided as path to the components. +This helps to keep experiments separated. + +Outputs +~~~~~~~ + +Outputs are generated by individual observers, configured by the **SlaveConfig**, and collected within the folder `results`. +This section describes the output files by the :ref:`observation_log`, as configured by the provided example configurations. + +Please refer to the documentation of the individual observers and files for more details. + +- **Simulation Output** (``simulationOutput.xml``) + + This file acts as central entry point for further evaluation, such as the visualization. + It contains central information about all executed invocations within an experiment, such as the executed scenario and the run results, which can be seen as current values from the random sampling of the given probabilities. + As such, each run result contains, a list of participating moving entities (also referred to as agents), events related to the entities, such as collisions or activation of ADAS's, and a reference to the *cyclics file*. + + .. note:: This file **does not** contain information about the actual position of agents. + +- **Cyclic Output** (``Cyclics_Run_###.csv``) + + This file contains the ground truth information for each agent at each time step. + For each invocation, a new file is generated (starting with ``Cyclics_Run_000.csv`` and referenced in the according run results in the ``simulationOutput.xml``. + + .. note:: This file **does not** contain information about the interaction between agents. + +.. note:: + + The core generates a file called ``LogSlave.txt`` at the execution path, which logs errors and warnings. + If the simulation behaves strange or did not produce any output, check this file. + + +Component View +~~~~~~~~~~~~~~ + +|Op| is divided into components, which can be roughly divided into **core components** and **model components**. +The most interesting core components are the individual **spawners**, which are responsible for populating the world in a realistic fashion. +Model components are again roughly divided into **drivers** and **vehicle components** and represent how an individual participant is composed. + +.. note:: + + There are several additional components acting in the background, making sure things work as they should. + As a guideline, components parameterized through the **ProfilesCatalog** are scope of this guide, others not. + +.. todo:: Move Inputs, Outputs, and Components to their own master section + +Inputs in Depth +--------------- + +As described in the primer above, not all inputs might be of interest for the targeted audience. +Yet, for completeness, all potential input files shall be described here in detail. + +.. toctree:: + :glob: + :maxdepth: 1 + + sim_user_guide/input/* + +Outputs in Depth +---------------- + +As described in the primer above, simulation outputs are generated by the corresponding observers. +In the following, all potential outputs are described, grouped by the corresponding observers. + +.. toctree:: + :glob: + :maxdepth: 3 + + sim_user_guide/output/* + +.. _simuserguide_components: + +Components in Depth +------------------- + +In the following, all available components are described. + +.. toctree:: + :glob: + :maxdepth: 3 + + sim_user_guide/components/* + +Use Cases Examples +------------------ + +.. toctree:: + :glob: + :maxdepth: 1 + + sim_user_guide/examples/* + diff --git a/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Persistent.csv b/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Persistent.csv new file mode 100644 index 0000000000000000000000000000000000000000..b7e28fc4ad387a8f7d3e31553d47fe2ff6abc32d --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Persistent.csv @@ -0,0 +1,27 @@ +id;group;source;version;name;secondary id;type;subtype; +0;MovingObject;OpenSCENARIO;;Ego;;Ego;; +1;MovingObject;OpenSCENARIO;;TF;;Scenaro;; +2;MovingObject;OpenSCENARIO;;S1;;Scenaro;; +3;MovingObject;OpenSCENARIO;;S2;;Scenaro;; +4;MovingObject;OpenSCENARIO;;S3;;Scenaro;; +5;MovingObject;OpenSCENARIO;;;;Common;; +6;MovingObject;OpenSCENARIO;;;;Common;; +7;MovingObject;OpenSCENARIO;;;;Common;; +100000;StationaryObject;OpenDRIVE;1.6;Barrier;barrier_01;obstacle;; +100001;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_01;railing;; +100002;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_01;railing;; +100003;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_01;railing;; +100004;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_01;railing;; +100005;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_01;railing;; +100006;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_02;railing;; +100007;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_02;railing;; +100008;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_02;railing;; +100009;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_02;railing;; +100010;StationaryObject;OpenDRIVE;1.6;GuardRail;guardrail_02;railing;; +200000;Others;OpenDRIVE;1.6;LaneRoadMark;;Solid;; +200001;Others;OpenDRIVE;1.6;LaneRoadMark;;Solid;; +200002;Others;OpenDRIVE;1.6;Lane;-3;Driving;; +200003;Others;OpenDRIVE;1.6;LaneRoadMark;;Broken;; +200004;Others;OpenDRIVE;1.6;Lane;-2;Driving;; +200005;Others;OpenDRIVE;1.6;LaneRoadMark;;Broken;; +200006;Others;OpenDRIVE;1.6;Lane;-1;Driving;; diff --git a/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Run_000.csv b/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Run_000.csv new file mode 100644 index 0000000000000000000000000000000000000000..a436c5f3042cde271c864c357c58a9332b68adea --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/_static/Repository_Run_000.csv @@ -0,0 +1,9 @@ +id;group;source;version;name;secondary id;type;subtype; +0;MovingObject;OpenSCENARIO;;Ego;;Ego;; +1;MovingObject;OpenSCENARIO;;TF;;Scenaro;; +2;MovingObject;OpenSCENARIO;;S1;;Scenaro;; +3;MovingObject;OpenSCENARIO;;S2;;Scenaro;; +4;MovingObject;OpenSCENARIO;;S3;;Scenaro;; +5;MovingObject;OpenSCENARIO;;;;Common;; +6;MovingObject;OpenSCENARIO;;;;Common;; +7;MovingObject;OpenSCENARIO;;;;Common;; \ No newline at end of file diff --git a/sim/doc/source/user_guide/sim_user_guide/_static/images/workflow.png b/sim/doc/source/user_guide/sim_user_guide/_static/images/workflow.png new file mode 100755 index 0000000000000000000000000000000000000000..7036a790cb0ad8dbb34e4f7264fcd1f6c2754f99 Binary files /dev/null and b/sim/doc/source/user_guide/sim_user_guide/_static/images/workflow.png differ diff --git a/sim/doc/source/user_guide/sim_user_guide/components/driver.rst b/sim/doc/source/user_guide/sim_user_guide/components/driver.rst new file mode 100644 index 0000000000000000000000000000000000000000..e18f542c6827f099114ee59827f4096cf9d44f3f --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/components/driver.rst @@ -0,0 +1,46 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _components_driver: + +Driver +------ + +.. _components_agentfollowingdrivermodel: + +AlgorithmAgentFollowingDriverModel +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This driver type adapts its velocity to an agent in front and holds a desired velocity if there's no front agent available (like adaptive cruise control). The lateral guidance always keeps the agent in the middle of the lane. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/ProfilesCatalog.xml + :language: xml + :dedent: 4 + :start-at: <Profile Name="Regular"> + :end-at: </Profile> + +.. table:: + :class: tight-table + + =========================== ========== ==== ====================================================================================================================== ============================ + Parameter Type Unit Description Defaults to + =========================== ========== ==== ====================================================================================================================== ============================ + AlgorithmLateralModule String Behavior model for the steering wheel angle of the driver Required value + AlgorithmLongitudinalModule String Behavior model for the accelerator, brake pedal position, and the current gear of the driver Required value + VelocityWish Double m/s Desired speed :abbr:`33.33 m/s (120 km/h)` + Delta Double Free acceleration exponent characterizing how the acceleration decreases with velocity (1: linear, infinity: constant) 4.0 + TGapWish Double s Desired time gap between ego and front agent 1.5 s + MinDistance Double m Minimum distance between ego and front (used at slow speeds); Also called jam distance 2.0 m + MaxAcceleration Double m/s² Maximum acceleration in satisfactory way, not vehicle possible acceleration 1.4 m/s² + MaxDeceleration Double m/s² Desired deceleration 2.0 m/s² + =========================== ========== ==== ====================================================================================================================== ============================ + +.. todo:: Check description of Delta diff --git a/sim/doc/source/user_guide/sim_user_guide/components/spawner.rst b/sim/doc/source/user_guide/sim_user_guide/components/spawner.rst new file mode 100644 index 0000000000000000000000000000000000000000..aa3f8ee8f6825718f5a1f236112ab2e19b6e95c6 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/components/spawner.rst @@ -0,0 +1,207 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _components_spawner: + +Spawner +------- + +.. _components_scenariospawner: + +Spawners are responsible to populate the world. +In order to do so, several spawners can be used, whereas only the **ScenarioSpawner** is mandatory. + +ScenarioSpawner +~~~~~~~~~~~~~~~ + +The ScenarioSpawner is responsible for spawning Ego and Scenario vehicles as defined in the Scenario configuration file. +It is only called once initially and is **mandatory** for each simulation. +This Spawner should trigger before any other Spawners. + +The ScenarioSpawner has no parameters. + +Behavior: + +- In order to spawn correctly, a position for each Ego and Scenario vehicle is necessary, normally coming from the scenario (recommended). + As the position is *optional* in openSCENARIO it is possible that it is **not defined**. + In such cases spawning takes place at ``x = 0`` and ``y = 0``. +- If there is no route defined in the Scenario, the Spawner will set a random route starting at the spawning position. +- If there are multiple lanes at this position (this is only possible on junctions) it will take the lane with the lowest relative heading. + +.. _components_prerunspawner: + +PreRunSpawner +~~~~~~~~~~~~~ + +The PreRunSpawner is responsible for populating the scenery/world with Common-Agents before the simulator starts. +This Spawner only acts once before the simulator starts and not during the simulation run. +The PreRunSpawner needs a list of SpawnPoints that define where it will spawn agents and a list of weighted :ref:`components_trafficgroups` that defines the type and parameters of the spawned agents. +The SpawnPoints have the following parameters: + +.. table:: + :class: tight-table + + ========= ============ ==== =================================================================================== + Parameter Type Unit Description + ========= ============ ==== =================================================================================== + Roads StringVector The RoadIDs of the Roads on which to spawn Agents. + Multiple roads can be given as a comma-separated list. + Inexistent roads are ignored. + Lanes IntVector The LaneIDs of the Lanes of the Road on which to spawn Agents. + Multiple lanes can be given as a comma-separated list. + Inexistent lanes are ignored. + SStart Double m The S position specifying the minimum S for the range within which to spawn Agents + SEnd Double m The S position specifying the maximum S for the range within which to spawn Agents + ========= ============ ==== =================================================================================== + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/ProfilesCatalog.xml + :language: xml + :dedent: 4 + :start-at: <Profile Name="DefaultPreRunCommon"> + :end-at: </Profile> + +The PreRunCommonSpawner will spawn common agents on the specified Lanes of the specified Road from the s position S-Start to the s position S-End based on the parameters of the TrafficGroups. +The following restrictions apply: + +- The PreRunCommonSpawner only spawns on the following OpenDRIVE lane types: + - Driving + - OnRamp + - OffRamp + - ConnectingRamp + +- If the ScenarioSpawner spawned Scenario Agents (including the Ego agent) before this Spawner is triggered (in the intended order of these Spawners), ranges between the Scenario Agents are invalid for spawning by this Spawner. + The spawn ranges will only be augmented by Scenario Agents on the same Road and Lane. + As such, there are 7 different potential scenarios that may arise in terms of how the valid spawn ranges of the spawner may be impacted: + + #) **Two Scenario Agents on the same Road and Lane** + + One before S-Start position and one after S-End position: + This invalidates the entirety of the spawning range; no agents may be spawned here + + #) **Two Scenario Agents on the same Road and Lane** + + One between S-Start position and S-End position and one either before S-Start or after S-End: + The only valid spawn range is that on the opposite side of the in-specified-range Agent from the outside-specified-range agent + + #) **Two Scenario Agents on the same Road and Lane** + + Both within the specified S-Start and S-End positions + The valid spawn ranges are between S-Start and the first car and between the second car and S-End + + #) **Two Scenario Agents on the same Road and Lane** + + Both outside the specified S-Start and S-End positions on the same side (both before S-Start or both after S-End): + The specified spawn range is entirely valid + + #) **One Scenario Agent on the same Road and Lane** + + Within specified S-Start and S-End positions: + The valid spawn ranges include all but the bounds of the Agent within the specified S-Start and S-End positions + #) **One Scenario Agent on the same Road and Lane** + + Outside specified S-Start and S-End positions: + The specified spawn range is entirely valid + + #) **No Scenario Agents on the same Road and Lane** + + The specified spawn range is entirely valid + +- If a non-existent road is specified, no spawning will occur + +- If only non-existent lanes for an existent road are specified, no spawning will occur + +- If some specified lanes exist and some are non-existent for an existent road, spawning will occur for the lanes which do exist + +- If the specified S-Start and S-End positions are either beyond or before the S positions at which the specified Road and Lane combination exists, no spawning will occur + +- In the situation where a section of a Road adds a new lane to the left of the currently existing lanes, one should be aware that the laneId "-1" will shift to the newest left lane and should adjust Spawner profiles with this in mind + +Once the spawning ranges are determined the PreRunSpawner will spawn for each spawning area based on the following logic: + +#) First the agentprofile needs to be determined. If the current spawn position evaluate to a right lane, the pool from which the agentprofile is drafted is extended by all traffic groups which contain the RightLaneOnly flag set to true. + +#) Then the time gap between the new agent and the closest existing agent is sampled. + +#) Afterwards the velocity of the new agent is being sampled under consideration of the homogeneity. + +#) The gap and velocity are used to calculate the distance between the new agent and the next agent in this spawnarea. Here a minimum distance of 5m between agents is required. + +#) A random route is sampled starting at the appropriate road + +#) Based on the distance and the velocity the TTC (2s) conditions are evaluated.If the TTC is critical the spawn velocity is reduced to fulfill the TTC requirements. + +#) As a final step the spawnpoint evaluates the spawncoordinates. If they are valid the agent is created, else the spawnpoint moves on to the next spawning range. + +.. _components_runtimespawner: + +RuntimeSpawner +~~~~~~~~~~~~~~~~~~~ + +The RuntimeSpawner (included in library "SpawnPointRuntimeCommon_OSI") is responsible for maintaining a populated scenery throughout the simulation runtime. +It acts at each timestep throughout the simulation run and attempts to spawn Common Agents at the specified location(s). +The RuntimeSpawner needs a list of Spawners that define where it will spawn agents and a list of weighted :ref:`components_trafficgroups` that defines the type and parameters of the spawned agents. +The Spawners have the following parameters: + +.. table:: + :class: tight-table + + ========== ============ ==== ============================================================== + Parameter Type Unit Description + ========== ============ ==== ============================================================== + Roads StringVector The RoadIDs of the Roads on which to spawn Agents + Lanes IntVector The LaneIDs of the Lanes of the Road on which to spawn Agents + S-Position Double m The S position specifying at which point to spawn Agents + ========== ============ ==== ============================================================== + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/ProfilesCatalog.xml + :language: xml + :dedent: 4 + :start-at: <Profile Name="DefaultRuntimeCommon"> + :end-at: </Profile> + +The RuntimeSpawner will spawn based on the following logic: + +- First the agentprofile needs to be determined. If the current spawn position evaluates to a right lane, the pool from which the agentprofile is drafted is extended by all traffic groups which contain the RightLaneOnly flag set to true. +- Then the time gap between the new agent and the closest existing agent is sampled. +- Afterwards the velocity of the new agent is being sampled under consideration of the homogeneity. +- A random route is sampled starting at the appropriate road +- Once the timely gap expires, the spawnpoint evaluate if the TTC (2s) conditions and a minimum required distance between agents (5m) are met. If the TTC is critical the spawn velocity is reduced to fullfill the TTC requriements. If the minimum distance is not fullfilled, the agent will be held back. +- If all requirements were fullfilled the agent is spawned. + +The RuntimeSpawner only spawns on the following OpenDRIVE lane types: Driving, OnRamp + +.. _components_trafficgroups: + +TrafficGroups +~~~~~~~~~~~~~ + +Both the :ref:`components_prerunspawner` and the :ref:`components_runtimespawner` need one or more TrafficGroup. +These are typically defined in a separate ProfileGroup of type "TrafficGroup" and then reference by the spawner profile. +In this way both spawner can use the same TrafficGroups. + +.. table:: + :class: tight-table + + ============= ============= ==== ======================================================================================================================================================================= + Parameter Type Unit Description + ============= ============= ==== ======================================================================================================================================================================= + AgentProfiles <List> A set of <ListItem>s which define potential AgentProfile values for the Agents spawned in the SpawnArea and the probability at which the TrafficVolume will be selected + Velocity Distribution m/s A stochastic distribution describing the velocity of the spawned Agents + TGap Distribution s A stochastic distribution describing the time gap between spawned Agents + Homogeneity DoubleVector OPTIONAL: A vector describing the velocity increments for left lanes + RightLaneOnly Bool OPTIONAL: A flag determining whether this TrafficGroup can only be applied to the right most lane + ============= ============= ==== ======================================================================================================================================================================= + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/ProfilesCatalog.xml + :language: xml + :dedent: 4 + :start-at: <Profile Name="LightVehicles"> + :end-at: </Profile> diff --git a/sim/doc/source/user_guide/sim_user_guide/components/vehicle.rst b/sim/doc/source/user_guide/sim_user_guide/components/vehicle.rst new file mode 100644 index 0000000000000000000000000000000000000000..34c37cdea61d2131760db71b5e67ecede39c28f3 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/components/vehicle.rst @@ -0,0 +1,109 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _components_vehiclecomponents: + +VehicleComponents +----------------- + +.. _components_aeb: + +AEB +~~~ + +The Autonomous Emergency Braking system checks if a collision is likely to occur in the near future and, if necessary, brakes to avoid the collision. +In each timestep, the system evaluates all objects detected by a Sensor and calculates the time to collision (TTC) for this object based on the perceived movement of the object. +If, for any object, the TTC is lower than the threshold of the component, then the component gets activated. The system deactivates if the TTC is larger than 1,5 times the threshold of the component. + +.. table:: + :class: tight-table + + ====================================== ====== ==== =================================================================================== + Attribute Type Unit Description + ====================================== ====== ==== =================================================================================== + CollisionDetectionLongitudinalBoundary Double m Additional length added the vehicle boundary when checking for collision detection + CollisionDetectionLateralBoundary Double m Additional width added the vehicle boundary when checking for collision detection + TTC Double s Time to collision which is used to trigger AEB + Acceleration Double m/s² Braking acceleration when activated + ====================================== ====== ==== =================================================================================== + +.. code-block:: xml + + <ProfileGroup Type="AEB"> + <Profile Type="AEB" Name="AEB1"> + <Double Key="CollisionDetectionLongitudinalBoundary" Value="4.0"/> + <Double Key="CollisionDetectionLateralBoundary" Value="1.5"/> + <Double Key="TTC" Value="2.0"/> + <Double Key="Acceleration" Value="-2"/> + </Profile> + ... + </ProfileGroup> + +.. _components_trajectoryfollower: + +DynamicsTrajectoryFollower +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +This module forces agents to drive according to a specific trajectory. The trajectory is defined in the scenario. This module is disabled by default and is activated if a trajectory from openSCENARIO is triggered. +It is always important that the trajectories matches the current scenery file, otherwise the Agent could be placed outside of valid lanes. If the agent gets placed on a invalid position, it will be deleted. + +All attributes are required. + +.. table:: + :class: tight-table + + ===================== ==== ======================================================================================================================= + Attribute Type Description + ===================== ==== ======================================================================================================================= + AutomaticDeactivation Bool If true, the trajectory follower relinquishes control of the vehicle after the final instruction in the TrajectoryFile. + EnforceTrajectory Bool If true, the trajectory follower overrides external input related to the vehicle's travel. + ===================== ==== ======================================================================================================================= + +.. code-block:: xml + + <ProfileGroup Type="DynamicsTrajectoryFollower"> + <Profile Name="BasicTrajectoryFollower"> + <Bool Key="AutomaticDeactivation" Value="true"/> + <Bool Key="EnforceTrajectory" Value="true"/> + </Profile> + </ProfileGroup> + +.. _components_geometric2d: + +SensorGeometric2D +~~~~~~~~~~~~~~~~~ + +This sensor is selected, when a sensor is parameterized as ProfileGroup "Geometric2D". + +.. table:: + :class: tight-table + + =============================== ====== ==== ================================================================================================== + Parameter Type Unit Description + =============================== ====== ==== ================================================================================================== + DetectionRange Double m Detection range + EnableVisualObstruction Bool Activates 2D sensor obstruction calculation + FailureProbability Double Probability of an object detection failure + Latency Double s Sensor latency + OpeningAngleH Double rad Horizontal opening angle + RequiredPercentageOfVisibleArea Double Required percentage of an object within the sensor cone to trigger a detection + =============================== ====== ==== ================================================================================================== + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ADAS_AEB_PreventingCollisionWithObstacle/ProfilesCatalog.xml + :language: xml + :dedent: 2 + :start-at: <ProfileGroup Type="Geometric2D"> + :end-at: </ProfileGroup> + +.. note:: + + Sensors also need a mounting position, defined w.r.t. the coordinate system of the vehicle (center of rear axis). + See also :ref:`profilescatalog_vehicleprofiles`. diff --git a/sim/doc/source/user_guide/sim_user_guide/examples/basic.rst b/sim/doc/source/user_guide/sim_user_guide/examples/basic.rst new file mode 100644 index 0000000000000000000000000000000000000000..14f3cdad66c32a54c5ca4c9ff44a67df2caf751b --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/examples/basic.rst @@ -0,0 +1,15 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +Basic Example +============= + +.. todo:: Add basic example \ No newline at end of file diff --git a/sim/doc/source/user_guide/sim_user_guide/input/profilescatalog.rst b/sim/doc/source/user_guide/sim_user_guide/input/profilescatalog.rst new file mode 100644 index 0000000000000000000000000000000000000000..36e933fcefd9ead55ae81f77a9593edf91612dd9 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/profilescatalog.rst @@ -0,0 +1,305 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _profilescatalog: + +ProfilesCatalog +=============== + +The ProfilesCatalog contains all AgentProfiles, VehicleProfiles and generic ProfileGroups and Profiles. +Depending on the configuration the simulator could require a "Driver"-ProfileGroup, a "Spawner"- and "TrafficGroup"-ProfileGroup, or sensor and vehiclecomponent specific ProfileGroups. + +* :ref:`profilescatalog_agentprofiles` +* :ref:`profilescatalog_vehicleprofiles` +* :ref:`profilescatalog_profilegroups` +* :ref:`profilescatalog_driverprofiles` +* :ref:`profilescatalog_vehiclecomponentprofiles` +* :ref:`profilescatalog_spawnerprofiles` + +.. _profilescatalog_agentprofiles: + +AgentProfiles +------------- + +In this section all AgentProfiles are defined. +An AgentProfile is either static or dynamic. +A static AgentProfile consists of a SystemConfig and a VehicleModel. +A dynamic AgentProfile specifies the composition of the agent according to certain probabilities. +Here the initial driver and the vehicle profile of an agent get specified. +At least one AgentProfile is required. +But every AgentProfile referenced in the used :ref:`scenario` file or :ref:`components_trafficgroups` must exist. +All probabilities must add up to 1.0. + +Composition of a static AgentProfile: + ++-----------------+-----------------------------------------------------------------------+-----------+ +| Tag | Description | Required | ++=================+=======================================================================+===========+ +| System | Reference to a system defined in a SystemConfig | Yes | ++-----------------+-----------------------------------------------------------------------+-----------+ +| VehicleModel | Name of the VehicleModel in the :ref:`scenario_vehiclemodels` | Yes | ++-----------------+-----------------------------------------------------------------------+-----------+ + +Composition of a dynamic AgentProfile: + ++-----------------+---------------------------------------------------------------------------------+--------------------+ +| Tag | Description | Required | ++=================+=================================================================================+====================+ +| DriverProfiles | List of :ref:`profilescatalog_driverprofiles` for random selection | At least one entry | ++-----------------+---------------------------------------------------------------------------------+--------------------+ +| VehicleProfiles | List of :ref:`profilescatalog_vehicleprofiles` for random selection | At least one entry | ++-----------------+---------------------------------------------------------------------------------+--------------------+ + +Example +~~~~~~~ + +In this experiment the ego agent is defined by the system with Id 0 in systemConfig.xml and the VehicleModel car_bmw_7. +Every LuxuryClassCarAgent has the driver profile "AgentFollowingDriver". +Regarding the vehicle profile 50% have a MINI Cooper and the other 50% drive a BMW 7. + +.. code-block:: xml + + <AgentProfiles> + <AgentProfile Name="EgoAgent" Type="Static"> + <System> + <File>systemConfig.xml</File> + <Id>0</Id> + </System> + <VehicleModel>car_bmw_7</VehicleModel> + </AgentProfile> + <AgentProfile Name="LuxuryClassCarAgent" Type="Dynamic"> + <DriverProfiles> + <DriverProfile Name="AgentFollowingDriver" Probability="1.0"/> + </DriverProfiles> + <VehicleProfiles> + <VehicleProfile Name="MINI Cooper" Probability="0.5"/> + <VehicleProfile Name="BMW 7" Probability="0.5"/> + </VehicleProfiles> + </AgentProfile> + </AgentProfiles> + +.. _profilescatalog_vehicleprofiles: + +VehicleProfiles +--------------- + +This sections contains all vehicle profiles. +Every VehicleProfile used by :ref:`profilescatalog_agentprofiles` must be listed here. + +.. code-block:: xml + + <VehicleProfiles> + <VehicleProfile Name="BMW 7"> + <Model Name="car_bmw_7"/> + <Components> + <Component Type="AEB"> + <Profiles> + <Profile Name="AebProfile" Probability="0.5"/> + </Profiles> + <SensorLinks> + <SensorLink SensorId="0" InputId="Camera"/> + </SensorLinks> + </Component> + </Components> + <Sensors> + <Sensor Id="0"> + <Position Name="Default" Longitudinal="0.0" Lateral="0.0" Height="0.5" Pitch="0.0" Yaw="0.0" Roll="0.0"/> + <Profile Type="Geometric2D" Name="Standard"/> + </Sensor> + </Sensors> + </VehicleProfile> + ... + </VehicleProfiles> + ++-------------+--------------------------------------------------------+ +| Attribute | Description | ++=============+========================================================+ +| Name | Name of the vehicle profile | ++-------------+--------------------------------------------------------+ +| Components | Lists all ADAS and other components in the vehicle | ++-------------+--------------------------------------------------------+ +| Sensors | Lists all sensors in the vehicle | ++-------------+--------------------------------------------------------+ + +.. _profilescatalog_components: + +Components +~~~~~~~~~~ + ++-------------+-------------------------------------------------------------------------------------------------+ +| Attribute | Description | ++=============+=================================================================================================+ +| Type | Type of the component. | +| | | +| | Must match component name in SystemConfigBlueprint | ++-------------+-------------------------------------------------------------------------------------------------+ +| Profile | Possible profiles of the component with probabilities. | +| | | +| | The profiles are defined in the :ref:`profilescatalog_vehiclecomponentprofiles` section | +| | | +| | Probabilities do not need to add up to 1. | ++-------------+-------------------------------------------------------------------------------------------------+ +| SensorLinks | Defines which sensor this component uses as input | ++-------------+-------------------------------------------------------------------------------------------------+ + +.. note:: The possibility of "not having that component" can be achieved if the probabilities of the profiles do not add up to 1. + +.. _profilescatalog_sensors: + +Sensors +~~~~~~~ + ++-------------+-------------------------------------------------------------------------------------------------+ +| Attribute | Description | ++=============+=================================================================================================+ +| Id | Identifier for the sensor used by the SensorLink definition of the components | ++-------------+-------------------------------------------------------------------------------------------------+ +| Position | Position of the sensor in the vehicle in relative coordinates | ++-------------+-------------------------------------------------------------------------------------------------+ +| Profile | All possible profiles of the sensor with probabilities. | +| | | +| | The profiles are defined in the :ref:`profilescatalog_vehiclecomponentprofiles` section | ++-------------+-------------------------------------------------------------------------------------------------+ + +.. _profilescatalog_profilegroups: + +ProfileGroups +------------- + +A ProfileGroup defines all the possible profiles of a component. +A single profile is a set of parameters that are passed to the component in the same way as the parameters in the SystemConfig. +Note: For components that have their parameters defined in the ProfilesCatalog the parameters in the SystemConfigBlueprint are ignored. +Parameters can either be simple or stochastic. +Simple parameters only have one value, while stochastic parameters have a minimum and maximum value as well as distribution specific parameters. +Which parameters are needed/supported depends on the component. + +.. code-block:: xml + + <ProfileGroup Type="ComponentName"> + <Profile Name="ExampleProfile"> + <String Key="StringParameter" Value="Lorem ipsum"/> + <DoubleVector Key="DoubleParameter" Value="12.3,4.56,78.9"/> + <NormalDistribution Key="RandomParameter" Mean="4.5" SD="0.5" Min="3.5" Max="10.0"/> + </Profile> + <Profile Name="AnotherProfile"> + ... + </Profile> + </ProfileGroup> + +There are the following types of simple parameters: + +* Bool +* Int +* Double +* String +* IntVector +* DoubleVector +* StringVector + +If a parameter is stochastic it can be defined as any to be drawn from any of the following distributions: + ++-------------------------+--------------------------------------------------+ +| Distribution | Additional Attributes | ++=========================+==================================================+ +| NormalDistribution | (Mean and SD) or (Mu and Sigma) - equivalent | ++-------------------------+--------------------------------------------------+ +| LogNormalDistribution | (Mean and SD) or (Mu and Sigma) - not equivalent | ++-------------------------+--------------------------------------------------+ +| UniformDistribution | None | ++-------------------------+--------------------------------------------------+ +| ExponentialDistribution | Lambda or Mean (Mean = 1 / Lambda) | ++-------------------------+--------------------------------------------------+ +| GammaDistribution | (Mean and SD) or (Shape and Scale) | ++-------------------------+--------------------------------------------------+ + +Additionally there is the list type. +The list contains any number of list items which itself contain a list of parameters. +Lists can be nested at most two times. + +.. code-block:: xml + + <List Name="ExampleList"> + <ListItem> + <String Key="FirstParameter" Value="Lorem"/> + <Double Key="SecondParameter" Value="0.4"/> + </ListItem> + <ListItem> + <String Key="FirstParameter" Value="ipsum"/> + <Double Key="SecondParameter" Value="0.6"/> + </ListItem> + </List> + + +A Profile can also reference another Profile in another ProfileGroup. +In these case the importer handles the reference as if it was substituted by all subelements of the referenced Profile. +References may not be nested. + +.. code-block:: xml + + <Reference Type="GroupType" Name="ProfileName"/> + + +.. _profilescatalog_driverprofiles: + +Driver ProfileGroup +------------------- + +This section contains all driver profiles used by the simulation. +At least one driver profile is required. +The special parameter "Type" defines the name of the component (i.e. library name). +For details on the indivual parameters see the :ref:`components reference <components_driver>`. + +.. code-block:: xml + + <ProfileGroup Type="Driver"> + <Profile Name="Name"> + <String Key="Type" Value="DriverLibrary"/> + ... + </Profile> + ... + </ProfileGroup> + + +.. _profilescatalog_vehiclecomponentprofiles: + +VehicleComponent ProfileGroups +------------------------------ + +This sections contains all driver assistance systems and other vehicle components and their parameter sets. +For every used VehicleComponent type there must be a ProfileGroup with this type and every profile of this type used by :ref:`profilescatalog_vehicleprofiles` must be listed here. +For details on the indivual parameters see the :ref:`components reference <components_vehiclecomponents>`. + +.. code-block:: xml + + <ProfileGroup Type="LibraryName"> + <Profile Name="Name"> + ... + </Profile> + ... + </ProfileGroup> + + +.. _profilescatalog_spawnerprofiles: + +SpawnerProfile ProfileGroup +--------------------------- + +This sections contains all parameters of the spawners referenced in the :ref:`slaveconfig`. +For details on the indivual parameters see the :ref:`components reference <components_spawner>`. + +.. code-block:: xml + + <ProfileGroup Type="Spawner"> + <Profile Name="Name"> + ... + </Profile> + ... + </ProfileGroup> diff --git a/sim/doc/source/user_guide/sim_user_guide/input/scenario.rst b/sim/doc/source/user_guide/sim_user_guide/input/scenario.rst new file mode 100644 index 0000000000000000000000000000000000000000..7b624f63a645dcfb44746c363182f72a7768e659 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/scenario.rst @@ -0,0 +1,815 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _scenario: + +Scenario +======== + +.. _scenario_overview: + +Overview +-------- + +The scenario configuration file describes all dynamic configuration of a simulation run, i.e. the position of an agent as well as conditional events that alter the behavior of the simulation during the run. +It adheres to the **ASAM OpenSCENARIO 1.0** standard, although we support only a subset of the features of the standard. + +The different parts of the scenario configuration are described in the following chapters. + +.. _scenario_parameterdeclaration: + +ParameterDeclarations +--------------------- + +The tag ``ParameterDeclarations`` allow to define generic parameters, which can be referenced later the file by its name, prefixed with ``$``. + +**Example declaration** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 2 + :start-at: <ParameterDeclarations> + :end-at: </ParameterDeclarations> + +**Example usage** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 12 + :start-at: <SimulationTime + :lines: 1 + +**Supported parameterTypes** + +- string +- integer +- double + +.. note:: Only ``string`` allows empty values. + +.. warning:: + + The parameter ``OP_OSC_SchemaVersion`` is used to check for schema compatibility and is mandatory within |op|. + +.. _scenario_catalogs: + +Catalogs +-------- + +The ``Catalogs`` tag defines references to various other files containing sub features of OpenSCENARIO (and written in the same format). + +The following catalogs interpreted: + +- Mandatory: :ref:`scenario_vehiclemodels` +- Mandatory: :ref:`scenario_pedestrianmodels` +- Optional: TrajectoryCatalog for the case that a *FollowTrajectory action* is defined + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 2 + :start-at: <CatalogLocations> + :end-at: </CatalogLocations> + +.. _scenario_vehiclemodels: + +VehicleCatalog +~~~~~~~~~~~~~~ + +This file is mandatory. +It contains the available vehicle models for the simulation. +For each vehicle the physical parameters are stored here. + +**Supported models:** + +- car_bmw_i3 +- car_bmw_3 +- car_bmw_7_1 +- car_bmw_7_2 +- car_mini_cooper +- bus +- truck +- bicycle + +**Full Example:** :download:`@OP_REL_SIM@/contrib/examples/DefaultConfigurations/VehicleModelsCatalog.xosc` + +.. _scenario_pedestrianmodels: + +PedestrianCatalog +~~~~~~~~~~~~~~~~~ + +This file is mandatory. +It contains the available pedestrian models for the simulation. +For each pedestrian the physical parameters are stored here. + +.. note:: + + Currently, pedestrian models are internally handled the same way as vehicle models, i.e. they behave like simplified vehicles. + For convenience, |op| internally sets *meaningless* parameters, such as *number of gears*, to operational defaults. + +**Supported models:** + +- pedestrian_child +- pedestrian_adult + +**Full Example:** :download:`@OP_REL_SIM@/contrib/examples/DefaultConfigurations/PedestrianModelsCatalog.xosc` + +.. _scenario_roadnetwork: + +RoadNetwork +----------- + +The ``RoadNetwork`` tag contains the mandatory reference to the OpenDRIVE :ref:`scenery`. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 2 + :start-at: <RoadNetwork> + :end-at: </RoadNetwork> + +.. _scenario_entities: + +Entities +-------- + +The ``Entities`` tag defines all agents that are present at the start of the simulation at predefined positions. +There may be any number of these so called **Scenario Agents** (also zero). +Each entity is described by a name and a reference to a vehicle profile within the :ref:`profilescatalog`. + +.. note:: This deviates from the OpenSCENARIO standard. + +.. todo:: In what way do scenario agents deviate from the standard? + +To specify an entity as the **Ego Agent**, the it must be named "Ego". + +Entities can also be grouped into selections. + +.. todo:: What is an EntitySelection? + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 2 + :start-at: <Entities> + :end-at: </Entities> + +**Overriding Parameters** + +Parameters defined in the VehicleCatalog can be assigned inside the CatalogReference element. +In this case the assigned parameter will overwrite the definition in the VehicleCatalog. +Otherwise the value defined in the VehicleCatalog is used. +The type of the parameter must match that in the VehicleCatalog. + +**Example** + +.. code-block:: xml + + <CatalogReference catalogName="ProfilesCatalog.xml" entryName="MiddleClassCarAgent"> + <ParameterAssignments> + <ParameterAssignment parameterRef="Length" value="4.0" /> + </ParameterAssignments> + </CatalogReference> + +.. admonition:: AgentProfile vs. VehicleModel + + |Op| references AgentProfiles instead of a VehicleModels. + Such an AgentProfile may have a stochastic distribution of different VehicleModels, each with potentially different parameters. + After the random selection of the vehicle model, some parameters may not be available and are therefore not assigned (ignored). + +.. _scenario_storyboard: + +Storyboard +---------- + +The ``Storyboard`` tag contains the initial setup of the scenario and manipulator actions. +These actions control the behavior of the simulation at runtime based on predefined conditions. + +.. _scenario_init: + +Init +~~~~ + +The content of the ``Init`` tag is forwarded to the SpawnPoint and define *if* and *where* it should place the ego and scenario agents. +The position can either be defined as global coordinates (x and y) with the ``World`` tag or as lane coordinates (s and t) with the ``Lane`` tag. + +The schema is defined as follows: + +.. table:: + :class: tight-table + + ==================== =================== ========================= ============== + Tag Parent Attributes Occurrences + ==================== =================== ========================= ============== + Actions Init *none* 1 + Private Actions entityRef 1 per entity + PrivateAction Private *none* 1+ + TeleportAction PrivateAction *none* 1 + Position TeleportAction *none* 1 + LanePosition Position roadId, laneId, s, offset 0 or 1 + WorldPosition Position x, y, h 0 or 1 + Orientation LanePosition type, h 0 or 1 + LongitudinalAction PrivateAction *none* 1 + SpeedAction LongitudinalAction *none* 1 + SpeedActionDynamics SpeedAction rate, dynamicsShape 1 + SpeedActionTarget SpeedAction *none* 1 + AbsoluteTargetSpeed SpeedActionTarget value 1 + RoutingAction PrivateAction *none* 0 or 1 + AssignRouteAction RoutingAction *none* 1 + Route AssignRouteAction *none* 1 + Waypoint Route *none* 1+ + Position Waypoint *none* 1 + RoadPosition Position roadId, t 1 + VisibilityAction PrivateAction traffic 1 + ==================== =================== ========================= ============== + +All listed attributes are required. +The attributes have the following meaning: + +.. table:: + :class: tight-table + + ==================== ================== ============================================================================================ + Tag Attribute Description + ==================== ================== ============================================================================================ + Private entityRef name of the entity for which the initial values are described in the sub-tags + LanePosition roadId Id of the road in the Scenery + LanePosition laneId Id of the lane in the Scenery + LanePosition s start position on the lane (i.e. distance from the start of the road) of the reference point + LanePosition offset lateral distance of the reference point to the middle of the road (i.e. t coordinate) + WorldPosition x x coordinate of the reference point + WorldPosition y y coordinate of the reference point + WorldPosition h heading + Orientation type has to be "relative" + Orientation h heading angle in radiant relative to the lane + SpeedActionDynamics rate acceleration + SpeedActionDynamics dynamicsShape "linear" for constant acceleration, "step" for immediate transition + SpeedActionDynamics dynamicsDimension has to be "rate" + AbsoluteTargetSpeed value velocity + RoadPosition roadId Id of the road in the Scenery + RoadPosition t negative for driving in roadDirection (i.e on lanes with negative Id) else positive + RoadPosition s ignored + VisibilityAction traffic Flag deciding if the scenario agent will be spawned (true = spawned, false = not spawned) + ==================== ================== ============================================================================================ + +**Defining a Position** + +|Op| only supports ``LanePosition`` and ``WorldPosition`` from the OpenSCENARIO standard. + +**Controlling Visibility** + +VisibilityAction is an optional attribute, which allows easy parameterization of certain entities, e.g. via :ref:`scenario_parameterdeclaration`. + +.. note:: If VisibilityAction **is not defined** the according entity agent **will be spawned**. + +**Stochastic Values** + +Unlike OpenSCENARIO, |op| allows some of the aforementioned values to be stochastic. +This is achieved by using the sub-tag ``Stochastics`` within the tags ``LanePosition`` or ``SpeedAction``: + +.. code-block:: xml + + <Stochastics value="..." stdDeviation="..." lowerBound="..." upperBound="..."/> + +The stochastics tag normally defines a normal distribution, but it is up to each component to interpret its values. +Here, value is a selector, which can be either ``s``, ``offset`` (if inside LanePosition), ``velocity`` or ``rate`` (if inside SpeedAction). +Depending on the selected type, the actual mean value is then taken from the attribute of the corresponding tag ``LanePosition``, ``SpeedActionDynamics``, or ``AbsoluteTargetSpeed``. + +**Full Example** + +.. code-block:: xml + + <Init> + <Actions> + <Private entityRef="Ego"> + <PrivateAction> + <TeleportAction> + <Position> + <LanePosition roadId="1" s="20.0" laneId="-2" offset="0.0"> + <Orientation type="relative" h="0.2"/> + <Stochastics value="s" stdDeviation="5.0" lowerBound="10.0" + upperBound="30.0"/> + </LanePosition> + </Position> + </TeleportAction> + </PrivateAction> + <PrivateAction> + <LongitudinalAction> + <SpeedAction> + <SpeedActionDynamics rate="0.0" dynamicsShape="linear" + dynamicsDimension="rate"/> + <SpeedActionTarget> + <AbsoluteTargetSpeed value="10.0" /> + </SpeedActionTarget> + <Stochastics value="velocity" stdDeviation="2.0" lowerBound="5.0" + upperBound="15.0"/> + </SpeedAction> + </LongitudinalAction> + </PrivateAction> + <PrivateAction> + <RoutingAction> + <AssignRouteAction> + <Route> + <Waypoint> + <Position> + <RoadPosition roadId="1" t="-1.0" s="0"/> + </Position> + </Waypoint> + <Waypoint> + <Position> + <RoadPosition roadId="2" t="-1.0" s="0"/> + </Position> + </Waypoint> + </Route> + </AssignRouteAction> + </RoutingAction> + </PrivateAction> + </Private> + <Private entityRef="ScenarioAgent"> + <PrivateAction> + <TeleportAction> + <Position> + <LanePosition roadId="1" s="50.0" laneId="-3" offset="0.0"/> + </Position> + </TeleportAction> + </PrivateAction> + <PrivateAction> + <LongitudinalAction> + <SpeedAction> + <SpeedActionDynamics rate="0.0" dynamicsShape="linear" + dynamicsDimension="rate"/> + <SpeedActionTarget> + <AbsoluteTargetSpeed value="10.0" /> + </SpeedActionTarget> + </SpeedAction> + </LongitudinalAction> + </PrivateAction> + </Private> + </Actions> + </Init> + +.. _scenario_story: + +Story +~~~~~ + +The tag ``Story`` is optional and defines all conditional interventions during runtime. +The story consists of multiple acts, which itself can consist of multiple ``ManeuverGroup`` tags. +A maneuver groups must consist of exactly one ``Actors`` tag and one ``Maneuver`` tag. +The ``maximumExecutionCount`` attribute states the maximum number of times that each maneuver will by triggered. +To trigger an maneuver for an unlimited number of times, set the value to ``-1,``. + +.. note:: While multiple stories can be added, grouping of maneuver groups into acts currently has no effect in the simulator. + +**Example** + +.. code-block:: xml + + <Story name="MyStory"> + <Act name="Act1"> + <ManeuverGroup name="MySequence" maximumExecutionCount="-1"> + <Actors> + ... + </Actors> + <Maneuver name="MyManeuver"> + ... + </Maneuver> + </ManeuverGroup> + </Act> + </Story> + +.. _scenario_actors: + +Actors +****** + +The ``Actors`` tag defines the agents that are mainly affected by this sequence. +These agents can either be defined directly by stating their name within a sub-tag ``<EntityRef entityRef="entityName"/>`` or as the agent that triggered the event itself via ``<Actors selectTriggeringEntities="true"/>``. + +.. _scenario_maneuver: + +Maneuver +******** + +The ``Maneuver`` tag defines the conditions, when an action shall take place. +It contains one or more events, each consisting of **one** action and **one or more** start conditions. + +.. note:: Only a single action is currently supported, although the standard allows several. + +.. warning:: Due to internal handling, event names must be unique. + +**Example** + +.. code-block:: xml + + <Maneuver name="MyManeuver"> + <Event name="MyEvent" priority="overwrite"> + <Action name="MyManipulator"> + ... + </Action> + <StartTrigger> + <ConditionGroup> + <Condition name="Conditional"> + ... + </Condition> + </ConditionGroup> + </StartTrigger> + </Event> + </Maneuver> + +.. _scenario_conditions: + +Conditions +"""""""""" + +|Op| support different kind of conditions, belonging either to ``ByValueCondition`` or ``ByEntityCondition``. +While a **by value condition** trigger based on a specified value and is unrelated to any specific agent, a **by entity condition** is bound to an triggering agent, defined by a mandatory section ``TriggeringEntities``. +Entities can be either ego or scenario agents, or all agents if the section is left blank. + +.. note:: + + OpenSCENARIO specifies that a rule should be applied to the ``TriggeringEntities`` element. + Currently, only the rule ``any`` is supported, so any of the listed entities may satisfy the condition independent of the others. + +.. table:: + + ==================================== ============== + Condition Triggered By + ==================================== ============== + :ref:`scenario_simulationtime` Value + :ref:`scenario_relativelaneposition` Entity + :ref:`scenario_roadposition` Entity + :ref:`scenario_relativelaneposition` Entity + :ref:`scenario_relativespeed` Entity + :ref:`scenario_timetocollision` Entity + :ref:`scenario_timeheadway` Entity + ==================================== ============== + +.. _scenario_simulationtime: + +SimulationTime +++++++++++++++ + +Defines, when the simulation ends. +Triggers at a specified time value, given in seconds. +The rule is required and only ``greaterThan`` is currently supported. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 8 + :start-at: <Condition name="EndTime" + :end-at: </Condition> + +.. _scenario_relativelaneposition: + +RelativeLanePosition +++++++++++++++++++++ + +Triggers if an entity is within a relative lane position with respect to the specified object. +Here, *ds* (s-delta) and *dLane* (lane-delta) are applied to a reference *object*, e.g. ``referenceEntity.s + ds``. +The tolerance is then added and subtracted from the resulting s-coordinate to form a triggering zone. +The condition is satisfied, if a TriggeringEntity touches this zone. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ByEntityCondition_RelativeLane/Scenario.xosc + :language: xml + :dedent: 18 + :start-at: <Condition name="RelativeLanePosition"> + :end-at: </Condition> + +.. _scenario_roadposition: + +RoadPosition +++++++++++++ + +This Condition evaluates if a TriggeringEntity touches a given s-coordinate, *s*, on a specified road, given by *roadId*. +Note that the tolerance is added and subtracted from the s-coordinate to form a triggering zone. +The condition is satisfied, if a TriggeringEntity touches this zone. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ByEntityCondition_RoadPosition/Scenario.xosc + :language: xml + :dedent: 18 + :start-at: <Condition name="RoadPosition"> + :end-at: </Condition> + +.. _scenario_relativespeed: + +RelativeSpeed ++++++++++++++ + +This condition evaluates if the relative velocity (:math:`v_{rel}`) between a TriggeringEntity and a reference entity, is *lessThan*, *equalTo*, or *greaterThan*, a specified value, where :math:`v_{rel} = v_{trig} - v_{ref}`. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ByEntityCondition_RelativeSpeed/Scenario.xosc + :language: xml + :dedent: 18 + :start-at: <Condition name="RelativeSpeed"> + :end-at: </Condition> + +.. _scenario_timetocollision: + +TimeToCollision ++++++++++++++++ + +This condition evaluates if the *Time To Collision* (TTC) between a TriggeringEntity and a reference entity is *lessThan*, *equalTo*, or *greaterThan* a specified value. +The TTC is determined by projecting the movement of the entities using steps of 0.1 seconds and returning the first time step, at which their bounding boxes intersect. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ByEntityCondition_TimeToCollision/Scenario.xosc + :language: xml + :dedent: 18 + :start-at: <Condition name="TimeToCollision"> + :end-at: </Condition> + +.. _scenario_timeheadway: + +TimeHeadway ++++++++++++ + +This condition evaluates if the *Time Headway* (THW) between a TriggeringEntity and a reference entity is *lessThan*, *equalTo*, or *greaterThan* a specified value. +If ``freespace="true"`` the net distance of the bounding boxes is considered, otherwise the distance of the reference points. +The ``alongRoute`` attribute must be ``true``. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/ByEntityCondition_TimeHeadway/Scenario.xosc + :language: xml + :dedent: 18 + :start-at: <Condition name="TimeHeadway"> + :end-at: </Condition> + +.. _scenario_actions: + +Actions +""""""" + +Actions define what happens if all conditions of the maneuver are fulfilled and are applied on the actors defined for this maneuver. + +The following openSCENARIO actions are supported: + +- :ref:`scenario_lanechange` +- :ref:`scenario_followtrajectory` +- :ref:`scenario_acquireposition` +- :ref:`scenario_removeagent` +- :ref:`scenario_speedaction` + +In addition, the following user defined actions are interpreted: + +- :ref:`scenario_componentstatechange` +- :ref:`scenario_defaultCustomCommandAction` + + +.. todo:: Write a paragraph about the concept "Trajectories, OSC Actions, and so" in the developer zone. + +.. _scenario_lanechange: + +LaneChange +++++++++++ + +If this action trigger, the actor is forced to perform a trajectory, calculated at the time of triggering. +The target lane be given either absolute or with respect to another entity. +The trajectory can either have a fixed length (in s) or a fixed time. + +Currently, "sinusoidal" is the only supported type. + +**Example** *with absolute target and fixed length* + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Absolute/Scenario.xosc + :language: xml + :dedent: 14 + :start-at: <Action name="LaneChange"> + :end-at: </Action> + +**Example** *with relative target and fixed time* + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/OSCAction_SinusoidalLaneChangeLeft_Relative/Scenario.xosc + :language: xml + :dedent: 14 + :start-at: <Action name="LaneChange"> + :end-at: </Action> + +.. _scenario_followtrajectory: + +Follow Trajectory ++++++++++++++++++ + +If triggered, the defined trajectory is relayed as signal to listening components. +The trajectory can be defined either directly in the story or as separate TrajectoryCatalog. +For the points (vertices) of the trajectory only world coordinates, given as ``openScenario::WorldPosition``, are supported. +Right now, the mandatory attributes *z*, *pitch* and *roll* are ignored. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/Pedestrian_Trajectory/Scenario.xosc + :language: xml + :dedent: 14 + :start-at: <Action name="Trajectory"> + :end-at: </Action> + +**Example** *using a TrajectoryCatalog* + +.. code-block:: xml + + <Action name="FollowTrajectory"> + <Private> + <Routing> + <FollowTrajectoryAction> + <CatalogReference catalogName="TrajectoryCatalog.xosc" entryName="TrajectoryA"> + </FollowTrajectoryAction> + </Routing> + </Private> + </Action> + + +.. _scenario_acquireposition: + +Acquire Position +++++++++++++++++ + +If triggered, the defined position is relayed as signal to listening components. +Currently only "WorldPosition" and "RelativeObjectPosition" are supported. + +.. warning: Currently, this is only the supported by the component *FMU_Wrapper* and for OSMP messages. + +**Example** *(WorldPosition)* + +.. code-block:: xml + + <Action name="AcquirePosition"> + <PrivateAction> + <RoutingAction> + <AcquirePositionAction> + <Position> + <WorldPosition x="1.0" y="2.0" z="0.0" h="3.1415" p="0.0" r="0.0" /> + </Position> + </AcquirePositionAction> + </RoutingAction> + </PrivateAction> + </Action> + +**Example** *(RelativeObjectPosition)* + +.. code-block:: xml + + <Action name="AcquirePosition"> + <PrivateAction> + <RoutingAction> + <AcquirePositionAction> + <Position> + <RelativeObjectPosition dx="1.0" dy="1.0" entityRef="S1"/> + </Position> + </AcquirePositionAction> + </RoutingAction> + </PrivateAction> + </Action> + +.. _scenario_removeagent: + +Remove Agent +++++++++++++ + +The RemoveAgentsManipulator removes the specified entity at the time of triggering. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/Configurations/OSCAction_RemoveAgent/Scenario.xosc + :language: xml + :dedent: 14 + :start-at: <Action name="RemoveAgents"> + :end-at: </Action> + +.. _scenario_speedaction: + +SpeedAction ++++++++++++ + +The SpeedAction adjusts the velocity of an entity based on parameters of the SpeedAction. +Both variants, "RelativeTargetSpeed" and "AbsoluteTargetSpeed", are supported, but with restrictions: + +- The SpeedActionDynamics attribute "dynamicsShape" only supports "linear" and "step". +- The SpeedActionDynamics attribute "dynamicsDimension" only supports "rate". +- The RelativeTargetSpeed attribute "continuous" is ignored. + +.. note:: + + Values defined in the SpeedAction might not reflect actual values used by the simulator due to physical boundaries of the simulator. + +**Example** *AbsoulteTargetSpeed* + +.. code-block:: xml + + <Action name="SpeedAction"> + <PrivateAction> + <LongitudinalAction> + <SpeedAction> + <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/> + <SpeedActionTarget> + <AbsoluteTargetSpeed value="20"/> + </SpeedActionTarget> + </SpeedAction> + </LongitudinalAction> + </PrivateAction> + </Action> + +**Example** *RelativeTargetSpeed* + +.. code-block:: xml + + <Action name="SpeedAction"> + <PrivateAction> + <LongitudinalAction> + <SpeedAction> + <SpeedActionDynamics dynamicsShape="step" value="0.0" dynamicsDimension="rate"/> + <SpeedActionTarget> + <RelativeTargetSpeed entityRef="ScenarioAgent" value="10" + speedTargetValueType="delta" continuous="false"/> + </SpeedActionTarget> + </SpeedAction> + </LongitudinalAction> + </PrivateAction> + </Action> + +.. _scenario_defaultCustomCommandAction: + +UsedDefinedAction: DefaultCustomCommandAction ++++++++++++++++++++++++++++++++++++++++++++++ + +.. todo:: Write a paragraph in the developer zone about the concept "wrapping FMUs" and the "OSMP FMU" + +This is **the** default custom command, and is always selected, if **the first WORD** (Keyword) in the command string is **not** registered as a special custom command. + +The ``DefaultCustomCommandAction`` adds an event to the ``EventNetwork``, which is relayed as a string (``StringSignal``) by the component``OSCActions``. + +.. admonition:: FMU_Wrapper component for OSMP messages only + + The linked string signal is set as custom action of the TrafficCommand. + +**Example** + +.. code-block:: xml + + <Action name="CustomParameters"> + <UserDefinedAction> + <CustomCommandAction>Arbitrary String, e.g. { "hello": "world"}</CustomCommandAction> + </UserDefinedAction> + </Action> + +.. note:: + + Here, "Arbitrary" is first checked, if it matches any other available Keyword for used defined actions, such as :ref:`scenario_componentstatechange`. + +.. _scenario_componentstatechange: + +UserDefinedAction: Component State Change ++++++++++++++++++++++++++++++++++++++++++ + +Command Keyword: SetComponentState + +.. todo:: Write a paragraph in the developer zone about the concept "Component State Change" + +The ComponentStateChangeManipulator influences the maximum reachable state of an agent component that is handled by the ComponentController, i.e. it can either activate or deactivate a component. + +**Example** + +.. code-block:: xml + + <Action name="ComponentStateChange"> + <UserDefinedAction> + <CustomCommandAction>SetComponentState Dynamics_TrajectoryFollower Acting</CustomCommandAction> + </UserDefinedAction> + </Action> + +.. _scenario_stoptrigger: + +StopTrigger +~~~~~~~~~~~ + +Here, end conditions for the simulation are defined. + +Right now, only SimulationTime is supported, given in seconds, with the fixed ``rule="greaterThan"``. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/Scenario.xosc + :language: xml + :dedent: 2 + :start-at: <StopTrigger> + :end-at: </StopTrigger> diff --git a/sim/doc/source/user_guide/sim_user_guide/input/scenery.rst b/sim/doc/source/user_guide/sim_user_guide/input/scenery.rst new file mode 100644 index 0000000000000000000000000000000000000000..a052007e69b282b8c4bdaf310c9840452a98c8a7 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/scenery.rst @@ -0,0 +1,40 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _scenery: + +Scenery +======= + +This file describes the road network and all static objects of the road for the simulation run. +It is structured according to the **ASAM OpenDRIVE 1.6** standard. + +The file name can be freely chosen, but needs to be properly referenced by the :ref:`scenario` within the tag :ref:`scenario_roadnetwork`. + +Restrictions +------------ + +If object definitions does not meet the openDRIVE or are not supported, the simulation is aborted. +On top |op| adds some additional requirements to the attributes of objects: + +* length > 0 +* width > 0 +* radius == 0 + +Objects, which do no meet these requirements are ignored. + +Full Example +------------ + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/SceneryConfiguration.xodr + :language: xml + :caption: SceneryConfiguration.xodr + :linenos: diff --git a/sim/doc/source/user_guide/sim_user_guide/input/slaveconfig.rst b/sim/doc/source/user_guide/sim_user_guide/input/slaveconfig.rst new file mode 100644 index 0000000000000000000000000000000000000000..350b7f441d88e63b93cc73961e632c385cf092d2 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/slaveconfig.rst @@ -0,0 +1,188 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _slaveconfig: + +SlaveConfig +=========== + +.. todo: Write a nicer introduction for the slaveconfig, similar to "Overview" section in scenery + +This file describes the user configurable parameters of an experiment. +Several parameters depend on probabilities. +Each invocation then rolls for said probabilities. +All probabilities need to add up to 1.0. + +The slaveConfig.xml consists of the following sections: + +* :ref:`slaveconfig_profilescatalog` +* :ref:`slaveconfig_experiment` +* :ref:`slaveconfig_scenario` +* :ref:`slaveconfig_environment` +* :ref:`slaveconfig_observations` +* :ref:`slaveconfig_spawners` + +.. _slaveconfig_profilescatalog: + +ProfilesCatalog +--------------- + +Specifies the :ref:`profilescatalog` for the experiment. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <ProfilesCatalog> + :end-at: </ProfilesCatalog> + +.. _slaveconfig_experiment: + +Experiment +---------- + +Specifies the general experiment setup, not specific to a single invocation. + +.. table:: + :class: tight-table + + ===================== ================================================== ========= + Tag Description Mandatory + ===================== ================================================== ========= + ExperimentId Id of the experiment yes + NumberOfInvocations Number of invocation in the experiment. + For each invocation probabilities are rerolled. yes + RandomSeed Random seed for the entire experiment. + Must be within the bounds of an unsigned integer. yes + Libraries Name of the core module Libraries to use. + If not specified the default name is assumed. yes + ===================== ================================================== ========= + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Experiment> + :end-at: </Experiment> + +.. _slaveconfig_scenario: + +Scenario +-------- + +This section contains information about the scenario setup for the experiment. This information does not change between invocations. + +.. table:: + :class: tight-table + + ================ ========================= ========= + Tag Description Mandatory + ================ ========================= ========= + OpenScenarioFile Name of the scenario file yes + ================ ========================= ========= + +**Example** + +This experiment uses the "HighwayScenario.xosc" scenario file. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Scenario> + :end-at: </Scenario> + +.. _slaveconfig_environment: + +Environment +----------- + +This section contains information about the world and the general environment inside the simulation. Every invocation re-rolls the environment probabilities. +All probabilities need to add up to 1.0. + +.. table:: + :class: tight-table + + =================== ============================================================================================== ========= + Tag Description Mandatory + =================== ============================================================================================== ========= + TimeOfDay **Currently unused.** Time of day ranging from 1-24 [h]. 1+ entry + VisibilityDistance Defines how far a human driver can see [m]. 1+ entry + Friction Friction on the road. Used by DynamicsRegularDriving and LimiterAccelerationVehicleComponents. 1+ entry + Weather **Currently unused.** Weather as string 1+ entry + =================== ============================================================================================== ========= + +**Example** + +Every invocation has the time set to 15:00. +In 70% of all invocation drivers can see 125 meter and for the other 30% of invocations the drivers can see 250 meter. +Every invocation has a friction of 0.3. +Every invocation has sunny weather. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Environment> + :end-at: </Environment> + +.. _slaveconfig_observations: + +Observations +------------ + +In this section all observation libraries are defined with their parameters. +A specific library is loaded by adding an entry to the `Observations` tag: + +.. code-block:: xml + + <Observations> + <!-- first observer --> + <Observation> + <Library>THE_OBSERVATION_LIBRARY</Library> + <!-- observer specific parameter --> + <Parameters> + <String Key="THE_KEY" Value="THE_VALUE"/> + <Bool Key="ANOTHER_KEY" Value="false"/> + ... + </Parameters> + </Observation> + <!-- second observer --> + <Observation> + ... + </Observation> + </Observations> + +Here, the ``Library`` tag contains the name of the library, and ``Parameters`` contain an optional list of key/value pairs, specific for each observer. + +Please refer to the documentation of the individual observers for available parameters: + +.. toctree:: + :glob: + :maxdepth: 1 + + ../output/* + +.. _slaveconfig_spawners: + +Spawners +-------- + +In this section the spawners are defined with their Profile (defined in the ProfilesCatalog). +The same library can be loaded multiple times with different profiles. +A spawner is either of type "PreRun", meaning it is triggered only once at the start of the simulation, or "Runtime", meaning it is triggered in every timestep. +If different spawners are to be triggered at the same time the spawner with the highest priority is triggered first. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Spawners> + :end-at: </Spawners> + + +Full Example +------------ + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :caption: slaveConfig.xodr + :linenos: diff --git a/sim/doc/source/user_guide/sim_user_guide/input/staticsystemconfig.rst b/sim/doc/source/user_guide/sim_user_guide/input/staticsystemconfig.rst new file mode 100644 index 0000000000000000000000000000000000000000..6b4418f3c3f6d2e1000e3aca584c62a9974fc237 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/staticsystemconfig.rst @@ -0,0 +1,19 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _staticsystemconfig: + +Static SystemConfig +=================== + +SystemConfig files are optional. +They describe static configurations of agents and are therefore an alternative to the dynamic sampling of an agent during runtime. +The schema is the same as for the :ref:`systemconfigblueprint`. \ No newline at end of file diff --git a/sim/doc/source/user_guide/sim_user_guide/input/systemconfigblueprint.rst b/sim/doc/source/user_guide/sim_user_guide/input/systemconfigblueprint.rst new file mode 100644 index 0000000000000000000000000000000000000000..11fde2112f7a3860d4946b2000622b07b235d305 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/input/systemconfigblueprint.rst @@ -0,0 +1,270 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _systemconfigblueprint: + +SystemConfigBlueprint +===================== + +This file contains the possible agent modules and channels of a dynamically generated agent. The content of this file should only be adjusted by experienced users with knowledge of the simulation architecture. The SystemConfigBlueprint is a special SystemConfig and has the same schema. Only the system with id 0 is used for generating dynamic agents. +If the simulation uses only statically configured agents (AgentProfile Type attribute is "Static"), this file isn't required. + +.. _systemconfigblueprint_agentComponents: + +AgentComponents +--------------- +All components are listed here. An agent consists of a subset of this components. + +.. table:: + :class: tight-table + + =========== =============================================================================== + Attribute Description + =========== =============================================================================== + Id Used as key by the simulation to find the component + Priority The module with the highest priority value gets executed first by the scheduler + Offset Delay for the trigger method of each component in ms + Cycle Interval in which the component gets triggered by the scheduler in ms + Response Delay for the UpdateOutput method of each component in ms + Library Library name of this component + Parameters Parameters used by the component + =========== =============================================================================== + +Example: +This example describes the Sensor_Driver module. + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/systemConfigBlueprint.xml + :language: xml + :dedent: 12 + :lines: 28-38 + +.. _systemconfigblueprint_priorities: + +Priorities +---------- + +Please refer to the [Components and channel communication diagram]]\ref dev_concepts_modulecomposition) for assignment of a proper priority. +Based on the signal flow, input relevant components like sensors need to be executed first. They provide data for consuming components (algorithms) like ADAS and drivers. +Data is then handled by algorithms like Algorithm_Lateral. +Output-relevant modules like dynamics and actions are executed last. + +Prioritizer can be applied on different levels depending on the modules/data they need to handle levels as following can be defined: +Level 1 describes data produced by ADAS and drivers. +Level 2 describes data output by vehicle dynamic controllers. +Level 3 describes data delivered by dynamics. + +Priorities can be grouped (coarse) as following: +Highest number indicates highest priority. + +.. table:: + :class: tight-table + + =========================== =========== + Scope Range + =========================== =========== + Parameters 500 + OpenScenarioActions 400 + Sensor 350...399 + Event 330 + DriverMode 310 + ADAS 250...299 + ComponentController 200 + Prioritizer (Lvl. 1) 150...199 + VehicleDynamicsControllers 100...149 + Prioritizer (Lvl. 2) 75...99 + Dynamics 50...74 + Prioritizer (Lvl. 3) 25...49 + Updater 0...24 + =========================== =========== + +The table below can be used as orientation when a new module is introduced. + +.. table:: + :class: tight-table + + ========================================= ======================================= ========= =========================== ======================================================================================================================= + Name Library Priority Scope Note + ========================================= ======================================= ========= =========================== ======================================================================================================================= + ParametersAgentModules ParametersAgent 500 Parameters Sets all init-data and is updated cyclically + OpenScenarioActions OpenScenarioActions 400 ADAS Reads events from OpenScenario Actions and forwards them to other components + SensorObjectDetector Sensor_OSI 398 Sensor Gets instantiated multiple times (one time per sensor) + SensorAggregation SensorAggregation_OSI 351 Sensor + SensorFusionErrorless SensorFusionErrorless_OSI 350 Sensor + AlgorithmAgentFollowingDriverModel AlgorithmAgentFollowingDriverModel 310 DriverModels + AEB AlgorithmAutonomousEmergencyBraking 250 ADAS + ComponentController ComponentController 200 ADAS Manages vehicle component states with regard to other vehicle component states and conditions and in response to events. + PrioritizerLaterDriver SignalPrioritizer 150 Prioritizer + PrioritizerAccelerationDriver SignalPrioritizer 150 Prioritizer + PrioritizerTurningIndicator SignalPrioritizer 150 Prioritizer + PrioritizerSteeringVehicleComponents SignalPrioritizer 150 Prioritizer + PrioritizerAccelerationVehicleComponents SignalPrioritizer 150 Prioritizer + LimiterAccelerationVehicleComponents LimiterAccelerationVehicleComponents 120 VehicleDynamicsControllers + AlgorithmLateralDriver AlgorithmLateralDriver 100 VehicleDynamicsControllers + AlgorithmLongitudinalVehicleComponents AlgorithmLongitudinalVehicleComponents 100 VehicleDynamicsControllers + AlgorithmLongitudinalDriver AlgorithmLongitudinalDriver 100 VehicleDynamicsControllers + PrioritizerSteering SignalPrioritizer 75 Prioritizer + PrioritizerLongitudinal SignalPrioritizer 75 Prioritizer + DynamicsCollision DynamicsCollision 50 Dynamics + DynamicsRegularDriving DynamicsRegularDriving 50 Dynamics + DynamicsTrajectoryFollower DynamicsTrajectoryFollower 50 Dynamics + PrioritizerDynamics SignalPrioritizer 25 Prioritizer + SensorRecordStateModule SensorRecordState 2 Updater Since values are "frozen" for current time step, logging can be placed anywhere + ActionLongitudinalDriverModules ActionLongitudinalDriver 3 Updater Will be expanded to ActionPrimary DriverTasks + ActionSecondaryDriverTasksModules ActionSecondaryDriverTasks 3 Updater + AgentUpdater AgentUpdater 1 Updater + ========================================= ======================================= ========= =========================== ======================================================================================================================= + +.. _systemconfigblueprint_channelids: + +Channel-Ids +----------- + +Channels allow components to communicate with each other. +The signalflow is set explicitly via a channel-Id of 4 digits (see also [Components and channels communication diagram](/ref dev_concepts_modulecomposition)). + +The first two numbers define the sending module (XX 00). +The other two digits define the type of signal that is sent (00 XX). + +Signals as well as modules can be grouped to allow explicit numbering (see tables below). + +Channel-Ids between Sensor and SensorFusion are an exception to this rule. For sensor/sensor fusion communication channel-ids are 9900 + x (incremented for every new sensor) + +Example: +PrioritizerAccelerationDriver -> AlgorithmLongitudinalDriver with signal of type AccelerationSignal: 1813. + + +**Ids for Modules (first two digits)** + + +Index range for module groups: + +.. table:: + :class: tight-table + + ================= ========== + Group Id + ================= ========== + Dynamics 1...10 + Algorithm 11...30 + DriverTasks 31...40 + Driver 41...50 + VehicleComponent 51...80 + Special 81...89 + Sensor 91...99 + ================= ========== + +With corresponding defined indices: + +.. table:: + :class: tight-table + + ========================================= ================= ===== + Module Group Id + ========================================= ================= ===== + AgentUpdater Dynamics 1 + Dynamics_TrajectoryFollower Dynamics 2 + Dynamics_RegularDriving Dynamics 3 + Dynamics_Collision Dynamics 4 + PrioritizerDynamics Dynamics 5 + Algorithm_LongitudinalVehicleComponent Algorithm 11 + Algorithm_LongitudinalAfdm Algorithm 12 + Algorithm_SteeringVehicleComponent Algorithm 14 + Algorithm_LateralVehicleAfdm Algorithm 15 + LimiterVehicleLongitudinal Algorithm 17 + PrioritizerLongitudinal Algorithm 21 + PrioritizerSteering Algorithm 22 + PrioritizerAccelerationVehicleComponents Algorithm 23 + PrioritizerSteeringVehicleComponents Algorithm 24 + Action_LongitudinalDriver DriverTasks 31 + Action_SecondaryDriverTasks DriverTasks 32 + PrioritizerTurningIndicator DriverTasks 33 + AlgorithmAgentFollowingDriver Driver 41 + AEB VehicleComponent 52 + ComponentController Special 83 + OpenScenarioActions Special 84 + Parameter_Vehicle Sensor 92 + SensorAggregation Sensor 93 + SensorFusion Sensor 94 + Sensor_Driver Sensor 95 + ========================================= ================= ===== + +**Ids for Signals (last two digits)** + +Index range for signal groups: + + +.. table:: + :class: tight-table + + ==================== ========== + Group Id + ==================== ========== + Dynamics 1...10 + Algorithm 11...30 + OpenScenarioActions 61...70 + Special 71...80 + Sensor 81...90 + Parameters 91...99 + ==================== ========== + +With corresponding defined indices: + +.. table:: + :class: tight-table + + ======================================= ==================== ===== + Signal Group Id + ======================================= ==================== ===== + Dynamics Dynamics 01 + Longitudinal Algorithm 11 + Steering Algorithm 12 + Acceleration Algorithm 13 + Lateral Algorithm 14 + SecondaryDriverTasks Algorithm 19 + Trajectory OpenScenarioActions 71 + AcquireGlobalPosition OpenScenarioActions 62 + CustomParameters (CustomCommandAction) OpenScenarioActions 63 + SensorDriver Sensor 81 + SensorData Sensor 90 + ParametersVehicle Parameters 92 + ======================================= ==================== ===== + +.. _systemconfigblueprint_parameters: + +Parameters +---------- + +For more information on the type of parameters (escpecially stochastic distributions), please refer to the [ProfilesGroup section](\ref io_input_profilescatalog_profileGroups). + +**Important Note:** The syntax for defining parameters in the SystemConfigBlueprint file differs from the ProfilesCatalog syntax. +See the following example: + +.. code-block:: xml + + <parameters> + <parameter> + <id>StringParameter</id> + <type>string</type> + <unit/> + <value>Lorem ipsum</value> + </parameter> + <parameter> + <id>RandomParameter</id> + <type>normalDistribution</type> + <unit/> + <value> + <mean>15.0</mean> + <sd>2.5</sd> + <min>10.0</min> + <max>20.0</max> + </value> + </parameter> + </parameters> diff --git a/sim/doc/source/user_guide/sim_user_guide/output/observation_log.rst b/sim/doc/source/user_guide/sim_user_guide/output/observation_log.rst new file mode 100644 index 0000000000000000000000000000000000000000..54a31c8244c794c4fee67c242024a5133b827aaf --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/output/observation_log.rst @@ -0,0 +1,290 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _observation_log: + +Observation_Log +############### + +This section describes the parameters and outputs of the ``Observation_Log`` observer. + +.. _observationlog_paramerization: + +Paramerization +============== + +Following parameters are supported: + +.. table:: + :class: tight-table + + =================== ============= ========================================================================== + Parameter Type Description + =================== ============= ========================================================================== + OutputFilename String Name of the output file (normally ``simulationOutput.xml``) + LoggingCyclicsToCsv Bool If ``true``, cyclics are written an additional file (one CSV file per run) + LoggingGroup_<NAME> StringVector Defines which columns belong to the logging group named NAME + LoggingGroups StringVector Defines active logging groups + =================== ============= ========================================================================== + +The columns, defined by the ``LoggingGroup_<NAME>`` correspond to cyclic data entries written by the core and other components. +At time or writing, the core publishes the following cyclics (see source of ``AgentNetwork.cpp``): + +- XPosition +- YPosition +- VelocityEgo +- AccelerationEgo +- YawAngle +- YawRate +- SteeringAngle +- TotalDistanceTraveled +- PositionRoute +- TCoordinate +- Lane +- Road +- SecondaryLanes +- AgentInFront + +Please refer to the individual components, for information about their published cyclics. + +.. todo:: + + The concept Cyclics and the DataStore needs further explanation. + We also need a way to better communicate, who is publishing what. + This should directly come out of the source code, to keep the documentation up to date. + +.. admonition:: **Wildcards in LoggingGroup definitions** + + | It is possible to use the wildcard character ``*`` in a ``LoggingGroup_<NAME>`` entry. + | The wildcard can be used only once per column reference. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Library>Observation_Log</Library> + :end-at: </Parameters> + +Output Files +============ + +.. _observationlog_simout: + +SimulationOutput +~~~~~~~~~~~~~~~~ + +Every successful run (single experiment) generates a single file, normally called ``simulationOutput.xml`` (see :ref:'observationlog_paramerization'). +The output can contain multiple invocations of the same configuration with different random seeds. +For each invocation a RunResult is stored, which contains information about the agents and their parameters. +As well as run specific events and parameters. + +.. code-block:: xml + + <SimulationOutput> + <RunResults> + <RunResult RunId="0"> + ... + </RunResult> + <RunResult RunId="1"> + ... + </RunResult> + </RunResults> + </SimulationOutput> + +The RunResult consist out of the following parts: + +- :ref:`observationlog_runstatistics` +- :ref:`observationlog_events` +- :ref:`observationlog_agents` +- :ref:`observationlog_cyclics` + +.. _observationlog_runstatistics: + +RunStatistics +------------- + +This section contains the RandomSeed and general statistics of the invocation. + +.. table:: + :class: tight-table + + ======================= ================================================================== + Tag Description + ======================= ================================================================== + RandomSeed Random seed used for this invocation + VisibilityDistance Visibility distance of the world + StopReason Displays the reason why the simulation stopped. + Currently only due to time out. + StopTime Currently not used and set to -1 + EgoAccident Flag which shows whether the ego agent was involved in an accident + TotalDistanceTraveled Total traveled distance of all agents + EgoDistanceTraveled Total traveled distance of ego vehicle only + ======================= ================================================================== + +.. _observationlog_events: + +Events +------ + +This section contains all events that occurred during the invocation. +Event can either be triggered by an EventDetector, Manipulator or by certain vehicle components. +They are used to track special behavior in the simulation. + +.. table:: + :class: tight-table + + ====================== ===================================================================================== + Attribute Description + ====================== ===================================================================================== + Time Time in ms when the event occurred. + Source Name of the component which created the event. + ``OpenSCENARIO``, if triggered by an OpenSCENARIO condition. + Name In case of an OpenSCENARIO event, a path expression Story/Act/Sequence/Maneuver/Event + using the names of the corresponding tags as described in the OpenSCENARIO file. + Otherwise determined by the triggering component. + TriggeringEntities List of entity IDs triggering this event. + AffectedEntities List of entity IDs affected by this event. + Parameters List of generic key/value string pairs. + ====================== ===================================================================================== + +.. _observationlog_agents: + +Agents +------ + +This section contains some information on how each agent is configured. + +.. table:: + :class: tight-table + + ====================== ============================================================== + Attribute Description + ====================== ============================================================== + Id Identification number + AgentTypeGroupName The agent category. This can either be Ego, Scenario or Common + AgentTypeName Name of the agent profile + VehicleModelType Name of the vehicle model + DriverProfileName Name of the driver profile + ====================== ============================================================== + +.. code-block:: xml + + <Agent Id="0" + AgentTypeGroupName="Ego" + AgentTypeName="MiddleClassCarAgent" + VehicleModelType="car_bmw_7" + DriverProfileName="Regular"> + +The VehicleAttributes tag lists basic information of the vehicle parameters. + +.. table:: + :class: tight-table + + ======================= ============================================================================= + Attribute Description + ======================= ============================================================================= + Width Width of the vehicles bounding box + Length Length of the vehicles bounding box + Height Height of the vehicles bounding box + LongitudinalPivotOffset Distance between center of the bounding box and reference point of the agent. + Positive distances are closer to the front of the vehicle. + Negative distances are closer to the rear of the vehicle. + ======================= ============================================================================= + +The Sensors tag lists all sensors of the agent and their parameters. + +.. table:: + :class: tight-table + + ======================= ===================================================================== + Attribute Description + ======================= ===================================================================== + Name Name of the component + Model Type of the sensor + MountingPosLongitudinal Relative longitudinal position of the sensor in relation to the agent + MountingPosLateral Relative lateral position of the sensor in relation to the agent + MountingPosHeight Relative height of the sensor in relation to the agent + OrientationPitch Pitch rotation of the sensor in relation to the agent + OrientationYaw Yaw rotation of the sensor in relation to the agent + OpeningAngleH Horizontal opening angle of the sensor + OpeningAngleV Vertical opening angle of the sensor + DetectionRange Range how far the sensor reaches in m + ======================= ===================================================================== + +.. note:: + + Calculation of visual obstruction is currently supported only by the Geometric2D sensor. + See :ref:`systemconfigblueprint` for configuration. + +.. code-block:: xml + + <Sensor Name="Geometric2DFront" + Model="Geometric2D" + MountingPosLongitudinal="0" + MountingPosLateral="0" + MountingPosHeight="0.5" + OrientationPitch="0" + OrientationYaw="0" + OpeningAngleH="20" + OpeningAngleV="-999" + DetectionRange="300" /> + +.. _observationlog_cyclics: + +Cyclics +------- + +If the parameter ``LoggingCyclicsToCsv`` is set to ``false``, this section contains all logged parameters of the agents per time step. +The tag ``header`` defines the layout of all samples. +Each entry of the header consists of the agent id and the name of the logged value, in the form ``ID:SAMPLE_NAME``. +A sample contains all information for one specific time step. +If an agent does not exist at the current time step, the value is ' '. + +**Example** + +In this example exist two agents with the ids 0 and 1. +Two time steps were being tracked, one at 0 seconds and one at 100 ms. +Agent 0 has a constant velocity of 30 m/s and starts at the position X: 100 and Y: 50. +Agent 1 has a initial velocity of 40 m/s and starts at the position X: 200 and Y: 50. + +.. code-block:: xml + + <Cyclics> + <Header>00:VelocityEgo, 00:XPosition, 00:YPosition, 00:YawAngle, 01:VelocityEgo, 01:XPosition, 01:YPosition, 01:YawAngle</Header> + <Samples> + <Sample Time="0">30, 100, 50, 0, 40, 200, 50, 0</Sample> + <Sample Time="100">30, 103, 50, 0, 40, 204, 50, 0</Sample> + </Samples> + </Cyclics> + +If the parameter ``LoggingCyclicsToCsv`` is set to ``true``, this section only contains a reference to the corresponding CSV file, e.g. + +.. code-block:: xml + + <Cyclics> + <CyclicsFile>Cyclics_Run_000.csv</CyclicsFile> + </Cyclics> + +For each invocation, the file number of the filename is incremented, starting with ``Cyclics_Run_000.csv``. + +Cyclics_Run_### +~~~~~~~~~~~~~~~ + +This file contains the samples as described in :ref:'observationlog_cyclics', but with the time step as leading column. + +**Example** + +======== ============== ============ ============ =========== ============== ============ ============ =========== +Timestep 00:VelocityEgo 00:XPosition 00:YPosition 00:YawAngle 01:VelocityEgo 01:XPosition 01:YPosition 01:YawAngle +======== ============== ============ ============ =========== ============== ============ ============ =========== +0 30 100 50 0 40 200 50 0 +100 30 103 50 0 40 204 50 0 +======== ============== ============ ============ =========== ============== ============ ============ =========== diff --git a/sim/doc/source/user_guide/sim_user_guide/output/observation_repository.rst b/sim/doc/source/user_guide/sim_user_guide/output/observation_repository.rst new file mode 100644 index 0000000000000000000000000000000000000000..f46c5a2460f6cc8b748d68ba8ff16a24f21b58b5 --- /dev/null +++ b/sim/doc/source/user_guide/sim_user_guide/output/observation_repository.rst @@ -0,0 +1,127 @@ +.. + ************************************************************ + Copyright (c) 2021 in-tech GmbH + + This program and the accompanying materials are made + available under the terms of the Eclipse Public License 2.0 + which is available at https://www.eclipse.org/legal/epl-2.0/ + + SPDX-License-Identifier: EPL-2.0 + ************************************************************ + +.. _observation_entityrepository: + +Observation_EntityRepository +############################ + +This observer logs all entities generated for an experiment, split by run and/or persistence. +In the following, the parametrization and generated outputs of the ``Observation_EntityRepository`` observer are described. + +.. _observation_entityrepository_parametrization: + +Parametrization +=============== + +Following parameters are supported: + +.. table:: + :class: tight-table + + ======================= ============= =============================================================================================================== + Parameter Type Description + ======================= ============= =============================================================================================================== + FilenamePrefix String (Optional) Prefix for the output files. + Defaults to ``Repository`` resulting e.g. in ``Repository_Run_00.csv``. + WritePersistentEntities String Defines how persistent, ie cross-run entities such as stationary objects, are logged + + Options: + + - **Consolidated** (default): Logged together with non persistent entities and hence duplicated for each run. + - **Separate**: Written once into ``{FilenamePrefix}_Persistent.csv`` + - **Skip**: No output. + ======================= ============= =============================================================================================================== + +.. warning:: The visualization is searching for files with the default ``Repository`` prefix, so don't change it unless you have a reason to. + +**Example** + +.. literalinclude:: @OP_REL_SIM@/contrib/examples/DefaultConfigurations/slaveConfig.xml + :language: xml + :start-at: <Library>Observation_EntityRepository</Library> + :end-at: </Parameters> + +Output Files +============ + +.. _observation_entityrepository_run: + +Repository_Run_###.csv +~~~~~~~~~~~~~~~~~~~~~~ + +This file contains information about entities, which exist only within the given run. +In other words, ``Repository_Run_000.csv`` will contain all moving objects, spawned within the first run (zero-based index). + +**Example** + +.. csv-table:: + :file: ../_static/Repository_Run_000.csv + :header-rows: 1 + :delim: ; + +.. note:: By convention, moving objects start with id 0. + +If ``WritePersistentEntities`` is set to ``Consolidated``, each file will also contain information about stationary objects, described below. + +.. _observation_entityrepository_persistent: + +Repository_Persistent.csv +~~~~~~~~~~~~~~~~~~~~~~~~~ + +This file contains information about entities, which exist in every single run. +This includes mainly both objects (starting at 100000) and road elements (starting at 200000), defined by the :ref:`scenery`. + +**Example** + +.. table:: + + ====== ================ ========= ======= ============ ============= =========== ======= + id group source version name secondary id type subtype + ====== ================ ========= ======= ============ ============= =========== ======= + 100000 StationaryObject OpenDRIVE 1.6 Barrier barrier_01 obstacle + 100001 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_01 railing + 100002 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_01 railing + 100003 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_01 railing + 100004 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_01 railing + 100005 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_01 railing + 100006 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_02 railing + 100007 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_02 railing + 100008 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_02 railing + 100009 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_02 railing + 100010 StationaryObject OpenDRIVE 1.6 GuardRail guardrail_02 railing + 200000 Others OpenDRIVE 1.6 LaneRoadMark Solid + 200001 Others OpenDRIVE 1.6 LaneRoadMark Solid + 200002 Others OpenDRIVE 1.6 Lane -3 Driving + 200003 Others OpenDRIVE 1.6 LaneRoadMark Broken + 200004 Others OpenDRIVE 1.6 Lane -2 Driving + 200005 Others OpenDRIVE 1.6 LaneRoadMark Broken + 200006 Others OpenDRIVE 1.6 Lane -1 Driving + ====== ================ ========= ======= ============ ============= =========== ======= + +Information coming from the source ``openDRIVE`` are mapped in the following manner: + +.. table:: + + ========= ============ + Attribute Column + ========= ============ + name name + id secondary id + type type + subtype subtype + ========= ============ + +.. note:: + + Repeated OpenDRIVE objects are internally split into individual objects. + E.g. a single guard rail object in openDRIVE, is split into individual openPASS objects having consecutive ids. + In the example above, the openDRIVE object with (secondary) id ``guardrail_01`` is split into 5 individual openPASS objects with the closed id range from 100001 to 100005. \ No newline at end of file diff --git a/sim/doc/version.txt.in b/sim/doc/source/version.txt.in similarity index 100% rename from sim/doc/version.txt.in rename to sim/doc/source/version.txt.in diff --git a/sim/src/CMakeLists.txt b/sim/src/CMakeLists.txt index c87ae4538faf388ca19a78126a452aff2e0c1082..34700b6d48639e716c38b9e5366a24146148adb0 100644 --- a/sim/src/CMakeLists.txt +++ b/sim/src/CMakeLists.txt @@ -11,29 +11,12 @@ set(FOLDER "src") -include_directories(${CMAKE_CURRENT_LIST_DIR}) - -if(SIMCORE_VERSION_MAJOR MATCHES "^[0-9]+$" AND - SIMCORE_VERSION_MINOR MATCHES "^[0-9]+$" AND - SIMCORE_VERSION_PATCH MATCHES "^[0-9]+$") - set(OPENPASS_VERSION "${SIMCORE_VERSION_MAJOR},${SIMCORE_VERSION_MINOR},${SIMCORE_VERSION_PATCH}") -elseif(DEFINED SIMCORE_VERSION_TAG) - set(OPENPASS_VERSION "\"${SIMCORE_VERSION_TAG}\"") -else() - set(OPENPASS_VERSION "9999,9999,9999") -endif() - +include_directories(${CMAKE_CURRENT_LIST_DIR} + ${CMAKE_CURRENT_LIST_DIR}/..) configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/common/version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/common/version.h - ) - -string(REPLACE "," "." OPENPASS_DOC_VERSION ${OPENPASS_VERSION}) - -configure_file( - ${CMAKE_CURRENT_SOURCE_DIR}/../doc/version.txt.in - ${CMAKE_CURRENT_SOURCE_DIR}/../doc/version.txt ) add_subdirectory(common) diff --git a/sim/src/common/events/customParametersEvent.h b/sim/src/common/events/customParametersEvent.h deleted file mode 100644 index 1c4ce59dd4a1ef181d363bc031d98015bab66281..0000000000000000000000000000000000000000 --- a/sim/src/common/events/customParametersEvent.h +++ /dev/null @@ -1,36 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2020 in-tech GmbH -* -* This program and the accompanying materials are made -* available under the terms of the Eclipse Public License 2.0 -* which is available at https://www.eclipse.org/legal/epl-2.0/ -* -* SPDX-License-Identifier: EPL-2.0 -*******************************************************************************/ - -#pragma once - -#include "common/events/basicEvent.h" -#include "include/signalInterface.h" - -namespace openpass::events { - -//----------------------------------------------------------------------------- -/** This class hold information about a Custom Parameters Event - * - * \ingroup Event */ -//----------------------------------------------------------------------------- -class CustomParametersEvent : public OpenScenarioEvent -{ -public: - static constexpr char TOPIC[] {"OpenSCENARIO/UserDefinedAction/CustomCommandAction/SetParameters"}; - - CustomParametersEvent(int time, const std::string eventName, std::string source, const int agentId, std::vector<std::string> parameters): - OpenScenarioEvent{time, eventName, source, {}, {{agentId}}}, - parameters(parameters) - {} - - const std::vector<std::string> parameters; -}; - -} // namespace openpass::events diff --git a/sim/src/common/events/defaultCustomCommandActionEvent.h b/sim/src/common/events/defaultCustomCommandActionEvent.h new file mode 100644 index 0000000000000000000000000000000000000000..95bb7abb174ecfb3604506820013ce1705a67f03 --- /dev/null +++ b/sim/src/common/events/defaultCustomCommandActionEvent.h @@ -0,0 +1,34 @@ +/******************************************************************************* +* Copyright (c) 2020, 2021 in-tech GmbH +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +#pragma once + +#include "common/events/basicEvent.h" +#include "include/signalInterface.h" + +namespace openpass::events { + +/// @brief Relay for information from the DefaultCustomCommandAction implementation +/// @ingroup Event +class DefaultCustomCommandActionEvent : public OpenScenarioEvent +{ +public: + static constexpr char TOPIC[]{"OpenSCENARIO/UserDefinedAction/CustomCommandAction/DefaultCustomCommandAction"}; + + DefaultCustomCommandActionEvent(int time, const std::string eventName, std::string source, const int agentId, std::string command) : + OpenScenarioEvent{time, eventName, source, {}, {{agentId}}}, + command{std::move(command)} + { + } + + const std::string command; +}; + +} // namespace openpass::events diff --git a/sim/src/common/customParametersSignal.h b/sim/src/common/stringSignal.h similarity index 53% rename from sim/src/common/customParametersSignal.h rename to sim/src/common/stringSignal.h index ea6ccc8ccf9c09522d30dcfc51462b7e938156fb..c62e0711475b0d7ac9a8f66a2d3e14f9a94c576d 100644 --- a/sim/src/common/customParametersSignal.h +++ b/sim/src/common/stringSignal.h @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2020 in-tech GmbH +* Copyright (c) 2020, 2021 in-tech GmbH * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -9,7 +9,7 @@ *******************************************************************************/ //----------------------------------------------------------------------------- -//! @file CustomParametersSignal.h +//! @file StringSignal.h //! @brief Transport a vector of strings //----------------------------------------------------------------------------- @@ -18,42 +18,36 @@ #include "include/modelInterface.h" //! @brief Transport a vector of strings -class CustomParametersSignal : public ComponentStateSignalInterface +class StringSignal : public ComponentStateSignalInterface { public: - static constexpr char COMPONENTNAME[] = "'CustomParametersSignal"; + static constexpr char COMPONENTNAME[]{"StringSignal"}; - CustomParametersSignal() : - parameters{} + StringSignal() : + payload{} { componentState = ComponentState::Disabled; } - CustomParametersSignal(CustomParametersSignal &other) : - CustomParametersSignal(other.componentState, other.parameters) + StringSignal(StringSignal &other) : + StringSignal(other.componentState, other.payload) { } - CustomParametersSignal(ComponentState componentState, std::vector<std::string> parameters) : - parameters(parameters) + StringSignal(ComponentState componentState, const std::string payload) : + payload{std::move(payload)} { this->componentState = componentState; } - virtual ~CustomParametersSignal() = default; + virtual ~StringSignal() = default; //! @brief Conversion method for printing //! @return Payload of the signal as string virtual operator std::string() const { - std::ostringstream sstream; - sstream << COMPONENTNAME << " "; - for (const auto parameter : parameters) - { - sstream << parameter << " "; - } - return sstream.str(); + return payload; } - const std::vector<std::string> parameters; + const std::string payload; }; diff --git a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp index 722ccdff4aa8d181d2890416b275009f3304f2ef..fcff3c5a158391346e16b5cc3e161cb5ccbd3de2 100644 --- a/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp +++ b/sim/src/components/Algorithm_FmuWrapper/src/OsmpFmuHandler.cpp @@ -16,12 +16,12 @@ #include <QDir> #include <QFile> -#include "common/customParametersSignal.h" #include "common/dynamicsSignal.h" #include "common/osiUtils.h" #include "common/sensorDataSignal.h" -#include "common/trajectorySignal.h" #include "common/speedActionSignal.h" +#include "common/stringSignal.h" +#include "common/trajectorySignal.h" #include "core/slave/modules/World_OSI/WorldData.h" #include "google/protobuf/util/json_util.h" #include "variant_visitor.h" @@ -183,7 +183,7 @@ void OsmpFmuHandler::UpdateInput(int localLinkId, const std::shared_ptr<const Si if (!signal) { - const std::string msg = "AlgorithmFmuHandler invalid singnaltype"; + const std::string msg = "AlgorithmFmuHandler invalid signaltype"; LOG(CbkLogLevel::Debug, msg); throw std::runtime_error(msg); } @@ -216,13 +216,10 @@ void OsmpFmuHandler::UpdateInput(int localLinkId, const std::shared_ptr<const Si } else if (localLinkId == 12) { - const auto signal = std::dynamic_pointer_cast<CustomParametersSignal const>(data); + const auto signal = std::dynamic_pointer_cast<StringSignal const>(data); if (signal && signal->componentState == ComponentState::Acting) { - for(const auto& parameter : signal->parameters) - { - trafficCommands[time]->add_action()->mutable_custom_action()->set_command(parameter); - } + trafficCommands[time]->add_action()->mutable_custom_action()->set_command(signal->payload); } } else if (localLinkId == 13) diff --git a/sim/src/components/OpenScenarioActions/CMakeLists.txt b/sim/src/components/OpenScenarioActions/CMakeLists.txt index 35a9af554f7ae0d576f6b101d366ac1c47843252..083ce67ab13837f4ee924f85cc42add78926c728 100644 --- a/sim/src/components/OpenScenarioActions/CMakeLists.txt +++ b/sim/src/components/OpenScenarioActions/CMakeLists.txt @@ -16,7 +16,7 @@ add_openpass_target( src/transformLaneChange.h src/transformSpeedAction.h src/transformAcquirePosition.h - src/transformCustomParameters.h + src/transformDefaultCustomCommandAction.h SOURCES openScenarioActions.cpp @@ -26,7 +26,7 @@ add_openpass_target( src/transformLaneChange.cpp src/transformSpeedAction.cpp src/transformAcquirePosition.cpp - src/transformCustomParameters.cpp + src/transformDefaultCustomCommandAction.cpp LIBRARIES Qt5::Core diff --git a/sim/src/components/OpenScenarioActions/OpenScenarioActions.pro b/sim/src/components/OpenScenarioActions/OpenScenarioActions.pro index 4efc2a69d99c7a132d61fb341a396f4cafc3297c..b4ad652ca6f8fae7d0f7b7b9393ea7975af1ec85 100644 --- a/sim/src/components/OpenScenarioActions/OpenScenarioActions.pro +++ b/sim/src/components/OpenScenarioActions/OpenScenarioActions.pro @@ -33,7 +33,7 @@ SOURCES += \ src/transformLaneChange.cpp \ src/transformSpeedAction.cpp \ src/transformAcquirePosition.cpp \ - src/transformCustomParameters.cpp + src/transformDefaultCustomCommandAction.cpp HEADERS += \ openScenarioActions.h \ @@ -45,4 +45,4 @@ HEADERS += \ src/transformLaneChange.h \ src/transformSpeedAction.h \ src/transformAcquirePosition.h \ - src/transformCustomParameters.h + src/transformDefaultCustomCommandAction.h diff --git a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h b/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h index 9c9a8408257fad847e34833436d2cdea857c40a0..f1b20b7b5a619f65134f667b452ed0273159c7c4 100644 --- a/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h +++ b/sim/src/components/OpenScenarioActions/src/openScenarioActionsImpl.h @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2020 in-tech GmbH +* Copyright (c) 2020, 2021 in-tech GmbH * 2020 BMW AG * * This program and the accompanying materials are made @@ -15,10 +15,10 @@ #include "include/modelInterface.h" #include "transformAcquirePosition.h" +#include "transformDefaultCustomCommandAction.h" #include "transformLaneChange.h" #include "transformSpeedAction.h" #include "transformTrajectory.h" -#include "transformCustomParameters.h" /** * \brief Relays triggered OpenScenario actions as signals to other components * @@ -64,7 +64,7 @@ public: using TrajectorySignalLinkId = std::integral_constant<LinkId, 0>; using SpeedActionSignalLinkId = std::integral_constant<LinkId, 3>; using AcquirePositionSignalLinkId = std::integral_constant<LinkId, 4>; - using CustomParametersSignalLinkId = std::integral_constant<LinkId, 5>; + using StringSignalLinkId = std::integral_constant<LinkId, 5>; private: [[noreturn]] void ThrowUnregisteredIdentifier(const std::string &identifier); @@ -78,12 +78,12 @@ private: ActionTransformRepository::Register(openScenario::transformation::LaneChange::Transform), ActionTransformRepository::Register(openScenario::transformation::SpeedAction::Transform), ActionTransformRepository::Register(openScenario::transformation::AcquirePosition::Transform), - ActionTransformRepository::Register(openScenario::transformation::CustomParameters::Transform)}; + ActionTransformRepository::Register(openScenario::transformation::DefaultCustomCommandAction::Transform)}; std::map<const std::string, LinkId> linkIdMapping{ {openpass::events::TrajectoryEvent::TOPIC, TrajectorySignalLinkId::value}, {openpass::events::LaneChangeEvent::TOPIC, TrajectorySignalLinkId::value}, {openpass::events::SpeedActionEvent::TOPIC, SpeedActionSignalLinkId::value}, {openpass::events::AcquirePositionEvent::TOPIC, AcquirePositionSignalLinkId::value}, - {openpass::events::CustomParametersEvent::TOPIC, CustomParametersSignalLinkId::value}}; + {openpass::events::DefaultCustomCommandActionEvent::TOPIC, StringSignalLinkId::value}}; }; diff --git a/sim/src/components/OpenScenarioActions/src/transformCustomParameters.h b/sim/src/components/OpenScenarioActions/src/transformCustomParameters.h deleted file mode 100644 index c9f248822c4cb48bd30ce9e16f4b5c0d452aa939..0000000000000000000000000000000000000000 --- a/sim/src/components/OpenScenarioActions/src/transformCustomParameters.h +++ /dev/null @@ -1,27 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2020 in-tech GmbH -* -* This program and the accompanying materials are made -* available under the terms of the Eclipse Public License 2.0 -* which is available at https://www.eclipse.org/legal/epl-2.0/ -* -* SPDX-License-Identifier: EPL-2.0 -*******************************************************************************/ - -#pragma once - -#include "common/events/customParametersEvent.h" -#include "common/customParametersSignal.h" -#include "transformerBase.h" - -namespace openScenario::transformation { - -struct CustomParameters : public TransformerBase<CustomParameters, CustomParametersSignal, openpass::events::CustomParametersEvent> -{ - static std::shared_ptr<CustomParametersSignal> ConvertToSignal(const openpass::events::CustomParametersEvent &event, - WorldInterface *, - AgentInterface *, - int); -}; - -} // namespace openScenario::transformation diff --git a/sim/src/components/OpenScenarioActions/src/transformCustomParameters.cpp b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp similarity index 57% rename from sim/src/components/OpenScenarioActions/src/transformCustomParameters.cpp rename to sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp index 31abe1a3b27c23f9ac9b23ec985e50464163cd8b..fb33fe1a3dbb6997f7db6e36e921eefca6f57e0f 100644 --- a/sim/src/components/OpenScenarioActions/src/transformCustomParameters.cpp +++ b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.cpp @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2020 in-tech GmbH +* Copyright (c) 2020, 2021 in-tech GmbH * * This program and the accompanying materials are made * available under the terms of the Eclipse Public License 2.0 @@ -7,13 +7,14 @@ * * SPDX-License-Identifier: EPL-2.0 *******************************************************************************/ -#include "transformCustomParameters.h" + +#include "transformDefaultCustomCommandAction.h" namespace openScenario::transformation { -std::shared_ptr<CustomParametersSignal> CustomParameters::ConvertToSignal(const openpass::events::CustomParametersEvent &event, WorldInterface *, AgentInterface *, int) +std::shared_ptr<StringSignal> DefaultCustomCommandAction::ConvertToSignal(const openpass::events::DefaultCustomCommandActionEvent &event, WorldInterface *, AgentInterface *, int) { - return std::make_shared<CustomParametersSignal>(ComponentState::Acting, event.parameters); + return std::make_shared<StringSignal>(ComponentState::Acting, event.command); } } // namespace openScenario::transformation diff --git a/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h new file mode 100644 index 0000000000000000000000000000000000000000..646e135e920d263b55115024b7981fe44ac30b74 --- /dev/null +++ b/sim/src/components/OpenScenarioActions/src/transformDefaultCustomCommandAction.h @@ -0,0 +1,27 @@ +/******************************************************************************* +* Copyright (c) 2020, 2021 in-tech GmbH +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +#pragma once + +#include "common/events/defaultCustomCommandActionEvent.h" +#include "common/stringSignal.h" +#include "transformerBase.h" + +namespace openScenario::transformation { + +struct DefaultCustomCommandAction : public TransformerBase<DefaultCustomCommandAction, StringSignal, openpass::events::DefaultCustomCommandActionEvent> +{ + static std::shared_ptr<StringSignal> ConvertToSignal(const openpass::events::DefaultCustomCommandActionEvent &event, + WorldInterface *, + AgentInterface *, + int); +}; + +} // namespace openScenario::transformation diff --git a/sim/src/core/slave/modules/Manipulator/CMakeLists.txt b/sim/src/core/slave/modules/Manipulator/CMakeLists.txt index 823fbce2d82ae447848817c9b6ec159d67ffe982..2a04314490d5b40dc3f4132dc3a9f07c59ae33c0 100644 --- a/sim/src/core/slave/modules/Manipulator/CMakeLists.txt +++ b/sim/src/core/slave/modules/Manipulator/CMakeLists.txt @@ -7,7 +7,7 @@ add_openpass_target( HEADERS CollisionManipulator.h - CustomParametersManipulator.h + DefaultCustomCommandAction.h ComponentStateChangeManipulator.h LaneChangeManipulator.h ManipulatorCommonBase.h @@ -25,7 +25,7 @@ add_openpass_target( SOURCES CollisionManipulator.cpp - CustomParametersManipulator.cpp + DefaultCustomCommandAction.cpp ComponentStateChangeManipulator.cpp LaneChangeManipulator.cpp ManipulatorCommonBase.cpp diff --git a/sim/src/core/slave/modules/Manipulator/CustomCommandFactory.h b/sim/src/core/slave/modules/Manipulator/CustomCommandFactory.h index 7b7f4c2d48b5630469d5232e76844a60a65d2f4b..917e758bcc2bed209ca692594b2fc2383f95cfaf 100644 --- a/sim/src/core/slave/modules/Manipulator/CustomCommandFactory.h +++ b/sim/src/core/slave/modules/Manipulator/CustomCommandFactory.h @@ -19,18 +19,20 @@ #include "include/worldInterface.h" #include "common/openScenarioDefinitions.h" -/// \brief Use this class as static auto registering factory for custom commands +/// @brief Use this class as static auto registering factory for custom commands /// /// Note that registration happens automatically without additional construction code, /// when the register method is used in a static assignment. This means that registering /// will be done if the translation unit holds an according statement (!) /// /// Example: -/// SomeClass.h -> static inline bool registered = CustomCommandFactory::Register("myCommand"); +/// SomeClass.h -> static inline bool registered = CustomCommandFactory::Register("myKeyword"); /// SomeClass.cpp is part of the translation unit /// /// Effect: -/// SomeOtherFile.cpp -> CustomCommandFactory::Create("myCommand", ...); // Args must be delivered +/// SomeOtherFile.cpp -> CustomCommandFactory::Create("myKeyword", ...); // Args must be delivered +/// +/// @ingroup Manipulator class CustomCommandFactory final { using CreateSignature = ManipulatorInterface *(*)(WorldInterface *, @@ -40,15 +42,15 @@ class CustomCommandFactory final const std::string &); public: - /// \brief Create registered class from command - /// \param command The command, used during Register + /// \brief Create registered class from keyword + /// \param keyword The keyword used during Register /// \param args Arguments of the underlying class /// \return The created instance /// template <typename... Args> - static ManipulatorInterface* Create(const std::string &command, Args... args) + static ManipulatorInterface *Create(const std::string &keyword, Args... args) { - if (auto it = repository().find(command); it != repository().end()) + if (auto it = repository().find(keyword); it != repository().end()) { return it->second(std::forward<Args>(args)...); } @@ -58,20 +60,20 @@ public: } } - /// \brief Register a type T for a given command - /// \return True if command could been registered + /// \brief Register a type T for a given keyword + /// \return True if keyword could been registered template <typename T> - static bool Register(const std::string command) + static bool Register(const std::string keyword) { - if (auto it = repository().find(command); it == repository().end()) + if (auto it = repository().find(keyword); it == repository().end()) { - repository()[command] = []( + repository()[keyword] = []( WorldInterface *world, SimulationSlave::EventNetworkInterface *eventNetwork, const CallbackInterface *callback, - const openScenario::CustomCommandAction customCommandAction, + const openScenario::CustomCommandAction action, const std::string &eventName) -> ManipulatorInterface * { - return new T(world, eventNetwork, callback, customCommandAction, eventName); + return new T(world, eventNetwork, callback, action, eventName); }; return true; } diff --git a/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.cpp b/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.cpp deleted file mode 100644 index eb6aea2fa3501d0220c9fd442f63c7c6d526b07d..0000000000000000000000000000000000000000 --- a/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2020 in-tech GmbH -* -* This program and the accompanying materials are made -* available under the terms of the Eclipse Public License 2.0 -* which is available at https://www.eclipse.org/legal/epl-2.0/ -* -* SPDX-License-Identifier: EPL-2.0 -*******************************************************************************/ - -//----------------------------------------------------------------------------- -/** \file CustomParametersManipulator.cpp */ -//----------------------------------------------------------------------------- - -#include "CustomParametersManipulator.h" - -#include "common/events/customParametersEvent.h" -#include "common/commonTools.h" - -CustomParametersManipulator::CustomParametersManipulator(WorldInterface *world, - SimulationSlave::EventNetworkInterface *eventNetwork, - const CallbackInterface *callbacks, - const openScenario::CustomCommandAction action, - const std::string &eventName) : - ManipulatorCommonBase(world, - eventNetwork, - callbacks, - eventName) -{ - auto commandTokens = CommonHelper::TokenizeString(action.command, ' '); - auto commandTokensSize = commandTokens.size(); - - if (commandTokensSize < 2) - { - const std::string msg = COMPONENTNAME + ": Too less arguments for SetCustomParameters"; - LOG(CbkLogLevel::Error, msg); - throw std::runtime_error(msg); - } - - if (commandTokens.at(0) != "SetCustomParameters") - { - const std::string msg = COMPONENTNAME + ": Wrong command token"; - LOG(CbkLogLevel::Error, msg); - throw std::runtime_error(msg); - } - - const auto first = commandTokens.begin() + 1; - const auto last = commandTokens.end(); - customParameters = std::vector<std::string>(first, last); -} - -void CustomParametersManipulator::Trigger(int time) -{ - for (const auto &eventInterface : GetEvents()) - { - auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface); - - for (const auto actorId : triggeringEvent->actingAgents.entities) - { - auto trigger = std::make_unique<openpass::events::CustomParametersEvent>(time, eventName, COMPONENTNAME, actorId, customParameters); - eventNetwork->InsertTrigger(openpass::events::CustomParametersEvent::TOPIC, std::move(trigger)); - } - } -} - -EventContainer CustomParametersManipulator::GetEvents() -{ - EventContainer manipulatorSpecificEvents{}; - - const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO); - - for (const auto &event : conditionalEvents) - { - const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event); - - if (oscEvent && oscEvent.get()->GetName() == eventName) - { - manipulatorSpecificEvents.emplace_back(event); - } - } - - return manipulatorSpecificEvents; -} diff --git a/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.h b/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.h deleted file mode 100644 index 0382066bf68add7b50f6e519957471d471cebbf3..0000000000000000000000000000000000000000 --- a/sim/src/core/slave/modules/Manipulator/CustomParametersManipulator.h +++ /dev/null @@ -1,61 +0,0 @@ -/******************************************************************************* -* Copyright (c) 2020 in-tech GmbH -* -* This program and the accompanying materials are made -* available under the terms of the Eclipse Public License 2.0 -* which is available at https://www.eclipse.org/legal/epl-2.0/ -* -* SPDX-License-Identifier: EPL-2.0 -*******************************************************************************/ - -/** \file CustomParametersManipulator.h -* \brief This manipulator sends a custom parameter to anybody whos interested. -* -* \details This manipulator sets a custom parameter to anybody whos interested -* Syntax: `CustomCommand SetParameters STR1 STR2 ...` , where the STR - parameter are seperated at every whitespace and sent as vector. -*/ -//----------------------------------------------------------------------------- - -#pragma once - -#include "CustomCommandFactory.h" -#include "ManipulatorCommonBase.h" -#include "include/agentInterface.h" -#include "common/openScenarioDefinitions.h" - -//----------------------------------------------------------------------------- -/** \brief This manipulator sets a custom lane change for an agent. -* \details This manipulator sets a custom lane change for an agent. -* Therefore it needs the number of lanes over which the -* lane change should take place. -* -* \ingroup Manipulator -*/ -//----------------------------------------------------------------------------- -class CustomParametersManipulator : public ManipulatorCommonBase -{ -public: - CustomParametersManipulator(WorldInterface *world, - SimulationSlave::EventNetworkInterface *eventNetwork, - const CallbackInterface *callbacks, - const openScenario::CustomCommandAction action, - const std::string &eventName); - - /*! - * \brief Triggers the functionality of this class - * - * \details Trigger gets called each cycle timestep. - * This function is repsonsible for creating events - * - * @param[in] time Current time. - */ - virtual void Trigger(int time) override; - -private: - EventContainer GetEvents() override; - - std::vector<std::string> customParameters; - - static inline bool registered = CustomCommandFactory::Register<CustomParametersManipulator>("SetCustomParameters"); -}; diff --git a/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.cpp b/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.cpp new file mode 100644 index 0000000000000000000000000000000000000000..90bbe2751d7f035bef06041a83e806747e36a646 --- /dev/null +++ b/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.cpp @@ -0,0 +1,62 @@ +/******************************************************************************* +* Copyright (c) 2020, 2021 in-tech GmbH +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +/// @file DefaultCustomCommandAction.cpp + +#include "DefaultCustomCommandAction.h" + +#include "common/commonTools.h" +#include "common/events/defaultCustomCommandActionEvent.h" + +DefaultCustomCommandAction::DefaultCustomCommandAction(WorldInterface *world, + SimulationSlave::EventNetworkInterface *eventNetwork, + const CallbackInterface *callbacks, + const openScenario::CustomCommandAction action, + const std::string &eventName) : + ManipulatorCommonBase(world, + eventNetwork, + callbacks, + eventName), + command{std::move(action.command)} +{ +} + +void DefaultCustomCommandAction::Trigger(int time) +{ + for (const auto &eventInterface : GetEvents()) + { + auto triggeringEvent = std::dynamic_pointer_cast<openpass::events::OpenScenarioEvent>(eventInterface); + + for (const auto actorId : triggeringEvent->actingAgents.entities) + { + auto trigger = std::make_unique<openpass::events::DefaultCustomCommandActionEvent>(time, eventName, COMPONENTNAME, actorId, command); + eventNetwork->InsertTrigger(openpass::events::DefaultCustomCommandActionEvent::TOPIC, std::move(trigger)); + } + } +} + +EventContainer DefaultCustomCommandAction::GetEvents() +{ + EventContainer manipulatorSpecificEvents{}; + + const auto &conditionalEvents = eventNetwork->GetEvents(EventDefinitions::EventCategory::OpenSCENARIO); + + for (const auto &event : conditionalEvents) + { + const auto oscEvent = std::static_pointer_cast<openpass::events::OpenScenarioEvent>(event); + + if (oscEvent && oscEvent.get()->GetName() == eventName) + { + manipulatorSpecificEvents.emplace_back(event); + } + } + + return manipulatorSpecificEvents; +} diff --git a/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.h b/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.h new file mode 100644 index 0000000000000000000000000000000000000000..d98231e6dbadaab3e09721d1adeeb325f6888f49 --- /dev/null +++ b/sim/src/core/slave/modules/Manipulator/DefaultCustomCommandAction.h @@ -0,0 +1,40 @@ +/******************************************************************************* +* Copyright (c) 2020, 2021 in-tech GmbH +* +* This program and the accompanying materials are made +* available under the terms of the Eclipse Public License 2.0 +* which is available at https://www.eclipse.org/legal/epl-2.0/ +* +* SPDX-License-Identifier: EPL-2.0 +*******************************************************************************/ + +/// @file DefaultCustomCommandAction.h + +#pragma once + +#include "ManipulatorCommonBase.h" +#include "common/openScenarioDefinitions.h" +#include "include/agentInterface.h" + +/** + * @brief Triggers a CustomCommandActionEvent holding the whole command as payload + * + * <CustomCommandAction>arbitrary string to send</CustomCommandAction> + * + * @ingroup Manipulator +*/ +class DefaultCustomCommandAction : public ManipulatorCommonBase +{ +public: + DefaultCustomCommandAction(WorldInterface *world, + SimulationSlave::EventNetworkInterface *eventNetwork, + const CallbackInterface *callbacks, + const openScenario::CustomCommandAction action, + const std::string &eventName); + + virtual void Trigger(int time) override; + +private: + EventContainer GetEvents() override; + std::string command; +}; diff --git a/sim/src/core/slave/modules/Manipulator/Manipulator.pro b/sim/src/core/slave/modules/Manipulator/Manipulator.pro index 896a4315874f5bc38e0e930d06e3980e0e2fddbb..9c8b444aa82cadf3abb7cbf313ae48527019f514 100644 --- a/sim/src/core/slave/modules/Manipulator/Manipulator.pro +++ b/sim/src/core/slave/modules/Manipulator/Manipulator.pro @@ -29,7 +29,7 @@ INCLUDEPATH += \ SOURCES += \ CollisionManipulator.cpp \ ComponentStateChangeManipulator.cpp \ - CustomParametersManipulator.cpp \ + DefaultCustomCommandAction.cpp \ LaneChangeManipulator.cpp \ ManipulatorCommonBase.cpp \ ManipulatorExport.cpp \ @@ -56,7 +56,7 @@ HEADERS += \ CollisionManipulator.h \ ComponentStateChangeManipulator.h \ CustomCommandFactory.h \ - CustomParametersManipulator.h \ + DefaultCustomCommandAction.h \ LaneChangeManipulator.h \ ManipulatorCommonBase.h \ ManipulatorExport.h \ diff --git a/sim/src/core/slave/modules/Manipulator/ManipulatorExport.cpp b/sim/src/core/slave/modules/Manipulator/ManipulatorExport.cpp index 2315b1c612a619f206a13107c52fa5940c8299b7..57c67fa94304695f39d16590cf9879796a718457 100644 --- a/sim/src/core/slave/modules/Manipulator/ManipulatorExport.cpp +++ b/sim/src/core/slave/modules/Manipulator/ManipulatorExport.cpp @@ -1,5 +1,5 @@ /******************************************************************************* -* Copyright (c) 2017, 2018, 2019, 2020 in-tech GmbH +* Copyright (c) 2017, 2018, 2019, 2020, 2021 in-tech GmbH * 2020 BMW AG * * This program and the accompanying materials are made @@ -14,16 +14,18 @@ //----------------------------------------------------------------------------- #include "ManipulatorExport.h" -#include "include/callbackInterface.h" -#include "include/eventNetworkInterface.h" -#include "common/openScenarioDefinitions.h" + +#include "AcquirePositionManipulator.h" #include "CollisionManipulator.h" +#include "CustomCommandFactory.h" +#include "DefaultCustomCommandAction.h" +#include "LaneChangeManipulator.h" #include "RemoveAgentsManipulator.h" #include "SpeedActionManipulator.h" #include "TrajectoryManipulator.h" -#include "AcquirePositionManipulator.h" -#include "LaneChangeManipulator.h" -#include "CustomCommandFactory.h" +#include "common/openScenarioDefinitions.h" +#include "include/callbackInterface.h" +#include "include/eventNetworkInterface.h" class PublisherInterface; namespace openpass::publisher { @@ -56,23 +58,32 @@ extern "C" MANIPULATOR_SHARED_EXPORT ManipulatorInterface* OpenPASS_CreateInstan if (std::holds_alternative<openScenario::CustomCommandAction>(userDefinedAction)) { - const auto customCommandAction = std::get<openScenario::CustomCommandAction>(userDefinedAction); - const auto command = customCommandAction.command; - const auto firstSplitInCommand = command.find(' '); - const auto commandType = command.substr(0, firstSplitInCommand); - - if (auto instance = CustomCommandFactory::Create(commandType, + const auto action = std::get<openScenario::CustomCommandAction>(userDefinedAction); + const auto command = action.command; + + // the keyword is the first word in the command + const auto keyword = command.substr(0, command.find(' ')); + const auto eventName = manipulatorInformation.eventName; + + // get the manipulator for the given keyword from the factory + if (auto instance = CustomCommandFactory::Create(keyword, world, eventNetwork, callbacks, - customCommandAction, - manipulatorInformation.eventName)) + action, + eventName)) { return instance; } - - Callbacks->Log(CbkLogLevel::Error, __FILE__, __LINE__, "Invalid CustomCommandAction as manipulator."); - return nullptr; + // fallback: relay command without interpretation + else + { + return new DefaultCustomCommandAction(world, + eventNetwork, + callbacks, + action, + eventName); + } } else { diff --git a/sim/tests/CMakeLists.txt b/sim/tests/CMakeLists.txt index b8493552b22a052505774a5a9414cbd2e8b467e3..6b99be2b0787e2fac47856d4f91f2f483a15e1ff 100644 --- a/sim/tests/CMakeLists.txt +++ b/sim/tests/CMakeLists.txt @@ -12,6 +12,7 @@ set(OPENPASS_SIMCORE_DIR ${CMAKE_CURRENT_LIST_DIR}/../src) set(TEST_PATH ${CMAKE_CURRENT_LIST_DIR}) include_directories( + ${CMAKE_CURRENT_LIST_DIR}/.. ${TEST_PATH} ${TEST_PATH}/common ${TEST_PATH}/common/gtest diff --git a/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt b/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt index 1d5c0e82c93677f7949a9dc565ab7942767ca8eb..c22c23b6935597e799f10545900dd5d65dcc0a84 100644 --- a/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt +++ b/sim/tests/unitTests/components/OpenScenarioActions/CMakeLists.txt @@ -12,7 +12,7 @@ add_openpass_target( ${COMPONENT_SOURCE_DIR}/transformLaneChange.cpp ${COMPONENT_SOURCE_DIR}/transformSpeedAction.cpp ${COMPONENT_SOURCE_DIR}/transformAcquirePosition.cpp - ${COMPONENT_SOURCE_DIR}/transformCustomParameters.cpp + ${COMPONENT_SOURCE_DIR}/transformDefaultCustomCommandAction.cpp ${COMPONENT_SOURCE_DIR}/transformSpeedAction.cpp HEADERS @@ -22,6 +22,7 @@ add_openpass_target( ${OPENPASS_SIMCORE_DIR}/common/events/trajectoryEvent.h ${OPENPASS_SIMCORE_DIR}/common/trajectorySignal.h ${OPENPASS_SIMCORE_DIR}/common/acquirePositionSignal.h + ${COMPONENT_SOURCE_DIR}/transformDefaultCustomCommandAction.h ${OPENPASS_SIMCORE_DIR}/common/speedActionSignal.h INCDIRS diff --git a/sim/tests/unitTests/components/OpenScenarioActions/openScenarioActions_Tests.pro b/sim/tests/unitTests/components/OpenScenarioActions/openScenarioActions_Tests.pro index 2f51e4bfe1d05950619e478da45afbaccfceb4c0..cea165eea8f5aa5c2059b0ac03967d21fb02ed9b 100644 --- a/sim/tests/unitTests/components/OpenScenarioActions/openScenarioActions_Tests.pro +++ b/sim/tests/unitTests/components/OpenScenarioActions/openScenarioActions_Tests.pro @@ -27,13 +27,14 @@ HEADERS += \ $$OPEN_SRC/common/acquirePositionEvent.h \ $$OPEN_SRC/common/acquirePositionSignal.h \ $$UNIT_UNDER_TEST/openScenarioActionsImpl.h \ - $$UNIT_UNDER_TEST/oscActionsCalculation.h + $$UNIT_UNDER_TEST/oscActionsCalculation.h \ + $$UNIT_UNDER_TEST/transformDefaultCustomCommandAction.h SOURCES += \ $$UNIT_UNDER_TEST/transformLaneChange.cpp \ $$UNIT_UNDER_TEST/transformSpeedAction.cpp \ $$UNIT_UNDER_TEST/transformAcquirePosition.cpp \ - $$UNIT_UNDER_TEST/transformCustomParameters.cpp \ + $$UNIT_UNDER_TEST/transformDefaultCustomCommandAction.cpp \ $$UNIT_UNDER_TEST/openScenarioActionsImpl.cpp \ $$UNIT_UNDER_TEST/oscActionsCalculation.cpp \ openScenarioActions_Tests.cpp diff --git a/utils/make_doc.sh b/utils/make_doc.sh new file mode 100755 index 0000000000000000000000000000000000000000..64f0d2a0d354086557ef99805a0de052da62f659 --- /dev/null +++ b/utils/make_doc.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +#************************************************************ +# Copyright (c) 2021 in-tech GmbH +# +# This program and the accompanying materials are made +# available under the terms of the Eclipse Public License 2.0 +# which is available at https://www.eclipse.org/legal/epl-2.0/ +# +# SPDX-License-Identifier: EPL-2.0 +# ************************************************************ + +# check +if [ $# -ne 1 ]; then + ME=$(basename "$0") + echo "Usage: $ME <BUILD_DIRECTORY>" + exit 1 +fi + +# variables +CWD=$(pwd) +BUILD_DIRECTORY="$1" + +# actual command +mkdir $BUILD_DIRECTORY +cd $BUILD_DIRECTORY +cmake -DWITH_SIMCORE=OFF -DWITH_TESTS=OFF -DWITH_DOC=ON $CWD/.. +make doc \ No newline at end of file