summaryrefslogtreecommitdiff
path: root/Documentation
diff options
context:
space:
mode:
Diffstat (limited to 'Documentation')
-rw-r--r--Documentation/Doxyfile-common.in70
-rw-r--r--Documentation/Doxyfile-internal.in33
-rw-r--r--Documentation/Doxyfile-public.in20
-rw-r--r--Documentation/Doxyfile.in2450
-rw-r--r--Documentation/api-html/index.rst6
-rw-r--r--Documentation/binning.svg5053
-rw-r--r--Documentation/camera-sensor-model.rst175
-rw-r--r--Documentation/code-of-conduct.rst96
-rw-r--r--Documentation/coding-style.rst141
-rw-r--r--Documentation/conf.py13
-rw-r--r--Documentation/contributing.rst92
-rw-r--r--Documentation/docs.rst398
-rw-r--r--Documentation/documentation-contents.rst35
-rw-r--r--Documentation/environment_variables.rst176
-rw-r--r--Documentation/feature_requirements.rst150
-rwxr-xr-xDocumentation/gen-doxyfile.py46
-rw-r--r--Documentation/getting-started.rst6
-rw-r--r--Documentation/guides/application-developer.rst641
-rw-r--r--Documentation/guides/ipa.rst533
-rw-r--r--Documentation/guides/pipeline-handler.rst1535
-rw-r--r--Documentation/guides/tracing.rst149
-rw-r--r--Documentation/images/rotation/rotate0.svg132
-rw-r--r--Documentation/images/rotation/rotate0Mirror.svg135
-rw-r--r--Documentation/images/rotation/rotate180.svg135
-rw-r--r--Documentation/images/rotation/rotate180Mirror.svg135
-rw-r--r--Documentation/images/rotation/rotate270.svg135
-rw-r--r--Documentation/images/rotation/rotate270Mirror.svg135
-rw-r--r--Documentation/images/rotation/rotate90.svg135
-rw-r--r--Documentation/images/rotation/rotate90Mirror.svg135
-rw-r--r--Documentation/index.rst27
-rw-r--r--Documentation/internal-api-html/index.rst8
-rw-r--r--Documentation/introduction.rst224
-rw-r--r--Documentation/lens_driver_requirements.rst29
-rw-r--r--Documentation/libcamera_architecture.rst168
-rw-r--r--Documentation/mainpage.dox33
-rw-r--r--Documentation/mali-c55.dot25
-rw-r--r--Documentation/meson.build145
-rw-r--r--Documentation/python-bindings.rst72
-rw-r--r--Documentation/sensor_driver_requirements.rst95
-rw-r--r--Documentation/sensor_model.svg4870
-rw-r--r--Documentation/skipping.svg1720
-rw-r--r--Documentation/software-isp-benchmarking.rst79
-rw-r--r--Documentation/theme/footer.html3
-rw-r--r--Documentation/theme/layout.html8
-rw-r--r--Documentation/theme/search.html3
-rw-r--r--Documentation/theme/static/css/theme.css8
-rw-r--r--Documentation/theme/theme.conf2
-rw-r--r--Documentation/thread-safety.dox44
48 files changed, 17519 insertions, 2939 deletions
diff --git a/Documentation/Doxyfile-common.in b/Documentation/Doxyfile-common.in
new file mode 100644
index 00000000..045c19dd
--- /dev/null
+++ b/Documentation/Doxyfile-common.in
@@ -0,0 +1,70 @@
+# SPDX-License-Identifier: CC-BY-SA-4.0
+# Doxyfile 1.9.5
+
+PROJECT_NAME = "libcamera"
+PROJECT_NUMBER = "@VERSION@"
+PROJECT_BRIEF = "Supporting cameras in Linux since 2019"
+
+OUTPUT_DIRECTORY = "@OUTPUT_DIR@"
+
+STRIP_FROM_PATH = "@TOP_SRCDIR@"
+
+ALIASES = "context=\xrefitem context \"Thread Safety\" \"Thread Safety\"" \
+ "threadbound=\ref thread-bound \"thread-bound\"" \
+ "threadsafe=\ref thread-safe \"thread-safe\""
+
+EXTENSION_MAPPING = h=C++
+
+TOC_INCLUDE_HEADINGS = 0
+
+CASE_SENSE_NAMES = YES
+
+QUIET = YES
+WARN_AS_ERROR = @WARN_AS_ERROR@
+
+FILE_PATTERNS = *.c \
+ *.cpp \
+ *.dox \
+ *.h
+
+RECURSIVE = YES
+
+EXCLUDE_PATTERNS = @TOP_BUILDDIR@/include/libcamera/ipa/*_serializer.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/*_proxy.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/ipu3_*.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/mali-c55_*.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/raspberrypi_*.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/rkisp1_*.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/vimc_*.h
+
+EXCLUDE_SYMBOLS = libcamera::BoundMethodArgs \
+ libcamera::BoundMethodBase \
+ libcamera::BoundMethodFunctor \
+ libcamera::BoundMethodMember \
+ libcamera::BoundMethodPack \
+ libcamera::BoundMethodPackBase \
+ libcamera::BoundMethodStatic \
+ libcamera::CameraManager::Private \
+ libcamera::SignalBase \
+ libcamera::ipa::AlgorithmFactoryBase \
+ *::details \
+ std::*
+
+EXCLUDE_SYMLINKS = YES
+
+GENERATE_LATEX = NO
+
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+
+INCLUDE_PATH = "@TOP_SRCDIR@/include/libcamera"
+INCLUDE_FILE_PATTERNS = *.h
+
+IMAGE_PATH = "@TOP_SRCDIR@/Documentation/images"
+
+PREDEFINED = __DOXYGEN__ \
+ __cplusplus \
+ __attribute__(x)= \
+ @PREDEFINED@
+
+HAVE_DOT = YES
diff --git a/Documentation/Doxyfile-internal.in b/Documentation/Doxyfile-internal.in
new file mode 100644
index 00000000..5343bc2b
--- /dev/null
+++ b/Documentation/Doxyfile-internal.in
@@ -0,0 +1,33 @@
+# SPDX-License-Identifier: CC-BY-SA-4.0
+
+@INCLUDE_PATH = @TOP_BUILDDIR@/Documentation
+@INCLUDE = Doxyfile-common
+
+HIDE_UNDOC_CLASSES = NO
+HIDE_UNDOC_MEMBERS = NO
+HTML_OUTPUT = internal-api-html
+INTERNAL_DOCS = YES
+ENABLED_SECTIONS = internal
+
+INPUT = "@TOP_SRCDIR@/Documentation" \
+ "@TOP_SRCDIR@/include/libcamera" \
+ "@TOP_SRCDIR@/src/ipa/ipu3" \
+ "@TOP_SRCDIR@/src/ipa/libipa" \
+ "@TOP_SRCDIR@/src/libcamera" \
+ "@TOP_BUILDDIR@/include/libcamera" \
+ "@TOP_BUILDDIR@/src/libcamera"
+
+EXCLUDE = @TOP_SRCDIR@/include/libcamera/base/span.h \
+ @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_sysfs.h \
+ @TOP_SRCDIR@/include/libcamera/internal/device_enumerator_udev.h \
+ @TOP_SRCDIR@/include/libcamera/internal/ipc_pipe_unixsocket.h \
+ @TOP_SRCDIR@/src/libcamera/device_enumerator_sysfs.cpp \
+ @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \
+ @TOP_SRCDIR@/src/libcamera/ipc_pipe_unixsocket.cpp \
+ @TOP_SRCDIR@/src/libcamera/pipeline/ \
+ @TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_legacy.cpp \
+ @TOP_SRCDIR@/src/libcamera/sensor/camera_sensor_raw.cpp \
+ @TOP_SRCDIR@/src/libcamera/tracepoints.cpp \
+ @TOP_BUILDDIR@/include/libcamera/internal/tracepoints.h \
+ @TOP_BUILDDIR@/include/libcamera/ipa/soft_ipa_interface.h \
+ @TOP_BUILDDIR@/src/libcamera/proxy/
diff --git a/Documentation/Doxyfile-public.in b/Documentation/Doxyfile-public.in
new file mode 100644
index 00000000..36bb5758
--- /dev/null
+++ b/Documentation/Doxyfile-public.in
@@ -0,0 +1,20 @@
+# SPDX-License-Identifier: CC-BY-SA-4.0
+
+@INCLUDE_PATH = @TOP_BUILDDIR@/Documentation
+@INCLUDE = Doxyfile-common
+
+HIDE_UNDOC_CLASSES = YES
+HIDE_UNDOC_MEMBERS = YES
+HTML_OUTPUT = api-html
+INTERNAL_DOCS = NO
+
+INPUT = "@TOP_SRCDIR@/Documentation" \
+ ${inputs}
+
+EXCLUDE = @TOP_SRCDIR@/include/libcamera/base/class.h \
+ @TOP_SRCDIR@/include/libcamera/base/object.h \
+ @TOP_SRCDIR@/include/libcamera/base/span.h \
+ @TOP_SRCDIR@/src/libcamera/base/class.cpp \
+ @TOP_SRCDIR@/src/libcamera/base/object.cpp
+
+PREDEFINED += __DOXYGEN_PUBLIC__
diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
deleted file mode 100644
index 3dffbf82..00000000
--- a/Documentation/Doxyfile.in
+++ /dev/null
@@ -1,2450 +0,0 @@
-# Doxyfile 1.8.14
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project.
-#
-# All text after a double hash (##) is considered a comment and is placed in
-# front of the TAG it is preceding.
-#
-# All text after a single hash (#) is considered a comment and will be ignored.
-# The format is:
-# TAG = value [value, ...]
-# For lists, items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (\" \").
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# This tag specifies the encoding used for all characters in the config file
-# that follow. The default is UTF-8 which is also the encoding used for all text
-# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
-# built into libc) for the transcoding. See
-# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
-# The default value is: UTF-8.
-
-DOXYFILE_ENCODING = UTF-8
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
-# double-quotes, unless you are using Doxywizard) that should identify the
-# project for which the documentation is generated. This name is used in the
-# title of most generated pages and in a few other places.
-# The default value is: My Project.
-
-PROJECT_NAME = "libcamera"
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
-# could be handy for archiving the generated documentation or if some version
-# control system is used.
-
-PROJECT_NUMBER = @VERSION@
-
-# Using the PROJECT_BRIEF tag one can provide an optional one line description
-# for a project that appears at the top of each page and should give viewer a
-# quick idea about the purpose of the project. Keep the description short.
-
-PROJECT_BRIEF = "Supporting cameras in Linux since 2019"
-
-# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
-# in the documentation. The maximum height of the logo should not exceed 55
-# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
-# the logo to the output directory.
-
-PROJECT_LOGO =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
-# into which the generated documentation will be written. If a relative path is
-# entered, it will be relative to the location where doxygen was started. If
-# left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = Documentation
-
-# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
-# directories (in 2 levels) under the output directory of each output format and
-# will distribute the generated files over these directories. Enabling this
-# option can be useful when feeding doxygen a huge amount of source files, where
-# putting all generated files in the same directory would otherwise causes
-# performance problems for the file system.
-# The default value is: NO.
-
-CREATE_SUBDIRS = NO
-
-# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
-# characters to appear in the names of generated files. If set to NO, non-ASCII
-# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
-# U+3044.
-# The default value is: NO.
-
-ALLOW_UNICODE_NAMES = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
-# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
-# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
-# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
-# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
-# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
-# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
-# Ukrainian and Vietnamese.
-# The default value is: English.
-
-OUTPUT_LANGUAGE = English
-
-# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
-# descriptions after the members that are listed in the file and class
-# documentation (similar to Javadoc). Set to NO to disable this.
-# The default value is: YES.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
-# description of a member or function before the detailed description
-#
-# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-# The default value is: YES.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator that is
-# used to form the text in various listings. Each string in this list, if found
-# as the leading text of the brief description, will be stripped from the text
-# and the result, after processing the whole list, is used as the annotated
-# text. Otherwise, the brief description is used as-is. If left blank, the
-# following values are used ($name is automatically replaced with the name of
-# the entity):The $name class, The $name widget, The $name file, is, provides,
-# specifies, contains, represents, a, an and the.
-
-ABBREVIATE_BRIEF = "The $name class" \
- "The $name widget" \
- "The $name file" \
- is \
- provides \
- specifies \
- contains \
- represents \
- a \
- an \
- the
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# doxygen will generate a detailed section even if there is only a brief
-# description.
-# The default value is: NO.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
-# inherited members of a class in the documentation of that class as if those
-# members were ordinary class members. Constructors, destructors and assignment
-# operators of the base classes will not be shown.
-# The default value is: NO.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
-# before files name in the file list and in the header files. If set to NO the
-# shortest path that makes the file name unique will be used
-# The default value is: YES.
-
-FULL_PATH_NAMES = YES
-
-# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
-# Stripping is only done if one of the specified strings matches the left-hand
-# part of the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the path to
-# strip.
-#
-# Note that you can specify absolute paths here, but also relative paths, which
-# will be relative from the directory where doxygen is started.
-# This tag requires that the tag FULL_PATH_NAMES is set to YES.
-
-STRIP_FROM_PATH = "@TOP_SRCDIR@"
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
-# path mentioned in the documentation of a class, which tells the reader which
-# header file to include in order to use a class. If left blank only the name of
-# the header file containing the class definition is used. Otherwise one should
-# specify the list of include paths that are normally passed to the compiler
-# using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
-# less readable) file names. This can be useful is your file systems doesn't
-# support long names like on DOS, Mac, or CD-ROM.
-# The default value is: NO.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
-# first line (until the first dot) of a Javadoc-style comment as the brief
-# description. If set to NO, the Javadoc-style will behave just like regular Qt-
-# style comments (thus requiring an explicit @brief command for a brief
-# description.)
-# The default value is: NO.
-
-JAVADOC_AUTOBRIEF = NO
-
-# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
-# line (until the first dot) of a Qt-style comment as the brief description. If
-# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
-# requiring an explicit \brief command for a brief description.)
-# The default value is: NO.
-
-QT_AUTOBRIEF = NO
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
-# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
-# a brief description. This used to be the default behavior. The new default is
-# to treat a multi-line C++ comment block as a detailed description. Set this
-# tag to YES if you prefer the old behavior instead.
-#
-# Note that setting this tag to YES also means that rational rose comments are
-# not recognized any more.
-# The default value is: NO.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
-# documentation from any documented member that it re-implements.
-# The default value is: YES.
-
-INHERIT_DOCS = YES
-
-# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
-# page for each member. If set to NO, the documentation of a member will be part
-# of the file/class/namespace that contains it.
-# The default value is: NO.
-
-SEPARATE_MEMBER_PAGES = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
-# uses this value to replace tabs by spaces in code fragments.
-# Minimum value: 1, maximum value: 16, default value: 4.
-
-TAB_SIZE = 4
-
-# This tag can be used to specify a number of aliases that act as commands in
-# the documentation. An alias has the form:
-# name=value
-# For example adding
-# "sideeffect=@par Side Effects:\n"
-# will allow you to put the command \sideeffect (or @sideeffect) in the
-# documentation, which will result in a user-defined paragraph with heading
-# "Side Effects:". You can put \n's in the value part of an alias to insert
-# newlines (in the resulting output). You can put ^^ in the value part of an
-# alias to insert a newline as if a physical newline was in the original file.
-
-ALIASES = "context=\xrefitem context \"Thread Safety\" \"Thread Safety\""
-ALIASES += "threadbound=\ref thread-bound \"thread-bound\""
-ALIASES += "threadsafe=\ref thread-safe \"thread-safe\""
-
-# This tag can be used to specify a number of word-keyword mappings (TCL only).
-# A mapping has the form "name=value". For example adding "class=itcl::class"
-# will allow you to use the command class in the itcl::class meaning.
-
-TCL_SUBST =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C. For
-# instance, some of the names that are used will be different. The list of all
-# members will be omitted, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
-# Python sources only. Doxygen will then generate output that is more tailored
-# for that language. For instance, namespaces will be presented as packages,
-# qualified scopes will look different, etc.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
-# sources. Doxygen will then generate output that is tailored for Fortran.
-# The default value is: NO.
-
-OPTIMIZE_FOR_FORTRAN = NO
-
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
-# sources. Doxygen will then generate output that is tailored for VHDL.
-# The default value is: NO.
-
-OPTIMIZE_OUTPUT_VHDL = NO
-
-# Doxygen selects the parser to use depending on the extension of the files it
-# parses. With this tag you can assign which parser to use for a given
-# extension. Doxygen has a built-in mapping, but you can override or extend it
-# using this tag. The format is ext=language, where ext is a file extension, and
-# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
-# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
-# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
-# Fortran. In the later case the parser tries to guess whether the code is fixed
-# or free formatted code, this is the default for Fortran type files), VHDL. For
-# instance to make doxygen treat .inc files as Fortran files (default is PHP),
-# and .f files as C (default is Fortran), use: inc=Fortran f=C.
-#
-# Note: For files without extension you can use no_extension as a placeholder.
-#
-# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
-# the files are not read by doxygen.
-
-EXTENSION_MAPPING = h=C++
-
-# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
-# according to the Markdown format, which allows for more readable
-# documentation. See http://daringfireball.net/projects/markdown/ for details.
-# The output of markdown processing is further processed by doxygen, so you can
-# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
-# case of backward compatibilities issues.
-# The default value is: YES.
-
-MARKDOWN_SUPPORT = YES
-
-# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
-# to that level are automatically included in the table of contents, even if
-# they do not have an id attribute.
-# Note: This feature currently applies only to Markdown headings.
-# Minimum value: 0, maximum value: 99, default value: 0.
-# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
-
-TOC_INCLUDE_HEADINGS = 0
-
-# When enabled doxygen tries to link words that correspond to documented
-# classes, or namespaces to their corresponding documentation. Such a link can
-# be prevented in individual cases by putting a % sign in front of the word or
-# globally by setting AUTOLINK_SUPPORT to NO.
-# The default value is: YES.
-
-AUTOLINK_SUPPORT = YES
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
-# to include (a tag file for) the STL sources as input, then you should set this
-# tag to YES in order to let doxygen match functions declarations and
-# definitions whose arguments contain STL classes (e.g. func(std::string);
-# versus func(std::string) {}). This also make the inheritance and collaboration
-# diagrams that involve STL classes more complete and accurate.
-# The default value is: NO.
-
-BUILTIN_STL_SUPPORT = NO
-
-# If you use Microsoft's C++/CLI language, you should set this option to YES to
-# enable parsing support.
-# The default value is: NO.
-
-CPP_CLI_SUPPORT = NO
-
-# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
-# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
-# will parse them like normal C++ but will assume all classes use public instead
-# of private inheritance when no explicit protection keyword is present.
-# The default value is: NO.
-
-SIP_SUPPORT = NO
-
-# For Microsoft's IDL there are propget and propput attributes to indicate
-# getter and setter methods for a property. Setting this option to YES will make
-# doxygen to replace the get and set methods by a property in the documentation.
-# This will only work if the methods are indeed getting or setting a simple
-# type. If this is not the case, or you want to show the methods anyway, you
-# should set this option to NO.
-# The default value is: YES.
-
-IDL_PROPERTY_SUPPORT = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-# The default value is: NO.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# If one adds a struct or class to a group and this option is enabled, then also
-# any nested class or struct is added to the same group. By default this option
-# is disabled and one has to add nested compounds explicitly via \ingroup.
-# The default value is: NO.
-
-GROUP_NESTED_COMPOUNDS = NO
-
-# Set the SUBGROUPING tag to YES to allow class member groups of the same type
-# (for instance a group of public functions) to be put as a subgroup of that
-# type (e.g. under the Public Functions section). Set it to NO to prevent
-# subgrouping. Alternatively, this can be done per class using the
-# \nosubgrouping command.
-# The default value is: YES.
-
-SUBGROUPING = YES
-
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
-# are shown inside the group in which they are included (e.g. using \ingroup)
-# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
-# and RTF).
-#
-# Note that this feature does not work in combination with
-# SEPARATE_MEMBER_PAGES.
-# The default value is: NO.
-
-INLINE_GROUPED_CLASSES = NO
-
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
-# with only public data fields or simple typedef fields will be shown inline in
-# the documentation of the scope in which they are defined (i.e. file,
-# namespace, or group documentation), provided this scope is documented. If set
-# to NO, structs, classes, and unions are shown on a separate page (for HTML and
-# Man pages) or section (for LaTeX and RTF).
-# The default value is: NO.
-
-INLINE_SIMPLE_STRUCTS = NO
-
-# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
-# enum is documented as struct, union, or enum with the name of the typedef. So
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
-# with name TypeT. When disabled the typedef will appear as a member of a file,
-# namespace, or class. And the struct will be named TypeS. This can typically be
-# useful for C code in case the coding convention dictates that all compound
-# types are typedef'ed and only the typedef is referenced, never the tag name.
-# The default value is: NO.
-
-TYPEDEF_HIDES_STRUCT = NO
-
-# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
-# cache is used to resolve symbols given their name and scope. Since this can be
-# an expensive process and often the same symbol appears multiple times in the
-# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
-# doxygen will become slower. If the cache is too large, memory is wasted. The
-# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
-# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
-# symbols. At the end of a run doxygen will report the cache usage and suggest
-# the optimal cache size from a speed point of view.
-# Minimum value: 0, maximum value: 9, default value: 0.
-
-LOOKUP_CACHE_SIZE = 0
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
-# documentation are documented, even if no documentation was available. Private
-# class members and static file members will be hidden unless the
-# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
-# Note: This will also disable the warnings about undocumented members that are
-# normally produced when WARNINGS is set to YES.
-# The default value is: NO.
-
-EXTRACT_ALL = NO
-
-# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
-# be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PRIVATE = NO
-
-# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
-# scope will be included in the documentation.
-# The default value is: NO.
-
-EXTRACT_PACKAGE = NO
-
-# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
-# included in the documentation.
-# The default value is: NO.
-
-EXTRACT_STATIC = NO
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
-# locally in source files will be included in the documentation. If set to NO,
-# only classes defined in header files are included. Does not have any effect
-# for Java sources.
-# The default value is: YES.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. If set to YES, local methods,
-# which are defined in the implementation section but not in the interface are
-# included in the documentation. If set to NO, only methods in the interface are
-# included.
-# The default value is: NO.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If this flag is set to YES, the members of anonymous namespaces will be
-# extracted and appear in the documentation as a namespace called
-# 'anonymous_namespace{file}', where file will be replaced with the base name of
-# the file that contains the anonymous namespace. By default anonymous namespace
-# are hidden.
-# The default value is: NO.
-
-EXTRACT_ANON_NSPACES = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
-# undocumented members inside documented classes or files. If set to NO these
-# members will be included in the various overviews, but no documentation
-# section is generated. This option has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy. If set
-# to NO, these classes will be included in the various overviews. This option
-# has no effect if EXTRACT_ALL is enabled.
-# The default value is: NO.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
-# (class|struct|union) declarations. If set to NO, these declarations will be
-# included in the documentation.
-# The default value is: NO.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
-# documentation blocks found inside the body of a function. If set to NO, these
-# blocks will be appended to the function's detailed documentation block.
-# The default value is: NO.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation that is typed after a
-# \internal command is included. If the tag is set to NO then the documentation
-# will be excluded. Set it to YES to include the internal documentation.
-# The default value is: NO.
-
-INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
-# names in lower-case letters. If set to YES, upper-case letters are also
-# allowed. This is useful if you have classes or files whose names only differ
-# in case and if your file system supports case sensitive file names. Windows
-# and Mac users are advised to set this option to NO.
-# The default value is: system dependent.
-
-CASE_SENSE_NAMES = YES
-
-# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
-# their full class and namespace scopes in the documentation. If set to YES, the
-# scope will be hidden.
-# The default value is: NO.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
-# append additional text to a page's title, such as Class Reference. If set to
-# YES the compound reference will be hidden.
-# The default value is: NO.
-
-HIDE_COMPOUND_REFERENCE= NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
-# the files that are included by a file in the documentation of that file.
-# The default value is: YES.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
-# grouped member an include statement to the documentation, telling the reader
-# which file to include in order to use the member.
-# The default value is: NO.
-
-SHOW_GROUPED_MEMB_INC = NO
-
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
-# files with double quotes in the documentation rather than with sharp brackets.
-# The default value is: NO.
-
-FORCE_LOCAL_INCLUDES = NO
-
-# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
-# documentation for inline members.
-# The default value is: YES.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
-# (detailed) documentation of file and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order.
-# The default value is: YES.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
-# descriptions of file, namespace and class members alphabetically by member
-# name. If set to NO, the members will appear in declaration order. Note that
-# this will also influence the order of the classes in the class list.
-# The default value is: NO.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
-# (brief and detailed) documentation of class members so that constructors and
-# destructors are listed first. If set to NO the constructors will appear in the
-# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
-# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
-# member documentation.
-# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
-# detailed member documentation.
-# The default value is: NO.
-
-SORT_MEMBERS_CTORS_1ST = NO
-
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
-# of group names into alphabetical order. If set to NO the group names will
-# appear in their defined order.
-# The default value is: NO.
-
-SORT_GROUP_NAMES = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
-# fully-qualified names, including namespaces. If set to NO, the class list will
-# be sorted only by class name, not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the alphabetical
-# list.
-# The default value is: NO.
-
-SORT_BY_SCOPE_NAME = NO
-
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
-# type resolution of all parameters of a function it will reject a match between
-# the prototype and the implementation of a member function even if there is
-# only one candidate or it is obvious which candidate to choose by doing a
-# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
-# accept a match between prototype and implementation in such cases.
-# The default value is: NO.
-
-STRICT_PROTO_MATCHING = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
-# list. This list is created by putting \todo commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
-# list. This list is created by putting \test commands in the documentation.
-# The default value is: YES.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
-# list. This list is created by putting \bug commands in the documentation.
-# The default value is: YES.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
-# the deprecated list. This list is created by putting \deprecated commands in
-# the documentation.
-# The default value is: YES.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional documentation
-# sections, marked by \if <section_label> ... \endif and \cond <section_label>
-# ... \endcond blocks.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
-# initial value of a variable or macro / define can have for it to appear in the
-# documentation. If the initializer consists of more lines than specified here
-# it will be hidden. Use a value of 0 to hide initializers completely. The
-# appearance of the value of individual variables and macros / defines can be
-# controlled using \showinitializer or \hideinitializer command in the
-# documentation regardless of this setting.
-# Minimum value: 0, maximum value: 10000, default value: 30.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
-# the bottom of the documentation of classes and structs. If set to YES, the
-# list will mention the files that were used to generate the documentation.
-# The default value is: YES.
-
-SHOW_USED_FILES = YES
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
-# will remove the Files entry from the Quick Index and from the Folder Tree View
-# (if specified).
-# The default value is: YES.
-
-SHOW_FILES = YES
-
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
-# page. This will remove the Namespaces entry from the Quick Index and from the
-# Folder Tree View (if specified).
-# The default value is: YES.
-
-SHOW_NAMESPACES = YES
-
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that
-# doxygen should invoke to get the current version for each file (typically from
-# the version control system). Doxygen will invoke the program by executing (via
-# popen()) the command command input-file, where command is the value of the
-# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
-# by doxygen. Whatever the program writes to standard output is used as the file
-# version. For an example see the documentation.
-
-FILE_VERSION_FILTER =
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
-# by doxygen. The layout file controls the global structure of the generated
-# output files in an output format independent way. To create the layout file
-# that represents doxygen's defaults, run doxygen with the -l option. You can
-# optionally specify a file name after the option, if omitted DoxygenLayout.xml
-# will be used as the name of the layout file.
-#
-# Note that if you run doxygen from a directory containing a file called
-# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
-# tag is left empty.
-
-LAYOUT_FILE =
-
-# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
-# the reference definitions. This must be a list of .bib files. The .bib
-# extension is automatically appended if omitted. This requires the bibtex tool
-# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
-# For LaTeX the style of the bibliography can be controlled using
-# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
-# search path. See also \cite for info how to create references.
-
-CITE_BIB_FILES =
-
-#---------------------------------------------------------------------------
-# Configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated to
-# standard output by doxygen. If QUIET is set to YES this implies that the
-# messages are off.
-# The default value is: NO.
-
-QUIET = YES
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
-# this implies that the warnings are on.
-#
-# Tip: Turn warnings on while writing the documentation.
-# The default value is: YES.
-
-WARNINGS = YES
-
-# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
-# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
-# will automatically be disabled.
-# The default value is: YES.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some parameters
-# in a documented function, or documenting parameters that don't exist or using
-# markup commands wrongly.
-# The default value is: YES.
-
-WARN_IF_DOC_ERROR = YES
-
-# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
-# are documented, but have no documentation for their parameters or return
-# value. If set to NO, doxygen will only warn about wrong or incomplete
-# parameter documentation, but not about the absence of documentation.
-# The default value is: NO.
-
-WARN_NO_PARAMDOC = NO
-
-# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
-# a warning is encountered.
-# The default value is: NO.
-
-WARN_AS_ERROR = NO
-
-# The WARN_FORMAT tag determines the format of the warning messages that doxygen
-# can produce. The string should contain the $file, $line, and $text tags, which
-# will be replaced by the file and line number from which the warning originated
-# and the warning text. Optionally the format may contain $version, which will
-# be replaced by the version of the file (if it could be obtained via
-# FILE_VERSION_FILTER)
-# The default value is: $file:$line: $text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning and error
-# messages should be written. If left blank the output is written to standard
-# error (stderr).
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag is used to specify the files and/or directories that contain
-# documented source files. You may enter file names like myfile.cpp or
-# directories like /usr/src/myproject. Separate the files or directories with
-# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
-# Note: If this tag is empty the current directory is searched.
-
-INPUT = "@TOP_SRCDIR@/include/ipa" \
- "@TOP_SRCDIR@/include/libcamera" \
- "@TOP_SRCDIR@/src/ipa/libipa" \
- "@TOP_SRCDIR@/src/libcamera" \
- "@TOP_BUILDDIR@/include/libcamera" \
- "@TOP_BUILDDIR@/src/libcamera"
-
-# This tag can be used to specify the character encoding of the source files
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
-# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
-# documentation (see: https://www.gnu.org/software/libiconv/) for the list of
-# possible encodings.
-# The default value is: UTF-8.
-
-INPUT_ENCODING = UTF-8
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
-# *.h) to filter out the source-files in the directories.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# read by doxygen.
-#
-# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
-# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
-# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
-# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08,
-# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf and *.qsf.
-
-FILE_PATTERNS = *.c \
- *.cpp \
- *.h
-
-# The RECURSIVE tag can be used to specify whether or not subdirectories should
-# be searched for input files as well.
-# The default value is: NO.
-
-RECURSIVE = YES
-
-# The EXCLUDE tag can be used to specify files and/or directories that should be
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-#
-# Note that relative paths are relative to the directory from which doxygen is
-# run.
-
-EXCLUDE = @TOP_SRCDIR@/include/libcamera/span.h \
- @TOP_SRCDIR@/src/libcamera/device_enumerator_sysfs.cpp \
- @TOP_SRCDIR@/src/libcamera/device_enumerator_udev.cpp \
- @TOP_SRCDIR@/src/libcamera/include/device_enumerator_sysfs.h \
- @TOP_SRCDIR@/src/libcamera/include/device_enumerator_udev.h \
- @TOP_SRCDIR@/src/libcamera/pipeline/ \
- @TOP_SRCDIR@/src/libcamera/proxy/
-
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
-# directories that are symbolic links (a Unix file system feature) are excluded
-# from the input.
-# The default value is: NO.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories for example use the pattern */test/*
-
-EXCLUDE_PATTERNS =
-
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
-# (namespaces, classes, functions, etc.) that should be excluded from the
-# output. The symbol name can be a fully qualified name, a word, or if the
-# wildcard * is used, a substring. Examples: ANamespace, AClass,
-# AClass::ANamespace, ANamespace::*Test
-#
-# Note that the wildcards are matched against the file with absolute path, so to
-# exclude all test directories use the pattern */test/*
-
-EXCLUDE_SYMBOLS = libcamera::BoundMethodArgs \
- libcamera::BoundMethodBase \
- libcamera::BoundMethodMember \
- libcamera::BoundMethodPack \
- libcamera::BoundMethodPackBase \
- libcamera::BoundMethodStatic \
- libcamera::SignalBase \
- libcamera::*::Private \
- *::details::* \
- std::*
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or directories
-# that contain example code fragments that are included (see the \include
-# command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
-# *.h) to filter out the source-files in the directories. If left blank all
-# files are included.
-
-EXAMPLE_PATTERNS = *
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude commands
-# irrespective of the value of the RECURSIVE tag.
-# The default value is: NO.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or directories
-# that contain images that are to be included in the documentation (see the
-# \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command:
-#
-# <filter> <input-file>
-#
-# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
-# name of an input file. Doxygen will then use the output that the filter
-# program writes to standard output. If FILTER_PATTERNS is specified, this tag
-# will be ignored.
-#
-# Note that the filter must not add or remove lines; it is applied before the
-# code is scanned, but not when the output code is generated. If lines are added
-# or removed, the anchors will not be placed correctly.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-INPUT_FILTER =
-
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
-# basis. Doxygen will compare the file name with each pattern and apply the
-# filter if there is a match. The filters are a list of the form: pattern=filter
-# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
-# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
-# patterns match the file name, INPUT_FILTER is applied.
-#
-# Note that for custom extensions or not directly supported extensions you also
-# need to set EXTENSION_MAPPING for the extension otherwise the files are not
-# properly processed by doxygen.
-
-FILTER_PATTERNS =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will also be used to filter the input files that are used for
-# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
-# The default value is: NO.
-
-FILTER_SOURCE_FILES = NO
-
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
-# it is also possible to disable source filtering for a specific pattern using
-# *.ext= (so without naming a filter).
-# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
-
-FILTER_SOURCE_PATTERNS =
-
-# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
-# is part of the input, its contents will be placed on the main page
-# (index.html). This can be useful if you have a project on for instance GitHub
-# and want to reuse the introduction page also for the doxygen output.
-
-USE_MDFILE_AS_MAINPAGE =
-
-#---------------------------------------------------------------------------
-# Configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
-# generated. Documented entities will be cross-referenced with these sources.
-#
-# Note: To get rid of all source code in the generated output, make sure that
-# also VERBATIM_HEADERS is set to NO.
-# The default value is: NO.
-
-SOURCE_BROWSER = NO
-
-# Setting the INLINE_SOURCES tag to YES will include the body of functions,
-# classes and enums directly into the documentation.
-# The default value is: NO.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
-# special comment blocks from generated source code fragments. Normal C, C++ and
-# Fortran comments will always remain visible.
-# The default value is: YES.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
-# function all documented functions referencing it will be listed.
-# The default value is: NO.
-
-REFERENCED_BY_RELATION = NO
-
-# If the REFERENCES_RELATION tag is set to YES then for each documented function
-# all documented entities called/used by that function will be listed.
-# The default value is: NO.
-
-REFERENCES_RELATION = NO
-
-# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
-# to YES then the hyperlinks from functions in REFERENCES_RELATION and
-# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
-# link to the documentation.
-# The default value is: YES.
-
-REFERENCES_LINK_SOURCE = YES
-
-# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
-# source code will show a tooltip with additional information such as prototype,
-# brief description and links to the definition and documentation. Since this
-# will make the HTML file larger and loading of large files a bit slower, you
-# can opt to disable this feature.
-# The default value is: YES.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-SOURCE_TOOLTIPS = YES
-
-# If the USE_HTAGS tag is set to YES then the references to source code will
-# point to the HTML generated by the htags(1) tool instead of doxygen built-in
-# source browser. The htags tool is part of GNU's global source tagging system
-# (see https://www.gnu.org/software/global/global.html). You will need version
-# 4.8.6 or higher.
-#
-# To use it do the following:
-# - Install the latest version of global
-# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
-# - Make sure the INPUT points to the root of the source tree
-# - Run doxygen as normal
-#
-# Doxygen will invoke htags (and that will in turn invoke gtags), so these
-# tools must be available from the command line (i.e. in the search path).
-#
-# The result: instead of the source browser generated by doxygen, the links to
-# source code will now point to the output of htags.
-# The default value is: NO.
-# This tag requires that the tag SOURCE_BROWSER is set to YES.
-
-USE_HTAGS = NO
-
-# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
-# verbatim copy of the header file for each class for which an include is
-# specified. Set to NO to disable this.
-# See also: Section \class.
-# The default value is: YES.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
-# compounds will be generated. Enable this if the project contains a lot of
-# classes, structs, unions or interfaces.
-# The default value is: YES.
-
-ALPHABETICAL_INDEX = YES
-
-# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
-# which the alphabetical index list will be split.
-# Minimum value: 1, maximum value: 20, default value: 5.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-COLS_IN_ALPHA_INDEX = 5
-
-# In case all classes in a project start with a common prefix, all classes will
-# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
-# can be used to specify a prefix (or a list of prefixes) that should be ignored
-# while generating the index headers.
-# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
-
-IGNORE_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
-# The default value is: YES.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_OUTPUT = api-html
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
-# generated HTML page (for example: .htm, .php, .asp).
-# The default value is: .html.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
-# each generated HTML page. If the tag is left blank doxygen will generate a
-# standard header.
-#
-# To get valid HTML the header file that includes any scripts and style sheets
-# that doxygen needs, which is dependent on the configuration options used (e.g.
-# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
-# default header using
-# doxygen -w html new_header.html new_footer.html new_stylesheet.css
-# YourConfigFile
-# and then modify the file new_header.html. See also section "Doxygen usage"
-# for information on how to generate the default header that doxygen normally
-# uses.
-# Note: The header is subject to change so you typically have to regenerate the
-# default header when upgrading to a newer version of doxygen. For a description
-# of the possible markers and block names see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
-# generated HTML page. If the tag is left blank doxygen will generate a standard
-# footer. See HTML_HEADER for more information on how to generate a default
-# footer and what special commands can be used inside the footer. See also
-# section "Doxygen usage" for information on how to generate the default footer
-# that doxygen normally uses.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
-# sheet that is used by each HTML page. It can be used to fine-tune the look of
-# the HTML output. If left blank doxygen will generate a default style sheet.
-# See also section "Doxygen usage" for information on how to generate the style
-# sheet that doxygen normally uses.
-# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
-# it is more robust and this tag (HTML_STYLESHEET) will in the future become
-# obsolete.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_STYLESHEET =
-
-# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# cascading style sheets that are included after the standard style sheets
-# created by doxygen. Using this option one can overrule certain style aspects.
-# This is preferred over using HTML_STYLESHEET since it does not replace the
-# standard style sheet and is therefore more robust against future updates.
-# Doxygen will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list). For an example see the documentation.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_STYLESHEET =
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the HTML output directory. Note
-# that these files will be copied to the base HTML output directory. Use the
-# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
-# files will be copied as-is; there are no commands or markers available.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_EXTRA_FILES =
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
-# will adjust the colors in the style sheet and background images according to
-# this color. Hue is specified as an angle on a colorwheel, see
-# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
-# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
-# purple, and 360 is red again.
-# Minimum value: 0, maximum value: 359, default value: 220.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_HUE = 220
-
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
-# in the HTML output. For a value of 0 the output will use grayscales only. A
-# value of 255 will produce the most vivid colors.
-# Minimum value: 0, maximum value: 255, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_SAT = 100
-
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
-# luminance component of the colors in the HTML output. Values below 100
-# gradually make the output lighter, whereas values above 100 make the output
-# darker. The value divided by 100 is the actual gamma applied, so 80 represents
-# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
-# change the gamma.
-# Minimum value: 40, maximum value: 240, default value: 80.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_COLORSTYLE_GAMMA = 80
-
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
-# page will contain the date and time when the page was generated. Setting this
-# to YES can help to show when doxygen was last run and thus if the
-# documentation is up to date.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_TIMESTAMP = NO
-
-# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
-# documentation will contain a main index with vertical navigation menus that
-# are dynamically created via Javascript. If disabled, the navigation index will
-# consists of multiple levels of tabs that are statically embedded in every HTML
-# page. Disable this option to support browsers that do not have Javascript,
-# like the Qt help browser.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_MENUS = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
-# documentation will contain sections that can be hidden and shown after the
-# page has loaded.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_DYNAMIC_SECTIONS = NO
-
-# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
-# shown in the various tree structured indices initially; the user can expand
-# and collapse entries dynamically later on. Doxygen will expand the tree to
-# such a level that at most the specified number of entries are visible (unless
-# a fully collapsed tree already exceeds this amount). So setting the number of
-# entries 1 will produce a full collapsed tree by default. 0 is a special value
-# representing an infinite number of entries and will result in a full expanded
-# tree by default.
-# Minimum value: 0, maximum value: 9999, default value: 100.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-HTML_INDEX_NUM_ENTRIES = 100
-
-# If the GENERATE_DOCSET tag is set to YES, additional index files will be
-# generated that can be used as input for Apple's Xcode 3 integrated development
-# environment (see: https://developer.apple.com/tools/xcode/), introduced with
-# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
-# Makefile in the HTML output directory. Running make will produce the docset in
-# that directory and running make install will install the docset in
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
-# startup. See https://developer.apple.com/tools/creatingdocsetswithdoxygen.html
-# for more information.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_DOCSET = NO
-
-# This tag determines the name of the docset feed. A documentation feed provides
-# an umbrella under which multiple documentation sets from a single provider
-# (such as a company or product suite) can be grouped.
-# The default value is: Doxygen generated docs.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_FEEDNAME = "Doxygen generated docs"
-
-# This tag specifies a string that should uniquely identify the documentation
-# set bundle. This should be a reverse domain-name style string, e.g.
-# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_BUNDLE_ID = org.doxygen.Project
-
-# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
-# the documentation publisher. This should be a reverse domain-name style
-# string, e.g. com.mycompany.MyDocSet.documentation.
-# The default value is: org.doxygen.Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_ID = org.doxygen.Publisher
-
-# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
-# The default value is: Publisher.
-# This tag requires that the tag GENERATE_DOCSET is set to YES.
-
-DOCSET_PUBLISHER_NAME = Publisher
-
-# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
-# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
-# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
-# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
-# Windows.
-#
-# The HTML Help Workshop contains a compiler that can convert all HTML output
-# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
-# files are now used as the Windows 98 help format, and will replace the old
-# Windows help format (.hlp) on all Windows platforms in the future. Compressed
-# HTML files also contain an index, a table of contents, and you can search for
-# words in the documentation. The HTML workshop also contains a viewer for
-# compressed HTML files.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_HTMLHELP = NO
-
-# The CHM_FILE tag can be used to specify the file name of the resulting .chm
-# file. You can add a path in front of the file if the result should not be
-# written to the html output directory.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_FILE =
-
-# The HHC_LOCATION tag can be used to specify the location (absolute path
-# including file name) of the HTML help compiler (hhc.exe). If non-empty,
-# doxygen will try to run the HTML help compiler on the generated index.hhp.
-# The file has to be specified with full path.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-HHC_LOCATION =
-
-# The GENERATE_CHI flag controls if a separate .chi index file is generated
-# (YES) or that it should be included in the master .chm file (NO).
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-GENERATE_CHI = NO
-
-# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
-# and project file content.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-CHM_INDEX_ENCODING =
-
-# The BINARY_TOC flag controls whether a binary table of contents is generated
-# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
-# enables the Previous and Next buttons.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members to
-# the table of contents of the HTML help documentation and to the tree view.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
-
-TOC_EXPAND = NO
-
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
-# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
-# (.qch) of the generated HTML documentation.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_QHP = NO
-
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
-# the file name of the resulting .qch file. The path specified is relative to
-# the HTML output folder.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QCH_FILE =
-
-# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
-# Project output. For more information please see Qt Help Project / Namespace
-# (see: http://doc.qt.io/qt-4.8/qthelpproject.html#namespace).
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_NAMESPACE = org.doxygen.Project
-
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
-# Help Project output. For more information please see Qt Help Project / Virtual
-# Folders (see: http://doc.qt.io/qt-4.8/qthelpproject.html#virtual-folders).
-# The default value is: doc.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_VIRTUAL_FOLDER = doc
-
-# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
-# filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_NAME =
-
-# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
-# custom filter to add. For more information please see Qt Help Project / Custom
-# Filters (see: http://doc.qt.io/qt-4.8/qthelpproject.html#custom-filters).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_CUST_FILTER_ATTRS =
-
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
-# project's filter section matches. Qt Help Project / Filter Attributes (see:
-# http://doc.qt.io/qt-4.8/qthelpproject.html#filter-attributes).
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHP_SECT_FILTER_ATTRS =
-
-# The QHG_LOCATION tag can be used to specify the location of Qt's
-# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
-# generated .qhp file.
-# This tag requires that the tag GENERATE_QHP is set to YES.
-
-QHG_LOCATION =
-
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
-# generated, together with the HTML files, they form an Eclipse help plugin. To
-# install this plugin and make it available under the help contents menu in
-# Eclipse, the contents of the directory containing the HTML and XML files needs
-# to be copied into the plugins directory of eclipse. The name of the directory
-# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
-# After copying Eclipse needs to be restarted before the help appears.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_ECLIPSEHELP = NO
-
-# A unique identifier for the Eclipse help plugin. When installing the plugin
-# the directory name containing the HTML and XML files should also have this
-# name. Each documentation set should have its own identifier.
-# The default value is: org.doxygen.Project.
-# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
-
-ECLIPSE_DOC_ID = org.doxygen.Project
-
-# If you want full control over the layout of the generated HTML pages it might
-# be necessary to disable the index and replace it with your own. The
-# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
-# of each HTML page. A value of NO enables the index and the value YES disables
-# it. Since the tabs in the index contain the same information as the navigation
-# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-DISABLE_INDEX = NO
-
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
-# structure should be generated to display hierarchical information. If the tag
-# value is set to YES, a side panel will be generated containing a tree-like
-# index structure (just like the one that is generated for HTML Help). For this
-# to work a browser that supports JavaScript, DHTML, CSS and frames is required
-# (i.e. any modern browser). Windows users are probably better off using the
-# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
-# further fine-tune the look of the index. As an example, the default style
-# sheet generated by doxygen has an example that shows how to put an image at
-# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
-# the same information as the tab index, you could consider setting
-# DISABLE_INDEX to YES when enabling this option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-GENERATE_TREEVIEW = NO
-
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
-# doxygen will group on one line in the generated HTML documentation.
-#
-# Note that a value of 0 will completely suppress the enum values from appearing
-# in the overview section.
-# Minimum value: 0, maximum value: 20, default value: 4.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
-# to set the initial width (in pixels) of the frame in which the tree is shown.
-# Minimum value: 0, maximum value: 1500, default value: 250.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-TREEVIEW_WIDTH = 250
-
-# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
-# external symbols imported via tag files in a separate window.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-EXT_LINKS_IN_WINDOW = NO
-
-# Use this tag to change the font size of LaTeX formulas included as images in
-# the HTML documentation. When you change the font size after a successful
-# doxygen run you need to manually remove any form_*.png images from the HTML
-# output directory to force them to be regenerated.
-# Minimum value: 8, maximum value: 50, default value: 10.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_FONTSIZE = 10
-
-# Use the FORMULA_TRANSPARENT tag to determine whether or not the images
-# generated for formulas are transparent PNGs. Transparent PNGs are not
-# supported properly for IE 6.0, but are supported on all modern browsers.
-#
-# Note that when changing this option you need to delete any form_*.png files in
-# the HTML output directory before the changes have effect.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-FORMULA_TRANSPARENT = YES
-
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
-# https://www.mathjax.org) which uses client side Javascript for the rendering
-# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
-# installed or if you want to formulas look prettier in the HTML output. When
-# enabled you may also need to install MathJax separately and configure the path
-# to it using the MATHJAX_RELPATH option.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-USE_MATHJAX = NO
-
-# When MathJax is enabled you can set the default output format to be used for
-# the MathJax output. See the MathJax site (see:
-# http://docs.mathjax.org/en/latest/output.html) for more details.
-# Possible values are: HTML-CSS (which is slower, but has the best
-# compatibility), NativeMML (i.e. MathML) and SVG.
-# The default value is: HTML-CSS.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_FORMAT = HTML-CSS
-
-# When MathJax is enabled you need to specify the location relative to the HTML
-# output directory using the MATHJAX_RELPATH option. The destination directory
-# should contain the MathJax.js script. For instance, if the mathjax directory
-# is located at the same level as the HTML output directory, then
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
-# Content Delivery Network so you can quickly see the result without installing
-# MathJax. However, it is strongly recommended to install a local copy of
-# MathJax from https://www.mathjax.org before deployment.
-# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_RELPATH = https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.2/
-
-# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
-# extension names that should be enabled during MathJax rendering. For example
-# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_EXTENSIONS =
-
-# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
-# of code that will be used on startup of the MathJax code. See the MathJax site
-# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
-# example see the documentation.
-# This tag requires that the tag USE_MATHJAX is set to YES.
-
-MATHJAX_CODEFILE =
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
-# the HTML output. The underlying search engine uses javascript and DHTML and
-# should work on any modern browser. Note that when using HTML help
-# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
-# there is already a search function so this one should typically be disabled.
-# For large projects the javascript based search engine can be slow, then
-# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
-# search using the keyboard; to jump to the search box use <access key> + S
-# (what the <access key> is depends on the OS and browser, but it is typically
-# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
-# key> to jump into the search results window, the results can be navigated
-# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
-# the search. The filter options can be selected when the cursor is inside the
-# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
-# to select a filter and <Enter> or <escape> to activate or cancel the filter
-# option.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_HTML is set to YES.
-
-SEARCHENGINE = YES
-
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
-# implemented using a web server instead of a web client using Javascript. There
-# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
-# setting. When disabled, doxygen will generate a PHP script for searching and
-# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
-# and searching needs to be provided by external tools. See the section
-# "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SERVER_BASED_SEARCH = NO
-
-# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
-# script for searching. Instead the search results are written to an XML file
-# which needs to be processed by an external indexer. Doxygen will invoke an
-# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
-# search results.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/).
-#
-# See the section "External Indexing and Searching" for details.
-# The default value is: NO.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH = NO
-
-# The SEARCHENGINE_URL should point to a search engine hosted by a web server
-# which will return the search results when EXTERNAL_SEARCH is enabled.
-#
-# Doxygen ships with an example indexer (doxyindexer) and search engine
-# (doxysearch.cgi) which are based on the open source search engine library
-# Xapian (see: https://xapian.org/). See the section "External Indexing and
-# Searching" for details.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHENGINE_URL =
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
-# search data is written to a file for indexing by an external tool. With the
-# SEARCHDATA_FILE tag the name of this file can be specified.
-# The default file is: searchdata.xml.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-SEARCHDATA_FILE = searchdata.xml
-
-# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
-# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
-# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
-# projects and redirect the results back to the right project.
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTERNAL_SEARCH_ID =
-
-# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
-# projects other than the one defined by this configuration file, but that are
-# all added to the same external search index. Each project needs to have a
-# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
-# to a relative location where the documentation can be found. The format is:
-# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
-# This tag requires that the tag SEARCHENGINE is set to YES.
-
-EXTRA_SEARCH_MAPPINGS =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
-# The default value is: YES.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_OUTPUT = latex
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked.
-#
-# Note that when enabling USE_PDFLATEX this option is only used for generating
-# bitmaps for formulas in the HTML output, but not in the Makefile that is
-# written to the output directory.
-# The default file is: latex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
-# index for LaTeX.
-# The default file is: makeindex.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used by the
-# printer.
-# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
-# 14 inches) and executive (7.25 x 10.5 inches).
-# The default value is: a4.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PAPER_TYPE = a4
-
-# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
-# that should be included in the LaTeX output. The package can be specified just
-# by its name or with the correct syntax as to be used with the LaTeX
-# \usepackage command. To get the times font for instance you can specify :
-# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
-# To use the option intlimits with the amsmath package you can specify:
-# EXTRA_PACKAGES=[intlimits]{amsmath}
-# If left blank no extra packages will be included.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
-# generated LaTeX document. The header should contain everything until the first
-# chapter. If it is left blank doxygen will generate a standard header. See
-# section "Doxygen usage" for information on how to let doxygen write the
-# default header to a separate file.
-#
-# Note: Only use a user-defined header if you know what you are doing! The
-# following commands have a special meaning inside the header: $title,
-# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
-# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
-# string, for the replacement values of the other commands the user is referred
-# to HTML_HEADER.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HEADER =
-
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
-# generated LaTeX document. The footer should contain everything after the last
-# chapter. If it is left blank doxygen will generate a standard footer. See
-# LATEX_HEADER for more information on how to generate a default footer and what
-# special commands can be used inside the footer.
-#
-# Note: Only use a user-defined footer if you know what you are doing!
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_FOOTER =
-
-# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
-# LaTeX style sheets that are included after the standard style sheets created
-# by doxygen. Using this option one can overrule certain style aspects. Doxygen
-# will copy the style sheet files to the output directory.
-# Note: The order of the extra style sheet files is of importance (e.g. the last
-# style sheet in the list overrules the setting of the previous ones in the
-# list).
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_STYLESHEET =
-
-# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
-# other source files which should be copied to the LATEX_OUTPUT output
-# directory. Note that the files will be copied as-is; there are no commands or
-# markers available.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_EXTRA_FILES =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
-# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
-# contain links (just like the HTML output) instead of page references. This
-# makes the output suitable for online browsing using a PDF viewer.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-PDF_HYPERLINKS = YES
-
-# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
-# the PDF file directly from the LaTeX files. Set this option to YES, to get a
-# higher quality PDF documentation.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-USE_PDFLATEX = YES
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
-# command to the generated LaTeX files. This will instruct LaTeX to keep running
-# if errors occur, instead of asking the user for help. This option is also used
-# when generating formulas in HTML.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BATCHMODE = NO
-
-# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
-# index chapters (such as File Index, Compound Index, etc.) in the output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_HIDE_INDICES = NO
-
-# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
-# code with syntax highlighting in the LaTeX output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_SOURCE_CODE = NO
-
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
-# bibliography, e.g. plainnat, or ieeetr. See
-# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
-# The default value is: plain.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_BIB_STYLE = plain
-
-# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
-# page will contain the date and time when the page was generated. Setting this
-# to NO can help when comparing the output of multiple runs.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_LATEX is set to YES.
-
-LATEX_TIMESTAMP = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
-# RTF output is optimized for Word 97 and may not look too pretty with other RTF
-# readers/editors.
-# The default value is: NO.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: rtf.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_OUTPUT = rtf
-
-# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
-# documents. This may be useful for small projects and may help to save some
-# trees in general.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
-# contain hyperlink fields. The RTF file will contain links (just like the HTML
-# output) instead of page references. This makes the output suitable for online
-# browsing using Word or some other Word compatible readers that support those
-# fields.
-#
-# Note: WordPad (write) and others do not support links.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's config
-# file, i.e. a series of assignments. You only have to provide replacements,
-# missing definitions are set to their default value.
-#
-# See also section "Doxygen usage" for information on how to generate the
-# default style sheet that doxygen normally uses.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an RTF document. Syntax is
-# similar to doxygen's config file. A template extensions file can be generated
-# using doxygen -e rtf extensionFile.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_EXTENSIONS_FILE =
-
-# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
-# with syntax highlighting in the RTF output.
-#
-# Note that which sources are shown also depends on other settings such as
-# SOURCE_BROWSER.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_RTF is set to YES.
-
-RTF_SOURCE_CODE = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
-# classes and files.
-# The default value is: NO.
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it. A directory man3 will be created inside the directory specified by
-# MAN_OUTPUT.
-# The default directory is: man.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_OUTPUT = man
-
-# The MAN_EXTENSION tag determines the extension that is added to the generated
-# man pages. In case the manual section does not start with a number, the number
-# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
-# optional.
-# The default value is: .3.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_EXTENSION = .3
-
-# The MAN_SUBDIR tag determines the name of the directory created within
-# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
-# MAN_EXTENSION with the initial . removed.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_SUBDIR =
-
-# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
-# will generate one additional man file for each entity documented in the real
-# man page(s). These additional files only source the real man page, but without
-# them the man command would be unable to find the correct page.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_MAN is set to YES.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
-# captures the structure of the code including all documentation.
-# The default value is: NO.
-
-GENERATE_XML = NO
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
-# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
-# it.
-# The default directory is: xml.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_OUTPUT = xml
-
-# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
-# listings (including syntax highlighting and cross-referencing information) to
-# the XML output. Note that enabling this will significantly increase the size
-# of the XML output.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_XML is set to YES.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the DOCBOOK output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
-# that can be used to generate PDF.
-# The default value is: NO.
-
-GENERATE_DOCBOOK = NO
-
-# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
-# front of it.
-# The default directory is: docbook.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_OUTPUT = docbook
-
-# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
-# program listings (including syntax highlighting and cross-referencing
-# information) to the DOCBOOK output. Note that enabling this will significantly
-# increase the size of the DOCBOOK output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
-
-DOCBOOK_PROGRAMLISTING = NO
-
-#---------------------------------------------------------------------------
-# Configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
-# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
-# the structure of the code including all documentation. Note that this feature
-# is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# Configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
-# file that captures the structure of the code including all documentation.
-#
-# Note that this feature is still experimental and incomplete at the moment.
-# The default value is: NO.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
-# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
-# output from the Perl module output.
-# The default value is: NO.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
-# formatted so it can be parsed by a human reader. This is useful if you want to
-# understand what is going on. On the other hand, if this tag is set to NO, the
-# size of the Perl module output will be much smaller and Perl will parse it
-# just the same.
-# The default value is: YES.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file are
-# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
-# so different doxyrules.make files included by the same Makefile don't
-# overwrite each other's variables.
-# This tag requires that the tag GENERATE_PERLMOD is set to YES.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
-# C-preprocessor directives found in the sources and include files.
-# The default value is: YES.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
-# in the source code. If set to NO, only conditional compilation will be
-# performed. Macro expansion can be done in a controlled way by setting
-# EXPAND_ONLY_PREDEF to YES.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-MACRO_EXPANSION = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
-# the macro expansion is limited to the macros specified with the PREDEFINED and
-# EXPAND_AS_DEFINED tags.
-# The default value is: NO.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_ONLY_PREDEF = YES
-
-# If the SEARCH_INCLUDES tag is set to YES, the include files in the
-# INCLUDE_PATH will be searched if a #include is found.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by the
-# preprocessor.
-# This tag requires that the tag SEARCH_INCLUDES is set to YES.
-
-INCLUDE_PATH = "@TOP_SRCDIR@/include/libcamera" "@TOP_SRCDIR@/src/libcamera/include"
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will be
-# used.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-INCLUDE_FILE_PATTERNS = *.h
-
-# The PREDEFINED tag can be used to specify one or more macro names that are
-# defined before the preprocessor is started (similar to the -D option of e.g.
-# gcc). The argument of the tag is a list of macros of the form: name or
-# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
-# is assumed. To prevent a macro definition from being undefined via #undef or
-# recursively expanded use the := operator instead of the = operator.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-PREDEFINED = __DOXYGEN__ \
- __cplusplus \
- __attribute__(x)=
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
-# tag can be used to specify a list of macro names that should be expanded. The
-# macro definition that is found in the sources will be used. Use the PREDEFINED
-# tag if you want to use a different macro definition that overrules the
-# definition found in the source code.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
-# remove all references to function-like macros that are alone on a line, have
-# an all uppercase name, and do not end with a semicolon. Such function macros
-# are typically used for boiler-plate code, and will confuse the parser if not
-# removed.
-# The default value is: YES.
-# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES tag can be used to specify one or more tag files. For each tag
-# file the location of the external documentation should be added. The format of
-# a tag file without this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where loc1 and loc2 can be relative or absolute paths or URLs. See the
-# section "Linking to external documentation" for more information about the use
-# of tag files.
-# Note: Each tag file must have a unique name (where the name does NOT include
-# the path). If a tag file is not located in the directory in which doxygen is
-# run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
-# tag file that is based on the input files it reads. See section "Linking to
-# external documentation" for more information about the usage of tag files.
-
-GENERATE_TAGFILE =
-
-# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
-# the class index. If set to NO, only the inherited external classes will be
-# listed.
-# The default value is: NO.
-
-ALLEXTERNALS = NO
-
-# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
-# in the modules index. If set to NO, only the current project's groups will be
-# listed.
-# The default value is: YES.
-
-EXTERNAL_GROUPS = YES
-
-# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
-# the related pages index. If set to NO, only the current project's pages will
-# be listed.
-# The default value is: YES.
-
-EXTERNAL_PAGES = YES
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
-# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
-# NO turns the diagrams off. Note that this option also works with HAVE_DOT
-# disabled, but it is recommended to install and use dot, since it yields more
-# powerful graphs.
-# The default value is: YES.
-
-CLASS_DIAGRAMS = YES
-
-# You can include diagrams made with dia in doxygen documentation. Doxygen will
-# then run dia to produce the diagram and insert it in the documentation. The
-# DIA_PATH tag allows you to specify the directory where the dia binary resides.
-# If left empty dia is assumed to be found in the default search path.
-
-DIA_PATH =
-
-# If set to YES the inheritance and collaboration graphs will hide inheritance
-# and usage relations if the target is undocumented or is not a class.
-# The default value is: YES.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz (see:
-# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
-# Bell Labs. The other options in this section have no effect if this option is
-# set to NO
-# The default value is: NO.
-
-HAVE_DOT = NO
-
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
-# to run in parallel. When set to 0 doxygen will base this on the number of
-# processors available in the system. You can set it explicitly to a value
-# larger than 0 to get control over the balance between CPU load and processing
-# speed.
-# Minimum value: 0, maximum value: 32, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_NUM_THREADS = 0
-
-# When you want a differently looking font in the dot files that doxygen
-# generates you can specify the font name using DOT_FONTNAME. You need to make
-# sure dot is able to find the font, which can be done by putting it in a
-# standard location or by setting the DOTFONTPATH environment variable or by
-# setting DOT_FONTPATH to the directory containing the font.
-# The default value is: Helvetica.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTNAME = Helvetica
-
-# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
-# dot graphs.
-# Minimum value: 4, maximum value: 24, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTSIZE = 10
-
-# By default doxygen will tell dot to use the default font as specified with
-# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
-# the path where dot can find it using this tag.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_FONTPATH =
-
-# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
-# each documented class showing the direct and indirect inheritance relations.
-# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
-# graph for each documented class showing the direct and indirect implementation
-# dependencies (inheritance, containment, and class references variables) of the
-# class with other documented classes.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-COLLABORATION_GRAPH = YES
-
-# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
-# groups, showing the direct groups dependencies.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GROUP_GRAPHS = YES
-
-# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LOOK = NO
-
-# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
-# class node. If there are many fields or methods and many nodes the graph may
-# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
-# number of items for each type to make the size more manageable. Set this to 0
-# for no limit. Note that the threshold may be exceeded by 50% before the limit
-# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
-# but if the number exceeds 15, the total amount of fields shown is limited to
-# 10.
-# Minimum value: 0, maximum value: 100, default value: 10.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-UML_LIMIT_NUM_FIELDS = 10
-
-# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
-# collaboration graphs will show the relations between templates and their
-# instances.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-TEMPLATE_RELATIONS = NO
-
-# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
-# YES then doxygen will generate a graph for each documented file showing the
-# direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDE_GRAPH = YES
-
-# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
-# set to YES then doxygen will generate a graph for each documented file showing
-# the direct and indirect include dependencies of the file with other documented
-# files.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INCLUDED_BY_GRAPH = YES
-
-# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command. Disabling a call graph can be
-# accomplished by means of the command \hidecallgraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALL_GRAPH = NO
-
-# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
-# dependency graph for every global function or class method.
-#
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable caller graphs for selected
-# functions only using the \callergraph command. Disabling a caller graph can be
-# accomplished by means of the command \hidecallergraph.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-CALLER_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
-# hierarchy of all classes instead of a textual one.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GRAPHICAL_HIERARCHY = YES
-
-# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
-# dependencies a directory has on other directories in a graphical way. The
-# dependency relations are determined by the #include relations between the
-# files in the directories.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DIRECTORY_GRAPH = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. For an explanation of the image formats see the section
-# output formats in the documentation of the dot tool (Graphviz (see:
-# http://www.graphviz.org/)).
-# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
-# to make the SVG files visible in IE 9+ (other browsers do not have this
-# requirement).
-# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
-# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
-# png:gdiplus:gdiplus.
-# The default value is: png.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_IMAGE_FORMAT = png
-
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
-# enable generation of interactive SVG images that allow zooming and panning.
-#
-# Note that this requires a modern browser other than Internet Explorer. Tested
-# and working are Firefox, Chrome, Safari, and Opera.
-# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
-# the SVG files visible. Older versions of IE do not have SVG support.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-INTERACTIVE_SVG = NO
-
-# The DOT_PATH tag can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found in the path.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the \dotfile
-# command).
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOTFILE_DIRS =
-
-# The MSCFILE_DIRS tag can be used to specify one or more directories that
-# contain msc files that are included in the documentation (see the \mscfile
-# command).
-
-MSCFILE_DIRS =
-
-# The DIAFILE_DIRS tag can be used to specify one or more directories that
-# contain dia files that are included in the documentation (see the \diafile
-# command).
-
-DIAFILE_DIRS =
-
-# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
-# path where java can find the plantuml.jar file. If left blank, it is assumed
-# PlantUML is not used or called during a preprocessing step. Doxygen will
-# generate a warning when it encounters a \startuml command in this case and
-# will not generate output for the diagram.
-
-PLANTUML_JAR_PATH =
-
-# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
-# configuration file for plantuml.
-
-PLANTUML_CFG_FILE =
-
-# When using plantuml, the specified paths are searched for files specified by
-# the !include statement in a plantuml block.
-
-PLANTUML_INCLUDE_PATH =
-
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
-# that will be shown in the graph. If the number of nodes in a graph becomes
-# larger than this value, doxygen will truncate the graph, which is visualized
-# by representing a node as a red box. Note that doxygen if the number of direct
-# children of the root node in a graph is already larger than
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
-# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
-# Minimum value: 0, maximum value: 10000, default value: 50.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_GRAPH_MAX_NODES = 50
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
-# generated by dot. A depth value of 3 means that only nodes reachable from the
-# root by following a path via at most 3 edges will be shown. Nodes that lay
-# further from the root node will be omitted. Note that setting this option to 1
-# or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that the size of a graph can be further restricted by
-# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
-# Minimum value: 0, maximum value: 1000, default value: 0.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
-# background. This is disabled by default, because dot on Windows does not seem
-# to support this out of the box.
-#
-# Warning: Depending on the platform used, enabling this option may lead to
-# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
-# read).
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_TRANSPARENT = NO
-
-# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
-# files in one run (i.e. multiple -o and -T options on the command line). This
-# makes dot run faster, but since only newer versions of dot (>1.8.10) support
-# this, this feature is disabled by default.
-# The default value is: NO.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_MULTI_TARGETS = NO
-
-# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
-# explaining the meaning of the various boxes and arrows in the dot generated
-# graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
-# files that are used to generate the various graphs.
-# The default value is: YES.
-# This tag requires that the tag HAVE_DOT is set to YES.
-
-DOT_CLEANUP = YES
diff --git a/Documentation/api-html/index.rst b/Documentation/api-html/index.rst
index cf2ef0bb..2f09833d 100644
--- a/Documentation/api-html/index.rst
+++ b/Documentation/api-html/index.rst
@@ -1,6 +1,8 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
.. _api:
-API
-===
+API Reference
+=============
:: Placeholder for Doxygen documentation
diff --git a/Documentation/binning.svg b/Documentation/binning.svg
new file mode 100644
index 00000000..c6a3b639
--- /dev/null
+++ b/Documentation/binning.svg
@@ -0,0 +1,5053 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="binning.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="0.96951281"
+ inkscape:cx="513.66005"
+ inkscape:cy="278.49039"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458333"
+ spacingy="0.26458334"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1">
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-87"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-91" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-74"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-12" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-41"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-58"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-60" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-13" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-60" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-64"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-82"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-38" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-50"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-92"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-87" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-62" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-37" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-35" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-87-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-0-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-5-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-2-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-7-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-91-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-9-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-6-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-3-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-6-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-8-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-4-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-6-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-6-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-74-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-1-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-0-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-0-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-6-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-4-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-4-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-3-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-4-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-3-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-3-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-6-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-9-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-0-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-4-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-8-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-5-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-12-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-9-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-7-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-3-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-8-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-9-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-2-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-3-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-1-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-8-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-7-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-41-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-6-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-3-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-5-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-58-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-7-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-1-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-7-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-0-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-60-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-4-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-13-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-0-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-2-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-9-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-60-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-3-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-5-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-4-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-3-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-64-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-3-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-1-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-9-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-74" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-57"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-88" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-90"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-78" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-73" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-15"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-33" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-87-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-0-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-5-85"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-2-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-7-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-91-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-9-69"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-6-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-3-37"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-6-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-8-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-4-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-6-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-6-39" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-74-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-1-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-0-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-0-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-6-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-4-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-4-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-3-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-4-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-3-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-3-91"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-6-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-9-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-0-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-4-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-8-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-5-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-12-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-9-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-7-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-3-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-8-5" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-9-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-2-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-3-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-1-1" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-8-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-7-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-41-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-6-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-3-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-5-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-58-2"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-7-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-1-4"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-7-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-0-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-60-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-4-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-13-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-0-7"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-2-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-60-0-5-2-8-6-9-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-48-9-9-4-1-8-60-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-3-0"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-5-64" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-7-4-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-4-6-3-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-8-64-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-8-3-8" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-1-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path2-7-9-0" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3"
+ width="13.873985"
+ height="13.536115"
+ x="65.388786"
+ y="21.368647" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6"
+ width="13.873985"
+ height="13.536115"
+ x="79.4552"
+ y="21.265594" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3"
+ width="13.873985"
+ height="13.536115"
+ x="65.400574"
+ y="35.581291" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3"
+ width="13.873985"
+ height="13.536115"
+ x="79.487213"
+ y="35.445648" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3"
+ width="13.873985"
+ height="13.536115"
+ x="36.816032"
+ y="21.611094" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9"
+ width="13.873985"
+ height="13.536115"
+ x="50.88245"
+ y="21.508043" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7"
+ width="13.873985"
+ height="13.536115"
+ x="36.827824"
+ y="35.823738" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2"
+ width="13.873985"
+ height="13.536115"
+ x="50.914459"
+ y="35.688095" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3"
+ width="13.873985"
+ height="13.536115"
+ x="65.473557"
+ y="49.829689" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5"
+ width="13.873985"
+ height="13.536115"
+ x="79.53997"
+ y="49.726639" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0"
+ width="13.873985"
+ height="13.536115"
+ x="65.485344"
+ y="64.042336" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8"
+ width="13.873985"
+ height="13.536115"
+ x="79.571983"
+ y="63.906689" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4"
+ width="13.873985"
+ height="13.536115"
+ x="36.900803"
+ y="50.072136" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1"
+ width="13.873985"
+ height="13.536115"
+ x="50.96722"
+ y="49.969086" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1"
+ width="13.873985"
+ height="13.536115"
+ x="36.912594"
+ y="64.284782" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3"
+ width="13.873985"
+ height="13.536115"
+ x="50.999229"
+ y="64.149139" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded)"
+ d="M 42.081702,56.601729 C 40.286141,52.204844 39.84416,48.248056 39.775934,43.793323 39.705994,39.227507 40.058028,34.155406 42.189147,28.949241"
+ id="path1"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60)"
+ d="M 55.099315,56.107712 C 46.749885,47.204301 45.5057,37.755811 55.174295,27.470139"
+ id="path1-8"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0)"
+ d="M 57.045954,72.804438 C 51.147833,63.901027 50.090593,54.779467 56.920539,44.493796"
+ id="path1-8-5"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5)"
+ d="M 73.072075,56.721348 C 57.027587,57.689095 47.292535,48.710474 44.701645,29.866502"
+ id="path1-8-5-6"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2)"
+ d="M 72.90507,70.575484 C 57.457506,78.709997 45.319286,62.459593 45.244064,43.230157"
+ id="path1-8-5-6-7"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8)"
+ d="M 86.158751,59.09319 C 69.785862,58.470577 60.1065,48.008767 56.857885,29.968538"
+ id="path1-8-5-6-7-8"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6)"
+ d="M 86.457671,71.13699 C 71.010108,79.271503 59.102258,64.163122 59.027036,44.933685"
+ id="path1-8-5-6-7-8-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded)"
+ d="m 44.687693,41.420418 c 6.448084,-5.278368 15.466061,-6.30545 28.431123,-0.80303"
+ id="path1-7"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6)"
+ d="M 57.078428,27.878124 C 67.151136,21.834217 72.464093,21.119079 86.668639,27.745841"
+ id="path1-7-3"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7)"
+ d="m 43.794332,28.085665 c 3.63222,-4.278367 8.633495,-5.657536 14.125001,-5.510111 4.339623,0.11649 8.774913,0.820414 14.546216,4.344855"
+ id="path1-7-3-3"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8)"
+ d="m 58.86173,43.233874 c 6.448089,-7.475501 14.979372,-8.678728 27.944435,-0.885912"
+ id="path1-7-1"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1)"
+ d="M 43.150248,70.196421 C 39.946602,64.842954 38.991849,59.890688 39.59491,54.079585 c 0.399898,-3.853407 1.143216,-8.419661 3.603258,-12.520737"
+ id="path1-5"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-4"
+ width="13.873985"
+ height="13.536115"
+ x="122.23671"
+ y="20.698904" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-7"
+ width="13.873985"
+ height="13.536115"
+ x="136.30313"
+ y="20.595854" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-2"
+ width="13.873985"
+ height="13.536115"
+ x="122.2485"
+ y="34.911549" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-1"
+ width="13.873985"
+ height="13.536115"
+ x="136.33514"
+ y="34.775906" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-9"
+ width="13.873985"
+ height="13.536115"
+ x="93.663963"
+ y="20.941351" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-5"
+ width="13.873985"
+ height="13.536115"
+ x="107.73038"
+ y="20.838301" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-6"
+ width="13.873985"
+ height="13.536115"
+ x="93.675751"
+ y="35.153996" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-8"
+ width="13.873985"
+ height="13.536115"
+ x="107.76238"
+ y="35.018353" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-5"
+ width="13.873985"
+ height="13.536115"
+ x="122.32149"
+ y="49.159946" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5"
+ width="13.873985"
+ height="13.536115"
+ x="136.38791"
+ y="49.056896" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-2"
+ width="13.873985"
+ height="13.536115"
+ x="122.33327"
+ y="63.372593" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-1"
+ width="13.873985"
+ height="13.536115"
+ x="136.41991"
+ y="63.23695" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9"
+ width="13.873985"
+ height="13.536115"
+ x="93.748734"
+ y="49.402393" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-9"
+ width="13.873985"
+ height="13.536115"
+ x="107.81515"
+ y="49.299343" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-1"
+ width="13.873985"
+ height="13.536115"
+ x="93.760521"
+ y="63.61504" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6"
+ width="13.873985"
+ height="13.536115"
+ x="107.84715"
+ y="63.479397" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-87)"
+ d="m 98.929634,55.931997 c -1.795575,-4.396885 -2.23755,-8.353673 -2.30576,-12.808407 -0.06986,-4.565816 0.282091,-9.637916 2.413212,-14.844081"
+ id="path3"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-5)"
+ d="m 111.94724,55.43798 c -8.34942,-8.903412 -9.59363,-18.351902 0.075,-28.637573"
+ id="path1-8-2"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-7)"
+ d="m 113.89388,72.134706 c -5.89813,-8.903412 -6.95537,-18.024971 -0.12542,-28.310642"
+ id="path1-8-5-1"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-9)"
+ d="M 129.92,56.051616 C 113.87551,57.019363 104.14045,48.040742 101.54958,29.196769"
+ id="path1-8-5-6-0"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-3)"
+ d="M 129.75299,69.905752 C 114.30543,78.040265 102.16722,61.789861 102.092,42.560424"
+ id="path1-8-5-6-7-5"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-8)"
+ d="M 143.00667,58.423457 C 126.63378,57.800845 116.95442,47.339035 113.70581,29.298805"
+ id="path1-8-5-6-7-8-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-6)"
+ d="M 143.30559,70.467258 C 127.85803,78.601771 115.95018,63.49339 115.87496,44.263953"
+ id="path1-8-5-6-7-8-2-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-87)"
+ d="m 101.53561,40.750686 c 6.44809,-5.278368 15.46606,-6.305451 28.43113,-0.803031"
+ id="path1-7-19"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-74)"
+ d="m 113.92635,27.208392 c 10.07271,-6.043908 15.38566,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-7"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-0)"
+ d="m 100.64224,27.415933 c 3.63223,-4.278368 8.63351,-5.657536 14.12501,-5.510111 4.33963,0.11649 8.77492,0.820414 14.54622,4.344855"
+ id="path1-7-3-3-6"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-6)"
+ d="m 115.70965,42.564142 c 6.44809,-7.475501 14.97937,-8.678728 27.94444,-0.885913"
+ id="path1-7-1-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-4)"
+ d="M 99.998175,69.526688 C 96.79452,64.173222 95.83977,59.220956 96.442844,53.409853 c 0.3999,-3.853408 1.143197,-8.419661 3.603256,-12.520737"
+ id="path1-5-2"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-5"
+ width="13.873985"
+ height="13.536115"
+ x="179.51106"
+ y="20.926241" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-5"
+ width="13.873985"
+ height="13.536115"
+ x="193.57747"
+ y="20.823191" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0"
+ width="13.873985"
+ height="13.536115"
+ x="179.52284"
+ y="35.138885" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-12"
+ width="13.873985"
+ height="13.536115"
+ x="193.60948"
+ y="35.003242" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-4"
+ width="13.873985"
+ height="13.536115"
+ x="150.93829"
+ y="21.16869" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8"
+ width="13.873985"
+ height="13.536115"
+ x="165.00471"
+ y="21.065638" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-5"
+ width="13.873985"
+ height="13.536115"
+ x="150.95009"
+ y="35.381336" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-6"
+ width="13.873985"
+ height="13.536115"
+ x="165.03673"
+ y="35.245689" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-52"
+ width="13.873985"
+ height="13.536115"
+ x="179.59583"
+ y="49.387283" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-6"
+ width="13.873985"
+ height="13.536115"
+ x="193.66225"
+ y="49.284233" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-9"
+ width="13.873985"
+ height="13.536115"
+ x="179.60762"
+ y="63.59993" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-13"
+ width="13.873985"
+ height="13.536115"
+ x="193.69426"
+ y="63.464287" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-1"
+ width="13.873985"
+ height="13.536115"
+ x="151.02307"
+ y="49.629734" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-5"
+ width="13.873985"
+ height="13.536115"
+ x="165.08948"
+ y="49.526684" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2"
+ width="13.873985"
+ height="13.536115"
+ x="151.03485"
+ y="63.842381" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-69"
+ width="13.873985"
+ height="13.536115"
+ x="165.12149"
+ y="63.706734" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-4)"
+ d="m 156.20396,56.159335 c -1.79555,-4.396885 -2.23753,-8.353673 -2.30576,-12.808407 -0.0699,-4.565816 0.28209,-9.637916 2.41321,-14.844082"
+ id="path3-4"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-3)"
+ d="m 169.22158,55.665317 c -8.34944,-8.903411 -9.59362,-18.351901 0.075,-28.637572"
+ id="path1-8-4"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-9)"
+ d="M 171.16822,72.362043 C 165.2701,63.458632 164.21286,54.337072 171.04281,44.051401"
+ id="path1-8-5-60"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-4)"
+ d="M 187.19434,56.278954 C 171.14986,57.246701 161.4148,48.26808 158.8239,29.424107"
+ id="path1-8-5-6-74"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-5)"
+ d="m 187.02734,70.133089 c -15.44756,8.134513 -27.5858,-8.11589 -27.66102,-27.345327"
+ id="path1-8-5-6-7-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-9)"
+ d="M 200.28102,58.650795 C 183.90813,58.028182 174.22877,47.566373 170.98015,29.526143"
+ id="path1-8-5-6-7-8-7"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-3)"
+ d="M 200.57994,70.694595 C 185.13238,78.829108 173.22453,63.720728 173.14931,44.491291"
+ id="path1-8-5-6-7-8-2-9"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-4)"
+ d="m 158.80996,40.978023 c 6.44809,-5.278367 15.46606,-6.30545 28.43113,-0.80303"
+ id="path1-7-0"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-9)"
+ d="m 171.2007,27.43573 c 10.07271,-6.043908 15.38566,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-0"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-3)"
+ d="m 157.91659,27.643271 c 3.63223,-4.278368 8.63351,-5.657536 14.12501,-5.510111 4.33963,0.11649 8.77492,0.820413 14.54622,4.344855"
+ id="path1-7-3-3-2"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-8)"
+ d="m 172.984,42.791479 c 6.44809,-7.4755 14.97937,-8.678727 27.94443,-0.885912"
+ id="path1-7-1-2"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-41)"
+ d="m 157.27252,69.754026 c -3.20365,-5.353467 -4.1584,-10.305732 -3.55535,-16.116836 0.3999,-3.853407 1.14322,-8.41966 3.60325,-12.520737"
+ id="path1-5-6"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-9"
+ width="13.873985"
+ height="13.536115"
+ x="236.369"
+ y="20.627245" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-4"
+ width="13.873985"
+ height="13.536115"
+ x="250.43542"
+ y="20.524195" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-5"
+ width="13.873985"
+ height="13.536115"
+ x="236.3808"
+ y="34.83989" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-6"
+ width="13.873985"
+ height="13.536115"
+ x="250.46744"
+ y="34.704247" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-5"
+ width="13.873985"
+ height="13.536115"
+ x="207.79625"
+ y="20.869694" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-9"
+ width="13.873985"
+ height="13.536115"
+ x="221.86267"
+ y="20.766644" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-1"
+ width="13.873985"
+ height="13.536115"
+ x="207.80804"
+ y="35.082336" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7"
+ width="13.873985"
+ height="13.536115"
+ x="221.89468"
+ y="34.946693" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-4"
+ width="13.873985"
+ height="13.536115"
+ x="236.45378"
+ y="49.088287" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-1"
+ width="13.873985"
+ height="13.536115"
+ x="250.5202"
+ y="48.985237" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-1"
+ width="13.873985"
+ height="13.536115"
+ x="236.46558"
+ y="63.300934" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-9"
+ width="13.873985"
+ height="13.536115"
+ x="250.5522"
+ y="63.165291" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-3"
+ width="13.873985"
+ height="13.536115"
+ x="207.88103"
+ y="49.330734" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-8"
+ width="13.873985"
+ height="13.536115"
+ x="221.94745"
+ y="49.227684" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-7"
+ width="13.873985"
+ height="13.536115"
+ x="207.89282"
+ y="63.543381" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-4"
+ width="13.873985"
+ height="13.536115"
+ x="221.97945"
+ y="63.407738" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-3)"
+ d="m 213.06192,55.860339 c -1.79558,-4.396885 -2.23755,-8.353673 -2.30579,-12.808407 -0.0699,-4.565816 0.28212,-9.637916 2.41321,-14.844081"
+ id="path3-9"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-58)"
+ d="M 226.07952,55.366322 C 217.7301,46.46291 216.4859,37.01442 226.15452,26.728749"
+ id="path1-8-3"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-1)"
+ d="M 228.02616,72.063048 C 222.12804,63.159636 221.0708,54.038077 227.90074,43.752406"
+ id="path1-8-5-13"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-0)"
+ d="M 244.05228,55.979958 C 228.00779,56.947705 218.27273,47.969084 215.68186,29.125111"
+ id="path1-8-5-6-8"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-4)"
+ d="M 243.88527,69.834094 C 228.43771,77.968606 216.2995,61.718203 216.22428,42.488766"
+ id="path1-8-5-6-7-7"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-0)"
+ d="M 257.13895,58.351799 C 240.76607,57.729187 231.0867,47.267377 227.83809,29.227147"
+ id="path1-8-5-6-7-8-9"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-9)"
+ d="M 257.43787,70.3956 C 241.99031,78.530112 230.08246,63.421732 230.00724,44.192295"
+ id="path1-8-5-6-7-8-2-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-3)"
+ d="m 215.66789,40.679027 c 6.44809,-5.278367 15.46607,-6.30545 28.43113,-0.80303"
+ id="path1-7-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-3)"
+ d="m 228.05863,27.136734 c 10.07271,-6.043908 15.38567,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-4)"
+ d="m 214.77453,27.344275 c 3.63222,-4.278368 8.6335,-5.657536 14.12501,-5.510111 4.33962,0.11649 8.77491,0.820413 14.54621,4.344855"
+ id="path1-7-3-3-4"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-64)"
+ d="m 229.84193,42.492484 c 6.44809,-7.475501 14.97938,-8.678728 27.94444,-0.885913"
+ id="path1-7-1-0"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-1)"
+ d="m 214.13046,49.215575 c -3.20366,-5.353466 -4.15841,-10.305732 -3.55533,-16.116835 0.39987,-3.853408 1.14319,-8.419661 3.60325,-12.520737"
+ id="path1-5-0"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-46"
+ width="13.873985"
+ height="13.536115"
+ x="65.132538"
+ y="77.161232" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-8"
+ width="13.873985"
+ height="13.536115"
+ x="79.198952"
+ y="77.058182" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-3"
+ width="13.873985"
+ height="13.536115"
+ x="65.144325"
+ y="91.373878" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-2"
+ width="13.873985"
+ height="13.536115"
+ x="79.230965"
+ y="91.238235" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6"
+ width="13.873985"
+ height="13.536115"
+ x="36.559784"
+ y="77.403679" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-2"
+ width="13.873985"
+ height="13.536115"
+ x="50.626202"
+ y="77.300629" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-2"
+ width="13.873985"
+ height="13.536115"
+ x="36.571575"
+ y="91.616325" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-4"
+ width="13.873985"
+ height="13.536115"
+ x="50.658211"
+ y="91.480682" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-49"
+ width="13.873985"
+ height="13.536115"
+ x="65.217308"
+ y="105.62228" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-65"
+ width="13.873985"
+ height="13.536115"
+ x="79.283722"
+ y="105.51923" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-4"
+ width="13.873985"
+ height="13.536115"
+ x="65.229095"
+ y="119.83492" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-6"
+ width="13.873985"
+ height="13.536115"
+ x="79.315735"
+ y="119.69928" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-2"
+ width="13.873985"
+ height="13.536115"
+ x="36.644554"
+ y="105.86472" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-51"
+ width="13.873985"
+ height="13.536115"
+ x="50.710972"
+ y="105.76167" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-6"
+ width="13.873985"
+ height="13.536115"
+ x="36.656345"
+ y="120.07737" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-1"
+ width="13.873985"
+ height="13.536115"
+ x="50.742981"
+ y="119.94173" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-82)"
+ d="m 41.825452,112.39432 c -1.795561,-4.39688 -2.237542,-8.35367 -2.305768,-12.808406 -0.06994,-4.565816 0.282094,-9.637917 2.413213,-14.844082"
+ id="path6"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-50)"
+ d="m 54.843065,111.9003 c -8.34943,-8.90341 -9.593615,-18.351898 0.07498,-28.63757"
+ id="path1-8-37"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-92)"
+ d="m 56.789704,128.59703 c -5.898121,-8.90341 -6.955361,-18.02497 -0.125415,-28.31064"
+ id="path1-8-5-7"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-8)"
+ d="m 72.815825,112.51394 c -16.044488,0.96775 -25.77954,-8.01087 -28.37043,-26.854847"
+ id="path1-8-5-6-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-2)"
+ d="M 72.64882,126.36808 C 57.201256,134.50259 45.063036,118.25218 44.987814,99.022748"
+ id="path1-8-5-6-7-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-3)"
+ d="M 85.902501,114.88578 C 69.529612,114.26317 59.85025,103.80136 56.601635,85.761129"
+ id="path1-8-5-6-7-8-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-7)"
+ d="m 86.201421,126.92958 c -15.447563,8.13451 -27.355413,-6.97387 -27.430635,-26.2033"
+ id="path1-8-5-6-7-8-2-0"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-82)"
+ d="m 44.431443,97.213009 c 6.448084,-5.278368 15.466061,-6.30545 28.431123,-0.80303"
+ id="path1-7-89"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-6)"
+ d="M 56.822178,83.670715 C 66.894886,77.626808 72.207843,76.91167 86.412389,83.538432"
+ id="path1-7-3-01"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-9)"
+ d="m 43.538082,83.878256 c 3.63222,-4.278367 8.633495,-5.657536 14.125001,-5.510111 4.339623,0.11649 8.774913,0.820414 14.546216,4.344855"
+ id="path1-7-3-3-3"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-0)"
+ d="m 58.60548,99.026465 c 6.448089,-7.475501 14.979372,-8.678728 27.944435,-0.885912"
+ id="path1-7-1-4"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-2)"
+ d="m 42.893998,125.98901 c -3.203646,-5.35346 -4.158399,-10.30573 -3.555338,-16.11683 0.399898,-3.85341 1.143216,-8.41966 3.603258,-12.520741"
+ id="path1-5-8"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-4-8"
+ width="13.873985"
+ height="13.536115"
+ x="121.98046"
+ y="76.491493" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-7-2"
+ width="13.873985"
+ height="13.536115"
+ x="136.04688"
+ y="76.388443" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-2-2"
+ width="13.873985"
+ height="13.536115"
+ x="121.99226"
+ y="90.70414" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-1-0"
+ width="13.873985"
+ height="13.536115"
+ x="136.07889"
+ y="90.568497" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-9-3"
+ width="13.873985"
+ height="13.536115"
+ x="93.407707"
+ y="76.73394" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-5-6"
+ width="13.873985"
+ height="13.536115"
+ x="107.47413"
+ y="76.63089" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-6-1"
+ width="13.873985"
+ height="13.536115"
+ x="93.419502"
+ y="90.946587" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-8-0"
+ width="13.873985"
+ height="13.536115"
+ x="107.50613"
+ y="90.810944" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-5-7"
+ width="13.873985"
+ height="13.536115"
+ x="122.06523"
+ y="104.95254" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-4"
+ width="13.873985"
+ height="13.536115"
+ x="136.13165"
+ y="104.84949" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-2-2"
+ width="13.873985"
+ height="13.536115"
+ x="122.07703"
+ y="119.16518" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-1-0"
+ width="13.873985"
+ height="13.536115"
+ x="136.16367"
+ y="119.02954" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-3"
+ width="13.873985"
+ height="13.536115"
+ x="93.492477"
+ y="105.19498" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-9-3"
+ width="13.873985"
+ height="13.536115"
+ x="107.5589"
+ y="105.09193" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-1-9"
+ width="13.873985"
+ height="13.536115"
+ x="93.504272"
+ y="119.40763" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-0"
+ width="13.873985"
+ height="13.536115"
+ x="107.5909"
+ y="119.27199" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-87-1)"
+ d="m 98.673384,111.72459 c -1.795575,-4.39689 -2.23755,-8.35368 -2.30576,-12.808409 -0.06986,-4.565816 0.282091,-9.637916 2.413212,-14.844081"
+ id="path7"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-5-8)"
+ d="m 111.69099,111.23057 c -8.34942,-8.90341 -9.59363,-18.351901 0.075,-28.637572"
+ id="path1-8-2-4"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-7-4)"
+ d="m 113.63763,127.9273 c -5.89813,-8.90341 -6.95537,-18.02497 -0.12542,-28.310645"
+ id="path1-8-5-1-3"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-9-6)"
+ d="m 129.66375,111.84421 c -16.04449,0.96774 -25.77955,-8.01088 -28.37042,-26.85485"
+ id="path1-8-5-6-0-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-3-3)"
+ d="m 129.49674,125.69834 c -15.44756,8.13452 -27.58577,-8.11589 -27.66099,-27.345325"
+ id="path1-8-5-6-7-5-4"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-8-4)"
+ d="M 142.75042,114.21605 C 126.37753,113.59344 116.69817,103.13163 113.44956,85.091396"
+ id="path1-8-5-6-7-8-3-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-6-7)"
+ d="m 143.04934,126.25985 c -15.44756,8.13451 -27.35541,-6.97387 -27.43063,-26.20331"
+ id="path1-8-5-6-7-8-2-2-4"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-87-1)"
+ d="m 101.27936,96.543277 c 6.44809,-5.278368 15.46606,-6.305451 28.43113,-0.803031"
+ id="path1-7-19-5"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-74-5)"
+ d="m 113.6701,83.000983 c 10.07271,-6.043908 15.38566,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-7-3"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-0-1)"
+ d="m 100.38599,83.208524 c 3.63223,-4.278368 8.63351,-5.657536 14.12501,-5.510111 4.33963,0.11649 8.77492,0.820414 14.54622,4.344855"
+ id="path1-7-3-3-6-8"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-6-5)"
+ d="m 115.4534,98.356733 c 6.44809,-7.475501 14.97937,-8.678728 27.94444,-0.885913"
+ id="path1-7-1-8-1"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-4-0)"
+ d="m 99.741925,125.31928 c -3.203655,-5.35347 -4.158405,-10.30573 -3.555331,-16.11684 0.3999,-3.8534 1.143197,-8.41966 3.603258,-12.520733"
+ id="path1-5-2-1"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-5-1"
+ width="13.873985"
+ height="13.536115"
+ x="179.25481"
+ y="76.718834" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-5-5"
+ width="13.873985"
+ height="13.536115"
+ x="193.32123"
+ y="76.615784" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-8"
+ width="13.873985"
+ height="13.536115"
+ x="179.2666"
+ y="90.93148" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-12-1"
+ width="13.873985"
+ height="13.536115"
+ x="193.35323"
+ y="90.79583" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-4-3"
+ width="13.873985"
+ height="13.536115"
+ x="150.68204"
+ y="76.961281" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9"
+ width="13.873985"
+ height="13.536115"
+ x="164.74846"
+ y="76.858231" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-5-7"
+ width="13.873985"
+ height="13.536115"
+ x="150.69383"
+ y="91.173927" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-6-5"
+ width="13.873985"
+ height="13.536115"
+ x="164.78047"
+ y="91.038284" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-52-4"
+ width="13.873985"
+ height="13.536115"
+ x="179.33958"
+ y="105.17988" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-6-9"
+ width="13.873985"
+ height="13.536115"
+ x="193.40599"
+ y="105.07683" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-9-6"
+ width="13.873985"
+ height="13.536115"
+ x="179.35136"
+ y="119.39252" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-13-7"
+ width="13.873985"
+ height="13.536115"
+ x="193.438"
+ y="119.25687" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-1-1"
+ width="13.873985"
+ height="13.536115"
+ x="150.76682"
+ y="105.42233" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-5-0"
+ width="13.873985"
+ height="13.536115"
+ x="164.83324"
+ y="105.31927" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-1"
+ width="13.873985"
+ height="13.536115"
+ x="150.77861"
+ y="119.63497" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-69-3"
+ width="13.873985"
+ height="13.536115"
+ x="164.86523"
+ y="119.49933" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-4-8)"
+ d="m 155.94771,111.95193 c -1.79555,-4.39689 -2.23753,-8.35368 -2.30576,-12.808411 -0.0699,-4.565816 0.28209,-9.637916 2.41321,-14.844082"
+ id="path3-4-7"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-3-9)"
+ d="m 168.96533,111.45791 c -8.34944,-8.90341 -9.59362,-18.351903 0.075,-28.637574"
+ id="path1-8-4-7"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-9-9)"
+ d="m 170.91197,128.15463 c -5.89812,-8.90341 -6.95536,-18.02497 -0.12541,-28.310638"
+ id="path1-8-5-60-6"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-4-6)"
+ d="m 186.93809,112.07154 c -16.04448,0.96775 -25.77954,-8.01087 -28.37044,-26.854842"
+ id="path1-8-5-6-74-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-5-5)"
+ d="m 186.77109,125.92568 c -15.44756,8.13451 -27.5858,-8.11589 -27.66102,-27.345327"
+ id="path1-8-5-6-7-3-9"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-9-5)"
+ d="M 200.02477,114.44339 C 183.65188,113.82077 173.97252,103.35896 170.7239,85.318734"
+ id="path1-8-5-6-7-8-7-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-3-0)"
+ d="m 200.32369,126.48719 c -15.44756,8.13451 -27.35541,-6.97387 -27.43063,-26.20331"
+ id="path1-8-5-6-7-8-2-9-0"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-4-8)"
+ d="m 158.55371,96.770614 c 6.44809,-5.278367 15.46606,-6.30545 28.43113,-0.80303"
+ id="path1-7-0-4"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-9-2)"
+ d="m 170.94445,83.228321 c 10.07271,-6.043908 15.38566,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-0-1"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-3-9)"
+ d="m 157.66034,83.435862 c 3.63223,-4.278368 8.63351,-5.657536 14.12501,-5.510111 4.33963,0.11649 8.77492,0.820413 14.54622,4.344855"
+ id="path1-7-3-3-2-1"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-8-2)"
+ d="m 172.72775,98.58407 c 6.44809,-7.4755 14.97937,-8.678727 27.94443,-0.885912"
+ id="path1-7-1-2-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-41-6)"
+ d="m 157.01627,125.54662 c -3.20365,-5.35347 -4.1584,-10.30574 -3.55535,-16.11684 0.3999,-3.85341 1.14322,-8.41966 3.60325,-12.520736"
+ id="path1-5-6-6"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-9-3"
+ width="13.873985"
+ height="13.536115"
+ x="236.11276"
+ y="76.419838" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-4-4"
+ width="13.873985"
+ height="13.536115"
+ x="250.17918"
+ y="76.316788" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-5-7"
+ width="13.873985"
+ height="13.536115"
+ x="236.12454"
+ y="90.632484" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-6-7"
+ width="13.873985"
+ height="13.536115"
+ x="250.21118"
+ y="90.496841" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-5-7"
+ width="13.873985"
+ height="13.536115"
+ x="207.54001"
+ y="76.662285" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-9-4"
+ width="13.873985"
+ height="13.536115"
+ x="221.60643"
+ y="76.559235" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-1-5"
+ width="13.873985"
+ height="13.536115"
+ x="207.55179"
+ y="90.874931" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3"
+ width="13.873985"
+ height="13.536115"
+ x="221.63843"
+ y="90.739288" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-4-7"
+ width="13.873985"
+ height="13.536115"
+ x="236.19753"
+ y="104.88088" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-1-2"
+ width="13.873985"
+ height="13.536115"
+ x="250.26395"
+ y="104.77783" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-1-9"
+ width="13.873985"
+ height="13.536115"
+ x="236.20932"
+ y="119.09353" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-9-9"
+ width="13.873985"
+ height="13.536115"
+ x="250.29596"
+ y="118.95789" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-3-0"
+ width="13.873985"
+ height="13.536115"
+ x="207.62477"
+ y="105.12333" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-8-2"
+ width="13.873985"
+ height="13.536115"
+ x="221.69119"
+ y="105.02028" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-7-7"
+ width="13.873985"
+ height="13.536115"
+ x="207.63657"
+ y="119.33598" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-4-9"
+ width="13.873985"
+ height="13.536115"
+ x="221.72321"
+ y="119.20033" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-3-5)"
+ d="m 212.80567,111.65293 c -1.79558,-4.39689 -2.23755,-8.35368 -2.30579,-12.808407 -0.0699,-4.565816 0.28212,-9.637916 2.41321,-14.844081"
+ id="path3-9-9"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-58-8)"
+ d="m 225.82327,111.15891 c -8.34942,-8.90341 -9.59362,-18.351899 0.075,-28.63757"
+ id="path1-8-3-5"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-1-7)"
+ d="m 227.76991,127.85564 c -5.89812,-8.90342 -6.95536,-18.02498 -0.12542,-28.310643"
+ id="path1-8-5-13-2"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-0-6)"
+ d="m 243.79603,111.77255 c -16.04449,0.96774 -25.77955,-8.01088 -28.37042,-26.854848"
+ id="path1-8-5-6-8-0"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-4-2)"
+ d="m 243.62902,125.62668 c -15.44756,8.13451 -27.58577,-8.11589 -27.66099,-27.345323"
+ id="path1-8-5-6-7-7-8"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-0-9)"
+ d="M 256.8827,114.14439 C 240.50982,113.52177 230.83045,103.05996 227.58184,85.019738"
+ id="path1-8-5-6-7-8-9-3"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-9-0)"
+ d="m 257.18162,126.18819 c -15.44756,8.13451 -27.35541,-6.97387 -27.43063,-26.203304"
+ id="path1-8-5-6-7-8-2-3-5"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-3-5)"
+ d="m 215.41164,96.471618 c 6.44809,-5.278367 15.46607,-6.30545 28.43113,-0.80303"
+ id="path1-7-8-9"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-3-7)"
+ d="m 227.80238,82.929325 c 10.07271,-6.043908 15.38567,-6.759046 29.59021,-0.132283"
+ id="path1-7-3-8-6"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-4-5)"
+ d="m 214.51828,83.136866 c 3.63222,-4.278368 8.6335,-5.657536 14.12501,-5.510111 4.33962,0.11649 8.77491,0.820413 14.54621,4.344855"
+ id="path1-7-3-3-4-5"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-64-4)"
+ d="m 229.58568,98.285075 c 6.44809,-7.475501 14.97938,-8.678728 27.94444,-0.885913"
+ id="path1-7-1-0-6"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-1-0)"
+ d="m 213.87421,105.00816 c -3.20366,-5.35346 -4.15841,-10.305726 -3.55533,-16.116829 0.39987,-3.853408 1.14319,-8.419661 3.60325,-12.520737"
+ id="path1-5-0-3"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-6"
+ width="13.873985"
+ height="13.536115"
+ x="65.269989"
+ y="133.67944" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-43"
+ width="13.873985"
+ height="13.536115"
+ x="79.336411"
+ y="133.57639" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-8"
+ width="13.873985"
+ height="13.536115"
+ x="65.281784"
+ y="147.89209" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-67"
+ width="13.873985"
+ height="13.536115"
+ x="79.368416"
+ y="147.75644" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-8"
+ width="13.873985"
+ height="13.536115"
+ x="36.697243"
+ y="133.92189" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-1"
+ width="13.873985"
+ height="13.536115"
+ x="50.76366"
+ y="133.81883" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-9"
+ width="13.873985"
+ height="13.536115"
+ x="36.709034"
+ y="148.13454" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-81"
+ width="13.873985"
+ height="13.536115"
+ x="50.79567"
+ y="147.99889" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-48"
+ width="13.873985"
+ height="13.536115"
+ x="65.354759"
+ y="162.14049" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-50"
+ width="13.873985"
+ height="13.536115"
+ x="79.421181"
+ y="162.03743" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-15"
+ width="13.873985"
+ height="13.536115"
+ x="65.366554"
+ y="176.35313" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-97"
+ width="13.873985"
+ height="13.536115"
+ x="79.453186"
+ y="176.21748" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-6"
+ width="13.873985"
+ height="13.536115"
+ x="36.782013"
+ y="162.38293" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-2"
+ width="13.873985"
+ height="13.536115"
+ x="50.848431"
+ y="162.27988" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-8"
+ width="13.873985"
+ height="13.536115"
+ x="36.793804"
+ y="176.59558" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-9"
+ width="13.873985"
+ height="13.536115"
+ x="50.88044"
+ y="176.45993" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-0)"
+ d="m 41.962911,168.91253 c -1.795561,-4.39689 -2.237542,-8.35368 -2.305768,-12.80841 -0.06994,-4.56582 0.282094,-9.63792 2.413213,-14.84408"
+ id="path6-5"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-7)"
+ d="m 54.980524,168.41851 c -8.34943,-8.90341 -9.593615,-18.3519 0.07498,-28.63757"
+ id="path1-8-0"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-0)"
+ d="m 56.927163,185.11524 c -5.898121,-8.90342 -6.955361,-18.02498 -0.125415,-28.31065"
+ id="path1-8-5-2"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-6)"
+ d="m 72.953284,169.03215 c -16.044488,0.96774 -25.77954,-8.01088 -28.37043,-26.85485"
+ id="path1-8-5-6-72"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-57)"
+ d="M 72.786279,182.88628 C 57.338715,191.02079 45.200495,174.77039 45.125273,155.54095"
+ id="path1-8-5-6-7-81"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-90)"
+ d="M 86.03996,171.40399 C 69.667071,170.78137 59.987709,160.31956 56.739094,142.27933"
+ id="path1-8-5-6-7-8-77"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-0)"
+ d="M 86.33888,183.44779 C 70.891317,191.5823 58.983467,176.47392 58.908245,157.24448"
+ id="path1-8-5-6-7-8-2-97"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-0)"
+ d="m 44.568902,153.73121 c 6.448084,-5.27836 15.466061,-6.30545 28.431123,-0.80303"
+ id="path1-7-9"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-0)"
+ d="m 56.959637,140.18892 c 10.072708,-6.04391 15.385665,-6.75904 29.590211,-0.13228"
+ id="path1-7-3-88"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-6)"
+ d="m 43.675541,140.39646 c 3.63222,-4.27837 8.633495,-5.65753 14.125001,-5.51011 4.339623,0.11649 8.774913,0.82041 14.546216,4.34486"
+ id="path1-7-3-3-9"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-2)"
+ d="m 58.742939,155.54467 c 6.448089,-7.4755 14.979372,-8.67873 27.944435,-0.88591"
+ id="path1-7-1-80"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-15)"
+ d="m 43.031457,182.50722 c -3.203646,-5.35347 -4.158399,-10.30573 -3.555338,-16.11684 0.399898,-3.85341 1.143216,-8.41966 3.603258,-12.52074"
+ id="path1-5-5"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-4-0"
+ width="13.873985"
+ height="13.536115"
+ x="122.11791"
+ y="133.0097" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-7-24"
+ width="13.873985"
+ height="13.536115"
+ x="136.18434"
+ y="132.90665" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-2-3"
+ width="13.873985"
+ height="13.536115"
+ x="122.12971"
+ y="147.22234" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-1-7"
+ width="13.873985"
+ height="13.536115"
+ x="136.21634"
+ y="147.0867" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-9-0"
+ width="13.873985"
+ height="13.536115"
+ x="93.545166"
+ y="133.25215" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-5-0"
+ width="13.873985"
+ height="13.536115"
+ x="107.61157"
+ y="133.14909" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-6-15"
+ width="13.873985"
+ height="13.536115"
+ x="93.556953"
+ y="147.4648" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-8-8"
+ width="13.873985"
+ height="13.536115"
+ x="107.64359"
+ y="147.32915" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-5-0"
+ width="13.873985"
+ height="13.536115"
+ x="122.20268"
+ y="161.47075" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-0"
+ width="13.873985"
+ height="13.536115"
+ x="136.2691"
+ y="161.36769" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-2-4"
+ width="13.873985"
+ height="13.536115"
+ x="122.21448"
+ y="175.68338" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-1-7"
+ width="13.873985"
+ height="13.536115"
+ x="136.30112"
+ y="175.54774" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-31"
+ width="13.873985"
+ height="13.536115"
+ x="93.629936"
+ y="161.7132" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-9-4"
+ width="13.873985"
+ height="13.536115"
+ x="107.69634"
+ y="161.61014" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-1-2"
+ width="13.873985"
+ height="13.536115"
+ x="93.641724"
+ y="175.92583" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-01"
+ width="13.873985"
+ height="13.536115"
+ x="107.72836"
+ y="175.79019" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-87-8)"
+ d="m 98.810843,168.24279 c -1.795575,-4.39688 -2.23755,-8.35367 -2.30576,-12.8084 -0.06986,-4.56582 0.282091,-9.63792 2.413212,-14.84408"
+ id="path7-3"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-5-85)"
+ d="m 111.82845,167.74878 c -8.34942,-8.90341 -9.59363,-18.3519 0.075,-28.63758"
+ id="path1-8-2-0"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-7-0)"
+ d="m 113.77509,184.4455 c -5.89813,-8.90341 -6.95537,-18.02497 -0.12542,-28.31064"
+ id="path1-8-5-1-0"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-9-69)"
+ d="m 129.80121,168.36241 c -16.04449,0.96775 -25.77955,-8.01087 -28.37042,-26.85484"
+ id="path1-8-5-6-0-4"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-3-37)"
+ d="m 129.6342,182.21655 c -15.44756,8.13451 -27.58577,-8.11589 -27.66099,-27.34533"
+ id="path1-8-5-6-7-5-8"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-8-3)"
+ d="M 142.88788,170.73425 C 126.51499,170.11164 116.83563,159.64983 113.58702,141.6096"
+ id="path1-8-5-6-7-8-3-22"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-6-1)"
+ d="m 143.1868,182.77805 c -15.44756,8.13452 -27.35541,-6.97386 -27.43063,-26.2033"
+ id="path1-8-5-6-7-8-2-2-0"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-87-8)"
+ d="m 101.41682,153.06148 c 6.44809,-5.27836 15.46606,-6.30545 28.43113,-0.80303"
+ id="path1-7-19-2"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-74-4)"
+ d="m 113.80756,139.51919 c 10.07271,-6.04391 15.38566,-6.75905 29.59021,-0.13228"
+ id="path1-7-3-7-4"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-0-0)"
+ d="m 100.52345,139.72673 c 3.63223,-4.27837 8.63351,-5.65754 14.12501,-5.51011 4.33963,0.11649 8.77492,0.82041 14.54622,4.34485"
+ id="path1-7-3-3-6-5"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-6-9)"
+ d="m 115.59086,154.87494 c 6.44809,-7.4755 14.97937,-8.67873 27.94444,-0.88591"
+ id="path1-7-1-8-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-4-7)"
+ d="m 99.879384,181.83749 c -3.203655,-5.35347 -4.158405,-10.30574 -3.555331,-16.11684 0.3999,-3.85341 1.143197,-8.41966 3.603256,-12.52074"
+ id="path1-5-2-4"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-5-8"
+ width="13.873985"
+ height="13.536115"
+ x="179.39226"
+ y="133.23703" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-5-4"
+ width="13.873985"
+ height="13.536115"
+ x="193.45868"
+ y="133.13399" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-2"
+ width="13.873985"
+ height="13.536115"
+ x="179.40405"
+ y="147.44968" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-12-5"
+ width="13.873985"
+ height="13.536115"
+ x="193.49069"
+ y="147.31404" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-4-2"
+ width="13.873985"
+ height="13.536115"
+ x="150.8195"
+ y="133.47948" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-7"
+ width="13.873985"
+ height="13.536115"
+ x="164.88593"
+ y="133.37643" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-5-5"
+ width="13.873985"
+ height="13.536115"
+ x="150.83128"
+ y="147.69212" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-6-7"
+ width="13.873985"
+ height="13.536115"
+ x="164.91792"
+ y="147.55649" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-52-2"
+ width="13.873985"
+ height="13.536115"
+ x="179.47704"
+ y="161.69807" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-6-2"
+ width="13.873985"
+ height="13.536115"
+ x="193.54346"
+ y="161.59503" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-9-8"
+ width="13.873985"
+ height="13.536115"
+ x="179.48883"
+ y="175.91072" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-13-6"
+ width="13.873985"
+ height="13.536115"
+ x="193.57545"
+ y="175.77509" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-1-0"
+ width="13.873985"
+ height="13.536115"
+ x="150.90427"
+ y="161.94052" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-5-09"
+ width="13.873985"
+ height="13.536115"
+ x="164.97069"
+ y="161.83748" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-12"
+ width="13.873985"
+ height="13.536115"
+ x="150.91606"
+ y="176.15317" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-69-6"
+ width="13.873985"
+ height="13.536115"
+ x="165.0027"
+ y="176.01753" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-4-6)"
+ d="m 156.08517,168.47013 c -1.79555,-4.39688 -2.23753,-8.35367 -2.30576,-12.8084 -0.0699,-4.56582 0.28209,-9.63792 2.41321,-14.84409"
+ id="path3-4-9"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-3-91)"
+ d="m 169.10279,167.97611 c -8.34944,-8.90341 -9.59362,-18.3519 0.075,-28.63757"
+ id="path1-8-4-4"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-9-3)"
+ d="m 171.04943,184.67284 c -5.89812,-8.90341 -6.95536,-18.02497 -0.12541,-28.31064"
+ id="path1-8-5-60-8"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-4-8)"
+ d="m 187.07555,168.58975 c -16.04448,0.96775 -25.77954,-8.01087 -28.37044,-26.85485"
+ id="path1-8-5-6-74-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-5-3)"
+ d="m 186.90855,182.44389 c -15.44756,8.13451 -27.5858,-8.11589 -27.66102,-27.34533"
+ id="path1-8-5-6-7-3-8"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-9-9)"
+ d="m 200.16223,170.96159 c -16.37289,-0.62261 -26.05225,-11.08442 -29.30087,-29.12465"
+ id="path1-8-5-6-7-8-7-2"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-3-4)"
+ d="m 200.46115,183.00539 c -15.44756,8.13452 -27.35541,-6.97387 -27.43063,-26.2033"
+ id="path1-8-5-6-7-8-2-9-7"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-4-6)"
+ d="m 158.69117,153.28882 c 6.44809,-5.27837 15.46606,-6.30545 28.43113,-0.80303"
+ id="path1-7-0-8"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-9-1)"
+ d="m 171.08191,139.74653 c 10.07271,-6.04391 15.38566,-6.75905 29.59021,-0.13229"
+ id="path1-7-3-0-6"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-3-0)"
+ d="m 157.7978,139.95407 c 3.63223,-4.27837 8.63351,-5.65754 14.12501,-5.51011 4.33963,0.11649 8.77492,0.82041 14.54622,4.34485"
+ id="path1-7-3-3-2-7"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-8-3)"
+ d="m 172.86521,155.10228 c 6.44809,-7.4755 14.97937,-8.67873 27.94443,-0.88592"
+ id="path1-7-1-2-7"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-41-0)"
+ d="m 157.15373,182.06482 c -3.20365,-5.35346 -4.1584,-10.30573 -3.55535,-16.11683 0.3999,-3.85341 1.14322,-8.41966 3.60325,-12.52074"
+ id="path1-5-6-0"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-937-0-3-9-4"
+ width="13.873985"
+ height="13.536115"
+ x="236.25021"
+ y="132.93803" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-4-5"
+ width="13.873985"
+ height="13.536115"
+ x="250.31664"
+ y="132.83498" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-5-4"
+ width="13.873985"
+ height="13.536115"
+ x="236.26201"
+ y="147.15068" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-6-2"
+ width="13.873985"
+ height="13.536115"
+ x="250.34863"
+ y="147.01503" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-5-3"
+ width="13.873985"
+ height="13.536115"
+ x="207.67746"
+ y="133.18048" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-9-9"
+ width="13.873985"
+ height="13.536115"
+ x="221.74388"
+ y="133.07742" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-1-6"
+ width="13.873985"
+ height="13.536115"
+ x="207.68925"
+ y="147.39313" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-5"
+ width="13.873985"
+ height="13.536115"
+ x="221.77588"
+ y="147.25748" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-6-4-3-4-4"
+ width="13.873985"
+ height="13.536115"
+ x="236.33499"
+ y="161.39908" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-1-3"
+ width="13.873985"
+ height="13.536115"
+ x="250.4014"
+ y="161.29602" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-1-94"
+ width="13.873985"
+ height="13.536115"
+ x="236.34677"
+ y="175.61172" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-9-4"
+ width="13.873985"
+ height="13.536115"
+ x="250.43341"
+ y="175.47607" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-3-6"
+ width="13.873985"
+ height="13.536115"
+ x="207.76224"
+ y="161.64153" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-8-0"
+ width="13.873985"
+ height="13.536115"
+ x="221.82864"
+ y="161.53847" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-7-2"
+ width="13.873985"
+ height="13.536115"
+ x="207.77402"
+ y="175.85417" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370418;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-4-2"
+ width="13.873985"
+ height="13.536115"
+ x="221.86066"
+ y="175.71852" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-3-0)"
+ d="m 212.94313,168.17113 c -1.79558,-4.39688 -2.23755,-8.35367 -2.30579,-12.8084 -0.0699,-4.56582 0.28212,-9.63792 2.41321,-14.84409"
+ id="path3-9-8"
+ inkscape:transform-center-x="-0.76484503"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-58-2)"
+ d="m 225.96073,167.67712 c -8.34942,-8.90342 -9.59362,-18.35191 0.075,-28.63758"
+ id="path1-8-3-4"
+ inkscape:transform-center-x="-1.756365"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-1-4)"
+ d="m 227.90737,184.37384 c -5.89812,-8.90341 -6.95536,-18.02497 -0.12542,-28.31064"
+ id="path1-8-5-13-3"
+ inkscape:transform-center-x="-1.2407313"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-0-9)"
+ d="M 243.93349,168.29075 C 227.889,169.2585 218.15394,160.27988 215.56307,141.43591"
+ id="path1-8-5-6-8-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-4-5)"
+ d="M 243.76648,182.14489 C 228.31892,190.2794 216.18071,174.029 216.10549,154.79956"
+ id="path1-8-5-6-7-7-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-0-7)"
+ d="M 257.02016,170.66259 C 240.64728,170.03998 230.96791,159.57817 227.7193,141.53794"
+ id="path1-8-5-6-7-8-9-1"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-60-0-5-2-8-6-9-6)"
+ d="m 257.31908,182.70639 c -15.44756,8.13452 -27.35541,-6.97386 -27.43063,-26.2033"
+ id="path1-8-5-6-7-8-2-3-9"
+ inkscape:transform-center-x="-4.374983"
+ inkscape:transform-center-y="-2.6647327"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-3-0)"
+ d="m 215.5491,152.98982 c 6.44809,-5.27837 15.46607,-6.30545 28.43113,-0.80303"
+ id="path1-7-8-0"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.1779744"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-3-0)"
+ d="m 227.93984,139.44753 c 10.07271,-6.04391 15.38567,-6.75905 29.59021,-0.13229"
+ id="path1-7-3-8-0"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.5378977"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-6-7-4-3)"
+ d="m 214.65574,139.65507 c 3.63222,-4.27837 8.6335,-5.65754 14.12501,-5.51011 4.33962,0.11649 8.77491,0.82041 14.54621,4.34485"
+ id="path1-7-3-3-4-0"
+ inkscape:transform-center-x="1.0156762"
+ inkscape:transform-center-y="1.709327"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#ArrowWideRounded-8-64-5)"
+ d="m 229.72314,154.80328 c 6.44809,-7.4755 14.97938,-8.67873 27.94444,-0.88591"
+ id="path1-7-1-0-2"
+ inkscape:transform-center-x="1.007168"
+ inkscape:transform-center-y="1.6683096"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-1-1)"
+ d="m 214.01167,161.52637 c -3.20366,-5.35347 -4.15841,-10.30573 -3.55533,-16.11684 0.39987,-3.8534 1.14319,-8.41966 3.60325,-12.52073"
+ id="path1-5-0-5"
+ inkscape:transform-center-x="-1.1208011"
+ inkscape:transform-center-y="1.8780721"
+ sodipodi:nodetypes="csc" />
+ </g>
+</svg>
diff --git a/Documentation/camera-sensor-model.rst b/Documentation/camera-sensor-model.rst
new file mode 100644
index 00000000..87a25bf4
--- /dev/null
+++ b/Documentation/camera-sensor-model.rst
@@ -0,0 +1,175 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+.. _camera-sensor-model:
+
+.. todo: Move to Doxygen-generated documentation
+
+The libcamera camera sensor model
+=================================
+
+libcamera defines an abstract camera sensor model in order to provide
+a description of each of the processing steps that result in image data being
+sent on the media bus and that form the image stream delivered to applications.
+
+Applications should use the abstract camera sensor model defined here to
+precisely control the operations of the camera sensor.
+
+The libcamera camera sensor model targets image sensors producing frames in
+RAW format, delivered through a MIPI CSI-2 compliant bus implementation.
+
+The abstract sensor model maps libcamera components to the characteristics and
+operations of an image sensor, and serves as a reference to model the libcamera
+CameraSensor class and SensorConfiguration classes and operations.
+
+In order to control the configuration of the camera sensor through the
+SensorConfiguration class, applications should understand this model and map it
+to the combination of image sensor and kernel driver in use.
+
+The camera sensor model defined here is based on the *MIPI CCS specification*,
+particularly on *Section 8.2 - Image readout* of *Chapter 8 - Video Timings*.
+
+
+Glossary
+--------
+
+.. glossary::
+
+ Pixel array
+ The full grid of pixels, active and inactive ones
+
+ Pixel array active area
+ The portion(s) of the pixel array that contains valid and readable pixels;
+ corresponds to the libcamera properties::PixelArrayActiveAreas
+
+ Analog crop rectangle
+ The portion of the *pixel array active area* which is read out and passed
+ to further processing stages
+
+ Subsampling
+ Pixel processing techniques that reduce the image size by binning or by
+ skipping adjacent pixels
+
+ Digital crop
+ Crop of the sub-sampled image data before scaling
+
+ Frame output
+ The frame (image) as output on the media bus by the camera sensor
+
+Camera sensor model
+-------------------
+
+The abstract sensor model is described in the following diagram.
+
+.. figure:: sensor_model.svg
+
+
+1. The sensor reads pixels from the *pixel array*. The pixels being read out are
+ selected by the *analog crop rectangle*.
+
+2. The pixels can be subsampled to reduce the image size without affecting the
+ field of view. Two subsampling techniques can be used:
+
+ - Binning: combines adjacent pixels of the same colour by averaging or
+ summing their values, in the analog domain and/or the digital domain.
+
+ .. figure:: binning.svg
+
+
+ - Skipping: skips the read out of a number of adjacent pixels.
+
+ .. figure:: skipping.svg
+
+
+3. The output of the optional sub-sampling stage is then cropped after the
+ conversion of the analogue pixel values in the digital domain.
+
+4. The resulting output frame is sent on the media bus by the sensor.
+
+Camera Sensor configuration parameters
+--------------------------------------
+
+The libcamera camera sensor model defines parameters that allow users to
+control:
+
+1. The image format bit depth
+
+2. The size and position of the *Analog crop rectangle*
+
+3. The subsampling factors used to downscale the pixel array readout data to a
+ smaller frame size without reducing the image *field of view*. Two
+ configuration parameters are made available to control the downscaling
+ factor:
+
+ - binning
+ A vertical and horizontal binning factor can be specified, the image
+ will be downscaled in its vertical and horizontal sizes by the specified
+ factor.
+
+ .. code-block:: c
+ :caption: Definition: The horizontal and vertical binning factors
+
+ horizontal_binning = xBin;
+ vertical_binning = yBin;
+
+ - skipping
+ Skipping reduces the image resolution by skipping the read-out of a number
+ of adjacent pixels. The skipping factor is specified by the 'increment'
+ number (number of pixels to 'skip') in the vertical and horizontal
+ directions and for even and odd rows and columns.
+
+ .. code-block:: c
+ :caption: Definition: The horizontal and vertical skipping factors
+
+ horizontal_skipping = (xOddInc + xEvenInc) / 2;
+ vertical_skipping = (yOddInc + yEvenInc) / 2;
+
+ Different sensors perform the binning and skipping stages in different
+ orders. For the sake of computing the final output image size the order of
+ execution is not relevant. The overall down-scaling factor is obtained by
+ combining the binning and skipping factors.
+
+ .. code-block:: c
+ :caption: Definition: The total scaling factor (binning + sub-sampling)
+
+ total_horizontal_downscale = horizontal_binning + horizontal_skipping;
+ total_vertical_downscale = vertical_binning + vertical_skipping;
+
+
+4. The output size is used to specify any additional cropping on the sub-sampled
+ frame.
+
+5. The total line length and frame height (*visibile* pixels + *blankings*) as
+ sent on the MIPI CSI-2 bus.
+
+6. The pixel transmission rate on the MIPI CSI-2 bus.
+
+The above parameters are combined to obtain the following high-level
+configurations:
+
+- **frame output size**
+
+ Obtained by applying a crop to the physical pixel array size in the analog
+ domain, followed by optional binning and sub-sampling (in any order),
+ followed by an optional crop step in the output digital domain.
+
+- **frame rate**
+
+ The combination of the *total frame size*, the image format *bit depth* and
+ the *pixel rate* of the data sent on the MIPI CSI-2 bus allows to compute the
+ image stream frame rate. The equation is the well known:
+
+ .. code-block:: c
+
+ frame_duration = total_frame_size / pixel_rate;
+ frame_rate = 1 / frame_duration;
+
+
+ where the *pixel_rate* parameter is the result of the sensor's configuration
+ of the MIPI CSI-2 bus *(the following formula applies to MIPI CSI-2 when
+ used on MIPI D-PHY physical protocol layer only)*
+
+ .. code-block:: c
+
+ pixel_rate = csi_2_link_freq * 2 * nr_of_lanes / bits_per_sample;
diff --git a/Documentation/code-of-conduct.rst b/Documentation/code-of-conduct.rst
new file mode 100644
index 00000000..0edd1e99
--- /dev/null
+++ b/Documentation/code-of-conduct.rst
@@ -0,0 +1,96 @@
+.. SPDX-License-Identifier: CC-BY-4.0
+
+.. include:: documentation-contents.rst
+
+.. _code-of-conduct:
+
+Contributor Covenant Code of Conduct
+====================================
+
+Our Pledge
+----------
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to make participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+Our Standards
+-------------
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+Our Responsibilities
+--------------------
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+Scope
+-----
+
+This Code of Conduct applies within all project spaces, and it also applies when
+an individual is representing the project or its community in public spaces.
+Examples of representing a project or community include using an official
+project e-mail address, posting via an official social media account, or acting
+as an appointed representative at an online or offline event. Representation of
+a project may be further defined and clarified by project maintainers.
+
+Enforcement
+-----------
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at conduct@libcamera.org, or directly to
+any member of the code of conduct team:
+
+* Kieran Bingham <kieran.bingham@ideasonboard.com>
+* Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+
+All complaints will be reviewed and investigated and will result in a response
+that is deemed necessary and appropriate to the circumstances. The project team
+is obligated to maintain confidentiality with regard to the reporter of an
+incident. Further details of specific enforcement policies may be posted
+separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+Attribution
+-----------
+
+This Code of Conduct is adapted from the `Contributor Covenant`_, version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+.. _Contributor Covenant: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
+
diff --git a/Documentation/coding-style.rst b/Documentation/coding-style.rst
index bbc1f2fb..6ac3a4a0 100644
--- a/Documentation/coding-style.rst
+++ b/Documentation/coding-style.rst
@@ -1,3 +1,7 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
.. _coding-style-guidelines:
Coding Style Guidelines
@@ -57,7 +61,7 @@ document:
underscores in between
* All formatting rules specified in the selected sections of the Linux kernel
Code Style for indentation, braces, spacing, etc
-* Header guards are formatted as '__LIBCAMERA_FILE_NAME_H__'
+* Headers are guarded by the use of '#pragma once'
Order of Includes
~~~~~~~~~~~~~~~~~
@@ -68,31 +72,41 @@ macro. For .cpp files, if the file implements an API declared in a header file,
that header file shall be included first in order to ensure it is
self-contained.
-The headers shall be grouped and ordered as follows.
+While the following list is extensive, it documents the expected behaviour
+defined by the clang-format configuration and tooling should assist with
+ordering.
+
+The headers shall be grouped and ordered as follows:
- # The header declaring the API being implemented (if any)
- # The C and C++ system and standard library headers
- # Other libraries' headers, with one group per library
- # Other project's headers
+1. The header declaring the API being implemented (if any)
+2. The C and C++ system and standard library headers
+3. Linux kernel headers
+4. The libcamera base private header if required
+5. The libcamera base library headers
+6. The libcamera public API headers
+7. The libcamera IPA interfaces
+8. The internal libcamera headers
+9. Other libraries' headers, with one group per library
+10. Local headers grouped by subdirectory
+11. Any local headers
Groups of headers shall be separated by a single blank line. Headers within
each group shall be sorted alphabetically.
System and library headers shall be included with angle brackets. Project
headers shall be included with angle brackets for the libcamera public API
-headers, and with double quotes for other libcamera headers.
+headers, and with double quotes for internal libcamera headers.
C++ Specific Rules
------------------
-The code shall be implemented in C++14, with the following caveats:
+The code shall be implemented in C++17, with the following caveats:
* Type inference (auto and decltype) shall be used with caution, to avoid
drifting towards an untyped language.
* The explicit, override and final specifiers are to be used where applicable.
-* General-purpose smart pointers (std::unique_ptr) deprecate std::auto_ptr.
- Smart pointers, as well as shared pointers and weak pointers, shall not be
+* Smart pointers, as well as shared pointers and weak pointers, shall not be
overused.
* Classes are encouraged to define move constructors and assignment operators
where applicable, and generally make use of the features offered by rvalue
@@ -116,7 +130,7 @@ reference means using a reference passed by a caller without ownership transfer
based on the assumption that the caller guarantees the validity of the
reference for the duration of the operation that borrows it.
-#. Single Owner Objects
+1. Single Owner Objects
* By default an object has a single owner at any time.
* Storage of single owner objects varies depending on how the object
@@ -153,7 +167,7 @@ reference for the duration of the operation that borrows it.
otherwise specified, pointers passed to functions are considered as
borrowed references valid for the duration of the function only.
-#. Shared Objects
+2. Shared Objects
* Objects that may have multiple owners at a given time are called shared
objects. They are reference-counted and live as long as any references to
@@ -186,6 +200,55 @@ These rules match the `object ownership rules from the Chromium C++ Style Guide`
long term borrowing isn't marked through language constructs, it shall be
documented explicitly in details in the API.
+Global Variables
+~~~~~~~~~~~~~~~~
+
+The order of initializations and destructions of global variables cannot be
+reasonably controlled. This can cause problems (including segfaults) when global
+variables depend on each other, directly or indirectly. For example, if the
+declaration of a global variable calls a constructor which uses another global
+variable that hasn't been initialized yet, incorrect behavior is likely.
+Similar issues may occur when the library is unloaded and global variables are
+destroyed.
+
+Global variables that are statically initialized and have trivial destructors
+(such as an integer constant) do not cause any issue. Other global variables
+shall be avoided when possible, but are allowed when required (for instance to
+implement factories with auto-registration). They shall not depend on any other
+global variable, should run a minimal amount of code in the constructor and
+destructor, and code that contains dependencies should be moved to a later
+point in time.
+
+Error Handling
+~~~~~~~~~~~~~~
+
+Proper error handling is crucial to the stability of libcamera. The project
+follows a set of high-level rules:
+
+* Make errors impossible through API design. The best way to handle errors is
+ to prevent them from happening in the first place. The preferred option is
+ thus to prevent error conditions at the API design stage when possible.
+* Detect errors at compile time. Compile-test checking of errors not only
+ reduces the runtime complexity, but also ensures that errors are caught early
+ on during development instead of during testing or, worse, in production. The
+ static_assert() declaration should be used where possible for this purpose.
+* Validate all external API contracts. Explicit pre-condition checks shall be
+ used to validate API contracts. Whenever possible, appropriate errors should
+ be returned directly. As libcamera doesn't use exceptions, errors detected in
+ constructors shall result in the constructed object being marked as invalid,
+ with a public member function available to check validity. The checks should
+ be thorough for the public API, and may be lighter for internal APIs when
+ pre-conditions can reasonably be considered to be met through other means.
+* Use assertions for fatal issues only. The ASSERT() macro causes a program
+ abort when compiled in debug mode, and is a no-op otherwise. It is useful to
+ abort execution synchronously with the error check instead of letting the
+ error cause problems (such as segmentation faults) later, and to provide a
+ detailed backtrace. Assertions shall only be used to catch conditions that are
+ never supposed to happen without a serious bug in libcamera that would prevent
+ safe recovery. They shall never be used to validate API contracts. The
+ assertion conditions shall not cause any side effect as they are compiled out
+ in non-debug mode.
+
C Compatibility Headers
~~~~~~~~~~~~~~~~~~~~~~~
@@ -194,9 +257,17 @@ them, defines C compatibility headers. The former have a name of the form
<cxxx> while the later are named <xxx.h>. The C++ headers declare names in the
std namespace, and may declare the same names in the global namespace. The C
compatibility headers declare names in the global namespace, and may declare
-the same names in the std namespace. Usage of the C compatibility headers is
-strongly preferred. Code shall not rely on the optional declaration of names in
-the global or std namespace.
+the same names in the std namespace. Code shall not rely on the optional
+declaration of names in the global or std namespace.
+
+Usage of the C compatibility headers is preferred, except for the math.h header.
+Where math.h defines separate functions for different argument types (e.g.
+abs(int), labs(long int), fabs(double) and fabsf(float)) and requires the
+developer to pick the right function, cmath defines overloaded functions
+(std::abs(int), std::abs(long int), std::abs(double) and std::abs(float) to let
+the compiler select the right function. This avoids potential errors such as
+calling abs(int) with a float argument, performing an unwanted implicit integer
+conversion. For this reason, cmath is preferred over math.h.
Documentation
@@ -223,7 +294,7 @@ member function of the PipelineHandler class.
* \param[in] camera The camera to start
*
* Start the group of streams that have been configured for capture by
- * \a configureStreams(). The intended caller of this method is the Camera
+ * \a configureStreams(). The intended caller of this function is the Camera
* class which will in turn be called from the application to indicate that
* it has configured the streams and is ready to capture.
*
@@ -255,28 +326,12 @@ The 'clang-format' code formatting tool can be used to reformat source files
with the libcamera coding style, defined in the .clang-format file at the root
of the source tree.
-Alternatively the 'astyle' tool can also be used, with the following arguments.
-
-::
-
- --style=linux
- --indent=force-tab=8
- --attach-namespaces
- --attach-extern-c
- --pad-oper
- --align-pointer=name
- --align-reference=name
- --max-code-length=120
-
-Use of astyle is discouraged as clang-format better matches the libcamera coding
-style.
-
-As both astyle and clang-format are code formatters, they operate on full files
-and output reformatted source code. While they can be used to reformat code
-before sending patches, it may generate unrelated changes. To avoid this,
-libcamera provides a 'checkstyle.py' script wrapping the formatting tools to
-only retain related changes. This should be used to validate modifications
-before submitting them for review.
+As clang-format is a code formatter, it operates on full files and outputs
+reformatted source code. While it can be used to reformat code before sending
+patches, it may generate unrelated changes. To avoid this, libcamera provides a
+'checkstyle.py' script wrapping the formatting tools to only retain related
+changes. This should be used to validate modifications before submitting them
+for review.
The script operates on one or multiple git commits specified on the command
line. It does not modify the git tree, the index or the working directory and
@@ -365,8 +420,12 @@ diff that fixes the issues, on top of the corresponding commit. As the script is
in early development false positive are expected. The flagged issues should be
reviewed, but the diff doesn't need to be applied blindly.
-The checkstyle.py script uses clang-format by default if found, and otherwise
-falls back to astyle. The formatter can be manually selected with the
-'--formatter' argument.
+Execution of checkstyle.py can be automated through git commit hooks. Example
+of pre-commit and post-commit hooks are available in `utils/hooks/pre-commit`
+and `utils/hooks/post-commit`. You can install either hook by copying it to
+`.git/hooks/`. The post-commit hook is easier to start with as it will only flag
+potential issues after committing, while the pre-commit hook will abort the
+commit if issues are detected and requires usage of `git commit --no-verify` to
+ignore false positives.
Happy hacking, libcamera awaits your patches!
diff --git a/Documentation/conf.py b/Documentation/conf.py
index bffd1d8f..089f114c 100644
--- a/Documentation/conf.py
+++ b/Documentation/conf.py
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: CC-BY-SA-4.0
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
@@ -36,8 +37,11 @@ author = u'Kieran Bingham, Jacopo Mondi, Laurent Pinchart, Niklas Söderlund'
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
+ 'sphinx.ext.graphviz'
]
+graphviz_output_format = 'svg'
+
# Add any paths that contain templates here, relative to this directory.
templates_path = []
@@ -55,12 +59,17 @@ master_doc = 'index'
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
-language = None
+language = 'en'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = [
+ '_build',
+ 'Thumbs.db',
+ '.DS_Store',
+ 'documentation-contents.rst',
+]
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = None
diff --git a/Documentation/contributing.rst b/Documentation/contributing.rst
index 1cfbd0ec..18b1914a 100644
--- a/Documentation/contributing.rst
+++ b/Documentation/contributing.rst
@@ -1,3 +1,5 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
Contributing
============
@@ -6,6 +8,10 @@ Whether you would like to help with coding, documentation, testing, proposing
new features, or just discussing the project with the community, you can join
our official public communication channels, or simply check out the code.
+The project adheres to a :ref:`code of conduct <code-of-conduct>` that
+maintainers, contributors and community members are expected to follow in all
+online and offline communication.
+
Mailing List
------------
@@ -18,23 +24,35 @@ list information page.
IRC Channel
-----------
-For informal and real time discussions, our IRC channel on Freenode is open to
-the public. Point your IRC client to #libcamera to say hello, or use the `WebChat`_.
+For informal and real time discussions, our IRC channel on irc.oftc.net is open
+to the public. Point your IRC client to #libcamera to say hello, or use the
+`WebChat`_.
-.. _WebChat: https://webchat.freenode.net/?channels=%23libcamera&uio=d4
+.. _WebChat: https://webchat.oftc.net/?channels=libcamera
Source Code
-----------
libcamera is in early stages of development, and no releases are available yet.
-The source code is available from the project's `git tree`_, hosted by `LinuxTV`_.
+The source code is available from the project's `git tree`_.
.. code-block:: shell
- $ git clone git://linuxtv.org/libcamera.git
+ $ git clone https://git.libcamera.org/libcamera/libcamera.git
+
+.. _git tree: https://git.libcamera.org/libcamera/libcamera.git/
-.. _git tree: https://git.linuxtv.org/libcamera.git/
-.. _LinuxTV: https://linuxtv.org/
+A mirror is also hosted on `LinuxTV`_.
+
+.. _LinuxTV: https://git.linuxtv.org/libcamera.git/
+
+Issue Tracker
+-------------
+
+Our `issue tracker`_ tracks all bugs, issues and feature requests. All issues
+are publicly visible, and you can register for an account to create new issues.
+
+.. _issue tracker: https://bugs.libcamera.org/
Documentation
-------------
@@ -42,8 +60,8 @@ Documentation
Project documentation is created using `Sphinx`_. Source level documentation
uses `Doxygen`_. Please make sure to document all code during development.
-.. _Sphinx: http://www.sphinx-doc.org
-.. _Doxygen: http://www.doxygen.nl
+.. _Sphinx: https://www.sphinx-doc.org
+.. _Doxygen: https://www.doxygen.nl
Submitting Patches
------------------
@@ -54,17 +72,71 @@ code that is as easy to read, understand and maintain as possible. This is
made possible by a set of :ref:`coding-style-guidelines` that all submissions
are expected to follow.
+We also care about the quality of commit messages. A good commit message not
+only describes what a commit does, but why it does so. By conveying clear
+information about the purpose of the commit, it helps speeding up reviews.
+Regardless of whether you're new to git or have years of experience,
+https://cbea.ms/git-commit/ is always a good guide to read to improve your
+commit message writing skills.
+
+The patch submission process for libcamera is similar to the Linux kernel, and
+goes through the `libcamera-devel`_ mailing list. If you have no previous
+experience with ``git-send-email``, or just experience trouble configuring it
+for your e-mail provider, the sourcehut developers have put together a detailed
+guide available at https://git-send-email.io/.
+
Patches submitted to the libcamera project must be certified as suitable for
integration into an open source project. As such libcamera follows the same
model as utilised by the Linux kernel, and requires the use of 'Signed-off-by:'
tags in all patches.
By signing your contributions you are certifying your work in accordance with
-the `Developer's Certificate of Origin`_
+the following:
+
+`Developer's Certificate of Origin`_
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Version 1.1
+
+Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
+1 Letterman Drive
+Suite D4700
+San Francisco, CA, 94129
+
+Everyone is permitted to copy and distribute verbatim copies of this
+license document, but changing it is not allowed.
+
+Developer's Certificate of Origin 1.1
+
+By making a contribution to this project, I certify that:
+
+(a) The contribution was created in whole or in part by me and I
+ have the right to submit it under the open source license
+ indicated in the file; or
+
+(b) The contribution is based upon previous work that, to the best
+ of my knowledge, is covered under an appropriate open source
+ license and I have the right under that license to submit that
+ work with modifications, whether created in whole or in part
+ by me, under the same open source license (unless I am
+ permitted to submit under a different license), as indicated
+ in the file; or
+
+(c) The contribution was provided directly to me by some other
+ person who certified (a), (b) or (c) and I have not modified
+ it.
+
+(d) I understand and agree that this project and the contribution
+ are public and that a record of the contribution (including all
+ personal information I submit with it, including my sign-off) is
+ maintained indefinitely and may be redistributed consistent with
+ this project or the open source license(s) involved.
+
.. _Developer's Certificate of Origin: https://developercertificate.org/
.. toctree::
:hidden:
+ Code of Conduct <code-of-conduct>
Coding Style <coding-style>
diff --git a/Documentation/docs.rst b/Documentation/docs.rst
deleted file mode 100644
index 7cb60596..00000000
--- a/Documentation/docs.rst
+++ /dev/null
@@ -1,398 +0,0 @@
-.. contents::
- :local:
-
-*************
-Documentation
-*************
-
-.. toctree::
- :hidden:
-
- API <api-html/index>
-
-API
-===
-
-The libcamera API is extensively documented using Doxygen. The :ref:`API
-nightly build <api>` contains the most up-to-date API documentation, built from
-the latest master branch.
-
-Feature Requirements
-====================
-
-Device enumeration
-------------------
-
-The library shall support enumerating all camera devices available in the
-system, including both fixed cameras and hotpluggable cameras. It shall
-support cameras plugged and unplugged after the initialization of the
-library, and shall offer a mechanism to notify applications of camera plug
-and unplug.
-
-The following types of cameras shall be supported:
-
-* Internal cameras designed for point-and-shoot still image and video
- capture usage, either controlled directly by the CPU, or exposed through
- an internal USB bus as a UVC device.
-
-* External UVC cameras designed for video conferencing usage.
-
-Other types of camera, including analog cameras, depth cameras, thermal
-cameras, external digital picture or movie cameras, are out of scope for
-this project.
-
-A hardware device that includes independent camera sensors, such as front
-and back sensors in a phone, shall be considered as multiple camera devices
-for the purpose of this library.
-
-Independent Camera Devices
---------------------------
-
-When multiple cameras are present in the system and are able to operate
-independently from each other, the library shall expose them as multiple
-camera devices and support parallel operation without any additional usage
-restriction apart from the limitations inherent to the hardware (such as
-memory bandwidth, CPU usage or number of CSI-2 receivers for instance).
-
-Independent processes shall be able to use independent cameras devices
-without interfering with each other. A single camera device shall be
-usable by a single process at a time.
-
-Multiple streams support
-------------------------
-
-The library shall support multiple video streams running in parallel
-for each camera device, within the limits imposed by the system.
-
-Per frame controls
-------------------
-
-The library shall support controlling capture parameters for each stream
-on a per-frame basis, on a best effort basis based on the capabilities of the
-hardware and underlying software stack (including kernel drivers and
-firmware). It shall apply capture parameters to the frame they target, and
-report the value of the parameters that have effectively been used for each
-captured frame.
-
-When a camera device supports multiple streams, the library shall allow both
-control of each stream independently, and control of multiple streams
-together. Streams that are controlled together shall be synchronized. No
-synchronization is required for streams controlled independently.
-
-Capability Enumeration
-----------------------
-
-The library shall expose capabilities of each camera device in a way that
-allows applications to discover those capabilities dynamically. Applications
-shall be allowed to cache capabilities for as long as they are using the
-library. If capabilities can change at runtime, the library shall offer a
-mechanism to notify applications of such changes. Applications shall not
-cache capabilities in long term storage between runs.
-
-Capabilities shall be discovered dynamically at runtime from the device when
-possible, and may come, in part or in full, from platform configuration
-data.
-
-Device Profiles
----------------
-
-The library may define different camera device profiles, each with a minimum
-set of required capabilities. Applications may use those profiles to quickly
-determine the level of features exposed by a device without parsing the full
-list of capabilities. Camera devices may implement additional capabilities
-on top of the minimum required set for the profile they expose.
-
-3A and Image Enhancement Algorithms
------------------------------------
-
-The camera devices shall implement auto exposure, auto gain and auto white
-balance. Camera devices that include a focus lens shall implement auto
-focus. Additional image enhancement algorithms, such as noise reduction or
-video stabilization, may be implemented.
-
-All algorithms may be implemented in hardware or firmware outside of the
-library, or in software in the library. They shall all be controllable by
-applications.
-
-The library shall be architectured to isolate the 3A and image enhancement
-algorithms in a component with a documented API, respectively called the 3A
-component and the 3A API. The 3A API shall be stable, and shall allow both
-open-source and closed-source implementations of the 3A component.
-
-The library may include statically-linked open-source 3A components, and
-shall support dynamically-linked open-source and closed-source 3A
-components.
-
-Closed-source 3A Component Sandboxing
--------------------------------------
-
-For security purposes, it may be desired to run closed-source 3A components
-in a separate process. The 3A API would in such a case be transported over
-IPC. The 3A API shall make it possible to use any IPC mechanism that
-supports passing file descriptors.
-
-The library may implement an IPC mechanism, and shall support third-party
-platform-specific IPC mechanisms through the implementation of a
-platform-specific 3A API wrapper. No modification to the library shall be
-needed to use such third-party IPC mechanisms.
-
-The 3A component shall not directly access any device node on the system.
-Such accesses shall instead be performed through the 3A API. The library
-shall validate all accesses and restrict them to what is absolutely required
-by 3A components.
-
-V4L2 Compatibility Layer
-------------------------
-
-The project shall support traditional V4L2 application through an additional
-libcamera wrapper library. The wrapper library shall trap all accesses to
-camera devices through LD_PRELOAD, and route them through libcamera to
-emulate a high-level V4L2 camera device. It shall expose camera device
-features on a best-effort basis, and aim for the level of features
-traditionally available from a UVC camera designed for video conferencing.
-
-Android Camera HAL v3 Compatibility
------------------------------------
-
-The library API shall expose all the features required to implement an
-Android Camera HAL v3 on top of libcamera. Some features of the HAL may be
-omitted as long as they can be implemented separately in the HAL, such as
-JPEG encoding, or YUV reprocessing.
-
-
-Camera Stack
-============
-
-::
-
- a c / +-------------+ +-------------+ +-------------+ +-------------+
- p a | | Native | | Framework | | Native | | Android |
- p t | | V4L2 | | Application | | libcamera | | Camera |
- l i | | Application | | (gstreamer) | | Application | | Framework |
- i o \ +-------------+ +-------------+ +-------------+ +-------------+
- n ^ ^ ^ ^
- | | | |
- l a | | | |
- i d v v | v
- b a / +-------------+ +-------------+ | +-------------+
- c p | | V4L2 | | Camera | | | Android |
- a t | | Compat. | | Framework | | | Camera |
- m a | | | | (gstreamer) | | | HAL |
- e t \ +-------------+ +-------------+ | +-------------+
- r i ^ ^ | ^
- a o | | | |
- n | | | |
- / | ,................................................
- | | ! : Language : !
- l f | | ! : Bindings : !
- i r | | ! : (optional) : !
- b a | | \...............................................'
- c m | | | | |
- a e | | | | |
- m w | v v v v
- e o | +----------------------------------------------------------------+
- r r | | |
- a k | | libcamera |
- | | |
- \ +----------------------------------------------------------------+
- ^ ^ ^
- Userspace | | |
- ------------------------ | ---------------- | ---------------- | ---------------
- Kernel | | |
- v v v
- +-----------+ +-----------+ +-----------+
- | Media | <--> | Video | <--> | V4L2 |
- | Device | | Device | | Subdev |
- +-----------+ +-----------+ +-----------+
-
-The camera stack comprises four software layers. From bottom to top:
-
-* The kernel drivers control the camera hardware and expose a
- low-level interface to userspace through the Linux kernel V4L2
- family of APIs (Media Controller API, V4L2 Video Device API and
- V4L2 Subdev API).
-
-* The libcamera framework is the core part of the stack. It
- handles all control of the camera devices in its core component,
- libcamera, and exposes a native C++ API to upper layers. Optional
- language bindings allow interfacing to libcamera from other
- programming languages.
-
- Those components live in the same source code repository and
- all together constitute the libcamera framework.
-
-* The libcamera adaptation is an umbrella term designating the
- components that interface to libcamera in other frameworks.
- Notable examples are a V4L2 compatibility layer, a gstreamer
- libcamera element, and an Android camera HAL implementation based
- on libcamera.
-
- Those components can live in the libcamera project source code
- in separate repositories, or move to their respective project's
- repository (for instance the gstreamer libcamera element).</p>
-
-* The applications and upper level frameworks are based on the
- libcamera framework or libcamera adaptation, and are outside of
- the scope of the libcamera project.
-
-
-libcamera Architecture
-======================
-
-::
-
- ---------------------------< libcamera Public API >---------------------------
- ^ ^
- | |
- v v
- +-------------+ +-------------------------------------------------+
- | Camera | | Camera Device |
- | Devices | | +---------------------------------------------+ |
- | Manager | | | Device-Agnostic | |
- +-------------+ | | | |
- ^ | | +------------------------+ |
- | | | | ~~~~~~~~~~~~~~~~~~~~~ |
- | | | | { +---------------+ } |
- | | | | } | ////Image//// | { |
- | | | | <-> | /Processing// | } |
- | | | | } | /Algorithms// | { |
- | | | | { +---------------+ } |
- | | | | ~~~~~~~~~~~~~~~~~~~~~ |
- | | | | ======================== |
- | | | | +---------------+ |
- | | | | | //Pipeline/// | |
- | | | | <-> | ///Handler/// | |
- | | | | | ///////////// | |
- | | +--------------------+ +---------------+ |
- | | Device-Specific |
- | +-------------------------------------------------+
- | ^ ^
- | | |
- v v v
- +--------------------------------------------------------------------+
- | Helpers and Support Classes |
- | +-------------+ +-------------+ +-------------+ +-------------+ |
- | | MC & V4L2 | | Buffers | | Sandboxing | | Plugins | |
- | | Support | | Allocator | | IPC | | Manager | |
- | +-------------+ +-------------+ +-------------+ +-------------+ |
- | +-------------+ +-------------+ |
- | | Pipeline | | ... | |
- | | Runner | | | |
- | +-------------+ +-------------+ |
- +--------------------------------------------------------------------+
-
- /// Device-Specific Components
- ~~~ Sandboxing
-
-While offering a unified API towards upper layers, and presenting
-itself as a single library, libcamera isn't monolithic. It exposes
-multiple components through its public API, is built around a set of
-separate helpers internally, uses device-specific components and can
-load dynamic plugins.
-
-Camera Devices Manager
- The Camera Devices Manager provides a view of available cameras
- in the system. It performs cold enumeration and runtime camera
- management, and supports a hotplug notification mechanism in its
- public API.
-
- To avoid the cost associated with cold enumeration of all devices
- at application start, and to arbitrate concurrent access to camera
- devices, the Camera Devices Manager could later be split to a
- separate service, possibly with integration in platform-specific
- device management.
-
-Camera Device
- The Camera Device represents a camera device to upper layers. It
- exposes full control of the device through the public API, and is
- thus the highest level object exposed by libcamera.
-
- Camera Device instances are created by the Camera Devices
- Manager. An optional method to create new instances could be exposed
- through the public API to speed up initialization when the upper
- layer knows how to directly address camera devices present in the
- system.
-
-Pipeline Handler
- The Pipeline Handler manages complex pipelines exposed by the kernel drivers
- through the Media Controller and V4L2 APIs. It abstracts pipeline handling to
- hide device-specific details to the rest of the library, and implements both
- pipeline configuration based on stream configuration, and pipeline runtime
- execution and scheduling when needed by the device.
-
- This component is device-specific and is part of the libcamera code base. As
- such it is covered by the same free software license as the rest of libcamera
- and needs to be contributed upstream by device vendors. The Pipeline Handler
- lives in the same process as the rest of the library, and has access to all
- helpers and kernel camera-related devices.</p>
-
-Image Processing Algorithms
- Together with the hardware image processing and hardware statistics
- collection, the Image Processing Algorithms implement 3A (Auto-Exposure,
- Auto-White Balance and Auto-Focus) and other algorithms. They run on the CPU
- and interact with the kernel camera devices to control hardware image
- processing based on the parameters supplied by upper layers, closing the
- control loop of the ISP.
-
- This component is device-specific and is loaded as an external plugin. It can
- be part of the libcamera code base, in which case it is covered by the same
- license, or provided externally as an open-source or closed-source component.
-
- The component is sandboxed and can only interact with libcamera through
- internal APIs specifically marked as such. In particular it will have no
- direct access to kernel camera devices, and all its accesses to image and
- metadata will be mediated by dmabuf instances explicitly passed to the
- component. The component must be prepared to run in a process separate from
- the main libcamera process, and to have a very restricted view of the system,
- including no access to networking APIs and limited access to file systems.
-
- The sandboxing mechanism isn't defined by libcamera. One example
- implementation will be provided as part of the project, and platforms vendors
- will be able to provide their own sandboxing mechanism as a plugin.
-
- libcamera should provide a basic implementation of Image Processing
- Algorithms, to serve as a reference for the internal API. Device vendors are
- expected to provide a full-fledged implementation compatible with their
- Pipeline Handler. One goal of the libcamera project is to create an
- environment in which the community will be able to compete with the
- closed-source vendor binaries and develop a high quality open source
- implementation.
-
-Helpers and Support Classes
- While Pipeline Handlers are device-specific, implementations are expected to
- share code due to usage of identical APIs towards the kernel camera drivers
- and the Image Processing Algorithms. This includes without limitation handling
- of the MC and V4L2 APIs, buffer management through dmabuf, and pipeline
- discovery, configuration and scheduling. Such code will be factored out to
- helpers when applicable.
-
- Other parts of libcamera will also benefit from factoring code out to
- self-contained support classes, even if such code is present only once in the
- code base, in order to keep the source code clean and easy to read. This
- should be the case for instance for plugin management.
-
-
-V4L2 Compatibility Layer
-------------------------
-
-V4L2 compatibility is achieved through a shared library that traps all
-accesses to camera devices and routes them to libcamera to emulate high-level
-V4L2 camera devices. It is injected in a process address space through
-LD_PRELOAD and is completely transparent for applications.
-
-The compatibility layer exposes camera device features on a best-effort basis,
-and aims for the level of features traditionally available from a UVC camera
-designed for video conferencing.
-
-
-Android Camera HAL
-------------------
-
-Camera support for Android is achieved through a generic Android
-camera HAL implementation on top of libcamera. The HAL will implement internally
-features required by Android and missing from libcamera, such as JPEG encoding
-support.
-
-The Android camera HAL implementation will initially target the
-LIMITED hardware level, with support for the FULL level then being gradually
-implemented.
diff --git a/Documentation/documentation-contents.rst b/Documentation/documentation-contents.rst
new file mode 100644
index 00000000..5c111849
--- /dev/null
+++ b/Documentation/documentation-contents.rst
@@ -0,0 +1,35 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. container:: documentation-nav
+
+ * **Documentation for Users**
+ * :doc:`Introduction </introduction>`
+ * :doc:`/feature_requirements`
+ * :doc:`/guides/application-developer`
+ * :doc:`/python-bindings`
+ * :doc:`/environment_variables`
+ * :doc:`/api-html/index`
+ * :doc:`/code-of-conduct`
+ * |
+ * **Documentation for Developers**
+ * :doc:`/libcamera_architecture`
+ * :doc:`/guides/pipeline-handler`
+ * :doc:`/guides/ipa`
+ * :doc:`/camera-sensor-model`
+ * :doc:`/guides/tracing`
+ * :doc:`/software-isp-benchmarking`
+ * :doc:`/coding-style`
+ * :doc:`/internal-api-html/index`
+ * |
+ * **Documentation for System Integrators**
+ * :doc:`/lens_driver_requirements`
+ * :doc:`/sensor_driver_requirements`
+
+..
+ The following directive adds the "documentation" class to all of the pages
+ generated by sphinx. This is not relevant in libcamera nor addressed in the
+ theme's CSS, since all of the pages here are documentation. It **is** used
+ to properly format the documentation pages on libcamera.org and so should not
+ be removed.
+
+.. rst-class:: documentation
diff --git a/Documentation/environment_variables.rst b/Documentation/environment_variables.rst
new file mode 100644
index 00000000..7da9883a
--- /dev/null
+++ b/Documentation/environment_variables.rst
@@ -0,0 +1,176 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+Environment variables
+=====================
+
+The libcamera behaviour can be tuned through environment variables. This
+document lists all the available variables and describes their usage.
+
+List of variables
+-----------------
+
+LIBCAMERA_LOG_FILE
+ The custom destination for log output.
+
+ Example value: ``/home/{user}/camera_log.log``
+
+LIBCAMERA_LOG_LEVELS
+ Configure the verbosity of log messages for different categories (`more <Log levels_>`__).
+
+ Example value: ``*:DEBUG``
+
+LIBCAMERA_LOG_NO_COLOR
+ Disable coloring of log messages (`more <Notes about debugging_>`__).
+
+LIBCAMERA_IPA_CONFIG_PATH
+ Define custom search locations for IPA configurations (`more <IPA configuration_>`__).
+
+ Example value: ``${HOME}/.libcamera/share/ipa:/opt/libcamera/vendor/share/ipa``
+
+LIBCAMERA_IPA_FORCE_ISOLATION
+ When set to a non-empty string, force process isolation of all IPA modules.
+
+ Example value: ``1``
+
+LIBCAMERA_IPA_MODULE_PATH
+ Define custom search locations for IPA modules (`more <IPA module_>`__).
+
+ Example value: ``${HOME}/.libcamera/lib:/opt/libcamera/vendor/lib``
+
+LIBCAMERA_IPA_PROXY_PATH
+ Define custom full path for a proxy worker for a given executable name.
+
+ Example value: ``${HOME}/.libcamera/proxy/worker:/opt/libcamera/vendor/proxy/worker``
+
+LIBCAMERA_PIPELINES_MATCH_LIST
+ Define an ordered list of pipeline names to be used to match the media
+ devices in the system. The pipeline handler names used to populate the
+ variable are the ones passed to the REGISTER_PIPELINE_HANDLER() macro in the
+ source code.
+
+ Example value: ``rkisp1,simple``
+
+LIBCAMERA_RPI_CONFIG_FILE
+ Define a custom configuration file to use in the Raspberry Pi pipeline handler.
+
+ Example value: ``/usr/local/share/libcamera/pipeline/rpi/vc4/minimal_mem.yaml``
+
+LIBCAMERA_RPI_TUNING_FILE
+ Define a custom JSON tuning file to use in the Raspberry Pi.
+
+ Example value: ``/usr/local/share/libcamera/ipa/rpi/vc4/custom_sensor.json``
+
+Further details
+---------------
+
+Notes about debugging
+~~~~~~~~~~~~~~~~~~~~~
+
+The environment variables ``LIBCAMERA_LOG_FILE``, ``LIBCAMERA_LOG_LEVELS`` and
+``LIBCAMERA_LOG_NO_COLOR`` are used to modify the default configuration of the
+libcamera logger.
+
+By default, libcamera logs all messages to the standard error (std::cerr).
+Messages are colored by default depending on the log level. Coloring can be
+disabled by setting the ``LIBCAMERA_LOG_NO_COLOR`` environment variable.
+
+The default log destination can also be directed to a file by setting the
+``LIBCAMERA_LOG_FILE`` environment variable to the log file name. This also
+disables coloring.
+
+Log levels are controlled through the ``LIBCAMERA_LOG_LEVELS`` variable, which
+accepts a comma-separated list of 'category:level' pairs.
+
+The `level <Log levels_>`__ part is mandatory and can either be specified by
+name or by numerical index associated with each level.
+
+The optional `category <Log categories_>`__ is a string matching the categories
+defined by each file in the source base using the logging infrastructure. It
+can include a wildcard ('*') character at the end to match multiple categories.
+
+For more information refer to the `API documentation <https://libcamera.org/api-html/log_8h.html#details>`__.
+
+Examples:
+
+Enable full debug output to a separate file, for every `category <Log categories_>`__
+within a local environment:
+
+.. code:: bash
+
+ :~$ LIBCAMERA_LOG_FILE='/tmp/example_log.log' \
+ LIBCAMERA_LOG_LEVELS=0 \
+ cam --list
+
+Enable full debug output for the categories ``Camera`` and ``V4L2`` within a
+global environment:
+
+.. code:: bash
+
+ :~$ export LIBCAMERA_LOG_LEVELS='Camera:DEBUG,V4L2:DEBUG'
+ :~$ cam --list
+
+Log levels
+~~~~~~~~~~
+
+This is the list of available log levels, notice that all levels below
+the chosen one are printed, while those above are discarded.
+
+- DEBUG (0)
+- INFO (1)
+- WARN (2)
+- ERROR (3)
+- FATAL (4)
+
+Example:
+If you choose WARN (2), you will be able to see WARN (2), ERROR (3) and FATAL (4)
+but not DEBUG (0) and INFO (1).
+
+Log categories
+~~~~~~~~~~~~~~
+
+Every category represents a specific area of the libcamera codebase,
+the names can be located within the source code, for example:
+`src/libcamera/camera_manager.cpp <https://git.libcamera.org/libcamera/libcamera.git/tree/src/libcamera/camera_manager.cpp#n35>`__
+
+.. code:: cpp
+
+ LOG_DEFINE_CATEGORY(Camera)
+
+There are two available macros used to assign a category name to a part of the
+libcamera codebase:
+
+LOG_DEFINE_CATEGORY
+ This macro is required, in order to use the ``LOGC`` macro for a particular
+ category. It can only be used once for each category. If you want to create
+ log messages within multiple compilation units for the same category utilize
+ the ``LOG_DECLARE_CATEGORY`` macro, in every file except the definition file.
+LOG_DECLARE_CATEGORY
+ Used for sharing an already defined category between multiple separate
+ compilation units.
+
+Both macros have to be used within the libcamera namespace of the C++ source
+code.
+
+IPA configuration
+~~~~~~~~~~~~~~~~~
+
+IPA modules use configuration files to store parameters. The format and
+contents of the configuration files is specific to the IPA module. They usually
+contain tuning parameters for the algorithms, in JSON format.
+
+The ``LIBCAMERA_IPA_CONFIG_PATH`` variable can be used to specify custom
+storage locations to search for those configuration files.
+
+`Examples <https://git.libcamera.org/libcamera/libcamera.git/tree/src/ipa/rpi/vc4/data>`__
+
+IPA module
+~~~~~~~~~~
+
+In order to locate the correct IPA module for your hardware, libcamera gathers
+existing IPA modules from multiple locations. The default locations for this
+operation are the installed system path (for example on Debian:
+``/usr/local/x86_64-pc-linux-gnu/libcamera``) and the build directory.
+With the ``LIBCAMERA_IPA_MODULE_PATH``, you can specify a non-default location
+to search for IPA modules.
diff --git a/Documentation/feature_requirements.rst b/Documentation/feature_requirements.rst
new file mode 100644
index 00000000..e6b74a62
--- /dev/null
+++ b/Documentation/feature_requirements.rst
@@ -0,0 +1,150 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+Feature Requirements
+====================
+
+Device enumeration
+------------------
+
+The library shall support enumerating all camera devices available in the
+system, including both fixed cameras and hotpluggable cameras. It shall
+support cameras plugged and unplugged after the initialization of the
+library, and shall offer a mechanism to notify applications of camera plug
+and unplug.
+
+The following types of cameras shall be supported:
+
+* Internal cameras designed for point-and-shoot still image and video
+ capture usage, either controlled directly by the CPU, or exposed through
+ an internal USB bus as a UVC device.
+
+* External UVC cameras designed for video conferencing usage.
+
+Other types of camera, including analog cameras, depth cameras, thermal
+cameras, external digital picture or movie cameras, are out of scope for
+this project.
+
+A hardware device that includes independent camera sensors, such as front
+and back sensors in a phone, shall be considered as multiple camera devices
+for the purpose of this library.
+
+Independent Camera Devices
+--------------------------
+
+When multiple cameras are present in the system and are able to operate
+independently from each other, the library shall expose them as multiple
+camera devices and support parallel operation without any additional usage
+restriction apart from the limitations inherent to the hardware (such as
+memory bandwidth, CPU usage or number of CSI-2 receivers for instance).
+
+Independent processes shall be able to use independent cameras devices
+without interfering with each other. A single camera device shall be
+usable by a single process at a time.
+
+Multiple streams support
+------------------------
+
+The library shall support multiple video streams running in parallel
+for each camera device, within the limits imposed by the system.
+
+Per frame controls
+------------------
+
+The library shall support controlling capture parameters for each stream
+on a per-frame basis, on a best effort basis based on the capabilities of the
+hardware and underlying software stack (including kernel drivers and
+firmware). It shall apply capture parameters to the frame they target, and
+report the value of the parameters that have effectively been used for each
+captured frame.
+
+When a camera device supports multiple streams, the library shall allow both
+control of each stream independently, and control of multiple streams
+together. Streams that are controlled together shall be synchronized. No
+synchronization is required for streams controlled independently.
+
+Capability Enumeration
+----------------------
+
+The library shall expose capabilities of each camera device in a way that
+allows applications to discover those capabilities dynamically. Applications
+shall be allowed to cache capabilities for as long as they are using the
+library. If capabilities can change at runtime, the library shall offer a
+mechanism to notify applications of such changes. Applications shall not
+cache capabilities in long term storage between runs.
+
+Capabilities shall be discovered dynamically at runtime from the device when
+possible, and may come, in part or in full, from platform configuration
+data.
+
+Device Profiles
+---------------
+
+The library may define different camera device profiles, each with a minimum
+set of required capabilities. Applications may use those profiles to quickly
+determine the level of features exposed by a device without parsing the full
+list of capabilities. Camera devices may implement additional capabilities
+on top of the minimum required set for the profile they expose.
+
+3A and Image Enhancement Algorithms
+-----------------------------------
+
+The library shall provide a basic implementation of Image Processing Algorithms
+to serve as a reference for the internal API. This shall including auto exposure
+and gain and auto white balance. Camera devices that include a focus lens shall
+implement auto focus. Additional image enhancement algorithms, such as noise
+reduction or video stabilization, may be implemented. Device vendors are
+expected to provide a fully-fledged implementation compatible with their
+Pipeline Handler. One goal of the libcamera project is to create an environment
+in which the community will be able to compete with the closed-source vendor
+biaries and develop a high quality open source implementation.
+
+All algorithms may be implemented in hardware or firmware outside of the
+library, or in software in the library. They shall all be controllable by
+applications.
+
+The library shall be architectured to isolate the 3A and image enhancement
+algorithms in a component with a documented API, respectively called the 3A
+component and the 3A API. The 3A API shall be stable, and shall allow both
+open-source and closed-source implementations of the 3A component.
+
+The library may include statically-linked open-source 3A components, and
+shall support dynamically-linked open-source and closed-source 3A
+components.
+
+Closed-source 3A Component Sandboxing
+-------------------------------------
+
+For security purposes, it may be desired to run closed-source 3A components
+in a separate process. The 3A API would in such a case be transported over
+IPC. The 3A API shall make it possible to use any IPC mechanism that
+supports passing file descriptors.
+
+The library may implement an IPC mechanism, and shall support third-party
+platform-specific IPC mechanisms through the implementation of a
+platform-specific 3A API wrapper. No modification to the library shall be
+needed to use such third-party IPC mechanisms.
+
+The 3A component shall not directly access any device node on the system.
+Such accesses shall instead be performed through the 3A API. The library
+shall validate all accesses and restrict them to what is absolutely required
+by 3A components.
+
+V4L2 Compatibility Layer
+------------------------
+
+The project shall support traditional V4L2 application through an additional
+libcamera wrapper library. The wrapper library shall trap all accesses to
+camera devices through `LD_PRELOAD`, and route them through libcamera to
+emulate a high-level V4L2 camera device. It shall expose camera device
+features on a best-effort basis, and aim for the level of features
+traditionally available from a UVC camera designed for video conferencing.
+
+Android Camera HAL v3 Compatibility
+-----------------------------------
+
+The library API shall expose all the features required to implement an
+Android Camera HAL v3 on top of libcamera. Some features of the HAL may be
+omitted as long as they can be implemented separately in the HAL, such as
+JPEG encoding, or YUV reprocessing.
diff --git a/Documentation/gen-doxyfile.py b/Documentation/gen-doxyfile.py
new file mode 100755
index 00000000..c265bc2f
--- /dev/null
+++ b/Documentation/gen-doxyfile.py
@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0-or-later
+# Copyright (C) 2024, Google Inc.
+#
+# Author: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+#
+# Generate Doxyfile from a template
+
+import argparse
+import os
+import string
+import sys
+
+
+def fill_template(template, data):
+
+ template = open(template, 'rb').read()
+ template = template.decode('utf-8')
+ template = string.Template(template)
+
+ return template.substitute(data)
+
+
+def main(argv):
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-o', dest='output', metavar='file',
+ type=argparse.FileType('w', encoding='utf-8'),
+ default=sys.stdout,
+ help='Output file name (default: standard output)')
+ parser.add_argument('template', metavar='doxyfile.tmpl', type=str,
+ help='Doxyfile template')
+ parser.add_argument('inputs', type=str, nargs='*',
+ help='Input files')
+
+ args = parser.parse_args(argv[1:])
+
+ inputs = [f'"{os.path.realpath(input)}"' for input in args.inputs]
+ data = fill_template(args.template, {'inputs': (' \\\n' + ' ' * 25).join(inputs)})
+ args.output.write(data)
+
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv))
diff --git a/Documentation/getting-started.rst b/Documentation/getting-started.rst
new file mode 100644
index 00000000..63b050eb
--- /dev/null
+++ b/Documentation/getting-started.rst
@@ -0,0 +1,6 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. Getting started information is defined in the project README file.
+.. include:: ../README.rst
+ :start-after: .. section-begin-getting-started
+ :end-before: .. section-end-getting-started
diff --git a/Documentation/guides/application-developer.rst b/Documentation/guides/application-developer.rst
new file mode 100644
index 00000000..25beb55d
--- /dev/null
+++ b/Documentation/guides/application-developer.rst
@@ -0,0 +1,641 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: ../documentation-contents.rst
+
+Using libcamera in a C++ application
+====================================
+
+This tutorial shows how to create a C++ application that uses libcamera to
+interface with a camera on a system, capture frames from it for 3 seconds, and
+write metadata about the frames to standard output.
+
+Application skeleton
+--------------------
+
+Most of the code in this tutorial runs in the ``int main()`` function
+with a separate global function to handle events. The two functions need
+to share data, which are stored in global variables for simplicity. A
+production-ready application would organize the various objects created
+in classes, and the event handler would be a class member function to
+provide context data without requiring global variables.
+
+Use the following code snippets as the initial application skeleton.
+It already lists all the necessary includes directives and instructs the
+compiler to use the libcamera namespace, which gives access to the libcamera
+defined names and types without the need of prefixing them.
+
+.. code:: cpp
+
+ #include <iomanip>
+ #include <iostream>
+ #include <memory>
+ #include <thread>
+
+ #include <libcamera/libcamera.h>
+
+ using namespace libcamera;
+ using namespace std::chrono_literals;
+
+ int main()
+ {
+ // Code to follow
+
+ return 0;
+ }
+
+Camera Manager
+--------------
+
+Every libcamera-based application needs an instance of a `CameraManager`_ that
+runs for the life of the application. When the Camera Manager starts, it
+enumerates all the cameras detected in the system. Behind the scenes, libcamera
+abstracts and manages the complex pipelines that kernel drivers expose through
+the `Linux Media Controller`_ and `Video for Linux`_ (V4L2) APIs, meaning that
+an application doesn't need to handle device or driver specific details.
+
+.. _CameraManager: https://libcamera.org/api-html/classlibcamera_1_1CameraManager.html
+.. _Linux Media Controller: https://www.kernel.org/doc/html/latest/media/uapi/mediactl/media-controller-intro.html
+.. _Video for Linux: https://www.linuxtv.org/docs.php
+
+Before the ``int main()`` function, create a global shared pointer
+variable for the camera to support the event call back later:
+
+.. code:: cpp
+
+ static std::shared_ptr<Camera> camera;
+
+Create a Camera Manager instance at the beginning of the main function, and then
+start it. An application must only create a single Camera Manager instance.
+
+The CameraManager can be stored in a unique_ptr to automate deleting the
+instance when it is no longer used, but care must be taken to ensure all
+cameras are released explicitly before this happens.
+
+.. code:: cpp
+
+ std::unique_ptr<CameraManager> cm = std::make_unique<CameraManager>();
+ cm->start();
+
+During the application initialization, the Camera Manager is started to
+enumerate all the supported devices and create cameras that the application can
+interact with.
+
+Once the camera manager is started, we can use it to iterate the available
+cameras in the system:
+
+.. code:: cpp
+
+ for (auto const &camera : cm->cameras())
+ std::cout << camera->id() << std::endl;
+
+Printing the camera id lists the machine-readable unique identifiers, so for
+example, the output on a Linux machine with a connected USB webcam is
+``\_SB_.PCI0.XHC_.RHUB.HS08-8:1.0-5986:2115``.
+
+What libcamera considers a camera
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The libcamera library considers any unique source of video frames, which usually
+correspond to a camera sensor, as a single camera device. Camera devices expose
+streams, which are obtained by processing data from the single image source and
+all share some basic properties such as the frame duration and the image
+exposure time, as they only depend by the image source configuration.
+
+Applications select one or multiple Camera devices they wish to operate on, and
+require frames from at least one of their Streams.
+
+Create and acquire a camera
+---------------------------
+
+This example application uses a single camera (the first enumerated one) that
+the Camera Manager reports as available to applications.
+
+Camera devices are stored by the CameraManager in a list accessible by index, or
+can be retrieved by name through the ``CameraManager::get()`` function. The
+code below retrieves the name of the first available camera and gets the camera
+by name from the Camera Manager, after making sure that at least one camera is
+available.
+
+.. code:: cpp
+
+ auto cameras = cm->cameras();
+ if (cameras.empty()) {
+ std::cout << "No cameras were identified on the system."
+ << std::endl;
+ cm->stop();
+ return EXIT_FAILURE;
+ }
+
+ std::string cameraId = cameras[0]->id();
+
+ auto camera = cm->get(cameraId);
+ /*
+ * Note that `camera` may not compare equal to `cameras[0]`.
+ * In fact, it might simply be a `nullptr`, as the particular
+ * device might have disappeared (and reappeared) in the meantime.
+ */
+
+Once a camera has been selected an application needs to acquire an exclusive
+lock to it so no other application can use it.
+
+.. code:: cpp
+
+ camera->acquire();
+
+Configure the camera
+--------------------
+
+Before the application can do anything with the camera, it needs to configure
+the image format and sizes of the streams it wants to capture frames from.
+
+Stream configurations are represented by instances of the
+``StreamConfiguration`` class, which are grouped together in a
+``CameraConfiguration`` object. Before an application can start setting its
+desired configuration, a ``CameraConfiguration`` instance needs to be generated
+from the ``Camera`` device using the ``Camera::generateConfiguration()``
+function.
+
+The libcamera library uses the ``StreamRole`` enumeration to define predefined
+ways an application intends to use a camera. The
+``Camera::generateConfiguration()`` function accepts a list of desired roles and
+generates a ``CameraConfiguration`` with the best stream parameters
+configuration for each of the requested roles. If the camera can handle the
+requested roles, it returns an initialized ``CameraConfiguration`` and a null
+pointer if it can't.
+
+It is possible for applications to generate an empty ``CameraConfiguration``
+instance by not providing any role. The desired configuration will have to be
+filled-in manually and manually validated.
+
+In the example application, create a new configuration variable and use the
+``Camera::generateConfiguration`` function to produce a ``CameraConfiguration``
+for the single ``StreamRole::Viewfinder`` role.
+
+.. code:: cpp
+
+ std::unique_ptr<CameraConfiguration> config = camera->generateConfiguration( { StreamRole::Viewfinder } );
+
+The generated ``CameraConfiguration`` has a ``StreamConfiguration`` instance for
+each ``StreamRole`` the application requested. Each of these has a default size
+and format that the camera assigned, and a list of supported pixel formats and
+sizes.
+
+The code below accesses the first and only ``StreamConfiguration`` item in the
+``CameraConfiguration`` and outputs its parameters to standard output.
+
+.. code:: cpp
+
+ StreamConfiguration &streamConfig = config->at(0);
+ std::cout << "Default viewfinder configuration is: " << streamConfig.toString() << std::endl;
+
+This is expected to output something like:
+
+ ``Default viewfinder configuration is: 1280x720-MJPEG``
+
+Change and validate the configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+With an initialized ``CameraConfiguration``, an application can make changes to
+the parameters it contains, for example, to change the width and height, use the
+following code:
+
+.. code:: cpp
+
+ streamConfig.size.width = 640;
+ streamConfig.size.height = 480;
+
+If an application changes any parameters, it must validate the configuration
+before applying it to the camera using the ``CameraConfiguration::validate()``
+function. If the new values are not supported by the ``Camera`` device, the
+validation process adjusts the parameters to what it considers to be the closest
+supported values.
+
+The ``validate`` function returns a `Status`_ which applications shall check to
+see if the Pipeline Handler adjusted the configuration.
+
+.. _Status: https://libcamera.org/api-html/classlibcamera_1_1CameraConfiguration.html#a64163f21db2fe1ce0a6af5a6f6847744
+
+For example, the code above set the width and height to 640x480, but if the
+camera cannot produce an image that large, it might adjust the configuration to
+the supported size of 320x240 and return ``Adjusted`` as validation status
+result.
+
+If the configuration to validate cannot be adjusted to a set of supported
+values, the validation procedure fails and returns the ``Invalid`` status.
+
+For this example application, the code below prints the adjusted values to
+standard out.
+
+.. code:: cpp
+
+ config->validate();
+ std::cout << "Validated viewfinder configuration is: " << streamConfig.toString() << std::endl;
+
+For example, the output might be something like
+
+ ``Validated viewfinder configuration is: 320x240-MJPEG``
+
+A validated ``CameraConfiguration`` can bet given to the ``Camera`` device to be
+applied to the system.
+
+.. code:: cpp
+
+ camera->configure(config.get());
+
+If an application doesn't first validate the configuration before calling
+``Camera::configure()``, there's a chance that calling the function can fail, if
+the given configuration would have to be adjusted.
+
+Allocate FrameBuffers
+---------------------
+
+An application needs to reserve the memory that libcamera can write incoming
+frames and data to, and that the application can then read. The libcamera
+library uses ``FrameBuffer`` instances to represent memory buffers allocated in
+memory. An application should reserve enough memory for the frame size the
+streams need based on the configured image sizes and formats.
+
+The libcamera library consumes buffers provided by applications as
+``FrameBuffer`` instances, which makes libcamera a consumer of buffers exported
+by other devices (such as displays or video encoders), or allocated from an
+external allocator (such as ION on Android).
+
+In some situations, applications do not have any means to allocate or get hold
+of suitable buffers, for instance, when no other device is involved, or on Linux
+platforms that lack a centralized allocator. The ``FrameBufferAllocator`` class
+provides a buffer allocator an application can use in these situations.
+
+An application doesn't have to use the default ``FrameBufferAllocator`` that
+libcamera provides. It can instead allocate memory manually and pass the buffers
+in ``Request``\s (read more about ``Request`` in `the frame capture section
+<#frame-capture>`_ of this guide). The example in this guide covers using the
+``FrameBufferAllocator`` that libcamera provides.
+
+Using the libcamera ``FrameBufferAllocator``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Applications create a ``FrameBufferAllocator`` for a Camera and use it
+to allocate buffers for streams of a ``CameraConfiguration`` with the
+``allocate()`` function.
+
+The list of allocated buffers can be retrieved using the ``Stream`` instance
+as the parameter of the ``FrameBufferAllocator::buffers()`` function.
+
+.. code:: cpp
+
+ FrameBufferAllocator *allocator = new FrameBufferAllocator(camera);
+
+ for (StreamConfiguration &cfg : *config) {
+ int ret = allocator->allocate(cfg.stream());
+ if (ret < 0) {
+ std::cerr << "Can't allocate buffers" << std::endl;
+ return -ENOMEM;
+ }
+
+ size_t allocated = allocator->buffers(cfg.stream()).size();
+ std::cout << "Allocated " << allocated << " buffers for stream" << std::endl;
+ }
+
+Frame Capture
+~~~~~~~~~~~~~
+
+The libcamera library implements a streaming model based on per-frame requests.
+For each frame an application wants to capture it must queue a request for it to
+the camera. With libcamera, a ``Request`` is at least one ``Stream`` associated
+with a ``FrameBuffer`` representing the memory location where frames have to be
+stored.
+
+First, by using the ``Stream`` instance associated to each
+``StreamConfiguration``, retrieve the list of ``FrameBuffer``\s created for it
+using the frame allocator. Then create a vector of requests to be submitted to
+the camera.
+
+.. code:: cpp
+
+ Stream *stream = streamConfig.stream();
+ const std::vector<std::unique_ptr<FrameBuffer>> &buffers = allocator->buffers(stream);
+ std::vector<std::unique_ptr<Request>> requests;
+
+Proceed to fill the request vector by creating ``Request`` instances from the
+camera device, and associate a buffer for each of them for the ``Stream``.
+
+.. code:: cpp
+
+ for (unsigned int i = 0; i < buffers.size(); ++i) {
+ std::unique_ptr<Request> request = camera->createRequest();
+ if (!request)
+ {
+ std::cerr << "Can't create request" << std::endl;
+ return -ENOMEM;
+ }
+
+ const std::unique_ptr<FrameBuffer> &buffer = buffers[i];
+ int ret = request->addBuffer(stream, buffer.get());
+ if (ret < 0)
+ {
+ std::cerr << "Can't set buffer for request"
+ << std::endl;
+ return ret;
+ }
+
+ requests.push_back(std::move(request));
+ }
+
+.. TODO: Controls
+
+.. TODO: A request can also have controls or parameters that you can apply to the image.
+
+Event handling and callbacks
+----------------------------
+
+The libcamera library uses the concept of `signals and slots` (similar to `Qt
+Signals and Slots`_) to connect events with callbacks to handle them.
+
+.. _signals and slots: https://libcamera.org/api-html/classlibcamera_1_1Signal.html#details
+.. _Qt Signals and Slots: https://doc.qt.io/qt-6/signalsandslots.html
+
+The ``Camera`` device emits two signals that applications can connect to in
+order to execute callbacks on frame completion events.
+
+The ``Camera::bufferCompleted`` signal notifies applications that a buffer with
+image data is available. Receiving notifications about the single buffer
+completion event allows applications to implement partial request completion
+support, and to inspect the buffer content before the request it is part of has
+fully completed.
+
+The ``Camera::requestCompleted`` signal notifies applications that a request
+has completed, which means all the buffers the request contains have now
+completed. Request completion notifications are always emitted in the same order
+as the requests have been queued to the camera.
+
+To receive the signals emission notifications, connect a slot function to the
+signal to handle it in the application code.
+
+.. code:: cpp
+
+ camera->requestCompleted.connect(requestComplete);
+
+For this example application, only the ``Camera::requestCompleted`` signal gets
+handled and the matching ``requestComplete`` slot function outputs information
+about the FrameBuffer to standard output. This callback is typically where an
+application accesses the image data from the camera and does something with it.
+
+Signals operate in the libcamera ``CameraManager`` thread context, so it is
+important not to block the thread for a long time, as this blocks internal
+processing of the camera pipelines, and can affect realtime performance.
+
+Handle request completion events
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Create the ``requestComplete`` function by matching the slot signature:
+
+.. code:: cpp
+
+ static void requestComplete(Request *request)
+ {
+ // Code to follow
+ }
+
+Request completion events can be emitted for requests which have been canceled,
+for example, by unexpected application shutdown. To avoid an application
+processing invalid image data, it's worth checking that the request has
+completed successfully. The list of request completion statuses is available in
+the `Request::Status`_ class enum documentation.
+
+.. _Request::Status: https://www.libcamera.org/api-html/classlibcamera_1_1Request.html#a2209ba8d51af8167b25f6e3e94d5c45b
+
+.. code:: cpp
+
+ if (request->status() == Request::RequestCancelled)
+ return;
+
+If the ``Request`` has completed successfully, applications can access the
+completed buffers using the ``Request::buffers()`` function, which returns a map
+of ``FrameBuffer`` instances associated with the ``Stream`` that produced the
+images.
+
+.. code:: cpp
+
+ const std::map<const Stream *, FrameBuffer *> &buffers = request->buffers();
+
+Iterating through the map allows applications to inspect each completed buffer
+in this request, and access the metadata associated to each frame.
+
+The metadata buffer contains information such the capture status, a timestamp,
+and the bytes used, as described in the `FrameMetadata`_ documentation.
+
+.. _FrameMetaData: https://libcamera.org/api-html/structlibcamera_1_1FrameMetadata.html
+
+.. code:: cpp
+
+ for (auto bufferPair : buffers) {
+ FrameBuffer *buffer = bufferPair.second;
+ const FrameMetadata &metadata = buffer->metadata();
+ }
+
+For this example application, inside the ``for`` loop from above, we can print
+the Frame sequence number and details of the planes.
+
+.. code:: cpp
+
+ std::cout << " seq: " << std::setw(6) << std::setfill('0') << metadata.sequence << " bytesused: ";
+
+ unsigned int nplane = 0;
+ for (const FrameMetadata::Plane &plane : metadata.planes())
+ {
+ std::cout << plane.bytesused;
+ if (++nplane < metadata.planes().size()) std::cout << "/";
+ }
+
+ std::cout << std::endl;
+
+The expected output shows each monotonically increasing frame sequence number
+and the bytes used by planes.
+
+.. code:: text
+
+ seq: 000000 bytesused: 1843200
+ seq: 000002 bytesused: 1843200
+ seq: 000004 bytesused: 1843200
+ seq: 000006 bytesused: 1843200
+ seq: 000008 bytesused: 1843200
+ seq: 000010 bytesused: 1843200
+ seq: 000012 bytesused: 1843200
+ seq: 000014 bytesused: 1843200
+ seq: 000016 bytesused: 1843200
+ seq: 000018 bytesused: 1843200
+ seq: 000020 bytesused: 1843200
+ seq: 000022 bytesused: 1843200
+ seq: 000024 bytesused: 1843200
+ seq: 000026 bytesused: 1843200
+ seq: 000028 bytesused: 1843200
+ seq: 000030 bytesused: 1843200
+ seq: 000032 bytesused: 1843200
+ seq: 000034 bytesused: 1843200
+ seq: 000036 bytesused: 1843200
+ seq: 000038 bytesused: 1843200
+ seq: 000040 bytesused: 1843200
+ seq: 000042 bytesused: 1843200
+
+A completed buffer contains of course image data which can be accessed through
+the per-plane dma-buf file descriptor transported by the ``FrameBuffer``
+instance. An example of how to write image data to disk is available in the
+`FileSink class`_ which is a part of the ``cam`` utility application in the
+libcamera repository.
+
+.. _FileSink class: https://git.libcamera.org/libcamera/libcamera.git/tree/src/apps/cam/file_sink.cpp
+
+With the handling of this request completed, it is possible to re-use the
+request and the associated buffers and re-queue it to the camera
+device:
+
+.. code:: cpp
+
+ request->reuse(Request::ReuseBuffers);
+ camera->queueRequest(request);
+
+Request queueing
+----------------
+
+The ``Camera`` device is now ready to receive frame capture requests and
+actually start delivering frames. In order to prepare for that, an application
+needs to first start the camera, and queue requests to it for them to be
+processed.
+
+In the main() function, just after having connected the
+``Camera::requestCompleted`` signal to the callback handler, start the camera
+and queue all the previously created requests.
+
+.. code:: cpp
+
+ camera->start();
+ for (std::unique_ptr<Request> &request : requests)
+ camera->queueRequest(request.get());
+
+Event processing
+~~~~~~~~~~~~~~~~
+
+libcamera creates an internal execution thread at `CameraManager::start()`_
+time to decouple its own event processing from the application's main thread.
+Applications are thus free to manage their own execution opportunely, and only
+need to respond to events generated by libcamera emitted through signals.
+
+.. _CameraManager::start(): https://libcamera.org/api-html/classlibcamera_1_1CameraManager.html#a49e322880a2a26013bb0076788b298c5
+
+Real-world applications will likely either integrate with the event loop of the
+framework they use, or create their own event loop to respond to user events.
+For the simple application presented in this example, it is enough to prevent
+immediate termination by pausing for 3 seconds. During that time, the libcamera
+thread will generate request completion events that the application will handle
+in the ``requestComplete()`` slot connected to the ``Camera::requestCompleted``
+signal.
+
+.. code:: cpp
+
+ std::this_thread::sleep_for(3000ms);
+
+Clean up and stop the application
+---------------------------------
+
+The application is now finished with the camera and the resources the camera
+uses, so needs to do the following:
+
+- stop the camera
+- free the buffers in the FrameBufferAllocator and delete it
+- release the lock on the camera and reset the pointer to it
+- stop the camera manager
+
+.. code:: cpp
+
+ camera->stop();
+ allocator->free(stream);
+ delete allocator;
+ camera->release();
+ camera.reset();
+ cm->stop();
+
+ return 0;
+
+In this instance the CameraManager will automatically be deleted by the
+unique_ptr implementation when it goes out of scope.
+
+Build and run instructions
+--------------------------
+
+To build the application, we recommend that you use the `Meson build system`_
+which is also the official build system of the libcamera library.
+
+Make sure both ``meson`` and ``libcamera`` are installed in your system. Please
+refer to your distribution documentation to install meson and install the most
+recent version of libcamera from the `git repository`_. You would also need to
+install the ``pkg-config`` tool to correctly identify the libcamera.so object
+install location in the system.
+
+.. _Meson build system: https://mesonbuild.com/
+.. _git repository: https://git.libcamera.org/libcamera/libcamera.git/
+
+Dependencies
+~~~~~~~~~~~~
+
+The test application presented here depends on the libcamera library to be
+available in a path that meson can identify. The libcamera install procedure
+performed using the ``ninja install`` command may by default deploy the
+libcamera components in the ``/usr/local/lib`` path, or a package manager may
+install it to ``/usr/lib`` depending on your distribution. If meson is unable to
+find the location of the libcamera installation, you may need to instruct meson
+to look into a specific path when searching for ``libcamera.so`` by setting the
+``PKG_CONFIG_PATH`` environment variable to the right location.
+
+Adjust the following command to use the ``pkgconfig`` directory where libcamera
+has been installed in your system.
+
+.. code:: shell
+
+ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
+
+Verify that ``pkg-config`` can identify the ``libcamera`` library with
+
+.. code:: shell
+
+ $ pkg-config --libs --cflags libcamera
+ -I/usr/local/include/libcamera -L/usr/local/lib -lcamera -lcamera-base
+
+``meson`` can alternatively use ``cmake`` to locate packages, please refer to
+the ``meson`` documentation if you prefer to use it in place of ``pkgconfig``
+
+Build file
+~~~~~~~~~~
+
+With the dependencies correctly identified, prepare a ``meson.build`` build file
+to be placed in the same directory where the application lives. You can
+name your application as you like, but be sure to update the following snippet
+accordingly. In this example, the application file has been named
+``simple-cam.cpp``.
+
+.. code::
+
+ project('simple-cam', 'cpp')
+
+ simple_cam = executable('simple-cam',
+ 'simple-cam.cpp',
+ dependencies: dependency('libcamera', required : true))
+
+The ``dependencies`` line instructs meson to ask ``pkgconfig`` (or ``cmake``) to
+locate the ``libcamera`` library, which the test application will be
+dynamically linked against.
+
+With the build file in place, compile and run the application with:
+
+.. code:: shell
+
+ $ meson build
+ $ cd build
+ $ ninja
+ $ ./simple-cam
+
+It is possible to increase the library debug output by using environment
+variables which control the library log filtering system:
+
+.. code:: shell
+
+ $ LIBCAMERA_LOG_LEVELS=0 ./simple-cam
diff --git a/Documentation/guides/ipa.rst b/Documentation/guides/ipa.rst
new file mode 100644
index 00000000..cd640563
--- /dev/null
+++ b/Documentation/guides/ipa.rst
@@ -0,0 +1,533 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: ../documentation-contents.rst
+
+IPA Writer's Guide
+==================
+
+IPA modules are Image Processing Algorithm modules. They provide functionality
+that the pipeline handler can use for image processing.
+
+This guide covers the definition of the IPA interface, and how to plumb the
+connection between the pipeline handler and the IPA.
+
+The IPA interface and protocol
+------------------------------
+
+The IPA interface defines the interface between the pipeline handler and the
+IPA. Specifically, it defines the functions that the IPA exposes that the
+pipeline handler can call, and the signals that the pipeline handler can
+connect to, in order to receive data from the IPA asynchronously. In addition,
+it contains any custom data structures that the pipeline handler and IPA may
+pass to each other.
+
+It is possible to use the same IPA interface with multiple pipeline handlers
+on different hardware platforms. Generally in such cases, these platforms would
+have a common hardware ISP pipeline. For instance, the rkisp1 pipeline handler
+supports both the RK3399 and the i.MX8MP as they integrate the same ISP.
+However, the i.MX8MP has a more complex camera pipeline, which may call for a
+dedicated pipeline handler in the future. As the ISP is the same as for RK3399,
+the same IPA interface could be used for both pipeline handlers. The build files
+provide a mapping from pipeline handler to the IPA interface name as detailed in
+:ref:`compiling-section`.
+
+The IPA protocol refers to the agreement between the pipeline handler and the
+IPA regarding the expected response(s) from the IPA for given calls to the IPA.
+This protocol doesn't need to be declared anywhere in code, but it shall be
+documented, as there may be multiple IPA implementations for one pipeline
+handler.
+
+As part of the design of libcamera, IPAs may be isolated in a separate process,
+or run in the same process but a different thread from libcamera. The pipeline
+handler and IPA shall not have to change their operation based on whether the
+IPA is isolated or not, but the possibility of isolation needs to be kept in
+mind. Therefore all data that is passed between them must be serializable, so
+they must be defined separately in the `mojo Interface Definition Language`_
+(IDL), and a code generator will generate headers and serializers corresponding
+to the definitions. Every interface is defined in a mojom file and includes:
+
+- the functions that the pipeline handler can call from the IPA
+- signals in the pipeline handler that the IPA can emit
+- any data structures that are to be passed between the pipeline handler and the IPA
+
+All IPA modules of a given pipeline handler use the same IPA interface. The IPA
+interface definition is thus written by the pipeline handler author, based on
+how they design the interactions between the pipeline handler and the IPA.
+
+The entire IPA interface, including the functions, signals, and any custom
+structs shall be defined in a file named {interface_name}.mojom under
+include/libcamera/ipa/.
+
+.. _mojo Interface Definition Language: https://chromium.googlesource.com/chromium/src.git/+/master/mojo/public/tools/bindings/README.md
+
+Namespacing
+-----------
+
+To avoid name collisions between data types defined by different IPA interfaces
+and data types defined by libcamera, each IPA interface must be defined in its
+own namespace.
+
+The namespace is specific with mojo's module directive. It must be the first
+non-comment line in the mojo data definition file. For example, the Raspberry
+Pi IPA interface uses:
+
+.. code-block:: none
+
+ module ipa.rpi;
+
+This will become the ipa::rpi namespace in C++ code.
+
+Data containers
+---------------
+
+Since the data passed between the pipeline handler and the IPA must support
+serialization, any custom data containers must be defined with the mojo IDL.
+
+The following list of libcamera objects are supported in the interface
+definition, and may be used as function parameter types or struct field types:
+
+- libcamera.ControlInfoMap
+- libcamera.ControlList
+- libcamera.FileDescriptor
+- libcamera.IPABuffer
+- libcamera.IPACameraSensorInfo
+- libcamera.IPASettings
+- libcamera.IPAStream
+- libcamera.Point
+- libcamera.Rectangle
+- libcamera.Size
+- libcamera.SizeRange
+
+To use them, core.mojom must be included in the mojo data definition file:
+
+.. code-block:: none
+
+ import "include/libcamera/ipa/core.mojom";
+
+Other custom structs may be defined and used as well. There is no requirement
+that they must be defined before usage. enums and structs are supported.
+
+The following is an example of a definition of an enum, for the purpose of
+being used as flags:
+
+.. code-block:: none
+
+ enum ConfigParameters {
+ ConfigLsTable = 0x01,
+ ConfigStaggeredWrite = 0x02,
+ ConfigSensor = 0x04,
+ ConfigDropFrames = 0x08,
+ };
+
+The following is an example of a definition of a struct:
+
+.. code-block:: none
+
+ struct ConfigInput {
+ uint32 op;
+ uint32 transform;
+ libcamera.FileDescriptor lsTableHandle;
+ int32 lsTableHandleStatic = -1;
+ map<uint32, libcamera.IPAStream> streamConfig;
+ array<libcamera.IPABuffer> buffers;
+ };
+
+This example has some special things about it. First of all, it uses the
+FileDescriptor data type. This type must be used to ensure that the file
+descriptor that it contains is translated properly across the IPC boundary
+(when the IPA is in an isolated process).
+
+This does mean that if the file descriptor should be sent without being
+translated (for example, for the IPA to tell the pipeline handler which
+fd *that the pipeline handler holds* to act on), then it must be in a
+regular int32 type.
+
+This example also illustrates that struct fields may have default values, as
+is assigned to lsTableHandleStatic. This is the value that the field will
+take when the struct is constructed with the default constructor.
+
+Arrays and maps are supported as well. They are translated to C++ vectors and
+maps, respectively. The members of the arrays and maps are embedded, and cannot
+be const.
+
+Note that nullable fields, static-length arrays, handles, and unions, which
+are supported by mojo, are not supported by our code generator.
+
+The Main IPA interface
+----------------------
+
+The IPA interface is split in two parts, the Main IPA interface, which
+describes the functions that the pipeline handler can call from the IPA,
+and the Event IPA interface, which describes the signals received by the
+pipeline handler that the IPA can emit. Both must be defined. This section
+focuses on the Main IPA interface.
+
+The main interface must be named as IPA{interface_name}Interface.
+
+The functions that the pipeline handler can call from the IPA may be
+synchronous or asynchronous. Synchronous functions do not return until the IPA
+returns from the function, while asynchronous functions return immediately
+without waiting for the IPA to return.
+
+At a minimum, the following three functions must be present (and implemented):
+
+- init();
+- start();
+- stop();
+
+All three of these functions are synchronous. The parameters for start() and
+init() may be customized.
+
+init() initializes the IPA interface. It shall be called before any other
+function of the IPAInterface.
+
+stop() informs the IPA module that the camera is stopped. The IPA module shall
+release resources prepared in start().
+
+A configure() function is recommended. Any ControlInfoMap instances that will be
+used by the IPA must be sent to the IPA from the pipeline handler, at configure
+time, for example.
+
+All input parameters will become const references, except for arithmetic types,
+which will be passed by value. Output parameters will become pointers, unless
+the first output parameter is an int32, or there is only one primitive output
+parameter, in which case it will become a regular return value.
+
+const is not allowed inside of arrays and maps. mojo arrays will become C++
+std::vector<>.
+
+By default, all functions defined in the main interface are synchronous. This
+means that in the case of IPC (i.e. isolated IPA), the function call will not
+return until the return value or output parameters are ready. To specify an
+asynchronous function, the [async] attribute can be used. Asynchronous
+functions must not have any return value or output parameters, since in the
+case of IPC the call needs to return immediately.
+
+It is also possible that the IPA will not be run in isolation. In this case,
+the IPA thread will not exist until start() is called. This means that in the
+case of no isolation, asynchronous calls cannot be made before start(). Since
+the IPA interface must be the same regardless of isolation, the same
+restriction applies to the case of isolation, and any function that will be
+called before start() must be synchronous.
+
+In addition, any call made after start() and before stop() must be
+asynchronous. The motivation for this is to avoid damaging real-time
+performance of the pipeline handler. If the pipeline handler wants some data
+from the IPA, the IPA should return the data asynchronously via an event
+(see "The Event IPA interface").
+
+The following is an example of a main interface definition:
+
+.. code-block:: none
+
+ interface IPARPiInterface {
+ init(libcamera.IPASettings settings, string sensorName)
+ => (int32 ret, bool metadataSupport);
+ start() => (int32 ret);
+ stop();
+
+ configure(libcamera.IPACameraSensorInfo sensorInfo,
+ map<uint32, libcamera.IPAStream> streamConfig,
+ map<uint32, libcamera.ControlInfoMap> entityControls,
+ ConfigInput ipaConfig)
+ => (int32 ret, ConfigOutput results);
+
+ mapBuffers(array<IPABuffer> buffers);
+ unmapBuffers(array<uint32> ids);
+
+ [async] signalStatReady(uint32 bufferId);
+ [async] signalQueueRequest(libcamera.ControlList controls);
+ [async] signalIspPrepare(ISPConfig data);
+ };
+
+
+The first three functions are the required functions. Functions do not need to
+have return values, like stop(), mapBuffers(), and unmapBuffers(). In the case
+of asynchronous functions, as explained before, they *must not* have return
+values.
+
+The Event IPA interface
+-----------------------
+
+The event IPA interface describes the signals received by the pipeline handler
+that the IPA can emit. It must be defined. If there are no event functions,
+then it may be empty. These emissions are meant to notify the pipeline handler
+of some event, such as request data is ready, and *must not* be used to drive
+the camera pipeline from the IPA.
+
+The event interface must be named as IPA{interface_name}EventInterface.
+
+Functions defined in the event interface are implicitly asynchronous.
+Thus they cannot return any value. Specifying the [async] tag is not
+necessary.
+
+Functions defined in the event interface will become signals in the IPA
+interface. The IPA can emit signals, while the pipeline handler can connect
+slots to them.
+
+The following is an example of an event interface definition:
+
+.. code-block:: none
+
+ interface IPARPiEventInterface {
+ statsMetadataComplete(uint32 bufferId,
+ libcamera.ControlList controls);
+ runIsp(uint32 bufferId);
+ embeddedComplete(uint32 bufferId);
+ setIsp(libcamera.ControlList controls);
+ setStaggered(libcamera.ControlList controls);
+ };
+
+.. _compiling-section:
+
+Compiling the IPA interface
+---------------------------
+
+After the IPA interface is defined in include/libcamera/ipa/{interface_name}.mojom,
+an entry for it must be added in meson so that it can be compiled. The filename
+must be added to the pipeline_ipa_mojom_mapping variable in
+include/libcamera/ipa/meson.build. This variable maps the pipeline handler name
+to its IPA interface file.
+
+For example, adding the raspberrypi.mojom file to meson:
+
+.. code-block:: none
+
+ pipeline_ipa_mojom_mapping = [
+ 'rpi/vc4': 'raspberrypi.mojom',
+ ]
+
+This will cause the mojo data definition file to be compiled. Specifically, it
+generates five files:
+
+- a header describing the custom data structures, and the complete IPA
+ interface (at {$build_dir}/include/libcamera/ipa/{interface}_ipa_interface.h)
+
+- a serializer implementing de/serialization for the custom data structures (at
+ {$build_dir}/include/libcamera/ipa/{interface}_ipa_serializer.h)
+
+- a proxy header describing a specialized IPA proxy (at
+ {$build_dir}/include/libcamera/ipa/{interface}_ipa_proxy.h)
+
+- a proxy source implementing the IPA proxy (at
+ {$build_dir}/src/libcamera/proxy/{interface}_ipa_proxy.cpp)
+
+- a proxy worker source implementing the other end of the IPA proxy (at
+ {$build_dir}/src/libcamera/proxy/worker/{interface}_ipa_proxy_worker.cpp)
+
+The IPA proxy serves as the layer between the pipeline handler and the IPA, and
+handles threading vs isolation transparently. The pipeline handler and the IPA
+only require the interface header and the proxy header. The serializer is only
+used internally by the proxy.
+
+Using the custom data structures
+--------------------------------
+
+To use the custom data structures that are defined in the mojo data definition
+file, the following header must be included:
+
+.. code-block:: C++
+
+ #include <libcamera/ipa/{interface_name}_ipa_interface.h>
+
+The POD types of the structs simply become their C++ counterparts, eg. uint32
+in mojo will become uint32_t in C++. mojo map becomes C++ std::map, and mojo
+array becomes C++ std::vector. All members of maps and vectors are embedded,
+and are not pointers. The members cannot be const.
+
+The names of all the fields of structs can be used in C++ in exactly the same
+way as they are defined in the data definition file. For example, the following
+struct as defined in the mojo file:
+
+.. code-block:: none
+
+ struct SensorConfig {
+ uint32 gainDelay = 1;
+ uint32 exposureDelay;
+ uint32 sensorMetadata;
+ };
+
+Will become this in C++:
+
+.. code-block:: C++
+
+ struct SensorConfig {
+ uint32_t gainDelay;
+ uint32_t exposureDelay;
+ uint32_t sensorMetadata;
+ };
+
+The generated structs will also have two constructors, a constructor that
+fills all fields with the default values, and a second constructor that takes
+a value for every field. The default value constructor will fill in the fields
+with the specified default value if it exists. In the above example, `gainDelay_`
+will be initialized to 1. If no default value is specified, then it will be
+filled in as zero (or -1 for a FileDescriptor type).
+
+All fields and constructors/destructors in these generated structs are public.
+
+Using the IPA interface (pipeline handler)
+------------------------------------------
+
+The following headers are necessary to use an IPA in the pipeline handler
+(with raspberrypi as an example):
+
+.. code-block:: C++
+
+ #include <libcamera/ipa/raspberrypi_ipa_interface.h>
+ #include <libcamera/ipa/raspberrypi_ipa_proxy.h>
+
+The first header includes definitions of the custom data structures, and
+the definition of the complete IPA interface (including both the Main and
+the Event IPA interfaces). The name of the header file comes from the name
+of the mojom file, which in this case was raspberrypi.mojom.
+
+The second header includes the definition of the specialized IPA proxy. It
+exposes the complete IPA interface. We will see how to use it in this section.
+
+In the pipeline handler, we first need to construct a specialized IPA proxy.
+From the point of view of the pipeline hander, this is the object that is the
+IPA.
+
+To do so, we invoke the IPAManager:
+
+.. code-block:: C++
+
+ std::unique_ptr<ipa::rpi::IPAProxyRPi> ipa_ =
+ IPAManager::createIPA<ipa::rpi::IPAProxyRPi>(pipe_, 1, 1);
+
+The ipa::rpi namespace comes from the namespace that we defined in the mojo
+data definition file, in the "Namespacing" section. The name of the proxy,
+IPAProxyRPi, comes from the name given to the main IPA interface,
+IPARPiInterface, in the "The Main IPA interface" section.
+
+The return value of IPAManager::createIPA shall be error-checked, to confirm
+that the returned pointer is not a nullptr.
+
+After this, before initializing the IPA, slots should be connected to all of
+the IPA's signals, as defined in the Event IPA interface:
+
+.. code-block:: C++
+
+ ipa_->statsMetadataComplete.connect(this, &RPiCameraData::statsMetadataComplete);
+ ipa_->runIsp.connect(this, &RPiCameraData::runIsp);
+ ipa_->embeddedComplete.connect(this, &RPiCameraData::embeddedComplete);
+ ipa_->setIsp.connect(this, &RPiCameraData::setIsp);
+ ipa_->setStaggered.connect(this, &RPiCameraData::setStaggered);
+
+The slot functions have a function signature based on the function definition
+in the Event IPA interface. All plain old data (POD) types are as-is (with
+their C++ versions, eg. uint32 -> uint32_t), and all structs are const references.
+
+For example, for the following entry in the Event IPA interface:
+
+.. code-block:: none
+
+ statsMetadataComplete(uint32 bufferId, ControlList controls);
+
+A function with the following function signature shall be connected to the
+signal:
+
+.. code-block:: C++
+
+ void statsMetadataComplete(uint32_t bufferId, const ControlList &controls);
+
+After connecting the slots to the signals, the IPA should be initialized
+(using the main interface definition example from earlier):
+
+.. code-block:: C++
+
+ IPASettings settings{};
+ bool metadataSupport;
+ int ret = ipa_->init(settings, "sensor name", &metadataSupport);
+
+At this point, any IPA functions that were defined in the Main IPA interface
+can be called as if they were regular member functions, for example (based on
+the main interface definition example from earlier):
+
+.. code-block:: C++
+
+ ipa_->start();
+ int ret = ipa_->configure(sensorInfo_, streamConfig, entityControls, ipaConfig, &result);
+ ipa_->signalStatReady(RPi::BufferMask::STATS | static_cast<unsigned int>(index));
+
+Remember that any functions designated as asynchronous *must not* be called
+before start().
+
+Notice that for both init() and configure(), the first output parameter is a
+direct return, since it is an int32, while the other output parameter is a
+pointer-based output parameter.
+
+Using the IPA interface (IPA Module)
+------------------------------------
+
+The following header is necessary to implement an IPA Module (with raspberrypi
+as an example):
+
+.. code-block:: C++
+
+ #include <libcamera/ipa/raspberrypi_ipa_interface.h>
+
+This header includes definitions of the custom data structures, and
+the definition of the complete IPA interface (including both the Main and
+the Event IPA interfaces). The name of the header file comes from the name
+of the mojom file, which in this case was raspberrypi.mojom.
+
+The IPA module must implement the IPA interface class that is defined in the
+header. In the case of our example, that is ipa::rpi::IPARPiInterface. The
+ipa::rpi namespace comes from the namespace that we defined in the mojo data
+definition file, in the "Namespacing" section. The name of the interface is the
+same as the name given to the Main IPA interface.
+
+The function signature rules are the same as for the slots in the pipeline
+handler side; PODs are passed by value, and structs are passed by const
+reference. For the Main IPA interface, output values are also allowed (only
+for synchronous calls), so there may be output parameters as well. If the
+first output parameter is a POD it will be returned by value, otherwise
+it will be returned by an output parameter pointer. The second and any other
+output parameters will also be returned by output parameter pointers.
+
+For example, for the following function specification in the Main IPA interface
+definition:
+
+.. code-block:: none
+
+ configure(libcamera.IPACameraSensorInfo sensorInfo,
+ uint32 exampleNumber,
+ map<uint32, libcamera.IPAStream> streamConfig,
+ map<uint32, libcamera.ControlInfoMap> entityControls,
+ ConfigInput ipaConfig)
+ => (int32 ret, ConfigOutput results);
+
+We will need to implement a function with the following function signature:
+
+.. code-block:: C++
+
+ int configure(const IPACameraSensorInfo &sensorInfo,
+ uint32_t exampleNumber,
+ const std::map<unsigned int, IPAStream> &streamConfig,
+ const std::map<unsigned int, ControlInfoMap> &entityControls,
+ const ipa::rpi::ConfigInput &data,
+ ipa::rpi::ConfigOutput *response);
+
+The return value is int, because the first output parameter is int32. The rest
+of the output parameters (in this case, only response) become output parameter
+pointers. The non-POD input parameters become const references, and the POD
+input parameter is passed by value.
+
+At any time after start() and before stop() (though usually only in response to
+an IPA call), the IPA may send data to the pipeline handler by emitting
+signals. These signals are defined in the C++ IPA interface class (which is in
+the generated and included header).
+
+For example, for the following function defined in the Event IPA interface:
+
+.. code-block:: none
+
+ statsMetadataComplete(uint32 bufferId, libcamera.ControlList controls);
+
+We can emit a signal like so:
+
+.. code-block:: C++
+
+ statsMetadataComplete.emit(bufferId & RPi::BufferMask::ID, libcameraMetadata_);
diff --git a/Documentation/guides/pipeline-handler.rst b/Documentation/guides/pipeline-handler.rst
new file mode 100644
index 00000000..69e832a5
--- /dev/null
+++ b/Documentation/guides/pipeline-handler.rst
@@ -0,0 +1,1535 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: ../documentation-contents.rst
+
+Pipeline Handler Writers Guide
+==============================
+
+Pipeline handlers are the abstraction layer for device-specific hardware
+configuration. They access and control hardware through the V4L2 and Media
+Controller kernel interfaces, and implement an internal API to control the ISP
+and capture components of a pipeline directly.
+
+Prerequisite knowledge: system architecture
+-------------------------------------------
+
+A pipeline handler configures and manages the image acquisition and
+transformation pipeline realized by specialized system peripherals combined with
+an image source connected to the system through a data and control bus. The
+presence, number and characteristics of them vary depending on the system design
+and the product integration of the target platform.
+
+System components can be classified in three macro-categories:
+
+.. TODO: Insert references to the open CSI-2 (and other) specification.
+
+- Input ports: Interfaces to external devices, usually image sensors,
+ which transfer data from the physical bus to locations accessible by other
+ system peripherals. An input port needs to be configured according to the
+ input image format and size and could optionally apply basic transformations
+ on the received images, most typically cropping/scaling and some formats
+ conversion. The industry standard for the system typically targeted by
+ libcamera is to have receivers compliant with the MIPI CSI-2 specifications,
+ implemented on a compatible physical layer such as MIPI D-PHY or MIPI C-PHY.
+ Other design are possible but less common, such as LVDS or the legacy BT.601
+ and BT.656 parallel protocols.
+
+- Image Signal Processor (ISP): A specialized media processor which applies
+ digital transformations on image streams. ISPs can be integrated as part of
+ the SoC as a memory interfaced system peripheral or packaged as stand-alone
+ chips connected to the application processor through a bus. Most hardware used
+ by libcamera makes use of in-system ISP designs but pipelines can equally
+ support external ISP chips or be instrumented to use other system resources
+ such as a GPU or an FPGA IP block. ISPs expose a software programming
+ interface that allows the configuration of multiple processing blocks which
+ form an "Image Transformation Pipeline". An ISP usually produces 'processed'
+ image streams along with the metadata describing the processing steps which
+ have been applied to generate the output frames.
+
+- Camera Sensor: Digital components that integrate an image sensor with control
+ electronics and usually a lens. It interfaces to the SoC image receiver ports
+ and is programmed to produce images in a format and size suitable for the
+ current system configuration. Complex camera modules can integrate on-board
+ ISP or DSP chips and process images before delivering them to the system. Most
+ systems with a dedicated ISP processor will usually integrate camera sensors
+ which produce images in Raw Bayer format and defer processing to it.
+
+It is the responsibility of the pipeline handler to interface with these (and
+possibly other) components of the system and implement the following
+functionalities:
+
+- Detect and register camera devices available in the system with an associated
+ set of image streams.
+
+- Configure the image acquisition and processing pipeline by assigning the
+ system resources (memory, shared components, etc.) to satisfy the
+ configuration requested by the application.
+
+- Start and stop the image acquisition and processing sessions.
+
+- Apply configuration settings requested by applications and computed by image
+ processing algorithms integrated in libcamera to the hardware devices.
+
+- Notify applications of the availability of new images and deliver them to the
+ correct locations.
+
+Prerequisite knowledge: libcamera architecture
+----------------------------------------------
+
+A pipeline handler makes use of the following libcamera classes to realize the
+functionalities described above. Below is a brief overview of each of those:
+
+.. TODO: (All) Convert to sphinx refs
+.. TODO: (MediaDevice) Reference to the Media Device API (possibly with versioning requirements)
+.. TODO: (IPAInterface) refer to the IPA guide
+
+- `MediaDevice <https://libcamera.org/api-html/classlibcamera_1_1MediaDevice.html>`_:
+ Instances of this class are associated with a kernel media controller
+ device and its connected objects.
+
+- `DeviceEnumerator <https://libcamera.org/api-html/classlibcamera_1_1DeviceEnumerator.html>`_:
+ Enumerates all media devices attached to the system and the media entities
+ registered with it, by creating instances of the ``MediaDevice`` class and
+ storing them.
+
+- `DeviceMatch <https://libcamera.org/api-html/classlibcamera_1_1DeviceMatch.html>`_:
+ Describes a media device search pattern using entity names, or other
+ properties.
+
+- `V4L2VideoDevice <https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html>`_:
+ Models an instance of a V4L2 video device constructed with the path to a V4L2
+ video device node.
+
+- `V4L2SubDevice <https://libcamera.org/api-html/classlibcamera_1_1V4L2Subdevice.html>`_:
+ Provides an API to the sub-devices that model the hardware components of a
+ V4L2 device.
+
+- `CameraSensor <https://libcamera.org/api-html/classlibcamera_1_1CameraSensor.html>`_:
+ Abstracts camera sensor handling by hiding the details of the V4L2 subdevice
+ kernel API and caching sensor information.
+
+- `Camera::Private <https://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html>`_:
+ Represents device-specific data a pipeline handler associates to each Camera
+ instance.
+
+- `StreamConfiguration <https://libcamera.org/api-html/structlibcamera_1_1StreamConfiguration.html>`_:
+ Models the current configuration of an image stream produced by the camera by
+ reporting its format and sizes.
+
+- `CameraConfiguration <https://libcamera.org/api-html/classlibcamera_1_1CameraConfiguration.html>`_:
+ Represents the current configuration of a camera, which includes a list of
+ stream configurations for each active stream in a capture session. When
+ validated, it is applied to the camera.
+
+- `IPAInterface <https://libcamera.org/api-html/classlibcamera_1_1IPAInterface.html>`_:
+ The interface to the Image Processing Algorithm (IPA) module which performs
+ the computation of the image processing pipeline tuning parameters.
+
+- `ControlList <https://libcamera.org/api-html/classlibcamera_1_1ControlList.html>`_:
+ A list of control items, indexed by Control<> instances or by numerical index
+ which contains values used by application and IPA to change parameters of
+ image streams, used to return to applications and share with IPA the metadata
+ associated with the captured images, and to advertise the immutable camera
+ characteristics enumerated at system initialization time.
+
+Creating a PipelineHandler
+--------------------------
+
+This guide walks through the steps to create a simple pipeline handler
+called “Vivid” that supports the `V4L2 Virtual Video Test Driver`_ (vivid).
+
+To use the vivid test driver, you first need to check that the vivid kernel
+module is loaded, for example with the ``modprobe vivid`` command.
+
+.. _V4L2 Virtual Video Test Driver: https://www.kernel.org/doc/html/latest/admin-guide/media/vivid.html
+
+Create the skeleton file structure
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To add a new pipeline handler, create a directory to hold the pipeline code in
+the *src/libcamera/pipeline/* directory that matches the name of the pipeline
+(in this case *vivid*). Inside the new directory add a *meson.build* file that
+integrates with the libcamera build system, and a *vivid.cpp* file that matches
+the name of the pipeline.
+
+In the *meson.build* file, add the *vivid.cpp* file as a build source for
+libcamera by adding it to the global meson ``libcamera_internal_sources``
+variable:
+
+.. code-block:: none
+
+ # SPDX-License-Identifier: CC0-1.0
+
+ libcamera_internal_sources += files([
+ 'vivid.cpp',
+ ])
+
+Users of libcamera can selectively enable pipelines while building libcamera
+using the ``pipelines`` option.
+
+For example, to enable only the IPU3, UVC, and VIVID pipelines, specify them as
+a comma separated list with ``-Dpipelines`` when generating a build directory:
+
+.. code-block:: shell
+
+ meson build -Dpipelines=ipu3,uvcvideo,vivid
+
+Read the `Meson build configuration`_ documentation for more information on
+configuring a build directory.
+
+.. _Meson build configuration: https://mesonbuild.com/Configuring-a-build-directory.html
+
+To add the new pipeline handler to this list of options, add its directory name
+to the libcamera build options in the top level ``meson_options.txt``.
+
+.. code-block:: none
+
+ option('pipelines',
+ type : 'array',
+ choices : ['ipu3', 'rkisp1', 'rpi/vc4', 'simple', 'uvcvideo', 'vimc', 'vivid'],
+ description : 'Select which pipeline handlers to include')
+
+
+In *vivid.cpp* add the pipeline handler to the ``libcamera`` namespace, defining
+a `PipelineHandler`_ derived class named PipelineHandlerVivid, and add stub
+implementations for the overridden class members.
+
+.. _PipelineHandler: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html
+
+.. code-block:: cpp
+
+ namespace libcamera {
+
+ class PipelineHandlerVivid : public PipelineHandler
+ {
+ public:
+ PipelineHandlerVivid(CameraManager *manager);
+
+ CameraConfiguration *generateConfiguration(Camera *camera,
+ Span<const StreamRole> roles) override;
+ int configure(Camera *camera, CameraConfiguration *config) override;
+
+ int exportFrameBuffers(Camera *camera, Stream *stream,
+ std::vector<std::unique_ptr<FrameBuffer>> *buffers) override;
+
+ int start(Camera *camera, const ControlList *controls) override;
+ void stop(Camera *camera) override;
+
+ int queueRequestDevice(Camera *camera, Request *request) override;
+
+ bool match(DeviceEnumerator *enumerator) override;
+ };
+
+ PipelineHandlerVivid::PipelineHandlerVivid(CameraManager *manager)
+ : PipelineHandler(manager)
+ {
+ }
+
+ CameraConfiguration *PipelineHandlerVivid::generateConfiguration(Camera *camera,
+ Span<const StreamRole> roles)
+ {
+ return nullptr;
+ }
+
+ int PipelineHandlerVivid::configure(Camera *camera, CameraConfiguration *config)
+ {
+ return -1;
+ }
+
+ int PipelineHandlerVivid::exportFrameBuffers(Camera *camera, Stream *stream,
+ std::vector<std::unique_ptr<FrameBuffer>> *buffers)
+ {
+ return -1;
+ }
+
+ int PipelineHandlerVivid::start(Camera *camera, const ControlList *controls)
+ {
+ return -1;
+ }
+
+ void PipelineHandlerVivid::stop(Camera *camera)
+ {
+ }
+
+ int PipelineHandlerVivid::queueRequestDevice(Camera *camera, Request *request)
+ {
+ return -1;
+ }
+
+ bool PipelineHandlerVivid::match(DeviceEnumerator *enumerator)
+ {
+ return false;
+ }
+
+ REGISTER_PIPELINE_HANDLER(PipelineHandlerVivid, "vivid")
+
+ } /* namespace libcamera */
+
+Note that you must register the ``PipelineHandler`` subclass with the pipeline
+handler factory using the `REGISTER_PIPELINE_HANDLER`_ macro which
+registers it and creates a global symbol to reference the class and make it
+available to try and match devices.
+String "vivid" is the name assigned to the pipeline, matching the pipeline
+subdirectory name in the source tree.
+
+.. _REGISTER_PIPELINE_HANDLER: https://libcamera.org/api-html/pipeline__handler_8h.html
+
+For debugging and testing a pipeline handler during development, you can define
+a log message category for the pipeline handler. The ``LOG_DEFINE_CATEGORY``
+macro and ``LIBCAMERA_LOG_LEVELS`` environment variable help you use the inbuilt
+libcamera `logging infrastructure`_ that allow for the inspection of internal
+operations in a user-configurable way.
+
+.. _logging infrastructure: https://libcamera.org/api-html/log_8h.html
+
+Add the following before the ``PipelineHandlerVivid`` class declaration:
+
+.. code-block:: cpp
+
+ LOG_DEFINE_CATEGORY(VIVID)
+
+At this point you need the following includes for logging and pipeline handler
+features:
+
+.. code-block:: cpp
+
+ #include <libcamera/base/log.h>
+
+ #include "libcamera/internal/pipeline_handler.h"
+
+Run the following commands:
+
+.. code-block:: shell
+
+ meson build
+ ninja -C build
+
+To build the libcamera code base, and confirm that the build system found the
+new pipeline handler by running:
+
+.. code-block:: shell
+
+ LIBCAMERA_LOG_LEVELS=Camera:0 ./build/src/cam/cam -l
+
+And you should see output like the below:
+
+.. code-block:: shell
+
+ DEBUG Camera camera_manager.cpp:148 Found registered pipeline handler 'PipelineHandlerVivid'
+
+Matching devices
+~~~~~~~~~~~~~~~~
+
+Each pipeline handler registered in libcamera gets tested against the current
+system configuration, by matching a ``DeviceMatch`` with the system
+``DeviceEnumerator``. A successful match makes sure all the requested components
+have been registered in the system and allows the pipeline handler to be
+initialized.
+
+The main entry point of a pipeline handler is the `match()`_ class member
+function. When the ``CameraManager`` is started (using the `start()`_ function),
+all the registered pipeline handlers are iterated and their ``match`` function
+called with an enumerator of all devices it found on a system.
+
+The match function should identify if there are suitable devices available in
+the ``DeviceEnumerator`` which the pipeline supports, returning ``true`` if it
+matches a device, and ``false`` if it does not. To do this, construct a
+`DeviceMatch`_ class with the name of the ``MediaController`` device to match.
+You can specify the search further by adding specific media entities to the
+search using the ``.add()`` function on the DeviceMatch.
+
+.. _match(): https://www.libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a7cd5b652a2414b543ec20ba9dabf61b6
+.. _start(): https://libcamera.org/api-html/classlibcamera_1_1CameraManager.html#a49e322880a2a26013bb0076788b298c5
+.. _DeviceMatch: https://libcamera.org/api-html/classlibcamera_1_1DeviceMatch.html
+
+This example uses search patterns that match vivid, but when developing a new
+pipeline handler, you should change this value to suit your device identifier.
+
+Replace the contents of the ``PipelineHandlerVivid::match`` function with the
+following:
+
+.. code-block:: cpp
+
+ DeviceMatch dm("vivid");
+ dm.add("vivid-000-vid-cap");
+ return false; // Prevent infinite loops for now
+
+With the device matching criteria defined, attempt to acquire exclusive access
+to the matching media controller device with the `acquireMediaDevice`_ function.
+If the function attempts to acquire a device it has already matched, it returns
+``false``.
+
+.. _acquireMediaDevice: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a77e424fe704e7b26094164b9189e0f84
+
+Add the following below ``dm.add("vivid-000-vid-cap");``:
+
+.. code-block:: cpp
+
+ MediaDevice *media = acquireMediaDevice(enumerator, dm);
+ if (!media)
+ return false;
+
+The pipeline handler now needs an additional include. Add the following to the
+existing include block for device enumeration functionality:
+
+.. code-block:: cpp
+
+ #include "libcamera/internal/device_enumerator.h"
+
+At this stage, you should test that the pipeline handler can successfully match
+the devices, but have not yet added any code to create a Camera which libcamera
+reports to applications.
+
+As a temporary validation step, add a debug print with
+
+.. code-block:: cpp
+
+ LOG(VIVID, Debug) << "Vivid Device Identified";
+
+before the final closing return statement in the ``PipelineHandlerVivid::match``
+function for when when the pipeline handler successfully matches the
+``MediaDevice`` and ``MediaEntity`` names.
+
+Test that the pipeline handler matches and finds a device by rebuilding, and
+running
+
+.. code-block:: shell
+
+ ninja -C build
+ LIBCAMERA_LOG_LEVELS=Pipeline,VIVID:0 ./build/src/cam/cam -l
+
+And you should see output like the below:
+
+.. code-block:: shell
+
+ DEBUG VIVID vivid.cpp:74 Vivid Device Identified
+
+Creating camera devices
+~~~~~~~~~~~~~~~~~~~~~~~
+
+If the pipeline handler successfully matches with the system it is running on,
+it can proceed to initialization, by creating all the required instances of the
+``V4L2VideoDevice``, ``V4L2Subdevice`` and ``CameraSensor`` hardware abstraction
+classes. If the Pipeline handler supports an ISP, it can then also initialise
+the IPA module before proceeding to the creation of the Camera devices.
+
+An image ``Stream`` represents a sequence of images and data of known size and
+format, stored in application-accessible memory locations. Typical examples of
+streams are the ISP processed outputs and the raw images captured at the
+receivers port output.
+
+The Pipeline Handler is responsible for defining the set of Streams associated
+with the Camera.
+
+Each Camera has instance-specific data represented using the `Camera::Private`_
+class, which can be extended for the specific needs of the pipeline handler.
+
+.. _Camera::Private: https://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html
+
+
+To support the Camera we will later register, we need to create a Camera::Private
+class that we can implement for our specific Pipeline Handler.
+
+Define a new ``VividCameraPrivate()`` class derived from ``Camera::Private`` by
+adding the following code before the PipelineHandlerVivid class definition where
+it will be used:
+
+.. code-block:: cpp
+
+ class VividCameraData : public Camera::Private
+ {
+ public:
+ VividCameraData(PipelineHandler *pipe, MediaDevice *media)
+ : Camera::Private(pipe), media_(media), video_(nullptr)
+ {
+ }
+
+ ~VividCameraData()
+ {
+ delete video_;
+ }
+
+ int init();
+ void bufferReady(FrameBuffer *buffer);
+
+ MediaDevice *media_;
+ V4L2VideoDevice *video_;
+ Stream stream_;
+ };
+
+This example pipeline handler handles a single video device and supports a
+single stream, represented by the ``VividCameraData`` class members. More
+complex pipeline handlers might register cameras composed of several video
+devices and sub-devices, or multiple streams per camera that represent the
+several components of the image capture pipeline. You should represent all these
+components in the ``Camera::Private`` derived class when developing a custom
+PipelineHandler.
+
+In our example VividCameraData we implement an ``init()`` function to prepare
+the object from our PipelineHandler, however the Camera::Private class does not
+specify the interface for initialisation and PipelineHandlers can manage this
+based on their own needs. Derived Camera::Private classes are used only by their
+respective pipeline handlers.
+
+The Camera::Private class stores the context required for each camera instance
+and is usually responsible for opening all Devices used in the capture pipeline.
+
+We can now implement the ``init`` function for our example Pipeline Handler to
+create a new V4L2 video device from the media entity, which we can specify using
+the `MediaDevice::getEntityByName`_ function from the MediaDevice. As our
+example is based upon the simplistic Vivid test device, we only need to open a
+single capture device named 'vivid-000-vid-cap' by the device.
+
+.. _MediaDevice::getEntityByName: https://libcamera.org/api-html/classlibcamera_1_1MediaDevice.html#ad5d9279329ef4987ceece2694b33e230
+
+.. code-block:: cpp
+
+ int VividCameraData::init()
+ {
+ video_ = new V4L2VideoDevice(media_->getEntityByName("vivid-000-vid-cap"));
+ if (video_->open())
+ return -ENODEV;
+
+ return 0;
+ }
+
+The VividCameraData should be created and initialised before we move on to
+register a new Camera device so we need to construct and initialise our
+VividCameraData after we have identified our device within
+PipelineHandlerVivid::match(). The VividCameraData is wrapped by a
+std::unique_ptr to help manage the lifetime of the instance.
+
+If the camera data initialization fails, return ``false`` to indicate the
+failure to the ``match()`` function and prevent retrying of the pipeline
+handler.
+
+.. code-block:: cpp
+
+ std::unique_ptr<VividCameraData> data = std::make_unique<VividCameraData>(this, media);
+
+ if (data->init())
+ return false;
+
+
+Once the camera data has been initialized, the Camera device instances and the
+associated streams have to be registered. Create a set of streams for the
+camera, which for this device is only one. You create a camera using the static
+`Camera::create`_ function, passing the Camera::Private instance, the id of the
+camera, and the streams available. Then register the camera with the pipeline
+handler and camera manager using `registerCamera`_.
+
+Finally with a successful construction, we return 'true' indicating that the
+PipelineHandler successfully matched and constructed a device.
+
+.. _Camera::create: https://libcamera.org/api-html/classlibcamera_1_1Camera.html#a453740e0d2a2f495048ae307a85a2574
+.. _registerCamera: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#adf02a7f1bbd87aca73c0e8d8e0e6c98b
+
+.. code-block:: cpp
+
+ std::set<Stream *> streams{ &data->stream_ };
+ std::shared_ptr<Camera> camera = Camera::create(this, data->video_->deviceName(), streams);
+ registerCamera(std::move(camera), std::move(data));
+
+ return true;
+
+
+Our match function should now look like the following:
+
+.. code-block:: cpp
+
+ bool PipelineHandlerVivid::match(DeviceEnumerator *enumerator)
+ {
+ DeviceMatch dm("vivid");
+ dm.add("vivid-000-vid-cap");
+
+ MediaDevice *media = acquireMediaDevice(enumerator, dm);
+ if (!media)
+ return false;
+
+ std::unique_ptr<VividCameraData> data = std::make_unique<VividCameraData>(this, media);
+
+ /* Locate and open the capture video node. */
+ if (data->init())
+ return false;
+
+ /* Create and register the camera. */
+ std::set<Stream *> streams{ &data->stream_ };
+ const std::string &id = data->video_->deviceName();
+ std::shared_ptr<Camera> camera = Camera::create(data.release(), id, streams);
+ registerCamera(std::move(camera));
+
+ return true;
+ }
+
+We will need to use our custom VividCameraData class frequently throughout the
+pipeline handler, so we add a private convenience helper to our Pipeline handler
+to obtain and cast the custom VividCameraData instance from a Camera::Private
+instance.
+
+.. code-block:: cpp
+
+ private:
+ VividCameraData *cameraData(Camera *camera)
+ {
+ return static_cast<VividCameraData *>(camera->_d());
+ }
+
+At this point, you need to add the following new includes to provide the Camera
+interface, and device interaction interfaces.
+
+.. code-block:: cpp
+
+ #include <libcamera/camera.h>
+ #include "libcamera/internal/media_device.h"
+ #include "libcamera/internal/v4l2_videodevice.h"
+
+Registering controls and properties
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The libcamera `controls framework`_ allows an application to configure the
+streams capture parameters on a per-frame basis and is also used to advertise
+immutable properties of the ``Camera`` device.
+
+The libcamera controls and properties are defined in YAML form which is
+processed to automatically generate documentation and interfaces. Controls are
+defined by the src/libcamera/`control_ids_core.yaml`_ file and camera properties
+are defined by src/libcamera/`properties_ids_core.yaml`_.
+
+.. _controls framework: https://libcamera.org/api-html/controls_8h.html
+.. _control_ids_core.yaml: https://libcamera.org/api-html/control__ids_8h.html
+.. _properties_ids_core.yaml: https://libcamera.org/api-html/property__ids_8h.html
+
+Pipeline handlers can optionally register the list of controls an application
+can set as well as a list of immutable camera properties. Being both
+Camera-specific values, they are represented in the ``Camera::Private`` base
+class, which provides two members for this purpose: the
+`Camera::Private::controlInfo_`_ and the `Camera::Private::properties_`_ fields.
+
+.. _Camera::Private::controlInfo_: https://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ab4e183eb4dabe929d1b2bbbb519b969f
+.. _Camera::Private::properties_: https://libcamera.org/api-html/classlibcamera_1_1Camera_1_1Private.html#ad31f12f5ed9c1fbe25750902f4791064
+
+The ``controlInfo_`` field represents a map of ``ControlId`` instances
+associated with the limits of valid values supported for the control. More
+information can be found in the `ControlInfoMap`_ class documentation.
+
+.. _ControlInfoMap: https://libcamera.org/api-html/classlibcamera_1_1ControlInfoMap.html
+
+Pipeline handlers register controls to expose the tunable device and IPA
+parameters to applications. Our example pipeline handler only exposes trivial
+controls of the video device, by registering a ``ControlId`` instance with
+associated values for each supported V4L2 control but demonstrates the mapping
+of V4L2 Controls to libcamera ControlIDs.
+
+Complete the initialization of the ``VividCameraData`` class by adding the
+following code to the ``VividCameraData::init()`` function to initialise the
+controls. For more complex control configurations, this could of course be
+broken out to a separate function, but for now we just initialise the small set
+inline in our VividCameraData init:
+
+.. code-block:: cpp
+
+ /* Initialise the supported controls. */
+ const ControlInfoMap &controls = video_->controls();
+ ControlInfoMap::Map ctrls;
+
+ for (const auto &ctrl : controls) {
+ const ControlId *id;
+ ControlInfo info;
+
+ switch (ctrl.first->id()) {
+ case V4L2_CID_BRIGHTNESS:
+ id = &controls::Brightness;
+ info = ControlInfo{ { -1.0f }, { 1.0f }, { 0.0f } };
+ break;
+ case V4L2_CID_CONTRAST:
+ id = &controls::Contrast;
+ info = ControlInfo{ { 0.0f }, { 2.0f }, { 1.0f } };
+ break;
+ case V4L2_CID_SATURATION:
+ id = &controls::Saturation;
+ info = ControlInfo{ { 0.0f }, { 2.0f }, { 1.0f } };
+ break;
+ default:
+ continue;
+ }
+
+ ctrls.emplace(id, info);
+ }
+
+ controlInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);
+
+The ``properties_`` field is a list of ``ControlId`` instances
+associated with immutable values, which represent static characteristics that can
+be used by applications to identify camera devices in the system. Properties can be
+registered by inspecting the values of V4L2 controls from the video devices and
+camera sensor (for example to retrieve the position and orientation of a camera)
+or to express other immutable characteristics. The example pipeline handler does
+not register any property, but examples are available in the libcamera code
+base.
+
+.. TODO: Add a property example to the pipeline handler. At least the model.
+
+At this point you need to add the following includes to the top of the file for
+handling controls:
+
+.. code-block:: cpp
+
+ #include <libcamera/controls.h>
+ #include <libcamera/control_ids.h>
+
+Vendor-specific controls and properties
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Vendor-specific controls and properties must be defined in a separate YAML file
+and included in the build by defining the pipeline handler to file mapping in
+include/libcamera/meson.build. These YAML files live in the src/libcamera
+directory.
+
+For example, adding a Raspberry Pi vendor control file for the PiSP pipeline
+handler is done with the following mapping:
+
+.. code-block:: meson
+
+ controls_map = {
+ 'controls': {
+ 'draft': 'control_ids_draft.yaml',
+ 'libcamera': 'control_ids_core.yaml',
+ 'rpi/pisp': 'control_ids_rpi.yaml',
+ },
+
+ 'properties': {
+ 'draft': 'property_ids_draft.yaml',
+ 'libcamera': 'property_ids_core.yaml',
+ }
+ }
+
+The pipeline handler named above must match the pipeline handler option string
+specified in the meson build configuration.
+
+Vendor-specific controls and properties must contain a `vendor: <vendor_string>`
+tag in the YAML file. Every unique vendor tag must define a unique and
+non-overlapping range of reserved control IDs in src/libcamera/control_ranges.yaml.
+
+For example, the following block defines a vendor-specific control with the
+`rpi` vendor tag:
+
+.. code-block:: yaml
+
+ vendor: rpi
+ controls:
+ - PispConfigDumpFile:
+ type: string
+ description: |
+ Triggers the Raspberry Pi PiSP pipeline handler to generate a JSON
+ formatted dump of the Backend configuration to the filename given by the
+ value of the control.
+
+The controls will be generated in the vendor-specific namespace
+`libcamera::controls::rpi`. Additionally a `#define
+LIBCAMERA_HAS_RPI_VENDOR_CONTROLS` will be available to allow applications to
+test for the availability of these controls.
+
+Generating a default configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once ``Camera`` devices and the associated ``Streams`` have been registered, an
+application can proceed to acquire and configure the camera to prepare it for a
+frame capture session.
+
+Applications specify the requested configuration by assigning a
+``StreamConfiguration`` instance to each stream they want to enable which
+expresses the desired image size and pixel format. The stream configurations are
+grouped in a ``CameraConfiguration`` which is inspected by the pipeline handler
+and validated to adjust it to a supported configuration. This may involve
+adjusting the formats or image sizes or alignments for example to match the
+capabilities of the device.
+
+Applications may choose to repeat validation stages, adjusting parameters until
+a set of validated StreamConfigurations are returned that is acceptable for the
+applications needs. When the pipeline handler receives a valid camera
+configuration it can use the image stream configurations to apply settings to
+the hardware devices.
+
+This configuration and validation process is managed with another Pipeline
+specific class derived from a common base implementation and interface.
+
+To support validation in our example pipeline handler, Create a new class called
+``VividCameraConfiguration`` derived from the base `CameraConfiguration`_ class
+which we can implement and use within our ``PipelineHandlerVivid`` class.
+
+.. _CameraConfiguration: https://libcamera.org/api-html/classlibcamera_1_1CameraConfiguration.html
+
+The derived ``CameraConfiguration`` class must override the base class
+``validate()`` function, where the stream configuration inspection and
+adjustment happens.
+
+.. code-block:: cpp
+
+ class VividCameraConfiguration : public CameraConfiguration
+ {
+ public:
+ VividCameraConfiguration();
+
+ Status validate() override;
+ };
+
+ VividCameraConfiguration::VividCameraConfiguration()
+ : CameraConfiguration()
+ {
+ }
+
+Applications generate a ``CameraConfiguration`` instance by calling the
+`Camera::generateConfiguration()`_ function, which calls into the pipeline
+implementation of the overridden `PipelineHandler::generateConfiguration()`_
+function.
+
+.. _Camera::generateConfiguration(): https://libcamera.org/api-html/classlibcamera_1_1Camera.html#a25c80eb7fc9b1cf32692ce0c7f09991d
+.. _PipelineHandler::generateConfiguration(): https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a7932e87735695500ce1f8c7ae449b65b
+
+Configurations are generated by receiving a list of ``StreamRole`` instances,
+which libcamera uses as predefined ways an application intends to use a camera
+(You can read the full list in the `StreamRole API`_ documentation). These are
+optional hints on how an application intends to use a stream, and a pipeline
+handler should return an ideal configuration for each role that is requested.
+
+.. _StreamRole API: https://libcamera.org/api-html/stream_8h.html#file_a295d1f5e7828d95c0b0aabc0a8baac03
+
+In the pipeline handler ``generateConfiguration`` implementation, remove the
+``return nullptr;``, create a new instance of the ``CameraConfiguration``
+derived class, and assign it to a base class pointer.
+
+.. code-block:: cpp
+
+ VividCameraData *data = cameraData(camera);
+ CameraConfiguration *config = new VividCameraConfiguration();
+
+A ``CameraConfiguration`` is specific to each pipeline, so you can only create
+it from the pipeline handler code path. Applications can also generate an empty
+configuration and add desired stream configurations manually. Pipelines must
+allow for this by returning an empty configuration if no roles are requested.
+
+To support this in our PipelineHandlerVivid, next add the following check in
+``generateConfiguration`` after the Cameraconfiguration has been constructed:
+
+.. code-block:: cpp
+
+ if (roles.empty())
+ return config;
+
+A production pipeline handler should generate the ``StreamConfiguration`` for
+all the appropriate stream roles a camera device supports. For this simpler
+example (with only one stream), the pipeline handler always returns the same
+configuration, inferred from the underlying V4L2VideoDevice.
+
+How it does this is shown below, but examination of the more full-featured
+pipelines for IPU3, RKISP1 and RaspberryPi are recommended to explore more
+complex examples.
+
+To generate a ``StreamConfiguration``, you need a list of pixel formats and
+frame sizes which are supported as outputs of the stream. You can fetch a map of
+the ``V4LPixelFormat`` and ``SizeRange`` supported by the underlying output
+device, but the pipeline handler needs to convert this to a
+``libcamera::PixelFormat`` type to pass to applications. We do this here using
+``std::transform`` to convert the formats and populate a new ``PixelFormat`` map
+as shown below.
+
+Continue adding the following code example to our ``generateConfiguration``
+implementation.
+
+.. code-block:: cpp
+
+ std::map<V4L2PixelFormat, std::vector<SizeRange>> v4l2Formats =
+ data->video_->formats();
+ std::map<PixelFormat, std::vector<SizeRange>> deviceFormats;
+ std::transform(v4l2Formats.begin(), v4l2Formats.end(),
+ std::inserter(deviceFormats, deviceFormats.begin()),
+ [&](const decltype(v4l2Formats)::value_type &format) {
+ return decltype(deviceFormats)::value_type{
+ format.first.toPixelFormat(),
+ format.second
+ };
+ });
+
+The `StreamFormats`_ class holds information about the pixel formats and frame
+sizes that a stream can support. The class groups size information by the pixel
+format, which can produce it.
+
+.. _StreamFormats: https://libcamera.org/api-html/classlibcamera_1_1StreamFormats.html
+
+The code below uses the ``StreamFormats`` class to represent all of the
+supported pixel formats, associated with a list of frame sizes. It then
+generates a supported StreamConfiguration to model the information an
+application can use to configure a single stream.
+
+Continue adding the following code to support this:
+
+.. code-block:: cpp
+
+ StreamFormats formats(deviceFormats);
+ StreamConfiguration cfg(formats);
+
+As well as a list of supported StreamFormats, the StreamConfiguration is also
+expected to provide an initialised default configuration. This may be arbitrary,
+but depending on use case you may wish to select an output that matches the
+Sensor output, or prefer a pixelformat which might provide higher performance on
+the hardware. The bufferCount represents the number of buffers required to
+support functional continuous processing on this stream.
+
+.. code-block:: cpp
+
+ cfg.pixelFormat = formats::BGR888;
+ cfg.size = { 1280, 720 };
+ cfg.bufferCount = 4;
+
+Finally add each ``StreamConfiguration`` generated to the
+``CameraConfiguration``, and ensure that it has been validated before returning
+it to the application. With only a single supported stream, this code adds only
+a single StreamConfiguration. However a StreamConfiguration should be added for
+each supported role in a device that can handle more streams.
+
+Add the following code to complete the implementation of
+``generateConfiguration``:
+
+.. code-block:: cpp
+
+ config->addConfiguration(cfg);
+
+ config->validate();
+
+ return config;
+
+To validate a camera configuration, a pipeline handler must implement the
+`CameraConfiguration::validate()`_ function in its derived class to inspect all
+the stream configuration associated to it, make any adjustments required to make
+the configuration valid, and return the validation status.
+
+If changes are made, it marks the configuration as ``Adjusted``, however if the
+requested configuration is not supported and cannot be adjusted it shall be
+refused and marked as ``Invalid``.
+
+.. _CameraConfiguration::validate(): https://libcamera.org/api-html/classlibcamera_1_1CameraConfiguration.html#a29f8f263384c6149775b6011c7397093
+
+The validation phase makes sure all the platform-specific constraints are
+respected by the requested configuration. The most trivial examples being making
+sure the requested image formats are supported and the image alignment
+restrictions adhered to. The pipeline handler specific implementation of
+``validate()`` shall inspect all the configuration parameters received and never
+assume they are correct, as applications are free to change the requested stream
+parameters after the configuration has been generated.
+
+Again, this example pipeline handler is simpler, look at the more complex
+implementations for a realistic example.
+
+Add the following function implementation to your file:
+
+.. code-block:: cpp
+
+ CameraConfiguration::Status VividCameraConfiguration::validate()
+ {
+ Status status = Valid;
+
+ if (config_.empty())
+ return Invalid;
+
+ if (config_.size() > 1) {
+ config_.resize(1);
+ status = Adjusted;
+ }
+
+ StreamConfiguration &cfg = config_[0];
+
+ const std::vector<libcamera::PixelFormat> formats = cfg.formats().pixelformats();
+ if (std::find(formats.begin(), formats.end(), cfg.pixelFormat) == formats.end()) {
+ cfg.pixelFormat = cfg.formats().pixelformats()[0];
+ LOG(VIVID, Debug) << "Adjusting format to " << cfg.pixelFormat.toString();
+ status = Adjusted;
+ }
+
+ cfg.bufferCount = 4;
+
+ return status;
+ }
+
+Now that we are handling the ``PixelFormat`` type, we also need to add
+``#include <libcamera/formats.h>`` to the include section before we rebuild the
+codebase, and test:
+
+.. code-block:: shell
+
+ ninja -C build
+ LIBCAMERA_LOG_LEVELS=Pipeline,VIVID:0 ./build/src/cam/cam -c vivid -I
+
+You should see the following output showing the capabilites of our new pipeline
+handler, and showing that our configurations have been generated:
+
+.. code-block:: shell
+
+ Using camera vivid
+ 0: 1280x720-BGR888
+ * Pixelformat: NV21 (320x180)-(3840x2160)/(+0,+0)
+ - 320x180
+ - 640x360
+ - 640x480
+ - 1280x720
+ - 1920x1080
+ - 3840x2160
+ * Pixelformat: NV12 (320x180)-(3840x2160)/(+0,+0)
+ - 320x180
+ - 640x360
+ - 640x480
+ - 1280x720
+ - 1920x1080
+ - 3840x2160
+ * Pixelformat: BGRA8888 (320x180)-(3840x2160)/(+0,+0)
+ - 320x180
+ - 640x360
+ - 640x480
+ - 1280x720
+ - 1920x1080
+ - 3840x2160
+ * Pixelformat: RGBA8888 (320x180)-(3840x2160)/(+0,+0)
+ - 320x180
+ - 640x360
+ - 640x480
+ - 1280x720
+ - 1920x1080
+ - 3840x2160
+
+Configuring a device
+~~~~~~~~~~~~~~~~~~~~
+
+With the configuration generated, and optionally modified and re-validated, a
+pipeline handler needs a function that allows an application to apply a
+configuration to the hardware devices.
+
+The `PipelineHandler::configure()`_ function receives a valid
+`CameraConfiguration`_ and applies the settings to hardware devices, using its
+parameters to prepare a device for a streaming session with the desired
+properties.
+
+.. _PipelineHandler::configure(): https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a930f2a9cdfb51dfb4b9ca3824e84fc29
+.. _CameraConfiguration: https://libcamera.org/api-html/classlibcamera_1_1CameraConfiguration.html
+
+Replace the contents of the stubbed ``PipelineHandlerVivid::configure`` function
+with the following to obtain the camera data and stream configuration. This
+pipeline handler supports only a single stream, so it directly obtains the first
+``StreamConfiguration`` from the camera configuration. A pipeline handler with
+multiple streams should inspect each StreamConfiguration and configure the
+system accordingly.
+
+.. code-block:: cpp
+
+ VividCameraData *data = cameraData(camera);
+ StreamConfiguration &cfg = config->at(0);
+ int ret;
+
+The Vivid capture device is a V4L2 video device, so we use a `V4L2DeviceFormat`_
+with the fourcc and size attributes to apply directly to the capture device
+node. The fourcc attribute is a `V4L2PixelFormat`_ and differs from the
+``libcamera::PixelFormat``. Converting the format requires knowledge of the
+plane configuration for multiplanar formats, so you must explicitly convert it
+using the helper ``V4L2VideoDevice::toV4L2PixelFormat()`` provided by the
+V4L2VideoDevice instance that the format will be applied on.
+
+.. _V4L2DeviceFormat: https://libcamera.org/api-html/classlibcamera_1_1V4L2DeviceFormat.html
+.. _V4L2PixelFormat: https://libcamera.org/api-html/classlibcamera_1_1V4L2PixelFormat.html
+
+Add the following code beneath the code from above:
+
+.. code-block:: cpp
+
+ V4L2DeviceFormat format = {};
+ format.fourcc = data->video_->toV4L2PixelFormat(cfg.pixelFormat);
+ format.size = cfg.size;
+
+Set the video device format defined above using the
+`V4L2VideoDevice::setFormat()`_ function. You should check if the kernel
+driver has adjusted the format, as this shows the pipeline handler has failed to
+handle the validation stages correctly, and the configure operation shall also
+fail.
+
+.. _V4L2VideoDevice::setFormat(): https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#ad67b47dd9327ce5df43350b80c083cca
+
+Continue the implementation with the following code:
+
+.. code-block:: cpp
+
+ ret = data->video_->setFormat(&format);
+ if (ret)
+ return ret;
+
+ if (format.size != cfg.size ||
+ format.fourcc != data->video_->toV4L2PixelFormat(cfg.pixelFormat))
+ return -EINVAL;
+
+Finally, store and set stream-specific data reflecting the state of the stream.
+Associate the configuration with the stream by using the
+`StreamConfiguration::setStream`_ function, and set the values of individual
+stream configuration members as required.
+
+.. _StreamConfiguration::setStream: https://libcamera.org/api-html/structlibcamera_1_1StreamConfiguration.html#a74a0eb44dad1b00112c7c0443ae54a12
+
+.. NOTE: the cfg.setStream() call here associates the stream to the
+ StreamConfiguration however that should quite likely be done as part of
+ the validation process. TBD
+
+Complete the configure implementation with the following code:
+
+.. code-block:: cpp
+
+ cfg.setStream(&data->stream_);
+ cfg.stride = format.planes[0].bpl;
+
+ return 0;
+
+.. TODO: stride SHALL be assigned in validate
+
+Initializing device controls
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Pipeline handlers can optionally initialize the video devices and camera sensor
+controls at system configuration time, to make sure they are defaulted to sane
+values. Handling of device controls is again performed using the libcamera
+`controls framework`_.
+
+.. _Controls Framework: https://libcamera.org/api-html/controls_8h.html
+
+This section is particularly specific to Vivid as it sets the initial values of
+controls to match `Vivid Controls`_ defined by the kernel driver. You won't need
+any of the code below for your pipeline handler, but it's included as an example
+of how to implement functionality your pipeline handler might need.
+
+.. _Vivid Controls: https://www.kernel.org/doc/html/latest/admin-guide/media/vivid.html#controls
+
+We need to add some definitions at the top of the file for convenience. These
+come directly from the kernel sources:
+
+.. code-block:: cpp
+
+ #define VIVID_CID_VIVID_BASE (0x00f00000 | 0xf000)
+ #define VIVID_CID_VIVID_CLASS (0x00f00000 | 1)
+ #define VIVID_CID_TEST_PATTERN (VIVID_CID_VIVID_BASE + 0)
+ #define VIVID_CID_OSD_TEXT_MODE (VIVID_CID_VIVID_BASE + 1)
+ #define VIVID_CID_HOR_MOVEMENT (VIVID_CID_VIVID_BASE + 2)
+
+We can now use the V4L2 control IDs to prepare a list of controls with the
+`ControlList`_ class, and set them using the `ControlList::set()`_ function.
+
+.. _ControlList: https://libcamera.org/api-html/classlibcamera_1_1ControlList.html
+.. _ControlList::set(): https://libcamera.org/api-html/classlibcamera_1_1ControlList.html#a74a1a29abff5243e6e37ace8e24eb4ba
+
+In our pipeline ``configure`` function, add the following code after the format
+has been set and checked to initialise the ControlList and apply it to the
+device:
+
+.. code-block:: cpp
+
+ ControlList controls(data->video_->controls());
+ controls.set(VIVID_CID_TEST_PATTERN, 0);
+ controls.set(VIVID_CID_OSD_TEXT_MODE, 0);
+
+ controls.set(V4L2_CID_BRIGHTNESS, 128);
+ controls.set(V4L2_CID_CONTRAST, 128);
+ controls.set(V4L2_CID_SATURATION, 128);
+
+ controls.set(VIVID_CID_HOR_MOVEMENT, 5);
+
+ ret = data->video_->setControls(&controls);
+ if (ret) {
+ LOG(VIVID, Error) << "Failed to set controls: " << ret;
+ return ret < 0 ? ret : -EINVAL;
+ }
+
+These controls configure VIVID to use a default test pattern, and enable all
+on-screen display text, while configuring sensible brightness, contrast and
+saturation values. Use the ``controls.set`` function to set individual controls.
+
+Buffer handling and stream control
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once the system has been configured with the requested parameters, it is now
+possible for applications to start capturing frames from the ``Camera`` device.
+
+libcamera implements a per-frame request capture model, realized by queueing
+``Request`` instances to a ``Camera`` object. Before applications can start
+submitting capture requests the capture pipeline needs to be prepared to deliver
+frames as soon as they are requested. Memory should be initialized and made
+available to the devices which have to be started and ready to produce
+images. At the end of a capture session the ``Camera`` device needs to be
+stopped, to gracefully clean up any allocated memory and stop the hardware
+devices. Pipeline handlers implement two functions for these purposes, the
+``start()`` and ``stop()`` functions.
+
+The memory initialization phase that happens at ``start()`` time serves to
+configure video devices to be able to use memory buffers exported as dma-buf
+file descriptors. From the pipeline handlers perspective the video devices that
+provide application facing streams always act as memory importers which use,
+in V4L2 terminology, buffers of V4L2_MEMORY_DMABUF memory type.
+
+libcamera also provides an API to allocate and export memory to applications
+realized through the `exportFrameBuffers`_ function and the
+`FrameBufferAllocator`_ class which will be presented later.
+
+.. _exportFrameBuffers: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a6312a69da7129c2ed41f9d9f790adf7c
+.. _FrameBufferAllocator: https://libcamera.org/api-html/classlibcamera_1_1FrameBufferAllocator.html
+
+Please refer to the V4L2VideoDevice API documentation, specifically the
+`allocateBuffers`_, `importBuffers`_ and `exportBuffers`_ functions for a
+detailed description of the video device memory management.
+
+.. _allocateBuffers: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a3a1a77e5e6c220ea7878e89485864a1c
+.. _importBuffers: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a154f5283d16ebd5e15d63e212745cb64
+.. _exportBuffers: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#ae9c0b0a68f350725b63b73a6da5a2ecd
+
+Video memory buffers are represented in libcamera by the `FrameBuffer`_ class.
+A ``FrameBuffer`` instance has to be associated to each ``Stream`` which is part
+of a capture ``Request``. Pipeline handlers should prepare the capture devices
+by importing the dma-buf file descriptors it needs to operate on. This operation
+is performed by using the ``V4L2VideoDevice`` API, which provides an
+``importBuffers()`` function that prepares the video device accordingly.
+
+.. _FrameBuffer: https://libcamera.org/api-html/classlibcamera_1_1FrameBuffer.html
+
+Implement the pipeline handler ``start()`` function by replacing the stub
+version with the following code:
+
+.. code-block:: c++
+
+ VividCameraData *data = cameraData(camera);
+ unsigned int count = data->stream_.configuration().bufferCount;
+
+ int ret = data->video_->importBuffers(count);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+
+During the startup phase pipeline handlers allocate any internal buffer pool
+required to transfer data between different components of the image capture
+pipeline, for example, between the CSI-2 receiver and the ISP input. The example
+pipeline does not require any internal pool, but examples are available in more
+complex pipeline handlers in the libcamera code base.
+
+Applications might want to use memory allocated in the video devices instead of
+allocating it from other parts of the system. libcamera provides an abstraction
+to assist with this task in the `FrameBufferAllocator`_ class. The
+``FrameBufferAllocator`` reserves memory for a ``Stream`` in the video device
+and exports it as dma-buf file descriptors. From this point on, the allocated
+``FrameBuffer`` are associated to ``Stream`` instances in a ``Request`` and then
+imported by the pipeline hander in exactly the same fashion as if they were
+allocated elsewhere.
+
+.. _FrameBufferAllocator: https://libcamera.org/api-html/classlibcamera_1_1FrameBufferAllocator.html
+
+Pipeline handlers support the ``FrameBufferAllocator`` operations by
+implementing the `exportFrameBuffers`_ function, which will allocate memory in
+the video device associated with a stream and export it.
+
+.. _exportFrameBuffers: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a6312a69da7129c2ed41f9d9f790adf7c
+
+Implement the ``exportFrameBuffers`` stub function with the following code to
+handle this:
+
+.. code-block:: cpp
+
+ unsigned int count = stream->configuration().bufferCount;
+ VividCameraData *data = cameraData(camera);
+
+ return data->video_->exportBuffers(count, buffers);
+
+Once memory has been properly setup, the video devices can be started, to
+prepare for capture operations. Complete the ``start`` function implementation
+with the following code:
+
+.. code-block:: cpp
+
+ ret = data->video_->streamOn();
+ if (ret < 0) {
+ data->video_->releaseBuffers();
+ return ret;
+ }
+
+ return 0;
+
+The function starts the video device associated with the stream with the
+`streamOn`_ function. If the call fails, the error value is propagated to the
+caller and the `releaseBuffers`_ function releases any buffers to leave the
+device in a consistent state. If your pipeline handler uses any image processing
+algorithms, or other devices you should also stop them.
+
+.. _streamOn: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a588a5dc9d6f4c54c61136ac43ff9a8cc
+.. _releaseBuffers: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a191619c152f764e03bc461611f3fcd35
+
+Of course we also need to handle the corresponding actions to stop streaming on
+a device, Add the following to the ``stop`` function, to stop the stream with
+the `streamOff`_ function and release all buffers.
+
+.. _streamOff: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a61998710615bdf7aa25a046c8565ed66
+
+.. code-block:: cpp
+
+ VividCameraData *data = cameraData(camera);
+ data->video_->streamOff();
+ data->video_->releaseBuffers();
+
+Queuing requests between applications and hardware
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+libcamera implements a streaming model based on capture requests queued by an
+application to the ``Camera`` device. Each request contains at least one
+``Stream`` instance with an associated ``FrameBuffer`` object.
+
+When an application sends a capture request, the pipeline handler identifies
+which video devices have to be provided with buffers to generate a frame from
+the enabled streams.
+
+This example pipeline handler identifies the buffer using the `findBuffer`_
+helper from the only supported stream and queues it to the capture device
+directly with the `queueBuffer`_ function provided by the V4L2VideoDevice.
+
+.. _findBuffer: https://libcamera.org/api-html/classlibcamera_1_1Request.html#ac66050aeb9b92c64218945158559c4d4
+.. _queueBuffer: https://libcamera.org/api-html/classlibcamera_1_1V4L2VideoDevice.html#a594cd594686a8c1cf9ae8dba0b2a8a75
+
+Replace the stubbed contents of ``queueRequestDevice`` with the following:
+
+.. code-block:: cpp
+
+ VividCameraData *data = cameraData(camera);
+ FrameBuffer *buffer = request->findBuffer(&data->stream_);
+ if (!buffer) {
+ LOG(VIVID, Error)
+ << "Attempt to queue request with invalid stream";
+
+ return -ENOENT;
+ }
+
+ int ret = data->video_->queueBuffer(buffer);
+ if (ret < 0)
+ return ret;
+
+ return 0;
+
+Processing controls
+~~~~~~~~~~~~~~~~~~~
+
+Capture requests not only contain streams and memory buffers, but can
+optionally contain a list of controls the application has set to modify the
+streaming parameters.
+
+Applications can set controls registered by the pipeline handler in the
+initialization phase, as explained in the `Registering controls and properties`_
+section.
+
+Implement a ``processControls`` function above the ``queueRequestDevice``
+function to loop through the control list received with each request, and
+inspect the control values. Controls may need to be converted between the
+libcamera control range definitions and their corresponding values on the device
+before being set.
+
+.. code-block:: cpp
+
+ int PipelineHandlerVivid::processControls(VividCameraData *data, Request *request)
+ {
+ ControlList controls(data->video_->controls());
+
+ for (auto it : request->controls()) {
+ unsigned int id = it.first;
+ unsigned int offset;
+ uint32_t cid;
+
+ if (id == controls::Brightness) {
+ cid = V4L2_CID_BRIGHTNESS;
+ offset = 128;
+ } else if (id == controls::Contrast) {
+ cid = V4L2_CID_CONTRAST;
+ offset = 0;
+ } else if (id == controls::Saturation) {
+ cid = V4L2_CID_SATURATION;
+ offset = 0;
+ } else {
+ continue;
+ }
+
+ int32_t value = std::lround(it.second.get<float>() * 128 + offset);
+ controls.set(cid, std::clamp(value, 0, 255));
+ }
+
+ for (const auto &ctrl : controls)
+ LOG(VIVID, Debug)
+ << "Setting control " << utils::hex(ctrl.first)
+ << " to " << ctrl.second.toString();
+
+ int ret = data->video_->setControls(&controls);
+ if (ret) {
+ LOG(VIVID, Error) << "Failed to set controls: " << ret;
+ return ret < 0 ? ret : -EINVAL;
+ }
+
+ return ret;
+ }
+
+Declare the function prototype for the ``processControls`` function within the
+private ``PipelineHandlerVivid`` class members, as it is only used internally as
+a helper when processing Requests.
+
+.. code-block:: cpp
+
+ private:
+ int processControls(VividCameraData *data, Request *request);
+
+A pipeline handler is responsible for applying controls provided in a Request to
+the relevant hardware devices. This could be directly on the capture device, or
+where appropriate by setting controls on V4L2Subdevices directly. Each pipeline
+handler is responsible for understanding the correct procedure for applying
+controls to the device they support.
+
+This example pipeline handler applies controls during the `queueRequestDevice`_
+function for each request, and applies them to the capture device through the
+capture node.
+
+.. _queueRequestDevice: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html#a106914cca210640c9da9ee1f0419e83c
+
+In the ``queueRequestDevice`` function, replace the following:
+
+.. code-block:: cpp
+
+ int ret = data->video_->queueBuffer(buffer);
+ if (ret < 0)
+ return ret;
+
+With the following code:
+
+.. code-block:: cpp
+
+ int ret = processControls(data, request);
+ if (ret < 0)
+ return ret;
+
+ ret = data->video_->queueBuffer(buffer);
+ if (ret < 0)
+ return ret;
+
+We also need to add the following include directive to support the control
+value translation operations:
+
+.. code-block:: cpp
+
+ #include <cmath>
+
+Frame completion and event handling
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+libcamera implements a signals and slots mechanism (similar to `Qt Signals and
+Slots`_) to connect event sources with callbacks to handle them.
+
+As a general summary, a ``Slot`` can be connected to a ``Signal``, which when
+emitted triggers the execution of the connected slots. A detailed description
+of the libcamera implementation is available in the `libcamera Signal and Slot`_
+classes documentation.
+
+.. _Qt Signals and Slots: https://doc.qt.io/qt-6/signalsandslots.html
+.. _libcamera Signal and Slot: https://libcamera.org/api-html/classlibcamera_1_1Signal.html#details
+
+In order to notify applications about the availability of new frames and data,
+the ``Camera`` device exposes two ``Signals`` to which applications can connect
+to be notified of frame completion events. The ``bufferComplete`` signal serves
+to report to applications the completion event of a single ``Stream`` part of a
+``Request``, while the ``requestComplete`` signal notifies the completion of all
+the ``Streams`` and data submitted as part of a request. This mechanism allows
+implementation of partial request completion, which allows an application to
+inspect completed buffers associated with the single streams without waiting for
+all of them to be ready.
+
+The ``bufferComplete`` and ``requestComplete`` signals are emitted by the
+``Camera`` device upon notifications received from the pipeline handler, which
+tracks the buffers and request completion status.
+
+The single buffer completion notification is implemented by pipeline handlers by
+`connecting`_ the ``bufferReady`` signal of the capture devices they have queued
+buffers to, to a member function slot that handles processing of the completed
+frames. When a buffer is ready, the pipeline handler must propagate the
+completion of that buffer to the Camera by using the PipelineHandler base class
+``completeBuffer`` function. When all of the buffers referenced by a ``Request``
+have been completed, the pipeline handler must again notify the ``Camera`` using
+the PipelineHandler base class ``completeRequest`` function. The PipelineHandler
+class implementation makes sure the request completion notifications are
+delivered to applications in the same order as they have been submitted.
+
+.. _connecting: https://libcamera.org/api-html/classlibcamera_1_1Signal.html#aa04db72d5b3091ffbb4920565aeed382
+
+Returning to the ``int VividCameraData::init()`` function, add the following
+above the closing ``return 0;`` to connect the pipeline handler ``bufferReady``
+function to the V4L2 device buffer signal.
+
+.. code-block:: cpp
+
+ video_->bufferReady.connect(this, &VividCameraData::bufferReady);
+
+Create the matching ``VividCameraData::bufferReady`` function after your
+VividCameradata::init() implementation.
+
+The ``bufferReady`` function obtains the request from the buffer using the
+``request`` function, and notifies the ``Camera`` that the buffer and
+request are completed. In this simpler pipeline handler, there is only one
+stream, so it completes the request immediately. You can find a more complex
+example of event handling with supporting multiple streams in the libcamera
+code-base.
+
+.. TODO: Add link
+
+.. code-block:: cpp
+
+ void VividCameraData::bufferReady(FrameBuffer *buffer)
+ {
+ Request *request = buffer->request();
+
+ pipe_->completeBuffer(request, buffer);
+ pipe_->completeRequest(request);
+ }
+
+Testing a pipeline handler
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Once you've built the pipeline handler, we can rebuild the code base, and test
+capture through the pipeline through both of the cam and qcam utilities.
+
+.. code-block:: shell
+
+ ninja -C build
+ ./build/src/cam/cam -c vivid -C5
+
+To test that the pipeline handler can detect a device, and capture input.
+
+Running the command above outputs (a lot of) information about pixel formats,
+and then starts capturing frame data, and should provide an output such as the
+following:
+
+.. code-block:: none
+
+ user@dev:/home/libcamera$ ./build/src/cam/cam -c vivid -C5
+ [42:34:08.573066847] [186470] INFO IPAManager ipa_manager.cpp:136 libcamera is not installed. Adding '/home/libcamera/build/src/ipa' to the IPA search path
+ [42:34:08.575908115] [186470] INFO Camera camera_manager.cpp:287 libcamera v0.0.11+876-7b27d262
+ [42:34:08.610334268] [186471] INFO IPAProxy ipa_proxy.cpp:122 libcamera is not installed. Loading IPA configuration from '/home/libcamera/src/ipa/vimc/data'
+ Using camera vivid
+ [42:34:08.618462130] [186470] WARN V4L2 v4l2_pixelformat.cpp:176 Unsupported V4L2 pixel format Y10
+ ... <remaining Unsupported V4L2 pixel format warnings can be ignored>
+ [42:34:08.619901297] [186470] INFO Camera camera.cpp:793 configuring streams: (0) 1280x720-BGR888
+ Capture 5 frames
+ fps: 0.00 stream0 seq: 000000 bytesused: 2764800
+ fps: 4.98 stream0 seq: 000001 bytesused: 2764800
+ fps: 5.00 stream0 seq: 000002 bytesused: 2764800
+ fps: 5.03 stream0 seq: 000003 bytesused: 2764800
+ fps: 5.03 stream0 seq: 000004 bytesused: 2764800
+
+This demonstrates that the pipeline handler is successfully capturing frames,
+but it is helpful to see the visual output and validate the images are being
+processed correctly. The libcamera project also implements a Qt based
+application which will render the frames in a window for visual inspection:
+
+.. code-block:: shell
+
+ ./build/src/qcam/qcam -c vivid
+
+.. TODO: Running qcam with the vivid pipeline handler appears to have a bug and
+ no visual frames are seen. However disabling zero-copy on qcam renders
+ them successfully.
diff --git a/Documentation/guides/tracing.rst b/Documentation/guides/tracing.rst
new file mode 100644
index 00000000..537dce50
--- /dev/null
+++ b/Documentation/guides/tracing.rst
@@ -0,0 +1,149 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: ../documentation-contents.rst
+
+Tracing Guide
+=============
+
+Guide to tracing in libcamera.
+
+Profiling vs Tracing
+--------------------
+
+Tracing is recording timestamps at specific locations. libcamera provides a
+tracing facility. This guide shows how to use this tracing facility.
+
+Tracing should not be confused with profiling, which samples execution
+at periodic points in time. This can be done with other tools such as
+callgrind, perf, gprof, etc., without modification to the application,
+and is out of scope for this guide.
+
+Compiling
+---------
+
+To compile libcamera with tracing support, it must be enabled through the
+meson ``tracing`` option. It depends on the lttng-ust library (available in the
+``liblttng-ust-dev`` package for Debian-based distributions).
+By default the tracing option in meson is set to ``auto``, so if
+liblttng is detected, it will be enabled by default. Conversely, if the option
+is set to disabled, then libcamera will be compiled without tracing support.
+
+Defining tracepoints
+--------------------
+
+libcamera already contains a set of tracepoints. To define additional
+tracepoints, create a file
+``include/libcamera/internal/tracepoints/{file}.tp``, where ``file`` is a
+reasonable name related to the category of tracepoints that you wish to
+define. For example, the tracepoints file for the Request object is called
+``request.tp``. An entry for this file must be added in
+``include/libcamera/internal/tracepoints/meson.build``.
+
+In this tracepoints file, define your tracepoints `as mandated by lttng
+<https://lttng.org/man/3/lttng-ust>`_. The header boilerplate must *not* be
+included (as it will conflict with the rest of our infrastructure), and
+only the tracepoint definitions (with the ``TRACEPOINT_*`` macros) should be
+included.
+
+All tracepoint providers shall be ``libcamera``. According to lttng, the
+tracepoint provider should be per-project; this is the rationale for this
+decision. To group tracepoint events, we recommend using
+``{class_name}_{tracepoint_name}``, for example, ``request_construct`` for a
+tracepoint for the constructor of the Request class.
+
+Tracepoint arguments may take C++ objects pointers, in which case the usual
+C++ namespacing rules apply. The header that contains the necessary class
+definitions must be included at the top of the tracepoint provider file.
+
+Note: the final parameter in ``TP_ARGS`` *must not* have a trailing comma, and
+the parameters to ``TP_FIELDS`` are *space-separated*. Not following these will
+cause compilation errors.
+
+Using tracepoints (in libcamera)
+--------------------------------
+
+To use tracepoints in libcamera, first the header needs to be included:
+
+``#include "libcamera/internal/tracepoints.h"``
+
+Then to use the tracepoint:
+
+``LIBCAMERA_TRACEPOINT({tracepoint_event}, args...)``
+
+This macro must be used, as opposed to lttng's macros directly, because
+lttng is an optional dependency of libcamera, so the code must compile and run
+even when lttng is not present or when tracing is disabled.
+
+The tracepoint provider name, as declared in the tracepoint definition, is not
+included in the parameters of the tracepoint.
+
+There are also two special tracepoints available for tracing IPA calls:
+
+``LIBCAMERA_TRACEPOINT_IPA_BEGIN({pipeline_name}, {ipa_function})``
+
+``LIBCAMERA_TRACEPOINT_IPA_END({pipeline_name}, {ipa_function})``
+
+These shall be placed where an IPA function is called from the pipeline handler,
+and when the pipeline handler receives the corresponding response from the IPA,
+respectively. These are the tracepoints that our sample analysis script
+(see "Analyzing a trace") scans for when computing statistics on IPA call time.
+
+Using tracepoints (from an application)
+---------------------------------------
+
+As applications are not part of libcamera, but rather users of libcamera,
+applications should seek their own tracing mechanisms. For ease of tracing
+the application alongside tracing libcamera, it is recommended to also
+`use lttng <https://lttng.org/docs/#doc-tracing-your-own-user-application>`_.
+
+Using tracepoints (from closed-source IPA)
+------------------------------------------
+
+Similar to applications, closed-source IPAs can simply use lttng on their own,
+or any other tracing mechanism if desired.
+
+Collecting a trace
+------------------
+
+A trace can be collected fairly simply from lttng:
+
+.. code-block:: bash
+
+ lttng create $SESSION_NAME
+ lttng enable-event -u libcamera:\*
+ lttng start
+ # run libcamera application
+ lttng stop
+ lttng view
+ lttng destroy $SESSION_NAME
+
+See the `lttng documentation <https://lttng.org/docs/>`_ for further details.
+
+The location of the trace file is printed when running
+``lttng create $SESSION_NAME``. After destroying the session, it can still be
+viewed by: ``lttng view -t $PATH_TO_TRACE``, where ``$PATH_TO_TRACE`` is the
+path that was printed when the session was created. This is the same path that
+is used when analyzing traces programatically, as described in the next section.
+
+Analyzing a trace
+-----------------
+
+As mentioned above, while an lttng tracing session exists and the trace is not
+running, the trace output can be viewed as text by ``lttng view``.
+
+The trace log can also be viewed as text using babeltrace2. See the
+`lttng trace analysis documentation
+<https://lttng.org/docs/#doc-viewing-and-analyzing-your-traces-bt>`_
+for further details.
+
+babeltrace2 also has a C API and python bindings that can be used to process
+traces. See the
+`lttng python bindings documentation <https://babeltrace.org/docs/v2.0/python/bt2/>`_
+and the
+`lttng C API documentation <https://babeltrace.org/docs/v2.0/libbabeltrace2/>`_
+for more details.
+
+As an example, there is a script ``utils/tracepoints/analyze-ipa-trace.py``
+that gathers statistics for the time taken for an IPA function call, by
+measuring the time difference between pairs of events
+``libcamera:ipa_call_start`` and ``libcamera:ipa_call_finish``.
diff --git a/Documentation/images/rotation/rotate0.svg b/Documentation/images/rotation/rotate0.svg
new file mode 100644
index 00000000..13cde16a
--- /dev/null
+++ b/Documentation/images/rotation/rotate0.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate0.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="1.4854147"
+ inkscape:cx="666.48052"
+ inkscape:cy="448.35962"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="77.237244"
+ y="81.982094" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;paint-order:markers stroke fill;stroke-dasharray:none"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="92.612343"
+ y="98.912964" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="167.25099"
+ y="98.912964" />
+ <g
+ id="g4"
+ transform="translate(-0.98582077)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 244.95942,81.765726 62.444825,81.97209 154.25639,28.65633 Z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+ d="m 199.76751,33.368887 0.0285,21.581353"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+ d="m 215.59016,33.189206 0.0959,31.330304"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 194.42835,33.189356 25.2821,-0.220612"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-dasharray:none"
+ d="m 195.19248,33.096339 -0.0701,-5.375793 23.77787,-0.05613 0.0553,5.315811"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 194.20874,25.616264 25.25485,-0.02536"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 195.03436,26.298566 -0.0455,-5.426692 23.77787,-0.05613 0.0553,5.315811"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate0Mirror.svg b/Documentation/images/rotation/rotate0Mirror.svg
new file mode 100644
index 00000000..a7edda87
--- /dev/null
+++ b/Documentation/images/rotation/rotate0Mirror.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate0Mirror.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.82900578"
+ inkscape:cx="599.51331"
+ inkscape:cy="579.00682"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="-230.13463"
+ y="81.982094"
+ transform="scale(-1,1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="-214.75954"
+ y="98.912964"
+ transform="scale(-1,1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="-140.12088"
+ y="98.912964"
+ transform="scale(-1,1)" />
+ <g
+ id="g4"
+ transform="matrix(-1,0,0,1,308.35769,0)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 62.412454,81.765726 244.92705,81.97209 153.11548,28.65633 Z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 107.60436,33.368887 -0.0285,21.581353"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 91.781714,33.189206 -0.0959,31.330304"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 112.94352,33.189356 87.661424,32.968744"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 112.17939,33.096339 0.0701,-5.375793 -23.777866,-0.05613 -0.0553,5.315811"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 113.16313,25.616264 87.908284,25.590904"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 112.33751,26.298566 0.0455,-5.426692 -23.777866,-0.05613 -0.0553,5.315811"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate180.svg b/Documentation/images/rotation/rotate180.svg
new file mode 100644
index 00000000..d092a532
--- /dev/null
+++ b/Documentation/images/rotation/rotate180.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate180.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.79489"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="-230.13461"
+ y="-140.22527"
+ transform="scale(-1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="-214.75951"
+ y="-123.2944"
+ transform="scale(-1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="-140.12086"
+ y="-123.2944"
+ transform="scale(-1)" />
+ <g
+ id="g4"
+ transform="rotate(180,154.17884,111.10368)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 62.412437,140.44163 182.514593,-0.20636 -91.81156,53.31576 z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 107.60435,188.83847 -0.0285,-21.58135"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 91.781697,189.01815 -0.0959,-31.3303"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 112.94351,189.018 -25.282103,0.22061"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 112.17938,189.11102 0.0701,5.37579 -23.777873,0.0561 -0.0553,-5.31581"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 113.16312,196.59109 -25.254853,0.0254"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 112.3375,195.90879 0.0455,5.42669 -23.777873,0.0561 -0.0553,-5.31581"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate180Mirror.svg b/Documentation/images/rotation/rotate180Mirror.svg
new file mode 100644
index 00000000..d4a77d50
--- /dev/null
+++ b/Documentation/images/rotation/rotate180Mirror.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate180Mirror.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.79489"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="77.237228"
+ y="-140.22527"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="92.612335"
+ y="-123.2944"
+ transform="scale(1,-1)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="167.25098"
+ y="-123.2944"
+ transform="scale(1,-1)" />
+ <g
+ id="g4"
+ transform="matrix(1,0,0,-1,-0.98584226,222.20736)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 244.9594,140.44163 62.444808,140.23527 154.25637,193.55103 Z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 199.76749,188.83847 0.0285,-21.58135"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 215.59014,189.01815 0.0959,-31.3303"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 194.42833,189.018 25.2821,0.22061"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 195.19246,189.11102 -0.0701,5.37579 23.77787,0.0561 0.0553,-5.31581"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 194.20872,196.59109 25.25485,0.0254"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 195.03434,195.90879 -0.0455,5.42669 23.77787,0.0561 0.0553,-5.31581"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate270.svg b/Documentation/images/rotation/rotate270.svg
new file mode 100644
index 00000000..13ea1e5d
--- /dev/null
+++ b/Documentation/images/rotation/rotate270.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate270.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.26451"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="-187.55237"
+ y="124.56432"
+ transform="rotate(-90)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="-172.17726"
+ y="141.49518"
+ transform="rotate(-90)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="-97.538612"
+ y="141.49518"
+ transform="rotate(-90)" />
+ <g
+ id="g4"
+ transform="rotate(-90,154.17883,111.5966)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 124.34796,19.830188 124.55432,202.34478 71.238559,110.53322 Z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.951119,65.022101 21.58135,-0.0285"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.771439,49.199448 31.330301,-0.0959"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 75.771589,70.361261 75.550979,45.079158"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.678569,69.597131 -5.37579,0.0701 -0.0561,-23.777873 5.31581,-0.0553"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 68.198499,70.580871 -0.0254,-25.254853"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 68.880799,69.755251 -5.42669,0.0455 -0.0561,-23.777873 5.31581,-0.0553"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate270Mirror.svg b/Documentation/images/rotation/rotate270Mirror.svg
new file mode 100644
index 00000000..6116f50a
--- /dev/null
+++ b/Documentation/images/rotation/rotate270Mirror.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate270Mirror.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.79489"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="-187.55237"
+ y="-182.80751"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="-172.17726"
+ y="-165.87666"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="-97.538612"
+ y="-165.87666"
+ transform="matrix(0,-1,-1,0,0,0)" />
+ <g
+ id="g4"
+ transform="matrix(0,-1,-1,0,264.78961,265.77543)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 183.02388,19.830188 -0.20636,182.514592 53.31576,-91.81156 z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.42072,65.022101 -21.58135,-0.0285"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.6004,49.199448 -31.3303,-0.0959"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.60025,70.361261 0.22061,-25.282103"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.69327,69.597131 5.37579,0.0701 0.0561,-23.777873 -5.31581,-0.0553"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 239.17334,70.580871 0.0254,-25.254853"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 238.49104,69.755251 5.42669,0.0455 0.0561,-23.777873 -5.31581,-0.0553"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate90.svg b/Documentation/images/rotation/rotate90.svg
new file mode 100644
index 00000000..af627638
--- /dev/null
+++ b/Documentation/images/rotation/rotate90.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate90.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.26451"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="34.65498"
+ y="-182.80751"
+ transform="rotate(90)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="50.030079"
+ y="-165.87665"
+ transform="rotate(90)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="124.66872"
+ y="-165.87665"
+ transform="rotate(90)" />
+ <g
+ id="g4"
+ transform="rotate(90,154.17885,110.61076)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 183.02388,202.37715 -0.20636,-182.51459 53.31576,91.81156 z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.42072,157.18524 -21.58135,0.0285"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.6004,173.00789 -31.3303,0.0959"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.60025,151.84608 0.22061,25.2821"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 231.69327,152.61021 5.37579,-0.0701 0.0561,23.77787 -5.31581,0.0553"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 239.17334,151.62647 0.0254,25.25485"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 238.49104,152.45209 5.42669,-0.0455 0.0561,23.77787 -5.31581,0.0553"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/images/rotation/rotate90Mirror.svg b/Documentation/images/rotation/rotate90Mirror.svg
new file mode 100644
index 00000000..1760c462
--- /dev/null
+++ b/Documentation/images/rotation/rotate90Mirror.svg
@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="rotate90Mirror.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="false"
+ inkscape:zoom="0.94272086"
+ inkscape:cx="467.79489"
+ inkscape:cy="423.24299"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1" />
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect1"
+ width="152.88184"
+ height="119.41136"
+ x="34.65498"
+ y="124.56432"
+ transform="matrix(0,1,1,0,0,0)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2"
+ width="49.755535"
+ height="36.468258"
+ x="50.030079"
+ y="141.49519"
+ transform="matrix(0,1,1,0,0,0)" />
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect2-5"
+ width="49.755535"
+ height="36.468258"
+ x="124.66872"
+ y="141.49519"
+ transform="matrix(0,1,1,0,0,0)" />
+ <g
+ id="g4"
+ transform="matrix(0,1,1,0,42.582224,-43.56809)"
+ style="stroke-width:1.5875;stroke-dasharray:none">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="rect3"
+ width="40.994682"
+ height="43.605846"
+ x="134.16664"
+ y="157.24184" />
+ <ellipse
+ style="fill:none;stroke:#000000;stroke-width:1.5875;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path3"
+ cx="140.15703"
+ cy="176.44627"
+ rx="1.889045"
+ ry="1.925626" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="M 124.34795,202.37715 124.55431,19.86256 71.238554,111.67412 Z"
+ id="path4"
+ sodipodi:nodetypes="cccc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.951114,157.18524 21.58135,0.0285"
+ id="path5" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.771434,173.00789 31.330296,0.0959"
+ id="path6" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.771584,151.84608 -0.22061,25.2821"
+ id="path7" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 75.678564,152.61021 -5.37579,-0.0701 -0.0561,23.77787 5.31581,0.0553"
+ id="path8" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 68.198494,151.62647 -0.0254,25.25485"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5875;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1"
+ d="m 68.880794,152.45209 -5.42669,-0.0455 -0.0561,23.77787 5.31581,0.0553"
+ id="path8-9"
+ sodipodi:nodetypes="cccc" />
+ </g>
+</svg>
diff --git a/Documentation/index.rst b/Documentation/index.rst
index 2c84a540..bea40660 100644
--- a/Documentation/index.rst
+++ b/Documentation/index.rst
@@ -1,12 +1,29 @@
-.. Front page matter is defined in the project README file.
-.. include:: ../README.rst
- :start-after: .. section-begin-libcamera
- :end-before: .. section-end-libcamera
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: introduction.rst
.. toctree::
:maxdepth: 1
:caption: Contents:
Home <self>
- Docs <docs>
Contribute <contributing>
+ Getting Started <getting-started>
+
+ Application Writer's Guide <guides/application-developer>
+ Camera Sensor Model <camera-sensor-model>
+ Environment variables <environment_variables>
+ Feature Requirements <feature_requirements>
+ IPA Writer's guide <guides/ipa>
+ Lens driver requirements <lens_driver_requirements>
+ libcamera Architecture <libcamera_architecture>
+ Pipeline Handler Writer's Guide <guides/pipeline-handler>
+ Python Bindings <python-bindings>
+ Sensor driver requirements <sensor_driver_requirements>
+ SoftwareISP Benchmarking <software-isp-benchmarking>
+ Tracing guide <guides/tracing>
+
+.. toctree::
+ :hidden:
+
+ introduction \ No newline at end of file
diff --git a/Documentation/internal-api-html/index.rst b/Documentation/internal-api-html/index.rst
new file mode 100644
index 00000000..43768648
--- /dev/null
+++ b/Documentation/internal-api-html/index.rst
@@ -0,0 +1,8 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. _internal-api:
+
+Internal API Reference
+======================
+
+:: Placeholder for Doxygen documentation
diff --git a/Documentation/introduction.rst b/Documentation/introduction.rst
new file mode 100644
index 00000000..82aa11a3
--- /dev/null
+++ b/Documentation/introduction.rst
@@ -0,0 +1,224 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+************
+Introduction
+************
+
+.. toctree::
+ :hidden:
+
+ API <api-html/index>
+ Internal API <internal-api-html/index>
+
+What is libcamera?
+==================
+
+libcamera is an open source complex camera support library for Linux, Android
+and ChromeOS. The library interfaces with Linux kernel device drivers and
+provides an intuitive API to developers in order to simplify the complexity
+involved in capturing images from complex cameras on Linux systems.
+
+What is a "complex camera"?
+===========================
+
+A modern "camera" tends to infact be several different pieces of hardware which
+must all be controlled together in order to produce and capture images of
+appropriate quality. A hardware pipeline typically consists of a camera sensor
+that captures raw frames and transmits them on a bus, a receiver that decodes
+the bus signals, and an image signal processor that processes raw frames to
+produce usable images in a standard format. The Linux kernel handles these
+multimedia devices through the 'Linux media' subsystem and provides a set of
+application programming interfaces known collectively as the
+V4L2 (`Video for Linux 2`_) and the `Media Controller`_ APIs, which provide an
+interface to interact and control media devices.
+
+.. _Video for Linux 2: https://www.linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/v4l/v4l2.html
+.. _Media Controller: https://www.linuxtv.org/downloads/v4l-dvb-apis-new/userspace-api/mediactl/media-controller.html
+
+Included in this subsystem are drivers for camera sensors, CSI2 (Camera
+Serial Interface) receivers, and ISPs (Image Signal Processors).
+
+The usage of these drivers to provide a functioning camera stack is a
+responsibility that lies in userspace, and is commonly implemented separately
+by vendors without a common architecture or API for application developers. This
+adds a lot of complexity to the task, particularly when considering that the
+differences in hardware pipelines and their representation in the kernel's APIs
+often necessitate bespoke handling.
+
+What is libcamera for?
+======================
+
+libcamera provides a complete camera stack for Linux-based systems to abstract
+the configuration of hardware and image control algorithms required to obtain
+desirable results from the camera through the kernel's APIs, reducing those
+operations to a simple and consistent method for developers. In short instead of
+having to deal with this:
+
+.. graphviz:: mali-c55.dot
+
+you can instead simply deal with:
+
+.. code-block:: python
+
+ >>> import libcamera as lc
+ >>> camera_manager = lc.CameraManager.singleton()
+ [0:15:59.582029920] [504] INFO Camera camera_manager.cpp:313 libcamera v0.3.0+182-01e57380
+ >>> for camera in camera_manager.cameras:
+ ... print(f' - {camera.id}')
+ ...
+ - mali-c55 tpg
+ - imx415 1-001a
+
+The library handles the rest for you. These documentary pages give more
+information on the internal workings of libcamera (and the kernel camera stack
+that lies behind it) as well as guidance on using libcamera in an application or
+extending the library with support for your hardware (through the pipeline
+handler and IPA module writer's guides).
+
+How should I use it?
+====================
+
+There are a few ways you might want to use libcamera, depending on your
+application. It's always possible to use the library directly, and you can find
+detailed information on how to do so in the
+:doc:`application writer's guide <guides/application-developer>`.
+
+It is often more appropriate to use one of the frameworks with libcamera
+support. For example an application powering an embedded media device
+incorporating capture, encoding and streaming of both video and audio would
+benefit from using `GStreamer`_, for which libcamera provides a plugin.
+Similarly an application for user-facing devices like a laptop would likely
+benefit accessing cameras through the XDG camera portal and `pipewire`_, which
+brings the advantages of resource sharing (multiple applications accessing the
+stream at the same time) and access control.
+
+.. _GStreamer: https://gstreamer.freedesktop.org/
+.. _pipewire: https://pipewire.org/
+
+Camera Stack
+============
+
+::
+
+ a c / +-------------+ +-------------+ +-------------+ +-------------+
+ p a | | Native | | Framework | | Native | | Android |
+ p t | | V4L2 | | Application | | libcamera | | Camera |
+ l i | | Application | | (gstreamer) | | Application | | Framework |
+ i o \ +-------------+ +-------------+ +-------------+ +-------------+
+ n ^ ^ ^ ^
+ | | | |
+ l a | | | |
+ i d v v | v
+ b a / +-------------+ +-------------+ | +-------------+
+ c p | | V4L2 | | Camera | | | Android |
+ a t | | Compat. | | Framework | | | Camera |
+ m a | | | | (gstreamer) | | | HAL |
+ e t \ +-------------+ +-------------+ | +-------------+
+ r i ^ ^ | ^
+ a o | | | |
+ n | | | |
+ / | ,................................................
+ | | ! : Language : !
+ l f | | ! : Bindings : !
+ i r | | ! : (optional) : !
+ b a | | \...............................................'
+ c m | | | | |
+ a e | | | | |
+ m w | v v v v
+ e o | +----------------------------------------------------------------+
+ r r | | |
+ a k | | libcamera |
+ | | |
+ \ +----------------------------------------------------------------+
+ ^ ^ ^
+ Userspace | | |
+ ------------------------ | ---------------- | ---------------- | ---------------
+ Kernel | | |
+ v v v
+ +-----------+ +-----------+ +-----------+
+ | Media | <--> | Video | <--> | V4L2 |
+ | Device | | Device | | Subdev |
+ +-----------+ +-----------+ +-----------+
+
+The camera stack comprises four software layers. From bottom to top:
+
+* The kernel drivers control the camera hardware and expose a
+ low-level interface to userspace through the Linux kernel V4L2
+ family of APIs (Media Controller API, V4L2 Video Device API and
+ V4L2 Subdev API).
+
+* The libcamera framework is the core part of the stack. It
+ handles all control of the camera devices in its core component,
+ libcamera, and exposes a native C++ API to upper layers. Optional
+ language bindings allow interfacing to libcamera from other
+ programming languages.
+
+ Those components live in the same source code repository and
+ all together constitute the libcamera framework.
+
+* The libcamera adaptation is an umbrella term designating the
+ components that interface to libcamera in other frameworks.
+ Notable examples are a V4L2 compatibility layer, a gstreamer
+ libcamera element, and an Android camera HAL implementation based
+ on libcamera.
+
+ Those components can live in the libcamera project source code
+ in separate repositories, or move to their respective project's
+ repository (for instance the gstreamer libcamera element).
+
+* The applications and upper level frameworks are based on the
+ libcamera framework or libcamera adaptation, and are outside of
+ the scope of the libcamera project.
+
+V4L2 Compatibility Layer
+ V4L2 compatibility is achieved through a shared library that traps all
+ accesses to camera devices and routes them to libcamera to emulate high-level
+ V4L2 camera devices. It is injected in a process address space through
+ ``LD_PRELOAD`` and is completely transparent for applications.
+
+ The compatibility layer exposes camera device features on a best-effort basis,
+ and aims for the level of features traditionally available from a UVC camera
+ designed for video conferencing.
+
+Android Camera HAL
+ Camera support for Android is achieved through a generic Android camera HAL
+ implementation on top of libcamera. The HAL implements features required by
+ Android and out of scope from libcamera, such as JPEG encoding support.
+
+ This component is used to provide support for ChromeOS platforms.
+
+GStreamer element (gstlibcamerasrc)
+ A `GStreamer element`_ is provided to allow capture from libcamera supported
+ devices through GStreamer pipelines, and connect to other elements for further
+ processing.
+
+Native libcamera API
+ Applications can make use of the libcamera API directly using the C++
+ API. An example application and walkthrough using the libcamera API can be
+ followed in the :doc:`Application writer's guide </guides/application-developer>`
+
+.. _GStreamer element: https://gstreamer.freedesktop.org/documentation/application-development/basics/elements.html
+
+Licensing
+=========
+
+The libcamera core is covered by the `LGPL-2.1-or-later`_ license. Pipeline
+Handlers are a part of the libcamera code base and need to be contributed
+upstream by device vendors. IPA modules included in libcamera are covered by a
+free software license, however third-parties may develop IPA modules outside of
+libcamera and distribute them under a closed-source license, provided they do
+not include source code from the libcamera project.
+
+The libcamera project itself contains multiple libraries, applications and
+utilities. Licenses are expressed through SPDX tags in text-based files that
+support comments, and through the .reuse/dep5 file otherwise. A copy of all
+licenses are stored in the LICENSES directory, and a full summary of the
+licensing used throughout the project can be found in the COPYING.rst document.
+
+Applications which link dynamically against libcamera and use only the public
+API are an independent work of the authors and have no license restrictions
+imposed upon them from libcamera.
+
+.. _LGPL-2.1-or-later: https://spdx.org/licenses/LGPL-2.1-or-later.html
diff --git a/Documentation/lens_driver_requirements.rst b/Documentation/lens_driver_requirements.rst
new file mode 100644
index 00000000..85fef76f
--- /dev/null
+++ b/Documentation/lens_driver_requirements.rst
@@ -0,0 +1,29 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+.. _lens-driver-requirements:
+
+Lens Driver Requirements
+========================
+
+libcamera handles lens devices in the CameraLens class and defines
+a consistent interface through its API towards other library components.
+
+The CameraLens class uses the V4L2 subdev kernel API to interface with the
+camera lens through a sub-device exposed to userspace by the lens driver.
+
+In order for libcamera to be fully operational and provide all the required
+information to interface with the camera lens to applications and pipeline
+handlers, a set of mandatory features the driver has to support has been defined.
+
+Mandatory Requirements
+----------------------
+
+The lens driver is assumed to be fully compliant with the V4L2 specification.
+
+The lens driver shall support the following V4L2 controls:
+
+* `V4L2_CID_FOCUS_ABSOLUTE`_
+
+.. _V4L2_CID_FOCUS_ABSOLUTE: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-camera.html
diff --git a/Documentation/libcamera_architecture.rst b/Documentation/libcamera_architecture.rst
new file mode 100644
index 00000000..abbb0d17
--- /dev/null
+++ b/Documentation/libcamera_architecture.rst
@@ -0,0 +1,168 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+libcamera Architecture
+======================
+
+While offering a unified API towards upper layers, and presenting itself as a
+single library, libcamera isn't monolithic. It exposes multiple components
+through its public API and is built around a set of separate helpers internally.
+Hardware abstractions are handled through the use of device-specific components
+where required and dynamically loadable plugins are used to separate image
+processing algorithms from the core libcamera codebase.
+
+::
+
+ --------------------------< libcamera Public API >---------------------------
+ ^ ^
+ | |
+ v v
+ +-------------+ +---------------------------------------------------+
+ | Camera | | Camera Device |
+ | Manager | | +-----------------------------------------------+ |
+ +-------------+ | | Device-Agnostic | |
+ ^ | | | |
+ | | | +--------------------------+ |
+ | | | | ~~~~~~~~~~~~~~~~~~~~~~~ |
+ | | | | { +-----------------+ } |
+ | | | | } | //// Image //// | { |
+ | | | | <-> | / Processing // | } |
+ | | | | } | / Algorithms // | { |
+ | | | | { +-----------------+ } |
+ | | | | ~~~~~~~~~~~~~~~~~~~~~~~ |
+ | | | | ========================== |
+ | | | | +-----------------+ |
+ | | | | | // Pipeline /// | |
+ | | | | <-> | /// Handler /// | |
+ | | | | | /////////////// | |
+ | | +--------------------+ +-----------------+ |
+ | | Device-Specific |
+ | +---------------------------------------------------+
+ | ^ ^
+ | | |
+ v v v
+ +--------------------------------------------------------------------+
+ | Helpers and Support Classes |
+ | +-------------+ +-------------+ +-------------+ +-------------+ |
+ | | MC & V4L2 | | Buffers | | Sandboxing | | Plugins | |
+ | | Support | | Allocator | | IPC | | Manager | |
+ | +-------------+ +-------------+ +-------------+ +-------------+ |
+ | +-------------+ +-------------+ |
+ | | Pipeline | | ... | |
+ | | Runner | | | |
+ | +-------------+ +-------------+ |
+ +--------------------------------------------------------------------+
+
+ /// Device-Specific Components
+ ~~~ Sandboxing
+
+
+Camera Manager
+ The Camera Manager enumerates cameras and instantiates Pipeline Handlers to
+ manage each Camera that libcamera supports. The Camera Manager supports
+ hotplug detection and notification events when supported by the underlying
+ kernel devices.
+
+ There is only ever one instance of the Camera Manager running per application.
+ Each application's instance of the Camera Manager ensures that only a single
+ application can take control of a camera device at once.
+
+ Read the `Camera Manager API`_ documentation for more details.
+
+.. _Camera Manager API: https://libcamera.org/api-html/classlibcamera_1_1CameraManager.html
+
+Camera Device
+ The Camera class represents a single item of camera hardware that is capable
+ of producing one or more image streams, and provides the API to interact with
+ the underlying device.
+
+ If a system has multiple instances of the same hardware attached, each has its
+ own instance of the camera class.
+
+ The API exposes full control of the device to upper layers of libcamera through
+ the public API, making it the highest level object libcamera exposes, and the
+ object that all other API operations interact with from configuration to
+ capture.
+
+ Read the `Camera API`_ documentation for more details.
+
+.. _Camera API: https://libcamera.org/api-html/classlibcamera_1_1Camera.html
+
+Pipeline Handler
+ The Pipeline Handler manages the complex pipelines exposed by the kernel
+ drivers through the Media Controller and V4L2 APIs. It abstracts pipeline
+ handling to hide device-specific details from the rest of the library, and
+ implements both pipeline configuration based on stream configuration, and
+ pipeline runtime execution and scheduling when needed by the device.
+
+ The Pipeline Handler lives in the same process as the rest of the library, and
+ has access to all helpers and kernel camera-related devices.
+
+ Hardware abstraction is handled by device specific Pipeline Handlers which are
+ derived from the Pipeline Handler base class allowing commonality to be shared
+ among the implementations.
+
+ Derived pipeline handlers create Camera device instances based on the devices
+ they detect and support on the running system, and are responsible for
+ managing the interactions with a camera device.
+
+ More details can be found in the `PipelineHandler API`_ documentation, and the
+ :doc:`Pipeline Handler Writers Guide <guides/pipeline-handler>`.
+
+.. _PipelineHandler API: https://libcamera.org/api-html/classlibcamera_1_1PipelineHandler.html
+
+Image Processing Algorithms
+ Together with the hardware image processing and hardware statistics
+ collection, the Image Processing Algorithms (IPA) implement 3A (Auto-Exposure,
+ Auto-White Balance and Auto-Focus) and other algorithms. They run on the CPU
+ and control hardware image processing based on the parameters supplied by
+ upper layers, closing the control loop of the ISP.
+
+ IPAs are loaded as external plugins named IPA Modules. IPA Modules can be part
+ of the libcamera code base or provided externally by camera vendors as
+ open-source or closed-source components.
+
+ Open source IPA Modules built with libcamera are run in the same process space
+ as libcamera. External IPA Modules are run in a separate sandboxed process. In
+ either case, they can only interact with libcamera through the API provided by
+ the Pipeline Handler. They have a restricted view of the system, with no direct
+ access to kernel camera devices, no access to networking APIs, and limited
+ access to file systems. All their accesses to image and metadata are mediated
+ by dmabuf instances explicitly passed by the Pipeline Handler to the IPA
+ Module.
+
+ IPA Modules are only required for platforms and devices with an ISP controlled
+ by the host CPU. Camera sensors which have an integrated ISP are not
+ controlled through the IPA Module.
+
+Helpers and Support Classes
+ While Pipeline Handlers are device-specific, implementations are expected to
+ share code due to usage of identical APIs towards the kernel camera drivers
+ and the Image Processing Algorithms. This includes without limitation handling
+ of the MC and V4L2 APIs, buffer management through dmabuf, and pipeline
+ discovery, configuration and scheduling. Such code will be factored out to
+ helpers when applicable.
+
+ Other parts of libcamera will also benefit from factoring code out to
+ self-contained support classes, even if such code is present only once in the
+ code base, in order to keep the source code clean and easy to read. This
+ should be the case for instance for plugin management.
+
+Platform Support
+----------------
+
+The library currently supports the following hardware platforms specifically
+with dedicated pipeline handlers:
+
+ - Arm Mali-C55
+ - Intel IPU3 (ipu3)
+ - NXP i.MX8MP (imx8-isi and rkisp1)
+ - RaspberryPi 3, 4 and zero (rpi/vc4)
+ - Rockchip RK3399 (rkisp1)
+
+Furthermore, generic platform support is provided for the following:
+
+ - USB video device class cameras (uvcvideo)
+ - iMX7, IPU6, Allwinner Sun6i (simple)
+ - Virtual media controller driver for test use cases (vimc)
diff --git a/Documentation/mainpage.dox b/Documentation/mainpage.dox
new file mode 100644
index 00000000..cbee9bab
--- /dev/null
+++ b/Documentation/mainpage.dox
@@ -0,0 +1,33 @@
+/**
+\mainpage libcamera API reference
+
+Welcome to the API reference for <a href="https://libcamera.org/">libcamera</a>,
+a complex camera support library for Linux, Android and ChromeOS. These pages
+are automatically generated from the libcamera source code and describe the API
+in detail - if this is your first interaction with libcamera then you may find
+it useful to visit the [documentation](../introduction.html) in
+the first instance, which can provide a more generic introduction to the
+library's concepts.
+
+\if internal
+
+As a follow-on to the developer's guide, to assist you in adding support for
+your platform the [pipeline handler writer's guide](../guides/pipeline-handler.html)
+and the [ipa module writer's guide](../guides/ipa.html) should be helpful.
+
+The full libcamera API is documented here. If you wish to see only the public
+part of the API you can use [these pages](../api-html/index.html) instead.
+
+\else
+
+As a follow-on to the developer's guide, to assist you in using libcamera within
+your project the [application developer's guide](../guides/application-developer.html)
+gives an overview on how to achieve that.
+
+Only the public part of the libcamera API is documented here; if you are a
+developer seeking to add support for your hardware to the library or make other
+improvements, you should switch to the internal API
+[reference pages](../internal-api-html/index.html) instead.
+
+\endif
+*/
diff --git a/Documentation/mali-c55.dot b/Documentation/mali-c55.dot
new file mode 100644
index 00000000..7bfc44c0
--- /dev/null
+++ b/Documentation/mali-c55.dot
@@ -0,0 +1,25 @@
+/* SPDX-License-Identifier: CC-BY-SA-4.0 */
+
+digraph board {
+ rankdir=TB
+ n00000001 [label="{{} | mali-c55 tpg\n/dev/v4l-subdev0 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000001:port0 -> n00000003:port0 [style=dashed]
+ n00000003 [label="{{<port0> 0 | <port4> 4} | mali-c55 isp\n/dev/v4l-subdev1 | {<port1> 1 | <port2> 2 | <port3> 3}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000003:port1 -> n00000009:port0 [style=bold]
+ n00000003:port2 -> n00000009:port2 [style=bold]
+ n00000003:port1 -> n0000000d:port0 [style=bold]
+ n00000003:port3 -> n0000001c
+ n00000009 [label="{{<port0> 0 | <port2> 2} | mali-c55 resizer fr\n/dev/v4l-subdev2 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000009:port1 -> n00000010
+ n0000000d [label="{{<port0> 0} | mali-c55 resizer ds\n/dev/v4l-subdev3 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+ n0000000d:port1 -> n00000014
+ n00000010 [label="mali-c55 fr\n/dev/video0", shape=box, style=filled, fillcolor=yellow]
+ n00000014 [label="mali-c55 ds\n/dev/video1", shape=box, style=filled, fillcolor=yellow]
+ n00000018 [label="mali-c55 3a params\n/dev/video2", shape=box, style=filled, fillcolor=yellow]
+ n00000018 -> n00000003:port4
+ n0000001c [label="mali-c55 3a stats\n/dev/video3", shape=box, style=filled, fillcolor=yellow]
+ n00000030 [label="{{<port0> 0} | lte-csi2-rx\n/dev/v4l-subdev4 | {<port1> 1}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000030:port1 -> n00000003:port0
+ n00000035 [label="{{} | imx415 1-001a\n/dev/v4l-subdev5 | {<port0> 0}}", shape=Mrecord, style=filled, fillcolor=green]
+ n00000035:port0 -> n00000030:port0 [style=bold]
+}
diff --git a/Documentation/meson.build b/Documentation/meson.build
index c4e98924..36ffae23 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -1,36 +1,115 @@
-doc_install_dir = join_paths(get_option('datadir'), 'doc',
- 'libcamera-@0@'.format(libcamera_version))
+# SPDX-License-Identifier: CC0-1.0
+
+doc_install_dir = get_option('datadir') / 'doc' / 'libcamera-@0@'.format(libcamera_version)
#
# Doxygen
#
-doxygen = find_program('doxygen', required : false)
+doxygen = find_program('doxygen', required : get_option('documentation'))
+dot = find_program('dot', required : get_option('documentation'))
-if doxygen.found()
+if doxygen.found() and dot.found()
cdata = configuration_data()
cdata.set('VERSION', 'v@0@'.format(libcamera_git_version))
- cdata.set('TOP_SRCDIR', meson.source_root())
- cdata.set('TOP_BUILDDIR', meson.build_root())
+ cdata.set('TOP_SRCDIR', meson.project_source_root())
+ cdata.set('TOP_BUILDDIR', meson.project_build_root())
+ cdata.set('OUTPUT_DIR', meson.current_build_dir())
+ cdata.set('WARN_AS_ERROR', get_option('doc_werror') ? 'YES' : 'NO')
- doxyfile = configure_file(input : 'Doxyfile.in',
- output : 'Doxyfile',
- configuration : cdata)
+ doxygen_predefined = []
+ foreach key : config_h.keys()
+ doxygen_predefined += '@0@=@1@'.format(key, config_h.get(key))
+ endforeach
+
+ cdata.set('PREDEFINED', ' \\\n\t\t\t '.join(doxygen_predefined))
+
+ doxyfile_common = configure_file(input : 'Doxyfile-common.in',
+ output : 'Doxyfile-common',
+ configuration : cdata)
+
+ doxygen_public_input = [
+ libcamera_base_public_headers,
+ libcamera_base_public_sources,
+ libcamera_public_headers,
+ libcamera_public_sources,
+ ]
+
+ doxygen_internal_input = [
+ libcamera_base_private_headers,
+ libcamera_base_internal_sources,
+ libcamera_internal_headers,
+ libcamera_internal_sources,
+ libcamera_ipa_headers,
+ libcamera_ipa_interfaces,
+ libipa_headers,
+ libipa_sources,
+ ]
+
+ if is_variable('ipu3_ipa_sources')
+ doxygen_internal_input += [ipu3_ipa_sources]
+ endif
+
+ # We run doxygen twice - the first run excludes internal API objects as it
+ # is intended to document the public API only. A second run covers all of
+ # the library's objects for libcamera developers. Common configuration is
+ # set in an initially generated Doxyfile, which is then included by the two
+ # final Doxyfiles.
+
+ # This is the "public" run of doxygen generating an abridged version of the
+ # API's documentation.
+
+ doxyfile_tmpl = configure_file(input : 'Doxyfile-public.in',
+ output : 'Doxyfile-public.tmpl',
+ configuration : cdata)
+
+ # The set of public input files stored in the doxygen_public_input array
+ # needs to be set in Doxyfile public. We can't pass them through cdata
+ # cdata, as some of the array members are custom_tgt instances, which
+ # configuration_data.set() doesn't support. Using a separate script invoked
+ # through custom_target(), which supports custom_tgt instances as inputs.
- custom_target('doxygen',
+ doxyfile = custom_target('doxyfile-public',
+ input : [
+ doxygen_public_input,
+ ],
+ output : 'Doxyfile-public',
+ command : [
+ 'gen-doxyfile.py',
+ '-o', '@OUTPUT@',
+ doxyfile_tmpl,
+ '@INPUT@',
+ ])
+
+ custom_target('doxygen-public',
input : [
doxyfile,
- libcamera_api,
- libcamera_ipa_api,
- libcamera_headers,
- libcamera_sources,
- libipa_headers,
- libipa_sources,
+ doxyfile_common,
],
output : 'api-html',
command : [doxygen, doxyfile],
install : true,
- install_dir : doc_install_dir)
+ install_dir : doc_install_dir,
+ install_tag : 'doc')
+
+ # This is the internal documentation, which hard-codes a list of directories
+ # to parse in its doxyfile.
+
+ doxyfile = configure_file(input : 'Doxyfile-internal.in',
+ output : 'Doxyfile-internal',
+ configuration : cdata)
+
+ custom_target('doxygen-internal',
+ input : [
+ doxyfile,
+ doxyfile_common,
+ doxygen_internal_input,
+ ],
+ output : 'internal-api-html',
+ command : [doxygen, doxyfile],
+ install : true,
+ install_dir : doc_install_dir,
+ install_tag : 'doc-internal')
endif
#
@@ -39,17 +118,32 @@ endif
sphinx = find_program('sphinx-build-3', required : false)
if not sphinx.found()
- sphinx = find_program('sphinx-build', required : false)
+ sphinx = find_program('sphinx-build', required : get_option('documentation'))
endif
if sphinx.found()
docs_sources = [
- '../README.rst',
+ 'camera-sensor-model.rst',
+ 'code-of-conduct.rst',
'coding-style.rst',
'conf.py',
'contributing.rst',
- 'docs.rst',
+ 'documentation-contents.rst',
+ 'environment_variables.rst',
+ 'feature_requirements.rst',
+ 'guides/application-developer.rst',
+ 'guides/ipa.rst',
+ 'guides/pipeline-handler.rst',
+ 'guides/tracing.rst',
'index.rst',
+ 'introduction.rst',
+ 'lens_driver_requirements.rst',
+ 'libcamera_architecture.rst',
+ 'mali-c55.dot',
+ 'python-bindings.rst',
+ 'sensor_driver_requirements.rst',
+ 'software-isp-benchmarking.rst',
+ '../README.rst',
]
release = 'release=v' + libcamera_git_version
@@ -61,11 +155,12 @@ if sphinx.found()
output : 'html',
build_by_default : true,
install : true,
- install_dir : doc_install_dir)
+ install_dir : doc_install_dir,
+ install_tag : 'doc')
custom_target('documentation-linkcheck',
- command: [sphinx, '-W', '-b', 'linkcheck', meson.current_source_dir(), '@OUTPUT@'],
- build_always_stale: true,
- input: docs_sources,
- output: 'linkcheck')
+ command : [sphinx, '-W', '-b', 'linkcheck', meson.current_source_dir(), '@OUTPUT@'],
+ build_always_stale : true,
+ input : docs_sources,
+ output : 'linkcheck')
endif
diff --git a/Documentation/python-bindings.rst b/Documentation/python-bindings.rst
new file mode 100644
index 00000000..94712238
--- /dev/null
+++ b/Documentation/python-bindings.rst
@@ -0,0 +1,72 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+.. _python-bindings:
+
+Python Bindings for libcamera
+=============================
+
+.. warning::
+ The bindings are under work, and the API will change.
+
+Differences to the C++ API
+--------------------------
+
+As a rule of thumb the bindings try to follow the C++ API when possible. This
+chapter lists the differences.
+
+Mostly these differences fall under two categories:
+
+1. Differences caused by the inherent differences between C++ and Python.
+ These differences are usually caused by the use of threads or differences in
+ C++ vs Python memory management.
+
+2. Differences caused by the code being work-in-progress. It's not always
+ trivial to create a binding in a satisfying way, and the current bindings
+ contain simplified versions of the C++ API just to get forward. These
+ differences are expected to eventually go away.
+
+Coding Style
+------------
+
+The C++ code for the bindings follows the libcamera coding style as much as
+possible. Note that the indentation does not quite follow the clang-format
+style, as clang-format makes a mess of the style used.
+
+The API visible to the Python side follows the Python style as much as possible.
+
+This means that e.g. ``Camera::generateConfiguration`` maps to
+``Camera.generate_configuration``.
+
+CameraManager
+-------------
+
+The Python API provides a singleton CameraManager via ``CameraManager.singleton()``.
+There is no need to start or stop the CameraManager.
+
+Handling Completed Requests
+---------------------------
+
+The Python bindings do not expose the ``Camera::requestCompleted`` signal
+directly as the signal is invoked from another thread and it has real-time
+constraints. Instead the bindings queue the completed requests internally and
+use an eventfd to inform the user that there are completed requests.
+
+The user can wait on the eventfd, and upon getting an event, use
+``CameraManager.get_ready_requests()`` to clear the eventfd event and to get
+the completed requests.
+
+Controls & Properties
+---------------------
+
+The classes related to controls and properties are rather complex to implement
+directly in the Python bindings. There are some simplifications in the Python
+bindings:
+
+- There is no ControlValue class. Python objects are automatically converted
+ to ControlValues and vice versa.
+- There is no ControlList class. A Python dict with ControlId keys and Python
+ object values is used instead.
+- There is no ControlInfoMap class. A Python dict with ControlId keys and
+ ControlInfo values is used instead.
diff --git a/Documentation/sensor_driver_requirements.rst b/Documentation/sensor_driver_requirements.rst
new file mode 100644
index 00000000..fb4269d0
--- /dev/null
+++ b/Documentation/sensor_driver_requirements.rst
@@ -0,0 +1,95 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+.. _sensor-driver-requirements:
+
+Sensor Driver Requirements
+==========================
+
+libcamera handles imaging devices in the CameraSensor class and defines
+a consistent interface through its API towards other library components.
+
+The CameraSensor class uses the V4L2 subdev kernel API to interface with the
+camera sensor through one or multiple sub-devices exposed in userspace by
+the sensor driver.
+
+In order for libcamera to be fully operational and provide all the required
+information to interface with the camera sensor to applications and pipeline
+handlers, a set of mandatory and optional features the driver has to support
+has been defined.
+
+Mandatory Requirements
+----------------------
+
+The sensor driver is assumed to be fully compliant with the V4L2 specification.
+
+For RAW sensors, the sensor driver shall support the following V4L2 controls:
+
+* `V4L2_CID_ANALOGUE_GAIN`_
+* `V4L2_CID_EXPOSURE`_
+* `V4L2_CID_HBLANK`_
+* `V4L2_CID_PIXEL_RATE`_
+* `V4L2_CID_VBLANK`_
+
+.. _V4L2_CID_ANALOGUE_GAIN: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
+.. _V4L2_CID_EXPOSURE: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/control.html
+.. _V4L2_CID_HBLANK: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
+.. _V4L2_CID_PIXEL_RATE: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-process.html
+.. _V4L2_CID_VBLANK: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-image-source.html
+
+The ``ANALOGUE_GAIN`` control units are sensor-specific. libcamera requires
+a sensor-specific CameraSensorHelper implementation to translate between the
+sensor specific ``gain code`` and the analogue ``gain value`` expressed as an
+absolute number as defined by ``controls::AnalogueGain``.
+
+While V4L2 doesn't specify a unit for the ``EXPOSURE`` control, libcamera
+requires it to be expressed as a number of image lines. Camera sensor drivers
+that do not comply with this requirement will need to be adapted or will produce
+incorrect results.
+
+The ``HBLANK``, ``PIXEL_RATE`` and ``VBLANK`` controls are used to compute the
+sensor output timings.
+
+Optional Requirements
+---------------------
+
+The sensor driver should support the following V4L2 controls:
+
+* `V4L2_CID_CAMERA_ORIENTATION`_
+* `V4L2_CID_CAMERA_SENSOR_ROTATION`_
+
+.. _V4L2_CID_CAMERA_ORIENTATION: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-camera.html
+.. _V4L2_CID_CAMERA_SENSOR_ROTATION: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/ext-ctrls-camera.html
+
+The controls are used to register the camera location and rotation.
+
+In order to support rotating the image the sensor driver should support
+
+* `V4L2_CID_HFLIP`_
+* `V4L2_CID_VFLIP`_
+
+.. _V4L2_CID_HFLIP: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/control.html
+.. _V4L2_CID_VFLIP: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/control.html
+
+The controls must be writable from userspace. In case of a RAW Bayer sensors,
+drivers should correctly report if vertical/horizontal flips modify the Bayer
+pattern ordering by reporting the `V4L2_CTRL_FLAG_MODIFY_LAYOUT` control flag.
+
+The sensor driver should implement support for the V4L2 Selection API,
+specifically it should implement support for the
+`VIDIOC_SUBDEV_G_SELECTION`_ ioctl with support for the following selection
+targets:
+
+.. _VIDIOC_SUBDEV_G_SELECTION: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/vidioc-subdev-g-selection.html#c.V4L.VIDIOC_SUBDEV_G_SELECTION
+
+* `V4L2_SEL_TGT_CROP_BOUNDS`_ to report the readable pixel array area size
+* `V4L2_SEL_TGT_CROP_DEFAULT`_ to report the active pixel array area size
+* `V4L2_SEL_TGT_CROP`_ to report the analogue selection rectangle
+
+Support for the selection API is scheduled to become a mandatory feature in
+the near future.
+
+.. _V4L2_SEL_TGT_CROP_BOUNDS: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/v4l2-selection-targets.html
+.. _V4L2_SEL_TGT_CROP_DEFAULT: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/v4l2-selection-targets.html
+.. _V4L2_SEL_TGT_CROP: https://www.kernel.org/doc/html/latest/userspace-api/media/v4l/v4l2-selection-targets.html
diff --git a/Documentation/sensor_model.svg b/Documentation/sensor_model.svg
new file mode 100644
index 00000000..02dc55a8
--- /dev/null
+++ b/Documentation/sensor_model.svg
@@ -0,0 +1,4870 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg5"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="sensor_model.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview7"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ inkscape:zoom="0.55815145"
+ inkscape:cx="535.6969"
+ inkscape:cy="472.9899"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer1"
+ showguides="false">
+ <inkscape:grid
+ type="xygrid"
+ id="grid184"
+ originx="0"
+ originy="0"
+ spacingy="1"
+ spacingx="1"
+ units="mm"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs2">
+ <marker
+ style="overflow:visible"
+ id="marker9374"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="TriangleStart"
+ markerWidth="5.32440803"
+ markerHeight="6.15538502"
+ viewBox="0 0 5.3244081 6.1553851"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path9372" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleStart"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="TriangleStart"
+ markerWidth="5.3244081"
+ markerHeight="6.155385"
+ viewBox="0 0 5.3244081 6.1553851"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path135" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="marker9374-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="TriangleStart"
+ markerWidth="5.3244081"
+ markerHeight="6.155385"
+ viewBox="0 0 5.3244081 6.1553851"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path9372-6" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="TriangleStart-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="TriangleStart"
+ markerWidth="5.3244081"
+ markerHeight="6.155385"
+ viewBox="0 0 5.3244081 6.1553851"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ transform="scale(0.5)"
+ style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
+ d="M 5.77,0 -2.88,5 V -5 Z"
+ id="path135-6" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g1052"
+ transform="translate(23.655977)"
+ style="opacity:0.5"
+ inkscape:export-filename="Documentation/camera-sensor-model_digiscale.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2"
+ transform="translate(13.062138,0.0898069)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0"
+ transform="translate(44.963283,-0.03138127)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26"
+ transform="translate(34.280458,-0.02885923)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20"
+ transform="translate(66.243325,-0.12103306)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28"
+ transform="translate(55.53615,-0.0663742)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9"
+ transform="translate(76.887707,-0.13032417)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-206"
+ transform="translate(2.5889069,0.05636587)"
+ style="opacity:0.502088">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-6"
+ transform="translate(23.672688,10.516298)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-4"
+ transform="translate(13.078849,10.606105)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-0"
+ transform="translate(44.979994,10.484917)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8"
+ transform="translate(34.297169,10.487439)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-9"
+ transform="translate(66.260036,10.395265)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9"
+ transform="translate(55.552861,10.449924)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-9"
+ transform="translate(76.904418,10.385974)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-206-7"
+ transform="translate(2.6056179,10.572664)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-22"
+ transform="translate(23.70412,21.058784)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-5"
+ transform="translate(13.110281,21.148591)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-1"
+ transform="translate(45.011426,21.027403)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-77"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-9"
+ transform="translate(34.328601,21.029925)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-3"
+ transform="translate(66.291468,20.937751)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-63"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-4"
+ transform="translate(55.584293,20.99241)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-3"
+ transform="translate(76.93585,20.92846)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-08"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-206-0"
+ transform="translate(2.6370499,21.11515)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-5"
+ transform="translate(23.740609,31.433065)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-61"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-15"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-48"
+ transform="translate(13.14677,31.522872)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-4"
+ transform="translate(45.047915,31.401684)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-6"
+ transform="translate(34.36509,31.404206)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-96"
+ transform="translate(66.327957,31.312032)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-21"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-7"
+ transform="translate(55.620782,31.366691)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-18"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-97"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5"
+ transform="translate(76.972339,31.302741)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-206-8"
+ transform="translate(2.6735389,31.489431)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15-96"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47-33"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-8"
+ transform="translate(23.725354,41.251089)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-60"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-48"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-89"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-7"
+ transform="translate(13.131515,41.340896)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-76"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-43"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-03"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-09"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-2"
+ transform="translate(45.03266,41.219708)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-40"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-4"
+ transform="translate(34.349835,41.22223)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-4"
+ transform="translate(66.312702,41.130056)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-75"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-81"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-2"
+ transform="translate(55.605527,41.184715)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-89"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-68"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2"
+ transform="translate(76.957084,41.120765)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-206-85"
+ transform="translate(2.5889069,41.307455)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5-64"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-8-5"
+ transform="translate(23.730747,51.649149)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-60-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-48-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-8-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-89-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-7-4"
+ transform="translate(13.136908,51.738956)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-76-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-43-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-03-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-09-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-2-6"
+ transform="translate(45.038053,51.617768)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-5-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-40-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-9-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-4-8"
+ transform="translate(34.355228,51.62029)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-6-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-9-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-2-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-2-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-4-0"
+ transform="translate(66.318095,51.528116)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-7-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-75-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-4-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-81-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-2-9"
+ transform="translate(55.61092,51.582775)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-89-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-68-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-0-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="129.98665"
+ y="78.113022" />
+ <rect
+ style="opacity:0.5;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="135.20201"
+ y="78.074852" />
+ <rect
+ style="opacity:0.5;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="129.99101"
+ y="83.377647" />
+ <g
+ id="g1052-9-4"
+ transform="translate(87.507934,-0.18332859)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-9-5"
+ transform="translate(87.524645,10.332969)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-3-2"
+ transform="translate(87.556077,20.875455)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-08-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5-6"
+ transform="translate(87.592566,31.249736)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2-1"
+ transform="translate(87.577311,41.06776)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-32"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.5;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-0-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="140.61124"
+ y="83.324638" />
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="135.21388"
+ y="83.3274" />
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-3-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="140.60687"
+ y="77.967453" />
+ <g
+ id="g1052-9-9-7-22"
+ transform="translate(97.600308,0.08245514)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5-41"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-3-9-6"
+ transform="translate(97.686888,10.559974)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-9-4-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-08-22-78"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-8-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-5-4-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5-3-27"
+ transform="translate(97.723368,20.934255)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3-3-36"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8-7-47"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1-2-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2-8-2"
+ transform="translate(97.708118,30.752279)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-15-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-4-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-92-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.5;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-8-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="145.82224"
+ y="77.929283" />
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="145.83411"
+ y="83.181831" />
+ <g
+ id="g1052-9-2-1-0"
+ transform="translate(97.884193,41.434681)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-32-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-1-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-1-3-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.074577"
+ y="37.001465" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-9-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.5;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-0-9-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="150.91812"
+ y="83.691559" />
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-3-1-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="150.91376"
+ y="78.334373" />
+ <rect
+ style="opacity:0.5;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-5-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="156.14098"
+ y="83.548752" />
+ <g
+ id="g1052-206-85-6"
+ transform="translate(2.5942999,51.705515)"
+ style="opacity:0.5">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-15-0-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-5-64-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-47-6-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-65-2-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.195644;fill:#000000;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect2827"
+ width="7.4583311"
+ height="61.587906"
+ x="47.724121"
+ y="26.798815" />
+ <rect
+ style="opacity:0.195644;fill:#000000;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect2829"
+ width="7.3512397"
+ height="61.724613"
+ x="161.43401"
+ y="26.690187" />
+ <rect
+ style="opacity:0.195644;fill:#000000;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect2831"
+ width="121.2337"
+ height="22.824373"
+ x="47.633518"
+ y="88.566978" />
+ <rect
+ style="opacity:0.195644;fill:#000000;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect2833"
+ width="121.20582"
+ height="8.0138454"
+ x="47.77354"
+ y="18.34436" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.8;stroke-dasharray:3.2, 0.8;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill"
+ id="rect3461"
+ width="84.249771"
+ height="41.517296"
+ x="66.555992"
+ y="36.749054" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.73, 0.865;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 149.57761,77.267496 301.74652,88.379163"
+ id="path4533-3-7"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g4698"
+ transform="translate(55.540721,9.7505553)">
+ <g
+ id="g1052-9-9-7"
+ transform="translate(174.2039,11.30255)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-6-1"
+ transform="translate(121.02732,11.367907)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-4-7"
+ transform="translate(110.43348,11.457714)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-0-4"
+ transform="translate(142.33462,11.336526)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-7-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-6-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-8-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8-0"
+ transform="translate(131.6518,11.339048)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-9-0"
+ transform="translate(163.61466,11.246874)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-2-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-0-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-6-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0"
+ transform="translate(152.90749,11.301533)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-2-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-22-0"
+ transform="translate(121.05875,21.910393)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-5-9"
+ transform="translate(110.46491,22.0002)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-9-0"
+ transform="translate(131.68323,21.881534)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-7-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-7-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-6-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-7-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-1-4"
+ transform="translate(142.36605,21.879012)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-77-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-1-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-1-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-3-4"
+ transform="translate(163.64609,21.78936)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-6-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-5-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-63-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-4-4"
+ transform="translate(152.93892,21.844019)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-8-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-1-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-9-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-3-9"
+ transform="translate(174.29048,21.780069)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-08-22"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-8-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-5-1"
+ transform="translate(121.09524,32.284674)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-61-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-15-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-48-2"
+ transform="translate(110.5014,32.374481)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-1-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-0-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-3-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-0-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-4-8"
+ transform="translate(142.40254,32.253293)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-7-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-6-3"
+ transform="translate(131.71972,32.255815)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-3-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-1-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-7-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-5-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-96-6"
+ transform="translate(163.68258,32.163641)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-21-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-7-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-8-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-7-8"
+ transform="translate(152.97541,32.2183)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-18-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-5-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-97-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5-3"
+ transform="translate(174.32696,32.15435)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-8-6"
+ transform="translate(121.07998,42.102698)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-60-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-48-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-8-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-89-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-7-8"
+ transform="translate(110.48614,42.192505)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-76-79"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-43-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-03-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-09-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-2-1"
+ transform="translate(142.38729,42.071317)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-5-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-40-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-5-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-4-0"
+ transform="translate(131.70446,42.073839)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-6-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-9-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-2-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-4-7"
+ transform="translate(163.66733,41.981665)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-7-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-75-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-4-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-81-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-2-8"
+ transform="translate(152.96015,42.036324)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-89-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-68-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-0-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2-8"
+ transform="translate(174.31171,41.972374)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-15"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-92"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-9-7-5"
+ transform="translate(184.38619,11.471979)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5-40"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-3-9-1"
+ transform="translate(184.47277,21.949498)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-9-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-08-22-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-8-6-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-5-4-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5-3-1"
+ transform="translate(184.50925,32.323779)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8-7-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83-3-32"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1-2-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2-8-7"
+ transform="translate(184.494,42.141803)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-9-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-15-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-4-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-92-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ </g>
+ <g
+ id="g4698-2"
+ transform="translate(103.99571,147.10736)">
+ <g
+ id="g1052-9-9-7-2"
+ transform="translate(126.23318,-40.652773)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-6-1-6"
+ transform="translate(72.684847,-40.246111)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-4-7-44"
+ transform="translate(62.091007,-40.156304)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-0-4-5"
+ transform="translate(93.992147,-40.277492)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-7-2-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-8-9-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-6-6-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-8-1-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8-0-4"
+ transform="translate(83.309327,-40.27497)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-4-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-9-0-1"
+ transform="translate(115.27219,-40.367144)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-2-5-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-0-5-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-6-2-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-8-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0-5"
+ transform="translate(104.56502,-40.312485)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-2-2-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-22-0-6"
+ transform="translate(72.716277,-29.703625)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-5-9-0"
+ transform="translate(62.122437,-29.613818)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-9-0-5"
+ transform="translate(83.340757,-29.732484)"
+ style="opacity:0.252344">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-7-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-7-0-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-6-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-7-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-1-4-5"
+ transform="translate(94.023577,-29.735006)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-77-9-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-1-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-1-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-5-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-3-4-6"
+ transform="translate(115.30362,-29.824658)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-6-3-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-5-5-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-63-1-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-9-7-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-4-4-7"
+ transform="translate(104.59645,-29.769999)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-8-3-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-1-1-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-2-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-9-6-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-5-1-0"
+ transform="translate(72.752767,-19.329344)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-61-2-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-15-8-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-9-8-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-8-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-48-2-6"
+ transform="translate(62.158927,-19.239537)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-1-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-0-8-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-3-8-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-0-6-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-4-8-2"
+ transform="translate(94.060067,-19.360725)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-4-3-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-4-8-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-4-3-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-7-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-6-3-2"
+ transform="translate(83.377247,-19.358203)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-3-8-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-1-0-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-7-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-5-7-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-96-6-0"
+ transform="translate(115.34011,-19.450377)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-21-8-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-7-9-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-8-0-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-5-6-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-7-8-2"
+ transform="translate(104.63294,-19.395718)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-4-7-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-18-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-5-0-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-97-3-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-5-3-2"
+ transform="translate(125.98449,-19.459668)">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-3-3-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-8-7-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-83-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-1-2-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-8-6-6"
+ transform="translate(72.737507,-9.5113204)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-60-5-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-48-2-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-8-6-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-89-5-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-7-8-2"
+ transform="translate(62.143667,-9.4215134)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-76-79-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-43-6-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-03-0-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-09-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-0-2-1-4"
+ transform="translate(94.044817,-9.5427014)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-93-5-0-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-6-40-4-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-0-5-8-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-6-9-7-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-4-0-1"
+ transform="translate(83.361987,-9.5401794)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-6-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-9-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-2-2-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-2-4-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-4-7-6"
+ transform="translate(115.32486,-9.6323534)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-7-9-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-75-3-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-4-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-81-2-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-9-0-1-2"
+ transform="translate(136.83954,-40.658221)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-2-5-3-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-0-5-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-6-2-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-8-9-8-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-3-4-6-0"
+ transform="translate(136.87097,-30.115735)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-6-3-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-5-5-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-63-1-9-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-9-7-0-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-3-4-6-0-7"
+ transform="translate(126.24242,-30.173373)"
+ style="opacity:0.252344">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-6-3-5-6-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-5-5-9-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-63-1-9-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-9-7-0-9-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-96-6-0-0"
+ transform="translate(136.90746,-19.741454)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-21-8-0-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-7-9-3-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-8-0-4-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-5-6-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-20-4-7-6-4"
+ transform="translate(136.89221,-9.9234312)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-2-7-9-9-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-3-75-3-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-75-4-9-1-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-92-81-2-3-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-2-8-3"
+ transform="translate(104.61768,-9.5776944)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-89-3-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-3-0-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-68-1-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-0-7-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-2-8-6"
+ transform="translate(125.96924,-9.6416444)"
+ style="opacity:0.15">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-1-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-05-15-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-1-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-10-92-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693"
+ width="21.177956"
+ height="20.838879"
+ x="115.31686"
+ y="-14.213038" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-4"
+ width="21.177956"
+ height="20.838879"
+ x="115.17234"
+ y="6.6754951" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-8"
+ width="21.177956"
+ height="20.838879"
+ x="136.78856"
+ y="-14.086202" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-1"
+ width="21.177956"
+ height="20.838879"
+ x="136.99756"
+ y="6.4101439" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-6"
+ width="21.177956"
+ height="20.838879"
+ x="158.1272"
+ y="-14.220315" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-85"
+ width="21.177956"
+ height="20.838879"
+ x="158.17397"
+ y="6.7189174" />
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-6-2"
+ width="21.177956"
+ height="20.838879"
+ x="179.34555"
+ y="-14.454299" />
+ <rect
+ style="fill:none;fill-opacity:1;stroke:#040000;stroke-width:0.865;stroke-dasharray:3.46, 0.865;stroke-dashoffset:0;paint-order:markers stroke fill"
+ id="rect6693-85-1"
+ width="21.177956"
+ height="20.838879"
+ x="179.64828"
+ y="6.1961193" />
+ </g>
+ <path
+ style="opacity:1;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.73, 0.865;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 66.659356,36.818342 218.82541,47.962052"
+ id="path4533"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.73, 0.865;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 150.73309,36.200165 302.902,47.311832"
+ id="path4533-3"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.865;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:1.73, 0.865;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 67.986904,77.950336 220.15295,89.094046"
+ id="path4533-7"
+ sodipodi:nodetypes="cc" />
+ <g
+ id="g1">
+ <g
+ id="g1052-9-9-7-0-7"
+ transform="translate(108.68336,116.60508)"
+ style="opacity:0.300974">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4-8-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99-1-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4-9-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5-9-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-4-7-4-0"
+ transform="translate(77.180174,116.39954)"
+ style="opacity:0.300974">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-9-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-0-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-2-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-0-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8-0-2-1"
+ transform="translate(87.639831,116.58827)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-4-4-0-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2-7-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2-3-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2-1-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0-7-9"
+ transform="translate(98.042911,116.4909)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-2-2-7-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3-0-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8-6-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-9-9-7-0-7-6"
+ transform="translate(108.66488,126.92391)"
+ style="opacity:0.300974">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-31-5-4-8-1-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-9-0-99-1-1-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-4-4-4-9-1-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-78-8-5-9-7-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-2-4-7-4-0-9"
+ transform="translate(77.161698,126.71837)"
+ style="opacity:0.300974">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-9-4-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-0-0-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-2-8-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-0-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8-0-2-1-1"
+ transform="translate(87.741912,126.78654)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-1-4-4-0-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2-7-6-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2-3-2-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2-1-1-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0-7-9-8"
+ transform="translate(98.024435,126.80973)"
+ style="opacity:1">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-97-2-2-7-6-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8-4-4-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3-0-8-5"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8-6-0-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.8;stroke-dasharray:3.2, 0.8;stroke-dashoffset:0;stroke-opacity:1;paint-order:markers stroke fill"
+ id="rect7388"
+ width="20.576803"
+ height="20.307524"
+ x="140.76538"
+ y="143.06564" />
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleStart)"
+ d="m 261.72591,93.236032 0.16234,31.497498"
+ id="path9137"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#TriangleStart-3)"
+ d="m 67.685641,168.64157 0.16234,16.82752"
+ id="path9137-7"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9374)"
+ d="m 212.12608,153.9478 c -0.39202,0.18905 -3.47785,0.26026 -7.09894,0.25872 -8.60075,-0.004 -21.95111,-0.0141 -21.95111,-0.0141"
+ id="path9370"
+ sodipodi:nodetypes="csc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="85.59259"
+ y="13.192001"
+ id="text9717"><tspan
+ sodipodi:role="line"
+ id="tspan9715"
+ style="stroke-width:0.264583px"
+ x="85.59259"
+ y="13.192001">Pixel array</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="230.03058"
+ y="35.165924"
+ id="text9717-7"><tspan
+ sodipodi:role="line"
+ id="tspan9715-6"
+ style="stroke-width:0.264583px"
+ x="230.03058"
+ y="35.165924">Analog crop</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="231.88487"
+ y="190.28648"
+ id="text9717-7-9"><tspan
+ sodipodi:role="line"
+ id="tspan9715-6-1"
+ style="stroke-width:0.264583px"
+ x="231.88487"
+ y="190.28648">Subsampling</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="125.35484"
+ y="177.69405"
+ id="text9717-7-9-1"><tspan
+ sodipodi:role="line"
+ id="tspan9715-6-1-9"
+ style="stroke-width:0.264583px"
+ x="125.35484"
+ y="177.69405">Digital crop</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.264583px"
+ x="125.35484"
+ y="190.92317"
+ id="tspan9850" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="43.724319"
+ y="202.93666"
+ id="text9717-7-9-1-5"><tspan
+ sodipodi:role="line"
+ id="tspan9715-6-1-9-3"
+ style="stroke-width:0.264583px"
+ x="43.724319"
+ y="202.93666">Media Bus</tspan><tspan
+ sodipodi:role="line"
+ style="stroke-width:0.264583px"
+ x="43.724319"
+ y="216.16579"
+ id="tspan9850-5" /></text>
+ <g
+ id="g2132"
+ transform="matrix(1.3821489,0,0,1.4039825,12.968023,-62.501729)"
+ style="stroke-width:0.717863">
+ <g
+ id="g1052-9-9-7-0-7-7"
+ transform="translate(-3.2072982,115.91871)"
+ style="opacity:0.300974;stroke-width:0.717863" />
+ <g
+ id="g1052-26-8-0-2-1-3"
+ transform="matrix(0.67497349,0,0,0.67524564,-2.9671558,128.89065)"
+ style="stroke-width:1.06333">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-1-4-4-0-6-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2-7-6-0"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2-3-2-62"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2-1-1-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0-7-9-1"
+ transform="matrix(0.67497349,0,0,0.67524564,4.0546474,128.8249)"
+ style="stroke-width:1.06333">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-97-2-2-7-6-8"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8-4-4-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3-0-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8-6-0-20"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-26-8-0-2-1-1-3"
+ transform="matrix(0.67497349,0,0,0.67524564,-2.8982539,135.77698)"
+ style="stroke-width:1.06333">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-1-4-4-0-6-5-6"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-5-8-3-2-7-6-5-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-3-7-1-2-3-2-4-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-56-9-4-2-1-1-9-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <g
+ id="g1052-28-9-0-7-9-8-3"
+ transform="matrix(0.67497349,0,0,0.67524564,4.0421766,135.79264)"
+ style="stroke-width:1.06333">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-97-2-2-7-6-3-1"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-5-36-6-8-4-4-8-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-3-1-6-3-0-8-5-4"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.393875;paint-order:markers stroke fill"
+ id="rect288-56-2-4-8-6-0-2-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ </g>
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker9374-3)"
+ d="m 123.82202,153.26143 c -0.39202,0.18905 -3.47785,0.26026 -7.09894,0.25872 -8.60075,-0.004 -21.951106,-0.0141 -21.951106,-0.0141"
+ id="path9370-4"
+ sodipodi:nodetypes="csc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 42.161302,205.87857 50.15057,-0.10808"
+ id="path1" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 43.410067,193.21441 50.15057,-0.10808"
+ id="path1-6" />
+ <ellipse
+ style="opacity:1;fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path2"
+ cx="263.63913"
+ cy="17.331734"
+ rx="8.0464878"
+ ry="7.6880746" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="261.26318"
+ y="21.157597"
+ id="text2"><tspan
+ sodipodi:role="line"
+ id="tspan2"
+ style="stroke-width:0.264583px"
+ x="261.26318"
+ y="21.157597">1</tspan></text>
+ <ellipse
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path2-7"
+ cx="264.95981"
+ cy="200.2849"
+ rx="8.0464878"
+ ry="7.6880746" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="262.07587"
+ y="204.11606"
+ id="text2-0"><tspan
+ sodipodi:role="line"
+ id="tspan2-9"
+ style="stroke-width:0.264583px"
+ x="262.07587"
+ y="204.11606">2</tspan></text>
+ <ellipse
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path2-6"
+ cx="44.883369"
+ cy="177.41577"
+ rx="8.0464878"
+ ry="7.6880746" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="41.983547"
+ y="181.24164"
+ id="text2-2"><tspan
+ sodipodi:role="line"
+ id="tspan2-6"
+ style="stroke-width:0.264583px"
+ x="41.983547"
+ y="181.24164">4</tspan></text>
+ <ellipse
+ style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-dasharray:none;paint-order:markers stroke fill"
+ id="path2-3"
+ cx="153.0576"
+ cy="191.86786"
+ rx="8.0464878"
+ ry="7.6880746" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="150.21071"
+ y="195.57201"
+ id="text2-6"><tspan
+ sodipodi:role="line"
+ id="tspan2-0"
+ style="stroke-width:0.264583px"
+ x="150.21071"
+ y="195.57201">3</tspan></text>
+ </g>
+</svg>
diff --git a/Documentation/skipping.svg b/Documentation/skipping.svg
new file mode 100644
index 00000000..7bef37cf
--- /dev/null
+++ b/Documentation/skipping.svg
@@ -0,0 +1,1720 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ width="297mm"
+ height="210mm"
+ viewBox="0 0 297 210"
+ version="1.1"
+ id="svg1"
+ inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
+ sodipodi:docname="skipping.svg"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg">
+ <sodipodi:namedview
+ id="namedview1"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ inkscape:document-units="mm"
+ showgrid="true"
+ showguides="true"
+ inkscape:zoom="0.91421356"
+ inkscape:cx="601.60998"
+ inkscape:cy="360.96599"
+ inkscape:window-width="1916"
+ inkscape:window-height="1040"
+ inkscape:window-x="0"
+ inkscape:window-y="38"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g2">
+ <inkscape:grid
+ id="grid1"
+ units="px"
+ originx="0"
+ originy="0"
+ spacingx="0.26458334"
+ spacingy="0.26458333"
+ empcolor="#0000ff"
+ empopacity="0.25098039"
+ color="#0000ff"
+ opacity="0.1254902"
+ empspacing="5"
+ dotted="false"
+ gridanglex="30"
+ gridanglez="30"
+ visible="true" />
+ </sodipodi:namedview>
+ <defs
+ id="defs1">
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-0" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-4" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-3"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-9" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-9"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-7" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-8"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-0-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-3-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-9-3" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-6-6"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-4-2" />
+ </marker>
+ <marker
+ style="overflow:visible"
+ id="ArrowWideRounded-1-8-5"
+ refX="0"
+ refY="0"
+ orient="auto-start-reverse"
+ inkscape:stockid="Wide, rounded arrow"
+ markerWidth="1"
+ markerHeight="1"
+ viewBox="0 0 1 1"
+ inkscape:isstock="true"
+ inkscape:collect="always"
+ preserveAspectRatio="xMidYMid">
+ <path
+ style="fill:none;stroke:context-stroke;stroke-width:1;stroke-linecap:round"
+ d="M 3,-3 0,0 3,3"
+ transform="rotate(180,0.125,0)"
+ sodipodi:nodetypes="ccc"
+ id="path4-0-3-0" />
+ </marker>
+ </defs>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1">
+ <g
+ id="g4698-2"
+ transform="translate(-26.194788,73.07432)">
+ <g
+ id="g1" />
+ <g
+ id="g2">
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3"
+ width="11.54506"
+ height="11.262992"
+ x="126.11332"
+ y="-33.444302" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6"
+ width="11.54506"
+ height="11.262992"
+ x="137.8185"
+ y="-33.530048" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3"
+ width="11.54506"
+ height="11.262992"
+ x="126.12312"
+ y="-21.618387" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3"
+ width="11.54506"
+ height="11.262992"
+ x="137.84511"
+ y="-21.731256" />
+ <g
+ id="g1052-2-4-7-44"
+ transform="matrix(2.2443659,0,0,2.2462986,-16.668792,-92.981079)"
+ style="stroke-width:0.445369">
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.164972;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.024174"
+ y="26.5942" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.164972;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.23954"
+ y="26.556028" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.164972;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7"
+ width="5.1440187"
+ height="5.0140224"
+ x="53.028545"
+ y="31.858822" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.164972;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2"
+ width="5.1440187"
+ height="5.0140224"
+ x="58.251408"
+ y="31.808577" />
+ </g>
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3"
+ width="11.54506"
+ height="11.262992"
+ x="126.18385"
+ y="-9.7627277" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5"
+ width="11.54506"
+ height="11.262992"
+ x="137.88902"
+ y="-9.8484716" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0"
+ width="11.54506"
+ height="11.262992"
+ x="126.19365"
+ y="2.0631855" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8"
+ width="11.54506"
+ height="11.262992"
+ x="137.91565"
+ y="1.9503218" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4"
+ width="11.54506"
+ height="11.262992"
+ x="102.40739"
+ y="-9.5609922" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1"
+ width="11.54506"
+ height="11.262992"
+ x="114.11258"
+ y="-9.6467371" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1"
+ width="11.54506"
+ height="11.262992"
+ x="102.41722"
+ y="2.2649202" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3"
+ width="11.54506"
+ height="11.262992"
+ x="114.13924"
+ y="2.1520538" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0"
+ width="11.54506"
+ height="11.262992"
+ x="173.61343"
+ y="-33.721619" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9"
+ width="11.54506"
+ height="11.262992"
+ x="185.3186"
+ y="-33.807365" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0"
+ width="11.54506"
+ height="11.262992"
+ x="173.62323"
+ y="-21.895706" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7"
+ width="11.54506"
+ height="11.262992"
+ x="185.34526"
+ y="-22.00857" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6"
+ width="11.54506"
+ height="11.262992"
+ x="149.83696"
+ y="-33.519886" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8"
+ width="11.54506"
+ height="11.262992"
+ x="161.54218"
+ y="-33.605633" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7"
+ width="11.54506"
+ height="11.262992"
+ x="149.8468"
+ y="-21.693974" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7"
+ width="11.54506"
+ height="11.262992"
+ x="161.5688"
+ y="-21.806837" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-4"
+ width="11.54506"
+ height="11.262992"
+ x="125.8679"
+ y="14.089965" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-0"
+ width="11.54506"
+ height="11.262992"
+ x="137.57307"
+ y="14.004221" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-1"
+ width="11.54506"
+ height="11.262992"
+ x="125.8777"
+ y="25.91588" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-2"
+ width="11.54506"
+ height="11.262992"
+ x="137.59967"
+ y="25.803013" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-0"
+ width="11.54506"
+ height="11.262992"
+ x="102.38698"
+ y="14.184427" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-1"
+ width="11.54506"
+ height="11.262992"
+ x="114.09217"
+ y="14.098681" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-5"
+ width="11.54506"
+ height="11.262992"
+ x="102.39677"
+ y="26.010342" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-2"
+ width="11.54506"
+ height="11.262992"
+ x="114.1188"
+ y="25.897474" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0"
+ width="11.54506"
+ height="11.262992"
+ x="173.368"
+ y="13.812649" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7"
+ width="11.54506"
+ height="11.262992"
+ x="185.07317"
+ y="13.726904" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1"
+ width="11.54506"
+ height="11.262992"
+ x="173.37778"
+ y="25.638563" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6"
+ width="11.54506"
+ height="11.262992"
+ x="185.09981"
+ y="25.525694" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4"
+ width="11.54506"
+ height="11.262992"
+ x="149.59154"
+ y="14.014381" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9"
+ width="11.54506"
+ height="11.262992"
+ x="161.29671"
+ y="13.928636" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5"
+ width="11.54506"
+ height="11.262992"
+ x="149.60135"
+ y="25.840294" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3"
+ width="11.54506"
+ height="11.262992"
+ x="161.32336"
+ y="25.727428" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6"
+ width="11.54506"
+ height="11.262992"
+ x="173.68398"
+ y="-10.040043" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5"
+ width="11.54506"
+ height="11.262992"
+ x="185.38916"
+ y="-10.125788" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3"
+ width="11.54506"
+ height="11.262992"
+ x="173.69376"
+ y="1.7858695" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7"
+ width="11.54506"
+ height="11.262992"
+ x="185.4158"
+ y="1.6730031" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9"
+ width="11.54506"
+ height="11.262992"
+ x="149.90752"
+ y="-9.8383083" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7"
+ width="11.54506"
+ height="11.262992"
+ x="161.6127"
+ y="-9.9240551" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2"
+ width="11.54506"
+ height="11.262992"
+ x="149.91733"
+ y="1.9876043" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6"
+ width="11.54506"
+ height="11.262992"
+ x="161.63936"
+ y="1.8747379" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-3"
+ width="11.54506"
+ height="11.262992"
+ x="221.3436"
+ y="-34.173023" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-6"
+ width="11.54506"
+ height="11.262992"
+ x="233.04878"
+ y="-34.25877" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-3"
+ width="11.54506"
+ height="11.262992"
+ x="221.35339"
+ y="-22.347115" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-60"
+ width="11.54506"
+ height="11.262992"
+ x="233.07542"
+ y="-22.459978" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-44"
+ width="11.54506"
+ height="11.262992"
+ x="197.56715"
+ y="-33.971294" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-96"
+ width="11.54506"
+ height="11.262992"
+ x="209.27232"
+ y="-34.057037" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-6"
+ width="11.54506"
+ height="11.262992"
+ x="197.57697"
+ y="-22.145384" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-4"
+ width="11.54506"
+ height="11.262992"
+ x="209.29898"
+ y="-22.258247" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0-1"
+ width="11.54506"
+ height="11.262992"
+ x="221.09816"
+ y="13.361241" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7-9"
+ width="11.54506"
+ height="11.262992"
+ x="232.80333"
+ y="13.275496" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1-8"
+ width="11.54506"
+ height="11.262992"
+ x="221.10796"
+ y="25.187153" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6-0"
+ width="11.54506"
+ height="11.262992"
+ x="232.82999"
+ y="25.074286" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4-4"
+ width="11.54506"
+ height="11.262992"
+ x="197.32172"
+ y="13.562973" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9-9"
+ width="11.54506"
+ height="11.262992"
+ x="209.02689"
+ y="13.477229" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5-0"
+ width="11.54506"
+ height="11.262992"
+ x="197.33153"
+ y="25.388887" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3-5"
+ width="11.54506"
+ height="11.262992"
+ x="209.05351"
+ y="25.27602" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6-5"
+ width="11.54506"
+ height="11.262992"
+ x="221.41415"
+ y="-10.491449" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-0"
+ width="11.54506"
+ height="11.262992"
+ x="233.11932"
+ y="-10.577197" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3-1"
+ width="11.54506"
+ height="11.262992"
+ x="221.42395"
+ y="1.3344631" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7-6"
+ width="11.54506"
+ height="11.262992"
+ x="233.14598"
+ y="1.2215967" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-0"
+ width="11.54506"
+ height="11.262992"
+ x="197.63768"
+ y="-10.289718" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7-2"
+ width="11.54506"
+ height="11.262992"
+ x="209.34288"
+ y="-10.375462" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-8"
+ width="11.54506"
+ height="11.262992"
+ x="197.64748"
+ y="1.5361952" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-8"
+ width="11.54506"
+ height="11.262992"
+ x="209.36951"
+ y="1.4233288" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-3"
+ width="11.54506"
+ height="11.262992"
+ x="126.15435"
+ y="37.763531" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-8"
+ width="11.54506"
+ height="11.262992"
+ x="137.85956"
+ y="37.677784" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-6"
+ width="11.54506"
+ height="11.262992"
+ x="126.16419"
+ y="49.589439" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-1"
+ width="11.54506"
+ height="11.262992"
+ x="137.88618"
+ y="49.476574" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-6"
+ width="11.54506"
+ height="11.262992"
+ x="102.37791"
+ y="37.96526" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-0"
+ width="11.54506"
+ height="11.262992"
+ x="114.08312"
+ y="37.879513" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-9"
+ width="11.54506"
+ height="11.262992"
+ x="102.3877"
+ y="49.791176" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-1"
+ width="11.54506"
+ height="11.262992"
+ x="114.10973"
+ y="49.678307" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-4-9"
+ width="11.54506"
+ height="11.262992"
+ x="125.83842"
+ y="61.616215" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-0-1"
+ width="11.54506"
+ height="11.262992"
+ x="137.54358"
+ y="61.530472" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-1-5"
+ width="11.54506"
+ height="11.262992"
+ x="125.69932"
+ y="73.643074" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-2-0"
+ width="11.54506"
+ height="11.262992"
+ x="137.4213"
+ y="73.530205" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-0-9"
+ width="11.54506"
+ height="11.262992"
+ x="102.35748"
+ y="61.710678" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-1-4"
+ width="11.54506"
+ height="11.262992"
+ x="114.06268"
+ y="61.624939" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-5-9"
+ width="11.54506"
+ height="11.262992"
+ x="102.2184"
+ y="73.737526" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-2-6"
+ width="11.54506"
+ height="11.262992"
+ x="113.94043"
+ y="73.624664" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0-8"
+ width="11.54506"
+ height="11.262992"
+ x="173.3385"
+ y="61.338898" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7-2"
+ width="11.54506"
+ height="11.262992"
+ x="185.04369"
+ y="61.253159" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1-4"
+ width="11.54506"
+ height="11.262992"
+ x="173.19939"
+ y="73.365753" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6-6"
+ width="11.54506"
+ height="11.262992"
+ x="184.92143"
+ y="73.252884" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4-5"
+ width="11.54506"
+ height="11.262992"
+ x="149.56206"
+ y="61.540638" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9-3"
+ width="11.54506"
+ height="11.262992"
+ x="161.26723"
+ y="61.454887" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5-4"
+ width="11.54506"
+ height="11.262992"
+ x="149.42297"
+ y="73.56749" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3-7"
+ width="11.54506"
+ height="11.262992"
+ x="161.14496"
+ y="73.454613" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6-4"
+ width="11.54506"
+ height="11.262992"
+ x="173.6545"
+ y="37.486214" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-7"
+ width="11.54506"
+ height="11.262992"
+ x="185.35968"
+ y="37.400467" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3-14"
+ width="11.54506"
+ height="11.262992"
+ x="173.66429"
+ y="49.312122" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7-0"
+ width="11.54506"
+ height="11.262992"
+ x="185.38632"
+ y="49.199261" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-4"
+ width="11.54506"
+ height="11.262992"
+ x="149.87804"
+ y="37.687943" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7-8"
+ width="11.54506"
+ height="11.262992"
+ x="161.58322"
+ y="37.6022" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-3"
+ width="11.54506"
+ height="11.262992"
+ x="149.88785"
+ y="49.513859" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-3"
+ width="11.54506"
+ height="11.262992"
+ x="161.60985"
+ y="49.40099" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0-1-4"
+ width="11.54506"
+ height="11.262992"
+ x="221.06868"
+ y="60.887497" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7-9-6"
+ width="11.54506"
+ height="11.262992"
+ x="232.77385"
+ y="60.801754" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1-8-1"
+ width="11.54506"
+ height="11.262992"
+ x="220.92955"
+ y="72.914345" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6-0-5"
+ width="11.54506"
+ height="11.262992"
+ x="232.65158"
+ y="72.801476" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4-4-5"
+ width="11.54506"
+ height="11.262992"
+ x="197.29221"
+ y="61.089226" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9-9-4"
+ width="11.54506"
+ height="11.262992"
+ x="208.99741"
+ y="61.003483" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5-0-6"
+ width="11.54506"
+ height="11.262992"
+ x="197.15314"
+ y="73.116074" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3-5-6"
+ width="11.54506"
+ height="11.262992"
+ x="208.87514"
+ y="73.003212" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6-5-9"
+ width="11.54506"
+ height="11.262992"
+ x="221.38467"
+ y="37.034805" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-0-6"
+ width="11.54506"
+ height="11.262992"
+ x="233.08984"
+ y="36.949059" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3-1-7"
+ width="11.54506"
+ height="11.262992"
+ x="221.39447"
+ y="48.860718" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7-6-5"
+ width="11.54506"
+ height="11.262992"
+ x="233.11649"
+ y="48.747845" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-0-6"
+ width="11.54506"
+ height="11.262992"
+ x="197.6082"
+ y="37.236534" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7-2-4"
+ width="11.54506"
+ height="11.262992"
+ x="209.31339"
+ y="37.150791" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-8-3"
+ width="11.54506"
+ height="11.262992"
+ x="197.618"
+ y="49.062447" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-8-0"
+ width="11.54506"
+ height="11.262992"
+ x="209.34003"
+ y="48.949585" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-3-8"
+ width="11.54506"
+ height="11.262992"
+ x="268.99387"
+ y="-34.440758" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-6-0"
+ width="11.54506"
+ height="11.262992"
+ x="280.69904"
+ y="-34.526497" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-3-9"
+ width="11.54506"
+ height="11.262992"
+ x="269.00366"
+ y="-22.614843" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-60-6"
+ width="11.54506"
+ height="11.262992"
+ x="280.72571"
+ y="-22.727707" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-44-7"
+ width="11.54506"
+ height="11.262992"
+ x="245.21744"
+ y="-34.239029" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-96-2"
+ width="11.54506"
+ height="11.262992"
+ x="256.92261"
+ y="-34.324772" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-6-1"
+ width="11.54506"
+ height="11.262992"
+ x="245.22725"
+ y="-22.413116" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-4-4"
+ width="11.54506"
+ height="11.262992"
+ x="256.94925"
+ y="-22.525974" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0-1-48"
+ width="11.54506"
+ height="11.262992"
+ x="268.74844"
+ y="13.09351" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7-9-4"
+ width="11.54506"
+ height="11.262992"
+ x="280.45361"
+ y="13.007765" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1-8-9"
+ width="11.54506"
+ height="11.262992"
+ x="268.75824"
+ y="24.919422" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6-0-8"
+ width="11.54506"
+ height="11.262992"
+ x="280.48026"
+ y="24.806559" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4-4-4"
+ width="11.54506"
+ height="11.262992"
+ x="244.97197"
+ y="13.29524" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9-9-41"
+ width="11.54506"
+ height="11.262992"
+ x="256.67715"
+ y="13.209496" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5-0-9"
+ width="11.54506"
+ height="11.262992"
+ x="244.98181"
+ y="25.121157" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3-5-68"
+ width="11.54506"
+ height="11.262992"
+ x="256.7038"
+ y="25.008287" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6-5-0"
+ width="11.54506"
+ height="11.262992"
+ x="269.06442"
+ y="-10.759184" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-0-9"
+ width="11.54506"
+ height="11.262992"
+ x="280.76959"
+ y="-10.844928" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3-1-3"
+ width="11.54506"
+ height="11.262992"
+ x="269.07422"
+ y="1.0667289" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7-6-6"
+ width="11.54506"
+ height="11.262992"
+ x="280.79623"
+ y="0.95386255" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-0-3"
+ width="11.54506"
+ height="11.262992"
+ x="245.28796"
+ y="-10.557449" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7-2-8"
+ width="11.54506"
+ height="11.262992"
+ x="256.99316"
+ y="-10.643196" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-8-9"
+ width="11.54506"
+ height="11.262992"
+ x="245.29776"
+ y="1.2684637" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-8-5"
+ width="11.54506"
+ height="11.262992"
+ x="257.01981"
+ y="1.1555973" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-937-0-3-0-0-1-4-0"
+ width="11.54506"
+ height="11.262992"
+ x="268.71893"
+ y="60.619762" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-4-7-6-9-7-9-6-1"
+ width="11.54506"
+ height="11.262992"
+ x="280.42413"
+ y="60.534019" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-5-5-3-0-1-8-1-7"
+ width="11.54506"
+ height="11.262992"
+ x="268.57983"
+ y="72.646606" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-25-8-3-7-6-0-5-1"
+ width="11.54506"
+ height="11.262992"
+ x="280.30188"
+ y="72.533737" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-7-0-3-6-4-4-5-9"
+ width="11.54506"
+ height="11.262992"
+ x="244.94249"
+ y="60.821495" />
+ <rect
+ style="fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-4-4-9-8-9-9-4-8"
+ width="11.54506"
+ height="11.262992"
+ x="256.64767"
+ y="60.735752" />
+ <rect
+ style="fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-4-8-7-7-5-0-6-2"
+ width="11.54506"
+ height="11.262992"
+ x="244.80341"
+ y="72.848343" />
+ <rect
+ style="fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-3-0-2-7-3-5-6-6"
+ width="11.54506"
+ height="11.262992"
+ x="256.52542"
+ y="72.735474" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-6-4-3-6-5-9-7"
+ width="11.54506"
+ height="11.262992"
+ x="269.03494"
+ y="36.767071" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-10-0-5-5-0-6-5"
+ width="11.54506"
+ height="11.262992"
+ x="280.74011"
+ y="36.681328" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-6-9-0-3-1-7-9"
+ width="11.54506"
+ height="11.262992"
+ x="269.04474"
+ y="48.592983" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-1-1-8-7-6-5-3"
+ width="11.54506"
+ height="11.262992"
+ x="280.76675"
+ y="48.480114" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-9-9-6-4-9-0-6-9"
+ width="11.54506"
+ height="11.262992"
+ x="245.25848"
+ y="36.968803" />
+ <rect
+ style="opacity:0.15;fill:#0100ff;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-5-1-49-2-1-7-2-4-9"
+ width="11.54506"
+ height="11.262992"
+ x="256.96365"
+ y="36.883057" />
+ <rect
+ style="opacity:0.15;fill:#ff000a;fill-opacity:1;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-3-2-0-5-1-2-8-3-7"
+ width="11.54506"
+ height="11.262992"
+ x="245.26828"
+ y="48.794716" />
+ <rect
+ style="opacity:0.15;fill:#00ff00;stroke:#040000;stroke-width:0.370417;paint-order:markers stroke fill"
+ id="rect288-56-7-9-4-3-6-8-0-9"
+ width="11.54506"
+ height="11.262992"
+ x="256.99033"
+ y="48.681854" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded)"
+ d="m 107.31925,-51.577366 c 4.74513,-3.867921 8.45747,-3.127986 11.65845,-0.106568"
+ id="path2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1)"
+ d="m 155.69201,-52.103201 c 4.74513,-3.867922 8.45748,-3.127987 11.65845,-0.106568"
+ id="path2-0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-8)"
+ d="m 205.6246,-51.786864 c 4.74513,-3.867923 8.45746,-3.127986 11.65845,-0.106568"
+ id="path2-0-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-1-8-5)"
+ d="m 252.68356,-50.911879 c 4.74513,-3.867922 8.45748,-3.127987 11.65845,-0.106568"
+ id="path2-0-9-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded)"
+ d="m 119.2485,-56.261218 c 10.02527,-3.47338 19.6883,-7.598722 35.75846,-0.191608"
+ id="path3"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-6)"
+ d="m 167.15143,-55.799841 c 10.02528,-3.473382 19.68831,-7.598723 35.75847,-0.191609"
+ id="path3-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.250001;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-6-6)"
+ d="m 217.31498,-57.659731 c 10.02527,-3.473382 19.6883,-7.598723 35.75847,-0.191609"
+ id="path3-9-2"
+ sodipodi:nodetypes="cc" />
+ <ellipse
+ id="path5"
+ style="fill:#f6e9e9;stroke:#000000;stroke-width:0.264583"
+ cx="88.19117"
+ cy="-29.671202"
+ rx="0.020938689"
+ ry="0.020956721" />
+ <ellipse
+ id="path6"
+ style="fill:#f6e9e9;stroke:#000000;stroke-width:0.264583"
+ cx="88.29512"
+ cy="-17.772333"
+ rx="0.020938689"
+ ry="0.020956721" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded)"
+ d="m 88.210313,-29.749351 c -3.901538,3.593858 -2.316274,7.754777 0.03417,11.994772"
+ id="path7"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-3)"
+ d="m 88.476097,20.705783 c -3.901539,3.593858 -2.316274,7.754778 0.03417,11.994772"
+ id="path7-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583;stroke-linecap:butt;stroke-linejoin:miter;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#ArrowWideRounded-3-5)"
+ d="m 88.077894,70.899225 c -3.901538,3.593858 -2.316273,7.754778 0.03417,11.994772"
+ id="path7-5-0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#ArrowWideRounded)"
+ d="M 85.21112,-18.062254 C 77.854142,-3.5491421 78.306424,9.1772046 85.12651,20.446596"
+ id="path8"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#ArrowWideRounded-9)"
+ d="m 84.721251,32.988117 c -7.356992,14.513113 -6.90471,27.239459 -0.08461,38.508851"
+ id="path8-8"
+ sodipodi:nodetypes="cc" />
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="47.435753"
+ y="-48.114857"
+ id="text8"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ id="tspan8"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.435753"
+ y="-48.114857">x_even_inc = 1</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.435753"
+ y="-40.193825"
+ id="tspan14" /><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.435753"
+ y="-32.272789"
+ id="tspan9" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="33.799152"
+ y="-23.751602"
+ id="text8-5"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="33.799152"
+ y="-23.751602"
+ id="tspan13">y_even_inc = 1</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="33.799152"
+ y="-15.830566"
+ id="tspan9-8" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="105.17001"
+ y="-40.766998"
+ id="text8-5-9"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="105.17001"
+ y="-40.766998"
+ id="tspan13-1"> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="105.17001"
+ y="-32.845963"
+ id="tspan9-8-2" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="47.782906"
+ y="-57.348003"
+ id="text8-3"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ id="tspan8-4"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.782906"
+ y="-57.348003">x_odd_inc = 3 </tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.782906"
+ y="-49.426968"
+ id="tspan10" /><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="47.782906"
+ y="-41.505932"
+ id="tspan9-0" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="35.099522"
+ y="-13.290938"
+ id="text8-3-5"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="35.099522"
+ y="-13.290938"
+ id="tspan12">y_odd_inc = 3</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="35.099522"
+ y="-5.3699036"
+ id="tspan10-1" /><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="35.099522"
+ y="2.5511286"
+ id="tspan9-0-4" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.25663"
+ y="-25.301243"
+ id="text8-5-9-2"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.25663"
+ y="-25.301243"
+ id="tspan13-1-6">0</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.25663"
+ y="-17.380207"
+ id="tspan9-8-2-0" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="94.882782"
+ y="-12.704006"
+ id="text8-5-9-2-0"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="94.882782"
+ y="-12.704006"
+ id="tspan13-1-6-8">1</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="94.882782"
+ y="-4.7829742"
+ id="tspan9-8-2-0-6" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.313683"
+ y="-1.2592223"
+ id="text8-5-9-2-6"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.313683"
+ y="-1.2592223"
+ id="tspan13-1-6-0">2</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.313683"
+ y="6.6618114"
+ id="tspan9-8-2-0-5" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.326363"
+ y="9.9864616"
+ id="text8-5-9-2-5"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.326363"
+ y="9.9864616"
+ id="tspan13-1-6-04">3</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.326363"
+ y="17.907495"
+ id="tspan9-8-2-0-9" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.3517"
+ y="22.179893"
+ id="text8-5-9-2-09"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.3517"
+ y="22.179893"
+ id="tspan13-1-6-6">4</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.3517"
+ y="30.100925"
+ id="tspan9-8-2-0-60" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.307358"
+ y="33.597816"
+ id="text8-5-9-2-8"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.307358"
+ y="33.597816"
+ id="tspan13-1-6-68">5</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.307358"
+ y="41.518852"
+ id="tspan9-8-2-0-53" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.25663"
+ y="46.90731"
+ id="text8-5-9-2-7"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.25663"
+ y="46.90731"
+ id="tspan13-1-6-80">6</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.25663"
+ y="54.828346"
+ id="tspan9-8-2-0-8" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.23764"
+ y="58.228878"
+ id="text8-5-9-2-9"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.23764"
+ y="58.228878"
+ id="tspan13-1-6-7">7</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.23764"
+ y="66.14991"
+ id="tspan9-8-2-0-2" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.294655"
+ y="70.441017"
+ id="text8-5-9-2-80"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.294655"
+ y="70.441017"
+ id="tspan13-1-6-62">8</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.294655"
+ y="78.362045"
+ id="tspan9-8-2-0-65" /></text>
+ <text
+ xml:space="preserve"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;line-height:125%;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ x="95.288322"
+ y="82.355179"
+ id="text8-5-9-2-1"
+ transform="scale(0.99956973,1.0004305)"><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.288322"
+ y="82.355179"
+ id="tspan13-1-6-71">9</tspan><tspan
+ sodipodi:role="line"
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:6.33683px;font-family:Sans;-inkscape-font-specification:'Sans, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;stroke-width:0.264583px"
+ x="95.288322"
+ y="90.276215"
+ id="tspan9-8-2-0-3" /></text>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/Documentation/software-isp-benchmarking.rst b/Documentation/software-isp-benchmarking.rst
new file mode 100644
index 00000000..9c2a409b
--- /dev/null
+++ b/Documentation/software-isp-benchmarking.rst
@@ -0,0 +1,79 @@
+.. SPDX-License-Identifier: CC-BY-SA-4.0
+
+.. include:: documentation-contents.rst
+
+.. _software-isp-benchmarking:
+
+Software ISP benchmarking
+=========================
+
+The Software ISP is particularly sensitive to performance regressions therefore
+it is a good idea to always benchmark the Software ISP before and after making
+changes to it and ensure that there are no performance regressions.
+
+DebayerCpu class builtin benchmark
+----------------------------------
+
+The DebayerCpu class has a builtin benchmark. This benchmark measures the time
+spent on processing (collecting statistics and debayering) only, it does not
+measure the time spent on capturing or outputting the frames.
+
+The builtin benchmark always runs. So this can be used by simply running "cam"
+or "qcam" with a pipeline using the Software ISP.
+
+When it runs it will skip measuring the first 30 frames to allow the caches and
+the CPU temperature (turbo-ing) to warm-up and then it measures 30 fps and shows
+the total and per frame processing time using an info level log message:
+
+.. code-block:: text
+
+ INFO Debayer debayer_cpu.cpp:907 Processed 30 frames in 244317us, 8143 us/frame
+
+To get stable measurements it is advised to disable any other processes which
+may cause significant CPU usage (e.g. disable wifi, bluetooth and browsers).
+When possible it is also advisable to disable CPU turbo-ing and
+frequency-scaling.
+
+For example when benchmarking on a Lenovo ThinkPad X1 Yoga Gen 8, with the
+charger plugged in, the CPU can be fixed to run at 2 GHz using:
+
+.. code-block:: shell
+
+ sudo x86_energy_perf_policy --turbo-enable 0
+ sudo cpupower frequency-set -d 2GHz -u 2GHz
+
+with these settings the builtin bench reports a processing time of ~7.8ms/frame
+on this laptop for FHD SGRBG10 (unpacked) bayer data.
+
+Measuring power consumption
+---------------------------
+
+Since the Software ISP is often used on mobile devices it is also important to
+measure power consumption and ensure that that does not regress.
+
+For example to measure power consumption on a Lenovo ThinkPad X1 Yoga Gen 8 it
+needs to be running on battery and it should be configured with its
+platform-profile (/sys/firmware/acpi/platform_profile) set to balanced and with
+its default turbo and frequency-scaling behavior to match real world usage.
+
+Then start qcam to capture a FHD picture at 30 fps and position the qcam window
+so that it is fully visible. After this run the following command to monitor the
+power consumption:
+
+.. code-block:: shell
+
+ watch -n 10 cat /sys/class/power_supply/BAT0/power_now /sys/class/hwmon/hwmon6/fan?_input
+
+Note this not only measures the power consumption in µW it also monitors the
+speed of this laptop's 2 fans. This is important because depending on the
+ambient temperature the 2 fans may spin up while testing and this will cause an
+additional power consumption of approx. 0.5 W messing up the measurement.
+
+After starting qcam + the watch command let the laptop sit without using it for
+2 minutes for the readings to stabilize. Then check that the fans have not
+turned on and manually take a couple of consecutive power readings and average
+these.
+
+On the example Lenovo ThinkPad X1 Yoga Gen 8 laptop this results in a measured
+power consumption of approx. 13 W while running qcam versus approx. 4-5 W while
+setting idle with its OLED panel on.
diff --git a/Documentation/theme/footer.html b/Documentation/theme/footer.html
index e63e9fb3..12939e8b 100644
--- a/Documentation/theme/footer.html
+++ b/Documentation/theme/footer.html
@@ -1,3 +1,6 @@
+{#
+SPDX-License-Identifier: CC-BY-SA-4.0
+#}
<footer>
<div id="signature">
{%- if show_copyright %}
diff --git a/Documentation/theme/layout.html b/Documentation/theme/layout.html
index 139c39c7..4fffefab 100644
--- a/Documentation/theme/layout.html
+++ b/Documentation/theme/layout.html
@@ -1,3 +1,6 @@
+{#
+SPDX-License-Identifier: CC-BY-SA-4.0
+#}
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
@@ -30,11 +33,6 @@
{% endif %}
- {# RTD hosts this file, so just load on non RTD builds #}
- {% if not READTHEDOCS %}
- <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
- {% endif %}
-
{% for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
diff --git a/Documentation/theme/search.html b/Documentation/theme/search.html
index 14d59395..00c2af93 100644
--- a/Documentation/theme/search.html
+++ b/Documentation/theme/search.html
@@ -1,4 +1,7 @@
{#
+SPDX-License-Identifier: CC-BY-SA-4.0
+#}
+{#
basic/search.html
~~~~~~~~~~~~~~~~~
diff --git a/Documentation/theme/static/css/theme.css b/Documentation/theme/static/css/theme.css
index a4934ede..a6d43195 100644
--- a/Documentation/theme/static/css/theme.css
+++ b/Documentation/theme/static/css/theme.css
@@ -1,3 +1,5 @@
+/* SPDX-License-Identifier: CC-BY-SA-4.0 */
+
html {
background-image: linear-gradient(to bottom right, #4895e1, #56c3ae);
background-size: cover;
@@ -281,9 +283,13 @@ div#signature {
font-size: 12px;
}
-#libcamera div.toctree-wrapper {
+#licensing div.toctree-wrapper {
height: 0px;
margin: 0px;
padding: 0px;
visibility: hidden;
}
+
+.documentation-nav {
+ display: none;
+}
diff --git a/Documentation/theme/theme.conf b/Documentation/theme/theme.conf
index ba25a192..f2ab39c3 100644
--- a/Documentation/theme/theme.conf
+++ b/Documentation/theme/theme.conf
@@ -1,3 +1,5 @@
+# SPDX-License-Identifier: CC-BY-SA-4.0
+
[theme]
inherit = basic
stylesheet = css/theme.css
diff --git a/Documentation/thread-safety.dox b/Documentation/thread-safety.dox
new file mode 100644
index 00000000..df4c457c
--- /dev/null
+++ b/Documentation/thread-safety.dox
@@ -0,0 +1,44 @@
+/**
+ * \page thread-safety Reentrancy and Thread-Safety
+ *
+ * Through the documentation, several terms are used to define how classes and
+ * their member functions can be used from multiple threads.
+ *
+ * - A **reentrant** function may be called simultaneously from multiple
+ * threads if and only if each invocation uses a different instance of the
+ * class. This is the default for all member functions not explictly marked
+ * otherwise.
+ *
+ * - \anchor thread-safe A **thread-safe** function may be called
+ * simultaneously from multiple threads on the same instance of a class. A
+ * thread-safe function is thus reentrant. Thread-safe functions may also be
+ * called simultaneously with any other reentrant function of the same class
+ * on the same instance.
+ *
+ * \internal
+ * - \anchor thread-bound A **thread-bound** function may be called only from
+ * the thread that the class instances lives in (see section \ref
+ * thread-objects). For instances of classes that do not derive from the
+ * Object class, this is the thread in which the instance was created. A
+ * thread-bound function is not thread-safe, and may or may not be reentrant.
+ * \endinternal
+ *
+ * Neither reentrancy nor thread-safety, in this context, mean that a function
+ * may be called simultaneously from the same thread, for instance from a
+ * callback invoked by the function. This may deadlock and isn't allowed unless
+ * separately documented.
+ *
+ * \if internal
+ * A class is defined as reentrant, thread-safe or thread-bound if all its
+ * member functions are reentrant, thread-safe or thread-bound respectively.
+ * \else
+ * A class is defined as reentrant or thread-safe if all its member functions
+ * are reentrant or thread-safe respectively.
+ * \endif
+ * Some member functions may additionally be documented as having additional
+ * thread-related attributes.
+ *
+ * Most classes are reentrant but not thread-safe, as making them fully
+ * thread-safe would incur locking costs considered prohibitive for the
+ * expected use cases.
+ */