diff options
115 files changed, 27692 insertions, 2231 deletions
@@ -20,6 +20,7 @@ steps: image: nixpkgs/nix:nixos-22.05 environment: GARAGE_TEST_INTEGRATION_EXE: result-bin/bin/garage + GARAGE_TEST_INTEGRATION_PATH: tmp-garage-integration commands: - nix-build --no-build-output --attr clippy.amd64 --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT} - nix-build --no-build-output --attr test.amd64 @@ -31,8 +32,9 @@ steps: - ./result/bin/garage_util-* - ./result/bin/garage_web-* - ./result/bin/garage-* - - ./result/bin/integration-* + - ./result/bin/integration-* || (cat tmp-garage-integration/stderr.log; false) - rm result + - rm -rv tmp-garage-integration - name: integration tests image: nixpkgs/nix:nixos-22.05 @@ -63,11 +65,16 @@ steps: - nix-build --no-build-output --attr pkgs.amd64.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT} - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage" - - name: integration + - name: integration tests image: nixpkgs/nix:nixos-22.05 commands: - nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false) + - name: upgrade tests + image: nixpkgs/nix:nixos-22.05 + commands: + - nix-shell --attr integration --run "./script/test-upgrade.sh v0.8.4 x86_64-unknown-linux-musl" || (cat /tmp/garage.log; false) + - name: push static binary image: nixpkgs/nix:nixos-22.05 environment: @@ -114,11 +121,16 @@ steps: - nix-build --no-build-output --attr pkgs.i386.release --argstr git_version ${DRONE_TAG:-$DRONE_COMMIT} - nix-shell --attr rust --run "./script/not-dynamic.sh result-bin/bin/garage" - - name: integration + - name: integration tests image: nixpkgs/nix:nixos-22.05 commands: - nix-shell --attr integration --run ./script/test-smoke.sh || (cat /tmp/garage.log; false) + - name: upgrade tests + image: nixpkgs/nix:nixos-22.05 + commands: + - nix-shell --attr integration --run "./script/test-upgrade.sh v0.8.4 i686-unknown-linux-musl" || (cat /tmp/garage.log; false) + - name: push static binary image: nixpkgs/nix:nixos-22.05 environment: @@ -283,6 +295,6 @@ trigger: --- kind: signature -hmac: ac09a5a8c82502f67271f93afa1e1e21ce66383b8e24a6deb26b285cc1c378ba +hmac: 0c4b57eb4b27b7c6a6ff21ab87f0767fe3eb90f5d95d5cbcdccf794e9d2a5d86 ... @@ -1301,6 +1301,7 @@ dependencies = [ "async-compression", "async-trait", "bytes", + "bytesize", "futures", "futures-util", "garage_db", @@ -1341,6 +1342,7 @@ dependencies = [ "async-trait", "base64 0.21.3", "blake2", + "chrono", "err-derive", "futures", "futures-util", @@ -1367,13 +1369,16 @@ dependencies = [ "arc-swap", "async-trait", "bytes", + "bytesize", "err-derive", + "format_table", "futures", "futures-util", "garage_db", "garage_util", "gethostname", "hex", + "itertools 0.10.5", "k8s-openapi", "kube", "kuska-sodiumoxide", @@ -2283,9 +2288,9 @@ checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" [[package]] name = "netapp" -version = "0.5.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ffe47ac46d3b2ce2f736a70865492df082e042eb2bfdddfca3b8dd66bd9469d" +checksum = "0a00b76cec93e3ae68c9ed5f08e27a1507424987ee23d5ec961ebd4da820a265" dependencies = [ "arc-swap", "async-trait", @@ -3032,9 +3037,9 @@ dependencies = [ [[package]] name = "rmp-serde" -version = "0.15.5" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723ecff9ad04f4ad92fe1c8ca6c20d2196d9286e9c60727c4cb5511629260e9d" +checksum = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a" dependencies = [ "byteorder", "rmp", @@ -7,13 +7,13 @@ args@{ "garage_db/default" "garage_util/default" "garage_rpc/default" + "format_table/default" "garage_table/default" "garage_block/default" "garage_model/default" "garage_api/default" "garage_web/default" "garage/default" - "format_table/default" "k2v-client/default" ], rustPackages, @@ -33,7 +33,7 @@ args@{ ignoreLockHash, }: let - nixifiedLockHash = "b73d35e98dc62acc3b01aba2cb825ba6e99217e46781b8c59f8e0ceef34e79d6"; + nixifiedLockHash = "3f325a8a549c43a788ff702e65f6de2d42ad19a46067248e29108e90212ca2f5"; workspaceSrc = if args.workspaceSrc == null then ./. else args.workspaceSrc; currentLockHash = builtins.hashFile "sha256" (workspaceSrc + /Cargo.lock); lockHashIgnored = if ignoreLockHash @@ -60,13 +60,13 @@ in garage_db = rustPackages.unknown.garage_db."0.8.4"; garage_util = rustPackages.unknown.garage_util."0.8.4"; garage_rpc = rustPackages.unknown.garage_rpc."0.8.4"; + format_table = rustPackages.unknown.format_table."0.1.1"; garage_table = rustPackages.unknown.garage_table."0.8.4"; garage_block = rustPackages.unknown.garage_block."0.8.4"; garage_model = rustPackages.unknown.garage_model."0.8.4"; garage_api = rustPackages.unknown.garage_api."0.8.4"; garage_web = rustPackages.unknown.garage_web."0.8.4"; garage = rustPackages.unknown.garage."0.8.4"; - format_table = rustPackages.unknown.format_table."0.1.1"; k2v-client = rustPackages.unknown.k2v-client."0.0.4"; }; "registry+https://github.com/rust-lang/crates.io-index".addr2line."0.21.0" = overridableMkRustCrate (profileName: rec { @@ -98,12 +98,12 @@ in (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "std") ]; dependencies = { - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "getrandom" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".getrandom."0.2.10" { inherit profileName; }).out; - ${ if (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && !((hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && hostPlatform.parsed.kernel.name == "none") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out; + ${ if (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") && !((hostPlatform.parsed.cpu.name == "armv6l" || hostPlatform.parsed.cpu.name == "armv7l") && hostPlatform.parsed.kernel.name == "none") then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out; }; buildDependencies = { - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "version_check" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.4" { profileName = "__noProfile"; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "version_check" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".version_check."0.9.4" { profileName = "__noProfile"; }).out; }; }); @@ -128,7 +128,7 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "alloc") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "alloc") ]; }); @@ -824,7 +824,7 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"; }; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; }; }); @@ -888,8 +888,8 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "17febce684fd15d89027105661fec94afb475cb995fbc59d2865198446ba2eea"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "extern_crate_alloc") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "extern_crate_std") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "extern_crate_alloc") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "extern_crate_std") ]; }); @@ -1182,13 +1182,13 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "alloc") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "default") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "std") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "alloc") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "default") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "std") ]; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "cfg_if" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".cfg-if."1.0.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_utils" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-utils."0.8.16" { inherit profileName; }).out; }; }); @@ -1459,8 +1459,8 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "default") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "std") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "default") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "std") ]; }); @@ -1716,13 +1716,13 @@ in (lib.optional (rootFeatures' ? "garage/default") "default") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/k2v") "k2v") (lib.optional (rootFeatures' ? "garage/kubernetes-discovery") "kubernetes-discovery") - (lib.optional (rootFeatures' ? "garage/lmdb") "lmdb") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb") "lmdb") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics") "metrics") (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "opentelemetry-otlp") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus") "opentelemetry-prometheus") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/prometheus") "prometheus") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled") "sled") - (lib.optional (rootFeatures' ? "garage/sqlite") "sqlite") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite") "sqlite") (lib.optional (rootFeatures' ? "garage/system-libs") "system-libs") (lib.optional (rootFeatures' ? "garage/telemetry-otlp") "telemetry-otlp") ]; @@ -1745,7 +1745,7 @@ in git_version = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".git-version."0.3.5" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out; - netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.5.2" { inherit profileName; }).out; + netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out; opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "opentelemetry_otlp" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry-otlp."0.10.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/metrics" || rootFeatures' ? "garage/opentelemetry-prometheus" then "opentelemetry_prometheus" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry-prometheus."0.10.0" { inherit profileName; }).out; @@ -1845,6 +1845,7 @@ in async_compression = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".async-compression."0.4.1" { inherit profileName; }).out; async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out; + bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out; futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out; futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out; garage_db = (rustPackages."unknown".garage_db."0.8.4" { inherit profileName; }).out; @@ -1873,20 +1874,20 @@ in (lib.optional (rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli") "clap") (lib.optional (rootFeatures' ? "garage_db/cli") "cli") (lib.optional (rootFeatures' ? "garage_db/default") "default") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "heed") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "lmdb") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "heed") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb") (lib.optional (rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger") "pretty_env_logger") - (lib.optional (rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "rusqlite") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "rusqlite") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "sled") - (lib.optional (rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "sqlite") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "sqlite") ]; dependencies = { ${ if rootFeatures' ? "garage_db/clap" || rootFeatures' ? "garage_db/cli" then "clap" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".clap."4.4.0" { inherit profileName; }).out; err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "heed" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed."0.11.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed."0.11.0" { inherit profileName; }).out; hexdump = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hexdump."0.1.1" { inherit profileName; }).out; ${ if rootFeatures' ? "garage_db/cli" || rootFeatures' ? "garage_db/pretty_env_logger" then "pretty_env_logger" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pretty_env_logger."0.5.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "rusqlite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.29.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "rusqlite" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rusqlite."0.29.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled" then "sled" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sled."0.34.7" { inherit profileName; }).out; tracing = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tracing."0.1.37" { inherit profileName; }).out; }; @@ -1903,15 +1904,16 @@ in features = builtins.concatLists [ (lib.optional (rootFeatures' ? "garage_model/default") "default") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/k2v" || rootFeatures' ? "garage_api/k2v" || rootFeatures' ? "garage_model/k2v") "k2v") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_model/lmdb") "lmdb") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb") (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sled" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sled") "sled") - (lib.optional (rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_model/sqlite") "sqlite") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "sqlite") ]; dependencies = { arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out; async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out; base64 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".base64."0.21.3" { inherit profileName; }).out; blake2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".blake2."0.10.6" { inherit profileName; }).out; + chrono = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".chrono."0.4.26" { inherit profileName; }).out; err_derive = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out; futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out; futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out; @@ -1921,7 +1923,7 @@ in garage_table = (rustPackages."unknown".garage_table."0.8.4" { inherit profileName; }).out; garage_util = (rustPackages."unknown".garage_util."0.8.4" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; - netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.5.2" { inherit profileName; }).out; + netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out; opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out; rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out; serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; @@ -1951,17 +1953,20 @@ in arc_swap = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".arc-swap."1.6.0" { inherit profileName; }).out; async_trait = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".async-trait."0.1.73" { profileName = "__noProfile"; }).out; bytes = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytes."1.4.0" { inherit profileName; }).out; + bytesize = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytesize."1.3.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/consul-discovery" || rootFeatures' ? "garage_rpc/consul-discovery" || rootFeatures' ? "garage_rpc/err-derive" then "err_derive" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".err-derive."0.3.1" { profileName = "__noProfile"; }).out; + format_table = (rustPackages."unknown".format_table."0.1.1" { inherit profileName; }).out; futures = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures."0.3.28" { inherit profileName; }).out; futures_util = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".futures-util."0.3.28" { inherit profileName; }).out; garage_db = (rustPackages."unknown".garage_db."0.8.4" { inherit profileName; }).out; garage_util = (rustPackages."unknown".garage_util."0.8.4" { inherit profileName; }).out; gethostname = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".gethostname."0.4.3" { inherit profileName; }).out; hex = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hex."0.4.3" { inherit profileName; }).out; + itertools = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".itertools."0.10.5" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/k8s-openapi" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "k8s_openapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".k8s-openapi."0.16.0" { inherit profileName; }).out; ${ if rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery" then "kube" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kube."0.75.0" { inherit profileName; }).out; sodiumoxide = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".kuska-sodiumoxide."0.2.5-0" { inherit profileName; }).out; - netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.5.2" { inherit profileName; }).out; + netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out; nix = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".nix."0.27.1" { inherit profileName; }).out; opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out; pnet_datalink = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pnet_datalink."0.33.0" { inherit profileName; }).out; @@ -2026,10 +2031,10 @@ in http = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".http."0.2.9" { inherit profileName; }).out; hyper = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hyper."0.14.27" { inherit profileName; }).out; lazy_static = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lazy_static."1.4.0" { inherit profileName; }).out; - netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.5.2" { inherit profileName; }).out; + netapp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" { inherit profileName; }).out; opentelemetry = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry."0.17.0" { inherit profileName; }).out; rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out; - rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.5" { inherit profileName; }).out; + rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."1.1.2" { inherit profileName; }).out; serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; serde_json = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out; sha2 = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".sha2."0.10.7" { inherit profileName; }).out; @@ -2181,15 +2186,15 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "ahash") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "allocator-api2") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "default") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "inline-more") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "ahash") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "allocator-api2") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "default") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "inline-more") (lib.optional (rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "raw") ]; dependencies = { - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.3" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "allocator_api2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".allocator-api2."0.2.16" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "ahash" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".ahash."0.8.3" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "allocator_api2" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".allocator-api2."0.2.16" { inherit profileName; }).out; }; }); @@ -2199,7 +2204,7 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f"; }; dependencies = { - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashbrown" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashbrown."0.14.0" { inherit profileName; }).out; }; }); @@ -2229,20 +2234,20 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "269c7486ed6def5d7b59a427cec3e87b4d4dd4381d01e21c8c9f2d3985688392"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "lmdb") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "lmdb-rkv-sys") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "lmdb-rkv-sys") ]; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "heed_types" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-types."0.8.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "lmdb_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lmdb-rkv-sys."0.11.2" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "page_size" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".page_size."0.4.2" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "synchronoise" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".synchronoise."1.0.1" { inherit profileName; }).out; - ${ if (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_types" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-types."0.8.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "lmdb_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".lmdb-rkv-sys."0.11.2" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "once_cell" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".once_cell."1.18.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "page_size" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".page_size."0.4.2" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "synchronoise" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".synchronoise."1.0.1" { inherit profileName; }).out; + ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "url" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".url."2.4.0" { inherit profileName; }).out; }; }); @@ -2259,20 +2264,20 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "9a6cf0a6952fcedc992602d5cddd1e3fff091fbe87d38636e3ec23a31f32acbd"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "bincode") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "default") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "serde") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "serde-bincode") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "serde-json") - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "serde_json") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "bincode") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "default") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "serde") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "serde-bincode") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "serde-json") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "serde_json") ]; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "bincode" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bincode."1.3.3" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bincode" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bincode."1.3.3" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "bytemuck" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bytemuck."1.13.1" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "byteorder" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "heed_traits" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".heed-traits."0.8.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "serde_json" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde_json."1.0.105" { inherit profileName; }).out; }; }); @@ -2648,12 +2653,12 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "default") - (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "use_alloc") - (lib.optional (rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp") "use_std") + [ "default" ] + [ "use_alloc" ] + [ "use_std" ] ]; dependencies = { - ${ if rootFeatures' ? "garage/opentelemetry-otlp" || rootFeatures' ? "garage/telemetry-otlp" then "either" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out; + either = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".either."1.9.0" { inherit profileName; }).out; }; }); @@ -3009,15 +3014,15 @@ in (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled") (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "bundled_bindings") (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "cc") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "default") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "min_sqlite_version_3_14_0") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "pkg-config") - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite") "vcpkg") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "default") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "min_sqlite_version_3_14_0") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "pkg-config") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite") "vcpkg") ]; buildDependencies = { ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "vcpkg" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".vcpkg."0.2.15" { profileName = "__noProfile"; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "vcpkg" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".vcpkg."0.2.15" { profileName = "__noProfile"; }).out; }; }); @@ -3047,14 +3052,14 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "61b9ce6b3be08acefa3003c57b7565377432a89ec24476bbe72e11d101f852fe"; }; features = builtins.concatLists [ - (lib.optional (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") "default") + (lib.optional (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") "default") ]; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; }; buildDependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out; - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "cc" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".cc."1.0.83" { profileName = "__noProfile"; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "pkg_config" else null } = (buildRustPackages."registry+https://github.com/rust-lang/crates.io-index".pkg-config."0.3.27" { profileName = "__noProfile"; }).out; }; }); @@ -3218,11 +3223,11 @@ in src = fetchCratesIo { inherit name version; sha256 = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"; }; }); - "registry+https://github.com/rust-lang/crates.io-index".netapp."0.5.2" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".netapp."0.10.0" = overridableMkRustCrate (profileName: rec { name = "netapp"; - version = "0.5.2"; + version = "0.10.0"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "4ffe47ac46d3b2ce2f736a70865492df082e042eb2bfdddfca3b8dd66bd9469d"; }; + src = fetchCratesIo { inherit name version; sha256 = "0a00b76cec93e3ae68c9ed5f08e27a1507424987ee23d5ec961ebd4da820a265"; }; features = builtins.concatLists [ [ "default" ] [ "opentelemetry" ] @@ -3244,7 +3249,7 @@ in opentelemetry_contrib = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".opentelemetry-contrib."0.9.0" { inherit profileName; }).out; pin_project = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".pin-project."1.1.3" { inherit profileName; }).out; rand = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rand."0.8.5" { inherit profileName; }).out; - rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.5" { inherit profileName; }).out; + rmp_serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp-serde."1.1.2" { inherit profileName; }).out; serde = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".serde."1.0.188" { inherit profileName; }).out; tokio = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio."1.32.0" { inherit profileName; }).out; tokio_stream = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".tokio-stream."0.1.14" { inherit profileName; }).out; @@ -3479,7 +3484,7 @@ in [ "default" ] [ "race" ] [ "std" ] - (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "unstable") + (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/kubernetes-discovery" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" || rootFeatures' ? "garage_rpc/kube" || rootFeatures' ? "garage_rpc/kubernetes-discovery") "unstable") ]; }); @@ -3617,8 +3622,8 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd"; }; dependencies = { - ${ if (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; - ${ if (rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out; + ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isUnix then "libc" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libc."0.2.147" { inherit profileName; }).out; + ${ if (rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb") && hostPlatform.isWindows then "winapi" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".winapi."0.3.9" { inherit profileName; }).out; }; }); @@ -4309,11 +4314,11 @@ in }; }); - "registry+https://github.com/rust-lang/crates.io-index".rmp-serde."0.15.5" = overridableMkRustCrate (profileName: rec { + "registry+https://github.com/rust-lang/crates.io-index".rmp-serde."1.1.2" = overridableMkRustCrate (profileName: rec { name = "rmp-serde"; - version = "0.15.5"; + version = "1.1.2"; registry = "registry+https://github.com/rust-lang/crates.io-index"; - src = fetchCratesIo { inherit name version; sha256 = "723ecff9ad04f4ad92fe1c8ca6c20d2196d9286e9c60727c4cb5511629260e9d"; }; + src = fetchCratesIo { inherit name version; sha256 = "bffea85eea980d8a74453e5d02a8d93028f3c34725de143085a844ebe953258a"; }; dependencies = { byteorder = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".byteorder."1.4.3" { inherit profileName; }).out; rmp = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".rmp."0.8.12" { inherit profileName; }).out; @@ -4346,12 +4351,12 @@ in (lib.optional (rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage_db/bundled-libs") "modern_sqlite") ]; dependencies = { - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "fallible_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.2.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "fallible_streaming_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-streaming-iterator."0.1.9" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "hashlink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.3" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "libsqlite3_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.26.0" { inherit profileName; }).out; - ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/sqlite" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "bitflags" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".bitflags."2.4.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "fallible_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-iterator."0.2.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "fallible_streaming_iterator" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".fallible-streaming-iterator."0.1.9" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "hashlink" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".hashlink."0.8.3" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "libsqlite3_sys" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".libsqlite3-sys."0.26.0" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/bundled-libs" || rootFeatures' ? "garage/default" || rootFeatures' ? "garage/sqlite" || rootFeatures' ? "garage_db/bundled-libs" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/rusqlite" || rootFeatures' ? "garage_db/sqlite" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/sqlite" then "smallvec" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".smallvec."1.11.0" { inherit profileName; }).out; }; }); @@ -5015,7 +5020,7 @@ in registry = "registry+https://github.com/rust-lang/crates.io-index"; src = fetchCratesIo { inherit name version; sha256 = "3dbc01390fc626ce8d1cffe3376ded2b72a11bb70e1c75f404a210e4daa4def2"; }; dependencies = { - ${ if rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_queue" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.8" { inherit profileName; }).out; + ${ if rootFeatures' ? "garage/default" || rootFeatures' ? "garage/lmdb" || rootFeatures' ? "garage_db/default" || rootFeatures' ? "garage_db/heed" || rootFeatures' ? "garage_db/lmdb" || rootFeatures' ? "garage_model/default" || rootFeatures' ? "garage_model/lmdb" then "crossbeam_queue" else null } = (rustPackages."registry+https://github.com/rust-lang/crates.io-index".crossbeam-queue."0.3.8" { inherit profileName; }).out; }; }); diff --git a/doc/book/connect/apps/index.md b/doc/book/connect/apps/index.md index 3f59530a..f67a29c9 100644 --- a/doc/book/connect/apps/index.md +++ b/doc/book/connect/apps/index.md @@ -37,7 +37,7 @@ Second, we suppose you have created a key and a bucket. As a reminder, you can create a key for your nextcloud instance as follow: ```bash -garage key new --name nextcloud-key +garage key create nextcloud-key ``` Keep the Key ID and the Secret key in a pad, they will be needed later. @@ -139,7 +139,7 @@ a reasonable trade-off for some instances. Create a key for Peertube: ```bash -garage key new --name peertube-key +garage key create peertube-key ``` Keep the Key ID and the Secret key in a pad, they will be needed later. @@ -253,7 +253,7 @@ As such, your Garage cluster should be configured appropriately for good perform This is the usual Garage setup: ```bash -garage key new --name mastodon-key +garage key create mastodon-key garage bucket create mastodon-data garage bucket allow mastodon-data --read --write --key mastodon-key ``` @@ -379,7 +379,7 @@ Supposing you have a working synapse installation, you can add the module with p Now create a bucket and a key for your matrix instance (note your Key ID and Secret Key somewhere, they will be needed later): ```bash -garage key new --name matrix-key +garage key create matrix-key garage bucket create matrix garage bucket allow matrix --read --write --key matrix-key ``` diff --git a/doc/book/connect/backup.md b/doc/book/connect/backup.md index d20c3c96..585ec469 100644 --- a/doc/book/connect/backup.md +++ b/doc/book/connect/backup.md @@ -54,7 +54,7 @@ how to configure this. Create your key and bucket: ```bash -garage key new my-key +garage key create my-key garage bucket create backup garage bucket allow backup --read --write --key my-key ``` diff --git a/doc/book/connect/repositories.md b/doc/book/connect/repositories.md index 4b14bb46..66365d64 100644 --- a/doc/book/connect/repositories.md +++ b/doc/book/connect/repositories.md @@ -23,7 +23,7 @@ You can configure a different target for each data type (check `[lfs]` and `[att Let's start by creating a key and a bucket (your key id and secret will be needed later, keep them somewhere): ```bash -garage key new --name gitea-key +garage key create gitea-key garage bucket create gitea garage bucket allow gitea --read --write --key gitea-key ``` @@ -118,7 +118,7 @@ through another support, like a git repository. As a first step, we will need to create a bucket on Garage and enabling website access on it: ```bash -garage key new --name nix-key +garage key create nix-key garage bucket create nix.example.com garage bucket allow nix.example.com --read --write --key nix-key garage bucket website nix.example.com --allow diff --git a/doc/book/cookbook/real-world.md b/doc/book/cookbook/real-world.md index 7061069f..a8fbb371 100644 --- a/doc/book/cookbook/real-world.md +++ b/doc/book/cookbook/real-world.md @@ -75,16 +75,11 @@ to store 2 TB of data in total. - For the metadata storage, Garage does not do checksumming and integrity verification on its own. If you are afraid of bitrot/data corruption, - put your metadata directory on a BTRFS partition. Otherwise, just use regular + put your metadata directory on a ZFS or BTRFS partition. Otherwise, just use regular EXT4 or XFS. -- Having a single server with several storage drives is currently not very well - supported in Garage ([#218](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/218)). - For an easy setup, just put all your drives in a RAID0 or a ZFS RAIDZ array. - If you're adventurous, you can try to format each of your disk as - a separate XFS partition, and then run one `garage` daemon per disk drive, - or use something like [`mergerfs`](https://github.com/trapexit/mergerfs) to merge - all your disks in a single union filesystem that spreads load over them. +- Servers with multiple HDDs are supported natively by Garage without resorting + to RAID, see [our dedicated documentation page](@/documentation/operations/multi-hdd.md). ## Get a Docker image diff --git a/doc/book/operations/durability-repairs.md b/doc/book/operations/durability-repairs.md index 498c8fda..b0d2c78a 100644 --- a/doc/book/operations/durability-repairs.md +++ b/doc/book/operations/durability-repairs.md @@ -91,6 +91,16 @@ is definitely lost, then there is no other choice than to declare your S3 object as unrecoverable, and to delete them properly from the data store. This can be done using the `garage block purge` command. +## Rebalancing data directories + +In [multi-HDD setups](@/documentation/operations/multi-hdd.md), to ensure that +data blocks are well balanced between storage locations, you may run a +rebalance operation using `garage repair rebalance`. This is usefull when +adding storage locations or when capacities of the storage locations have been +changed. Once this is finished, Garage will know for each block of a single +possible location where it can be, which can increase access speed. This +operation will also move out all data from locations marked as read-only. + # Metadata operations @@ -114,4 +124,3 @@ in your cluster, you can run one of the following repair procedures: - `garage repair versions`: checks that all versions belong to a non-deleted object, and purges any orphan version - `garage repair block_refs`: checks that all block references belong to a non-deleted object version, and purges any orphan block reference (this will then allow the blocks to be garbage-collected) - diff --git a/doc/book/operations/layout.md b/doc/book/operations/layout.md index 5e314246..ece17ddb 100644 --- a/doc/book/operations/layout.md +++ b/doc/book/operations/layout.md @@ -9,18 +9,30 @@ a certain capacity, or a gateway node that does not store data and is only used as an API entry point for faster cluster access. An introduction to building cluster layouts can be found in the [production deployment](@/documentation/cookbook/real-world.md) page. +In Garage, all of the data that can be stored in a given cluster is divided +into slices which we call *partitions*. Each partition is stored by +one or several nodes in the cluster +(see [`replication_mode`](@/documentation/reference-manual/configuration.md#replication-mode)). +The layout determines the correspondence between these partition, +which exist on a logical level, and actual storage nodes. + ## How cluster layouts work in Garage -In Garage, a cluster layout is composed of the following components: +A cluster layout is composed of the following components: -- a table of roles assigned to nodes +- a table of roles assigned to nodes, defined by the user +- an optimal assignation of partitions to nodes, computed by an algorithm that is ran once when calling `garage layout apply` or the ApplyClusterLayout API endpoint - a version number Garage nodes will always use the cluster layout with the highest version number. Garage nodes also maintain and synchronize between them a set of proposed role changes that haven't yet been applied. These changes will be applied (or -canceled) in the next version of the layout +canceled) in the next version of the layout. + +All operations on the layout can be realized using the `garage` CLI or using the +[administration API endpoint](@/documentation/reference-manual/admin-api.md). +We give here a description of CLI commands, the admin API semantics are very similar. The following commands insert modifications to the set of proposed role changes for the next layout version (but they do not create the new layout immediately): @@ -51,7 +63,7 @@ commands will fail otherwise. ## Warnings about Garage cluster layout management -**Warning: never make several calls to `garage layout apply` or `garage layout +**⚠️ Never make several calls to `garage layout apply` or `garage layout revert` with the same value of the `--version` flag. Doing so can lead to the creation of several different layouts with the same version number, in which case your Garage cluster will become inconsistent until fixed.** If a call to @@ -65,13 +77,198 @@ shell, you shouldn't have much issues as long as you run commands one after the other and take care of checking the output of `garage layout show` before applying any changes. -If you are using the `garage` CLI to script layout changes, follow the following recommendations: +If you are using the `garage` CLI or the admin API to script layout changes, +follow the following recommendations: + +- If using the CLI, make all of your `garage` CLI calls to the same RPC host. + If using the admin API, make all of your API calls to the same Garage node. Do + not connect to individual nodes to send them each a piece of the layout changes + you are making, as the changes propagate asynchronously between nodes and might + not all be taken into account at the time when the new layout is applied. + +- **Only call `garage layout apply`/ApplyClusterLayout once**, and call it + **strictly after** all of the `layout assign` and `layout remove` + commands/UpdateClusterLayout API calls have returned. + + +## Understanding unexpected layout calculations + +When adding, removing or modifying nodes in a cluster layout, sometimes +unexpected assigntations of partitions to node can occur. These assignations +are in fact normal and logical, given the objectives of the algorihtm. Indeed, +**the layout algorithm prioritizes moving less data between nodes over the fact +of achieving equal distribution of load. It also tries to use all links between +pairs of nodes in equal proportions when moving data.** This section presents +two examples and illustrates how one can control Garage's behavior to obtain +the desired results. + +### Example 1 + +In this example, a cluster is originally composed of 3 nodes in 3 different +zones (data centers). The three nodes are of equal capacity, therefore they +are all fully exploited and all store a copy of all of the data in the cluster. + +Then, a fourth node of the same size is added in the datacenter `dc1`. +As illustrated by the following, **Garage will by default not store any data on the new node**: + +``` +$ garage layout show +==== CURRENT CLUSTER LAYOUT ==== +ID Tags Zone Capacity Usable capacity +b10c110e4e854e5a node1 dc1 1000.0 MB 1000.0 MB (100.0%) +a235ac7695e0c54d node2 dc2 1000.0 MB 1000.0 MB (100.0%) +62b218d848e86a64 node3 dc3 1000.0 MB 1000.0 MB (100.0%) + +Zone redundancy: maximum + +Current cluster layout version: 6 + +==== STAGED ROLE CHANGES ==== +ID Tags Zone Capacity +a11c7cf18af29737 node4 dc1 1000.0 MB + + +==== NEW CLUSTER LAYOUT AFTER APPLYING CHANGES ==== +ID Tags Zone Capacity Usable capacity +b10c110e4e854e5a node1 dc1 1000.0 MB 1000.0 MB (100.0%) +a11c7cf18af29737 node4 dc1 1000.0 MB 0 B (0.0%) +a235ac7695e0c54d node2 dc2 1000.0 MB 1000.0 MB (100.0%) +62b218d848e86a64 node3 dc3 1000.0 MB 1000.0 MB (100.0%) + +Zone redundancy: maximum + +==== COMPUTATION OF A NEW PARTITION ASSIGNATION ==== + +Partitions are replicated 3 times on at least 3 distinct zones. + +Optimal partition size: 3.9 MB (3.9 MB in previous layout) +Usable capacity / total cluster capacity: 3.0 GB / 4.0 GB (75.0 %) +Effective capacity (replication factor 3): 1000.0 MB + +A total of 0 new copies of partitions need to be transferred. + +dc1 Tags Partitions Capacity Usable capacity + b10c110e4e854e5a node1 256 (0 new) 1000.0 MB 1000.0 MB (100.0%) + a11c7cf18af29737 node4 0 (0 new) 1000.0 MB 0 B (0.0%) + TOTAL 256 (256 unique) 2.0 GB 1000.0 MB (50.0%) + +dc2 Tags Partitions Capacity Usable capacity + a235ac7695e0c54d node2 256 (0 new) 1000.0 MB 1000.0 MB (100.0%) + TOTAL 256 (256 unique) 1000.0 MB 1000.0 MB (100.0%) + +dc3 Tags Partitions Capacity Usable capacity + 62b218d848e86a64 node3 256 (0 new) 1000.0 MB 1000.0 MB (100.0%) + TOTAL 256 (256 unique) 1000.0 MB 1000.0 MB (100.0%) +``` + +While unexpected, this is logical because of the following facts: + +- storing some data on the new node does not help increase the total quantity + of data that can be stored on the cluster, as the two other zones (`dc2` and + `dc3`) still need to store a full copy of everything, and their capacity is + still the same; + +- there is therefore no need to move any data on the new node as this would be pointless; + +- moving data to the new node has a cost which the algorithm decides to not pay if not necessary. + +This distribution of data can however not be what the administrator wanted: if +they added a new node to `dc1`, it might be because the existing node is too +slow, and they wish to divide its load by half. In that case, what they need to +do to force Garage to distribute the data between the two nodes is to attribute +only half of the capacity to each node in `dc1` (in our example, 500M instead of 1G). +In that case, Garage would determine that to be able to store 1G in total, it +would need to store 500M on the old node and 500M on the added one. + + +### Example 2 + +The following example is a slightly different scenario, where `dc1` had two +nodes that were used at 50%, and `dc2` and `dc3` each have one node that is +100% used. All node capacities are the same. + +Then, a node from `dc1` is moved into `dc3`. One could expect that the roles of +`dc1` and `dc3` would simply be swapped: the remaining node in `dc1` would be +used at 100%, and the two nodes now in `dc3` would be used at 50%. Instead, +this happens: + +``` +==== CURRENT CLUSTER LAYOUT ==== +ID Tags Zone Capacity Usable capacity +b10c110e4e854e5a node1 dc1 1000.0 MB 500.0 MB (50.0%) +a11c7cf18af29737 node4 dc1 1000.0 MB 500.0 MB (50.0%) +a235ac7695e0c54d node2 dc2 1000.0 MB 1000.0 MB (100.0%) +62b218d848e86a64 node3 dc3 1000.0 MB 1000.0 MB (100.0%) + +Zone redundancy: maximum + +Current cluster layout version: 8 + +==== STAGED ROLE CHANGES ==== +ID Tags Zone Capacity +a11c7cf18af29737 node4 dc3 1000.0 MB + + +==== NEW CLUSTER LAYOUT AFTER APPLYING CHANGES ==== +ID Tags Zone Capacity Usable capacity +b10c110e4e854e5a node1 dc1 1000.0 MB 1000.0 MB (100.0%) +a235ac7695e0c54d node2 dc2 1000.0 MB 1000.0 MB (100.0%) +62b218d848e86a64 node3 dc3 1000.0 MB 753.9 MB (75.4%) +a11c7cf18af29737 node4 dc3 1000.0 MB 246.1 MB (24.6%) + +Zone redundancy: maximum + +==== COMPUTATION OF A NEW PARTITION ASSIGNATION ==== + +Partitions are replicated 3 times on at least 3 distinct zones. + +Optimal partition size: 3.9 MB (3.9 MB in previous layout) +Usable capacity / total cluster capacity: 3.0 GB / 4.0 GB (75.0 %) +Effective capacity (replication factor 3): 1000.0 MB + +A total of 128 new copies of partitions need to be transferred. + +dc1 Tags Partitions Capacity Usable capacity + b10c110e4e854e5a node1 256 (128 new) 1000.0 MB 1000.0 MB (100.0%) + TOTAL 256 (256 unique) 1000.0 MB 1000.0 MB (100.0%) + +dc2 Tags Partitions Capacity Usable capacity + a235ac7695e0c54d node2 256 (0 new) 1000.0 MB 1000.0 MB (100.0%) + TOTAL 256 (256 unique) 1000.0 MB 1000.0 MB (100.0%) + +dc3 Tags Partitions Capacity Usable capacity + 62b218d848e86a64 node3 193 (0 new) 1000.0 MB 753.9 MB (75.4%) + a11c7cf18af29737 node4 63 (0 new) 1000.0 MB 246.1 MB (24.6%) + TOTAL 256 (256 unique) 2.0 GB 1000.0 MB (50.0%) +``` + +As we can see, the node that was moved to `dc3` (node4) is only used at 25% (approximatively), +whereas the node that was already in `dc3` (node3) is used at 75%. + +This can be explained by the following: + +- node1 will now be the only node remaining in `dc1`, thus it has to store all + of the data in the cluster. Since it was storing only half of it before, it has + to retrieve the other half from other nodes in the cluster. + +- The data which it does not have is entirely stored by the other node that was + in `dc1` and that is now in `dc3` (node4). There is also a copy of it on node2 + and node3 since both these nodes have a copy of everything. + +- node3 and node4 are the two nodes that will now be in a datacenter that is + under-utilized (`dc3`), this means that those are the two candidates from which + data can be removed to be moved to node1. + +- Garage will move data in equal proportions from all possible sources, in this + case it means that it will tranfer 25% of the entire data set from node3 to + node1 and another 25% from node4 to node1. -- Make all of your `garage` CLI calls to the same RPC host. Do not use the - `garage` CLI to connect to individual nodes to send them each a piece of the - layout changes you are making, as the changes propagate asynchronously - between nodes and might not all be taken into account at the time when the - new layout is applied. +This explains why node3 ends with 75% utilization (100% from before minus 25% +that is moved to node1), and node4 ends with 25% (50% from before minus 25% +that is moved to node1). -- **Only call `garage layout apply` once**, and call it **strictly after** all - of the `layout assign` and `layout remove` commands have returned. +This illustrates the second principle of the layout computation: **if there is +a choice in moving data out of some nodes, then all links between pairs of +nodes are used in equal proportions** (this is approximately true, there is +randomness in the algorihtm to achieve this so there might be some small +fluctuations, as we see above). diff --git a/doc/book/operations/multi-hdd.md b/doc/book/operations/multi-hdd.md new file mode 100644 index 00000000..36445b0a --- /dev/null +++ b/doc/book/operations/multi-hdd.md @@ -0,0 +1,101 @@ ++++ +title = "Multi-HDD support" +weight = 15 ++++ + + +Since v0.9, Garage natively supports nodes that have several storage drives +for storing data blocks (not for metadata storage). + +## Initial setup + +To set up a new Garage storage node with multiple HDDs, +format and mount all your drives in different directories, +and use a Garage configuration as follows: + +```toml +data_dir = [ + { path = "/path/to/hdd1", capacity = "2T" }, + { path = "/path/to/hdd2", capacity = "4T" }, +] +``` + +Garage will automatically balance all blocks stored by the node +among the different specified directories, proportionnally to the +specified capacities. + +## Updating the list of storage locations + +If you add new storage locations to your `data_dir`, +Garage will not rebalance existing data between storage locations. +Newly written blocks will be balanced proportionnally to the specified capacities, +and existing data may be moved between drives to improve balancing, +but only opportunistically when a data block is re-written (e.g. an object +is re-uploaded, or an object with a duplicate block is uploaded). + +To understand precisely what is happening, we need to dive in to how Garage +splits data among the different storage locations. + +First of all, Garage divides the set of all possible block hashes +in a fixed number of slices (currently 1024), and assigns +to each slice a primary storage location among the specified data directories. +The number of slices having their primary location in each data directory +is proportionnal to the capacity specified in the config file. + +When Garage receives a block to write, it will always write it in the primary +directory of the slice that contains its hash. + +Now, to be able to not lose existing data blocks when storage locations +are added, Garage also keeps a list of secondary data directories +for all of the hash slices. Secondary data directories for a slice indicates +storage locations that once were primary directories for that slice, i.e. where +Garage knows that data blocks of that slice might be stored. +When Garage is requested to read a certain data block, +it will first look in the primary storage directory of its slice, +and if it doesn't find it there it goes through all of the secondary storage +locations until it finds it. This allows Garage to continue operating +normally when storage locations are added, without having to shuffle +files between drives to place them in the correct location. + +This relatively simple strategy works well but does not ensure that data +is correctly balanced among drives according to their capacity. +To rebalance data, two strategies can be used: + +- Lazy rebalancing: when a block is re-written (e.g. the object is re-uploaded), + Garage checks whether the existing copy is in the primary directory of the slice + or in a secondary directory. If the current copy is in a secondary directory, + Garage re-writes a copy in the primary directory and deletes the one from the + secondary directory. This might never end up rebalancing everything if there + are data blocks that are only read and never written. + +- Active rebalancing: an operator of a Garage node can explicitly launch a repair + procedure that rebalances the data directories, moving all blocks to their + primary location. Once done, all secondary locations for all hash slices are + removed so that they won't be checked anymore when looking for a data block. + +## Read-only storage locations + +If you would like to move all data blocks from an existing data directory to one +or several new data directories, mark the old directory as read-only: + +```toml +data_dir = [ + { path = "/path/to/old_data", read_only = true }, + { path = "/path/to/new_hdd1", capacity = "2T" }, + { path = "/path/to/new_hdd2", capacity = "4T" }, +] +``` + +Garage will be able to read requested blocks from the read-only directory. +Garage will also move data out of the read-only directory either progressively +(lazy rebalancing) or if requested explicitly (active rebalancing). + +Once an active rebalancing has finished, your read-only directory should be empty: +it might still contain subdirectories, but no data files. You can check that +it contains no files using: + +```bash +find -type f /path/to/old_data # should not print anything +``` + +at which point it can be removed from the `data_dir` list in your config file. diff --git a/doc/book/operations/upgrading.md b/doc/book/operations/upgrading.md index e8919a19..9a738282 100644 --- a/doc/book/operations/upgrading.md +++ b/doc/book/operations/upgrading.md @@ -80,6 +80,6 @@ The entire procedure would look something like this: 5. If any specific migration procedure is required, it is usually in one of the two cases: - It can be run on online nodes after the new version has started, during regular cluster operation. - - it has to be run offline + - it has to be run offline, in which case you will have to again take all nodes offline one after the other to run the repair For this last step, please refer to the specific documentation pertaining to the version upgrade you are doing. diff --git a/doc/book/quick-start/_index.md b/doc/book/quick-start/_index.md index 08932775..8ed36b7d 100644 --- a/doc/book/quick-start/_index.md +++ b/doc/book/quick-start/_index.md @@ -209,7 +209,7 @@ one key can access multiple buckets, multiple keys can access one bucket. Create an API key using the following command: ``` -garage key new --name nextcloud-app-key +garage key create nextcloud-app-key ``` The output should look as follows: diff --git a/doc/book/reference-manual/configuration.md b/doc/book/reference-manual/configuration.md index 3110aab7..1ac681cf 100644 --- a/doc/book/reference-manual/configuration.md +++ b/doc/book/reference-manual/configuration.md @@ -10,6 +10,8 @@ Here is an example `garage.toml` configuration file that illustrates all of the ```toml metadata_dir = "/var/lib/garage/meta" data_dir = "/var/lib/garage/data" +metadata_fsync = true +data_fsync = false db_engine = "lmdb" @@ -90,6 +92,19 @@ This folder can be placed on an HDD. The space available for `data_dir` should be counted to determine a node's capacity when [adding it to the cluster layout](@/documentation/cookbook/real-world.md). +Since `v0.9.0`, Garage supports multiple data directories with the following syntax: + +```toml +data_dir = [ + { path = "/path/to/old_data", read_only = true }, + { path = "/path/to/new_hdd1", capacity = "2T" }, + { path = "/path/to/new_hdd2", capacity = "4T" }, +] +``` + +See [the dedicated documentation page](@/documentation/operations/multi-hdd.md) +on how to operate Garage in such a setup. + ### `db_engine` (since `v0.8.0`) By default, Garage uses the Sled embedded database library @@ -131,6 +146,49 @@ convert-db -a <input db engine> -i <input db path> \ Make sure to specify the full database path as presented in the table above, and not just the path to the metadata directory. +### `metadata_fsync` + +Whether to enable synchronous mode for the database engine or not. +This is disabled (`false`) by default. + +This reduces the risk of metadata corruption in case of power failures, +at the cost of a significant drop in write performance, +as Garage will have to pause to sync data to disk much more often +(several times for API calls such as PutObject). + +Using this option reduces the risk of simultaneous metadata corruption on several +cluster nodes, which could lead to data loss. + +If multi-site replication is used, this option is most likely not necessary, as +it is extremely unlikely that two nodes in different locations will have a +power failure at the exact same time. + +(Metadata corruption on a single node is not an issue, the corrupted data file +can always be deleted and reconstructed from the other nodes in the cluster.) + +Here is how this option impacts the different database engines: + +| Database | `metadata_fsync = false` (default) | `metadata_fsync = true` | +|----------|------------------------------------|-------------------------------| +| Sled | default options | *unsupported* | +| Sqlite | `PRAGMA synchronous = OFF` | `PRAGMA synchronous = NORMAL` | +| LMDB | `MDB_NOMETASYNC` + `MDB_NOSYNC` | `MDB_NOMETASYNC` | + +Note that the Sqlite database is always ran in `WAL` mode (`PRAGMA journal_mode = WAL`). + +### `data_fsync` + +Whether to `fsync` data blocks and their containing directory after they are +saved to disk. +This is disabled (`false`) by default. + +This might reduce the risk that a data block is lost in rare +situations such as simultaneous node losing power, +at the cost of a moderate drop in write performance. + +Similarly to `metatada_fsync`, this is likely not necessary +if geographical replication is used. + ### `block_size` Garage splits stored objects in consecutive chunks of size `block_size` diff --git a/doc/book/reference-manual/s3-compatibility.md b/doc/book/reference-manual/s3-compatibility.md index 15b29bd1..1bcfd123 100644 --- a/doc/book/reference-manual/s3-compatibility.md +++ b/doc/book/reference-manual/s3-compatibility.md @@ -75,16 +75,13 @@ but these endpoints are documented in [Red Hat Ceph Storage - Chapter 2. Ceph Ob | Endpoint | Garage | [Openstack Swift](https://docs.openstack.org/swift/latest/s3_compat.html) | [Ceph Object Gateway](https://docs.ceph.com/en/latest/radosgw/s3/) | [Riak CS](https://docs.riak.com/riak/cs/2.1.1/references/apis/storage/s3/index.html) | [OpenIO](https://docs.openio.io/latest/source/arch-design/s3_compliancy.html) | |------------------------------|----------------------------------|-----------------|---------------|---------|-----| -| [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | -| [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | ✅ Implemented (see details below) | ✅ | ✅ | ✅ | ✅ | -| [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | ✅ Implemented | ✅| ✅ | ✅ | ✅ | -| [ListMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUpload.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | -| [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | -| [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) | ✅ Implemented (see details below) | ✅ | ✅| ✅ | ✅ | -| [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | - -Our implementation of Multipart Upload is currently a bit more restrictive than Amazon's one in some edge cases. -For more information, please refer to our [issue tracker](https://git.deuxfleurs.fr/Deuxfleurs/garage/issues/204). +| [AbortMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | +| [CompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | +| [CreateMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html) | ✅ Implemented | ✅| ✅ | ✅ | ✅ | +| [ListMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUpload.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | +| [ListParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | +| [UploadPart](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html) | ✅ Implemented | ✅ | ✅| ✅ | ✅ | +| [UploadPartCopy](https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html) | ✅ Implemented | ✅ | ✅ | ✅ | ✅ | ### Website endpoints @@ -127,15 +124,22 @@ If you need this feature, please [share your use case in our dedicated issue](ht | Endpoint | Garage | [Openstack Swift](https://docs.openstack.org/swift/latest/s3_compat.html) | [Ceph Object Gateway](https://docs.ceph.com/en/latest/radosgw/s3/) | [Riak CS](https://docs.riak.com/riak/cs/2.1.1/references/apis/storage/s3/index.html) | [OpenIO](https://docs.openio.io/latest/source/arch-design/s3_compliancy.html) | |------------------------------|----------------------------------|-----------------|---------------|---------|-----| -| [DeleteBucketLifecycle](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html) | ❌ Missing | ❌| ✅| ❌| ✅| -| [GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html) | ❌ Missing | ❌| ✅ | ❌| ✅| -| [PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html) | ❌ Missing | ❌| ✅ | ❌| ✅| +| [DeleteBucketLifecycle](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html) | ✅ Implemented | ❌| ✅| ❌| ✅| +| [GetBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html) | ✅ Implemented | ❌| ✅ | ❌| ✅| +| [PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html) | ⚠ Partially implemented (see below) | ❌| ✅ | ❌| ✅| | [GetBucketVersioning](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html) | ❌ Stub (see below) | ✅| ✅ | ❌| ✅| | [ListObjectVersions](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectVersions.html) | ❌ Missing | ❌| ✅ | ❌| ✅| | [PutBucketVersioning](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html) | ❌ Missing | ❌| ✅| ❌| ✅| +**PutBucketLifecycleConfiguration:** The only actions supported are +`AbortIncompleteMultipartUpload` and `Expiration` (without the +`ExpiredObjectDeleteMarker` field). All other operations are dependent on +either bucket versionning or storage classes which Garage currently does not +implement. The deprecated `Prefix` member directly in the the `Rule` +structure/XML tag is not supported, specified prefixes must be inside the +`Filter` structure/XML tag. -**GetBucketVersioning:** Stub implementation (Garage does not yet support versionning so this always returns "versionning not enabled"). +**GetBucketVersioning:** Stub implementation which always returns "versionning not enabled", since Garage does not yet support bucket versionning. ### Replication endpoints diff --git a/doc/book/working-documents/migration-09.md b/doc/book/working-documents/migration-09.md new file mode 100644 index 00000000..8d403580 --- /dev/null +++ b/doc/book/working-documents/migration-09.md @@ -0,0 +1,69 @@ ++++ +title = "Migrating from 0.8 to 0.9" +weight = 14 ++++ + +**This guide explains how to migrate to 0.9 if you have an existing 0.8 cluster. +We don't recommend trying to migrate to 0.9 directly from 0.7 or older.** + +**We make no guarantee that this migration will work perfectly: +back up all your data before attempting it!** + +The following are **breaking changes** in Garage v0.9 that require your attention when migrating: + +- LMDB is now the default metadata db engine and Sled is deprecated. If you were using Sled, make sure to specify `db_engine = "sled"` in your configuration file, or take the time to [convert your database](https://garagehq.deuxfleurs.fr/documentation/reference-manual/configuration/#db-engine-since-v0-8-0). + +- Capacity values are now in actual byte units. The translation from the old layout will assign 1 capacity = 1Gb by default, which might be wrong for your cluster. This does not cause any data to be moved around, but you might want to re-assign correct capacity values post-migration. + +- Multipart uploads that were started in Garage v0.8 will not be visible in Garage v0.9 and will have to be restarted from scratch. + +- Changes to the admin API: some `v0/` endpoints have been replaced by `v1/` counterparts with updated/uniformized syntax. All other endpoints have also moved to `v1/` by default, without syntax changes, but are still available under `v0/` for compatibility. + + +## Simple migration procedure (takes cluster offline for a while) + +The migration steps are as follows: + +1. Disable API and web access. You may do this by stopping your reverse proxy or by commenting out + the `api_bind_addr` values in your `config.toml` file and restarting Garage. +2. Do `garage repair --all-nodes --yes tables` and `garage repair --all-nodes --yes blocks`, + check the logs and check that all data seems to be synced correctly between + nodes. If you have time, do additional checks (`versions`, `block_refs`, etc.) +3. Check that the block resync queue and Merkle queue are empty: + run `garage stats -a` to query them or inspect metrics in the Grafana dashboard. +4. Turn off Garage v0.8 +5. **Backup the metadata folder of all your nodes!** For instance, use the following command + if your metadata directory is `/var/lib/garage/meta`: `cd /var/lib/garage ; tar -acf meta-v0.8.tar.zst meta/` +6. Install Garage v0.9 +7. Update your configuration file if necessary. +8. Turn on Garage v0.9 +9. Do `garage repair --all-nodes --yes tables` and `garage repair --all-nodes --yes blocks`. + Wait for a full table sync to run. +10. Your upgraded cluster should be in a working state. Re-enable API and Web + access and check that everything went well. +11. Monitor your cluster in the next hours to see if it works well under your production load, report any issue. +12. You might want to assign correct capacity values to all your nodes. Doing so might cause data to be moved + in your cluster, which should also be monitored carefully. + +## Minimal downtime migration procedure + +The migration to Garage v0.9 can be done with almost no downtime, +by restarting all nodes at once in the new version. + +The migration steps are as follows: + +1. Do `garage repair --all-nodes --yes tables` and `garage repair --all-nodes --yes blocks`, + check the logs and check that all data seems to be synced correctly between + nodes. If you have time, do additional checks (`versions`, `block_refs`, etc.) + +2. Turn off each node individually; back up its metadata folder (see above); turn it back on again. + This will allow you to take a backup of all nodes without impacting global cluster availability. + You can do all nodes of a single zone at once as this does not impact the availability of Garage. + +3. Prepare your binaries and configuration files for Garage v0.9 + +4. Shut down all v0.8 nodes simultaneously, and restart them all simultaneously in v0.9. + Use your favorite deployment tool (Ansible, Kubernetes, Nomad) to achieve this as fast as possible. + Garage v0.9 should be in a working state as soon as it starts. + +5. Proceed with repair and monitoring as described in steps 9-12 above. diff --git a/doc/drafts/admin-api.md b/doc/drafts/admin-api.md index fb71dc83..411f6418 100644 --- a/doc/drafts/admin-api.md +++ b/doc/drafts/admin-api.md @@ -52,11 +52,11 @@ Returns an HTTP status 200 if the node is ready to answer user's requests, and an HTTP status 503 (Service Unavailable) if there are some partitions for which a quorum of nodes is not available. A simple textual message is also returned in a body with content-type `text/plain`. -See `/v0/health` for an API that also returns JSON output. +See `/v1/health` for an API that also returns JSON output. ### Cluster operations -#### GetClusterStatus `GET /v0/status` +#### GetClusterStatus `GET /v1/status` Returns the cluster's current status in JSON, including: @@ -70,86 +70,112 @@ Example response body: ```json { "node": "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f", - "garage_version": "git:v0.8.0", - "knownNodes": { - "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f": { + "garageVersion": "git:v0.9.0-dev", + "garageFeatures": [ + "k2v", + "sled", + "lmdb", + "sqlite", + "metrics", + "bundled-libs" + ], + "rustVersion": "1.68.0", + "dbEngine": "LMDB (using Heed crate)", + "knownNodes": [ + { + "id": "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f", "addr": "10.0.0.11:3901", - "is_up": true, - "last_seen_secs_ago": 9, + "isUp": true, + "lastSeenSecsAgo": 9, "hostname": "node1" }, - "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff": { + { + "id": "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff", "addr": "10.0.0.12:3901", - "is_up": true, - "last_seen_secs_ago": 1, + "isUp": true, + "lastSeenSecsAgo": 1, "hostname": "node2" }, - "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27": { + { + "id": "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27", "addr": "10.0.0.21:3901", - "is_up": true, - "last_seen_secs_ago": 7, + "isUp": true, + "lastSeenSecsAgo": 7, "hostname": "node3" }, - "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b": { + { + "id": "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b", "addr": "10.0.0.22:3901", - "is_up": true, - "last_seen_secs_ago": 1, + "isUp": true, + "lastSeenSecsAgo": 1, "hostname": "node4" } - }, + ], "layout": { "version": 12, - "roles": { - "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f": { + "roles": [ + { + "id": "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f", "zone": "dc1", - "capacity": 4, + "capacity": 10737418240, "tags": [ "node1" ] }, - "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff": { + { + "id": "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff", "zone": "dc1", - "capacity": 6, + "capacity": 10737418240, "tags": [ "node2" ] }, - "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27": { + { + "id": "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27", "zone": "dc2", - "capacity": 10, + "capacity": 10737418240, "tags": [ "node3" ] } - }, - "stagedRoleChanges": { - "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b": { + ], + "stagedRoleChanges": [ + { + "id": "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b", + "remove": false, "zone": "dc2", - "capacity": 5, + "capacity": 10737418240, "tags": [ "node4" ] } - } + { + "id": "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27", + "remove": true, + "zone": null, + "capacity": null, + "tags": null, + } + ] } } ``` -#### GetClusterHealth `GET /v0/health` +#### GetClusterHealth `GET /v1/health` Returns the cluster's current health in JSON format, with the following variables: -- `status`: one of `Healthy`, `Degraded` or `Unavailable`: - - Healthy: Garage node is connected to all storage nodes - - Degraded: Garage node is not connected to all storage nodes, but a quorum of write nodes is available for all partitions - - Unavailable: a quorum of write nodes is not available for some partitions -- `known_nodes`: the number of nodes this Garage node has had a TCP connection to since the daemon started -- `connected_nodes`: the nubmer of nodes this Garage node currently has an open connection to -- `storage_nodes`: the number of storage nodes currently registered in the cluster layout -- `storage_nodes_ok`: the number of storage nodes to which a connection is currently open +- `status`: one of `healthy`, `degraded` or `unavailable`: + - healthy: Garage node is connected to all storage nodes + - degraded: Garage node is not connected to all storage nodes, but a quorum of write nodes is available for all partitions + - unavailable: a quorum of write nodes is not available for some partitions +- `knownNodes`: the number of nodes this Garage node has had a TCP connection to since the daemon started +- `connectedNodes`: the nubmer of nodes this Garage node currently has an open connection to +- `storageNodes`: the number of storage nodes currently registered in the cluster layout +- `storageNodesOk`: the number of storage nodes to which a connection is currently open - `partitions`: the total number of partitions of the data (currently always 256) -- `partitions_quorum`: the number of partitions for which a quorum of write nodes is available -- `partitions_all_ok`: the number of partitions for which we are connected to all storage nodes responsible of storing it +- `partitionsQuorum`: the number of partitions for which a quorum of write nodes is available +- `partitionsAllOk`: the number of partitions for which we are connected to all storage nodes responsible of storing it Contrarily to `GET /health`, this endpoint always returns a 200 OK HTTP response code. @@ -157,18 +183,18 @@ Example response body: ```json { - "status": "Degraded", - "known_nodes": 3, - "connected_nodes": 2, - "storage_nodes": 3, - "storage_nodes_ok": 2, - "partitions": 256, - "partitions_quorum": 256, - "partitions_all_ok": 0 + "status": "degraded", + "knownNodes": 3, + "connectedNodes": 3, + "storageNodes": 4, + "storageNodesOk": 3, + "partitions": 256, + "partitionsQuorum": 256, + "partitionsAllOk": 64 } ``` -#### ConnectClusterNodes `POST /v0/connect` +#### ConnectClusterNodes `POST /v1/connect` Instructs this Garage node to connect to other Garage nodes at specified addresses. @@ -198,7 +224,7 @@ Example response: ] ``` -#### GetClusterLayout `GET /v0/layout` +#### GetClusterLayout `GET /v1/layout` Returns the cluster's current layout in JSON, including: @@ -212,42 +238,54 @@ Example response body: ```json { "version": 12, - "roles": { - "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f": { + "roles": [ + { + "id": "ec79480e0ce52ae26fd00c9da684e4fa56658d9c64cdcecb094e936de0bfe71f", "zone": "dc1", - "capacity": 4, + "capacity": 10737418240, "tags": [ "node1" ] }, - "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff": { + { + "id": "4a6ae5a1d0d33bf895f5bb4f0a418b7dc94c47c0dd2eb108d1158f3c8f60b0ff", "zone": "dc1", - "capacity": 6, + "capacity": 10737418240, "tags": [ "node2" ] }, - "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27": { + { + "id": "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27", "zone": "dc2", - "capacity": 10, + "capacity": 10737418240, "tags": [ "node3" ] } - }, - "stagedRoleChanges": { - "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b": { + ], + "stagedRoleChanges": [ + { + "id": "e2ee7984ee65b260682086ec70026165903c86e601a4a5a501c1900afe28d84b", + "remove": false, "zone": "dc2", - "capacity": 5, + "capacity": 10737418240, "tags": [ "node4" ] } - } + { + "id": "23ffd0cdd375ebff573b20cc5cef38996b51c1a7d6dbcf2c6e619876e507cf27", + "remove": true, + "zone": null, + "capacity": null, + "tags": null, + } + ] } ``` -#### UpdateClusterLayout `POST /v0/layout` +#### UpdateClusterLayout `POST /v1/layout` Send modifications to the cluster layout. These modifications will be included in the staged role changes, visible in subsequent calls @@ -259,8 +297,9 @@ the layout. Request body format: ```json -{ - <node_id>: { +[ + { + "id": <node_id>, "capacity": <new_capacity>, "zone": <new_zone>, "tags": [ @@ -268,17 +307,22 @@ Request body format: ... ] }, - <node_id_to_remove>: null, - ... -} + { + "id": <node_id_to_remove>, + "remove": true + } +] ``` Contrary to the CLI that may update only a subset of the fields `capacity`, `zone` and `tags`, when calling this API all of these values must be specified. +This returns the new cluster layout with the proposed staged changes, +as returned by GetClusterLayout. + -#### ApplyClusterLayout `POST /v0/layout/apply` +#### ApplyClusterLayout `POST /v1/layout/apply` Applies to the cluster the layout changes currently registered as staged layout changes. @@ -295,7 +339,10 @@ Similarly to the CLI, the body must include the version of the new layout that will be created, which MUST be 1 + the value of the currently existing layout in the cluster. -#### RevertClusterLayout `POST /v0/layout/revert` +This returns the message describing all the calculations done to compute the new +layout, as well as the description of the layout as returned by GetClusterLayout. + +#### RevertClusterLayout `POST /v1/layout/revert` Clears all of the staged layout changes. @@ -313,10 +360,13 @@ Similarly to the CLI, the body must include the incremented version number, which MUST be 1 + the value of the currently existing layout in the cluster. +This returns the new cluster layout with all changes reverted, +as returned by GetClusterLayout. + ### Access key operations -#### ListKeys `GET /v0/key` +#### ListKeys `GET /v1/key` Returns all API access keys in the cluster. @@ -335,34 +385,8 @@ Example response: ] ``` -#### CreateKey `POST /v0/key` - -Creates a new API access key. - -Request body format: - -```json -{ - "name": "NameOfMyKey" -} -``` - -#### ImportKey `POST /v0/key/import` - -Imports an existing API key. - -Request body format: - -```json -{ - "accessKeyId": "GK31c2f218a2e44f485b94239e", - "secretAccessKey": "b892c0665f0ada8a4755dae98baa3b133590e11dae3bcc1f9d769d67f16c3835", - "name": "NameOfMyKey" -} -``` - -#### GetKeyInfo `GET /v0/key?id=<acces key id>` -#### GetKeyInfo `GET /v0/key?search=<pattern>` +#### GetKeyInfo `GET /v1/key?id=<acces key id>` +#### GetKeyInfo `GET /v1/key?search=<pattern>` Returns information about the requested API access key. @@ -370,6 +394,9 @@ If `id` is set, the key is looked up using its exact identifier (faster). If `search` is set, the key is looked up using its name or prefix of identifier (slower, all keys are enumerated to do this). +Optionnally, the query parameter `showSecretKey=true` can be set to reveal the +associated secret access key. + Example response: ```json @@ -433,11 +460,40 @@ Example response: } ``` -#### DeleteKey `DELETE /v0/key?id=<acces key id>` +#### CreateKey `POST /v1/key` -Deletes an API access key. +Creates a new API access key. -#### UpdateKey `POST /v0/key?id=<acces key id>` +Request body format: + +```json +{ + "name": "NameOfMyKey" +} +``` + +This returns the key info, including the created secret key, +in the same format as the result of GetKeyInfo. + +#### ImportKey `POST /v1/key/import` + +Imports an existing API key. +This will check that the imported key is in the valid format, i.e. +is a key that could have been generated by Garage. + +Request body format: + +```json +{ + "accessKeyId": "GK31c2f218a2e44f485b94239e", + "secretAccessKey": "b892c0665f0ada8a4755dae98baa3b133590e11dae3bcc1f9d769d67f16c3835", + "name": "NameOfMyKey" +} +``` + +This returns the key info in the same format as the result of GetKeyInfo. + +#### UpdateKey `POST /v1/key?id=<acces key id>` Updates information about the specified API access key. @@ -457,10 +513,16 @@ All fields (`name`, `allow` and `deny`) are optional. If they are present, the corresponding modifications are applied to the key, otherwise nothing is changed. The possible flags in `allow` and `deny` are: `createBucket`. +This returns the key info in the same format as the result of GetKeyInfo. + +#### DeleteKey `DELETE /v1/key?id=<acces key id>` + +Deletes an API access key. + ### Bucket operations -#### ListBuckets `GET /v0/bucket` +#### ListBuckets `GET /v1/bucket` Returns all storage buckets in the cluster. @@ -502,8 +564,8 @@ Example response: ] ``` -#### GetBucketInfo `GET /v0/bucket?id=<bucket id>` -#### GetBucketInfo `GET /v0/bucket?globalAlias=<alias>` +#### GetBucketInfo `GET /v1/bucket?id=<bucket id>` +#### GetBucketInfo `GET /v1/bucket?globalAlias=<alias>` Returns information about the requested storage bucket. @@ -535,7 +597,10 @@ Example response: ], "objects": 14827, "bytes": 13189855625, - "unfinshedUploads": 0, + "unfinishedUploads": 1, + "unfinishedMultipartUploads": 1, + "unfinishedMultipartUploadParts": 11, + "unfinishedMultipartUploadBytes": 41943040, "quotas": { "maxSize": null, "maxObjects": null @@ -543,7 +608,7 @@ Example response: } ``` -#### CreateBucket `POST /v0/bucket` +#### CreateBucket `POST /v1/bucket` Creates a new storage bucket. @@ -583,13 +648,7 @@ or no alias at all. Technically, you can also specify both `globalAlias` and `localAlias` and that would create two aliases, but I don't see why you would want to do that. -#### DeleteBucket `DELETE /v0/bucket?id=<bucket id>` - -Deletes a storage bucket. A bucket cannot be deleted if it is not empty. - -Warning: this will delete all aliases associated with the bucket! - -#### UpdateBucket `PUT /v0/bucket?id=<bucket id>` +#### UpdateBucket `PUT /v1/bucket?id=<bucket id>` Updates configuration of the given bucket. @@ -621,9 +680,16 @@ In `quotas`: new values of `maxSize` and `maxObjects` must both be specified, or to remove the quotas. An absent value will be considered the same as a `null`. It is not possible to change only one of the two quotas. +#### DeleteBucket `DELETE /v1/bucket?id=<bucket id>` + +Deletes a storage bucket. A bucket cannot be deleted if it is not empty. + +Warning: this will delete all aliases associated with the bucket! + + ### Operations on permissions for keys on buckets -#### BucketAllowKey `POST /v0/bucket/allow` +#### BucketAllowKey `POST /v1/bucket/allow` Allows a key to do read/write/owner operations on a bucket. @@ -644,7 +710,7 @@ Request body format: Flags in `permissions` which have the value `true` will be activated. Other flags will remain unchanged. -#### BucketDenyKey `POST /v0/bucket/deny` +#### BucketDenyKey `POST /v1/bucket/deny` Denies a key from doing read/write/owner operations on a bucket. @@ -668,19 +734,19 @@ Other flags will remain unchanged. ### Operations on bucket aliases -#### GlobalAliasBucket `PUT /v0/bucket/alias/global?id=<bucket id>&alias=<global alias>` +#### GlobalAliasBucket `PUT /v1/bucket/alias/global?id=<bucket id>&alias=<global alias>` Empty body. Creates a global alias for a bucket. -#### GlobalUnaliasBucket `DELETE /v0/bucket/alias/global?id=<bucket id>&alias=<global alias>` +#### GlobalUnaliasBucket `DELETE /v1/bucket/alias/global?id=<bucket id>&alias=<global alias>` Removes a global alias for a bucket. -#### LocalAliasBucket `PUT /v0/bucket/alias/local?id=<bucket id>&accessKeyId=<access key ID>&alias=<local alias>` +#### LocalAliasBucket `PUT /v1/bucket/alias/local?id=<bucket id>&accessKeyId=<access key ID>&alias=<local alias>` Empty body. Creates a local alias for a bucket in the namespace of a specific access key. -#### LocalUnaliasBucket `DELETE /v0/bucket/alias/local?id=<bucket id>&accessKeyId<access key ID>&alias=<local alias>` +#### LocalUnaliasBucket `DELETE /v1/bucket/alias/local?id=<bucket id>&accessKeyId<access key ID>&alias=<local alias>` Removes a local alias for a bucket in the namespace of a specific access key. diff --git a/doc/optimal_layout_report/.gitignore b/doc/optimal_layout_report/.gitignore new file mode 100644 index 00000000..d5e59136 --- /dev/null +++ b/doc/optimal_layout_report/.gitignore @@ -0,0 +1,13 @@ +optimal_layout.aux +optimal_layout.log +optimal_layout.synctex.gz +optimal_layout.bbl +optimal_layout.blg + +geodistrib.aux +geodistrib.bbl +geodistrib.blg +geodistrib.log +geodistrib.out +geodistrib.synctex.gz + diff --git a/doc/optimal_layout_report/figures/flow.pdf b/doc/optimal_layout_report/figures/flow.pdf Binary files differnew file mode 100644 index 00000000..3546ad0a --- /dev/null +++ b/doc/optimal_layout_report/figures/flow.pdf diff --git a/doc/optimal_layout_report/figures/flow.svg b/doc/optimal_layout_report/figures/flow.svg new file mode 100644 index 00000000..e370755e --- /dev/null +++ b/doc/optimal_layout_report/figures/flow.svg @@ -0,0 +1,2205 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:ns3="http://www.iki.fi/pav/software/textext/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + viewBox="0 0 210 297" + version="1.1" + id="svg8" + sodipodi:docname="flow.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <defs + id="defs2"> + <marker + style="overflow:visible;" + id="marker5128" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5126" /> + </marker> + <marker + style="overflow:visible;" + id="marker5020" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5018" /> + </marker> + <marker + style="overflow:visible;" + id="marker4918" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4916" /> + </marker> + <marker + style="overflow:visible;" + id="marker4822" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4820" /> + </marker> + <marker + style="overflow:visible;" + id="marker4732" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4730" /> + </marker> + <marker + style="overflow:visible;" + id="marker4648" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4646" /> + </marker> + <marker + style="overflow:visible;" + id="marker4570" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4568" /> + </marker> + <marker + style="overflow:visible;" + id="marker4498" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4496" /> + </marker> + <marker + style="overflow:visible;" + id="marker4432" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4430" /> + </marker> + <marker + style="overflow:visible;" + id="marker4372" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4370" /> + </marker> + <marker + style="overflow:visible;" + id="marker4318" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4316" /> + </marker> + <marker + style="overflow:visible;" + id="marker4270" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4268" /> + </marker> + <marker + style="overflow:visible;" + id="marker4228" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4226" /> + </marker> + <marker + style="overflow:visible;" + id="marker4192" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4190" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Lend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path3903" /> + </marker> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-5"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-6"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-2" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-7" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-9" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-3"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-6" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-5"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-9"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-2" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-2"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-8" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-3"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-4"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-7" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-8"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-1"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-0" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-9"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-37"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-5"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-25" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-30"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-7" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-8"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-68" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-4"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-50" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-48"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-71" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-2" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-2"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-61" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-0"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-61" /> + </symbol> + </g> + <g + id="id-f665f0ad-6acc-4c65-818f-65538ae870ec-7"> + <symbol + overflow="visible" + id="id-b528872c-9c37-40cc-8f3c-4a3820527247-7"> + <path + style="stroke:none" + d="" + id="id-b9b64af8-af4d-498f-81ae-f2cb3b370123-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d0bf1643-b2f5-444d-a657-4aaefc6c89d4-7"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-311ed8ac-5c86-4922-8ddd-c8730c4eb1f1-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1911bbd6-3c25-4e44-b82f-6e209a9efbf4-6"> + <path + style="stroke:none" + d="" + id="id-ad0a7a76-9842-4d63-89a8-c9c17aa71c17-5" /> + </symbol> + <symbol + overflow="visible" + id="id-756b752a-2988-4d30-9ec2-f35e31955def-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3ec43921-ba3b-4f7d-b817-b8c615e98630-3" /> + </symbol> + </g> + <g + id="id-f98b961b-31b5-4c0f-bfb1-2760408a739a-8"> + <symbol + overflow="visible" + id="id-4737c041-b95c-4219-8e7e-c562852710ea-5"> + <path + style="stroke:none" + d="" + id="id-c55a79d7-b066-4a99-ae31-2b04d4c628d0-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80361aa1-942d-4c7e-b9e6-0b746bab4670-9"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-46772014-ff2f-4c4f-bd9c-546c16e45ebe-6" /> + </symbol> + <symbol + overflow="visible" + id="id-8dac91f2-ce64-4971-ad7d-d446cd8c9c1c-3"> + <path + style="stroke:none" + d="" + id="id-604b9e94-17f8-4699-8fca-83a7170f9ad1-8" /> + </symbol> + <symbol + overflow="visible" + id="id-7656f371-933a-4b40-8c22-717f88b408ac-5"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-99006318-9528-4ad3-a74f-c639da460421-6" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-3"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-4" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-8"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-5"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-7" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-4"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-1" /> + </symbol> + </g> + <g + id="id-e9cdbc45-842a-4299-856a-e73e8a96598a-8"> + <symbol + overflow="visible" + id="id-4c9afea4-0492-4e68-ad02-526d968a9dda-8"> + <path + style="stroke:none" + d="" + id="id-022447e8-2b8e-45a6-9421-6bb9cee18fb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-eb4351ed-2b75-4189-9149-06b49bb09d39-1"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-9793d5ee-1e50-443d-8e24-59e74686be5c-8" /> + </symbol> + <symbol + overflow="visible" + id="id-acdb85cf-666d-461d-bcc6-3145d4b5a194-9"> + <path + style="stroke:none" + d="" + id="id-974496ba-fe40-4bde-9d6c-97d29282be67-6" /> + </symbol> + <symbol + overflow="visible" + id="id-a9937435-0508-4c68-9850-f26d0b685df1-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-9c0b6904-6368-4d8f-ad75-244ef0a02a48-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4dbc287f-4992-4820-8c67-423900ff8378-3"> + <path + style="stroke:none" + d="" + id="id-d9c1862f-dbd4-4f66-9f79-92002bb14eb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-7933b5d5-7f25-482f-b30b-4ba167fd355d-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7f05503e-8203-4760-910b-5af86e2658b9-6" /> + </symbol> + </g> + <g + id="id-eea55ade-e2c2-48c1-a3f1-d65d7b23c75c-3"> + <symbol + overflow="visible" + id="id-702cf98a-7855-4a56-b3b9-be3e9c89e5eb-0"> + <path + style="stroke:none" + d="" + id="id-3d08f3b9-fc2d-4c8b-a693-2f069085b4c8-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4db591ab-5b31-4921-a71b-d732a9a3a154-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-fb3ea09c-6864-4691-95b5-1c3c652a23e5-5" /> + </symbol> + <symbol + overflow="visible" + id="id-a45ec7ed-aed1-44f6-87e2-879d7497660b-4"> + <path + style="stroke:none" + d="" + id="id-7b47d29b-e6d8-48a4-b8b1-d1b172f6aa82-0" /> + </symbol> + <symbol + overflow="visible" + id="id-b6a5b321-fb81-4c79-8c77-e89277728de4-5"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c892cf5-670f-4af9-9c88-c02621bf8637-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ad80f9d7-8845-4991-af60-575fc64207c6-4"> + <path + style="stroke:none" + d="" + id="id-62aa46d3-6905-4658-9610-06a86458f6eb-6" /> + </symbol> + <symbol + overflow="visible" + id="id-25df116e-62f9-4a97-a0aa-f3214438cb8a-9"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c94b97b0-0e4d-4d84-8e0b-6baff1ddbc84-2" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-6"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-8"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-0" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-1" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-0"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-5" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-0"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-8" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-5"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-0" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-4"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-0"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-6" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-29"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-9" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-08"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-11" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-03"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-3" /> + </symbol> + </g> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.3131931" + inkscape:cx="269.84092" + inkscape:cy="216.61097" + inkscape:document-units="mm" + inkscape:current-layer="g3128" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="992" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3128" + transform="translate(0,1.9402219)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-3" + cx="29.921179" + cy="57.147594" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,28.9278,55.5399)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{s}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6"> + <defs + id="id-b8b5e3e7-eaef-4e90-9b23-e33c7addfd0b"> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525" /> + </symbol> + </g> + </defs> + <g + id="id-f73a8857-fdac-4c87-ae0e-65dc150a63e8" + transform="translate(-149.087,-130.249)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-2f770fd4-bb45-449d-b247-9b46d24284e2"> + <g + transform="translate(148.712,134.765)" + id="g1093"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-906cb7e4-b32b-42ac-8d74-3e888f78676c" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.5541,0,0,0.584984,36.661851,43.071258)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$n_{z_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-1"> + <defs + id="id-500f6610-588a-4818-a433-a4f58ed9eb9c"> + <g + id="id-e9cdbc45-842a-4299-856a-e73e8a96598a"> + <symbol + overflow="visible" + id="id-4c9afea4-0492-4e68-ad02-526d968a9dda"> + <path + style="stroke:none" + d="" + id="id-022447e8-2b8e-45a6-9421-6bb9cee18fb8" /> + </symbol> + <symbol + overflow="visible" + id="id-eb4351ed-2b75-4189-9149-06b49bb09d39"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-9793d5ee-1e50-443d-8e24-59e74686be5c" /> + </symbol> + <symbol + overflow="visible" + id="id-acdb85cf-666d-461d-bcc6-3145d4b5a194"> + <path + style="stroke:none" + d="" + id="id-974496ba-fe40-4bde-9d6c-97d29282be67" /> + </symbol> + <symbol + overflow="visible" + id="id-a9937435-0508-4c68-9850-f26d0b685df1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-9c0b6904-6368-4d8f-ad75-244ef0a02a48" /> + </symbol> + <symbol + overflow="visible" + id="id-4dbc287f-4992-4820-8c67-423900ff8378"> + <path + style="stroke:none" + d="" + id="id-d9c1862f-dbd4-4f66-9f79-92002bb14eb8" /> + </symbol> + <symbol + overflow="visible" + id="id-7933b5d5-7f25-482f-b30b-4ba167fd355d"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7f05503e-8203-4760-910b-5af86e2658b9" /> + </symbol> + </g> + </defs> + <g + id="id-26364c9d-08dc-4865-b0f5-a8b7297166be" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-0f03436e-8db0-450f-aa25-544f24a2f390"> + <g + transform="translate(148.712,134.765)" + id="g5447"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-8d69f6e6-afd7-45c6-b3ad-a0c71f610f71" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b623b9b7-25f3-4b3c-b1b9-1f0b64ed4354"> + <g + transform="translate(154.692,136.259)" + id="g5451"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-c4159b05-d0cb-49aa-ada3-a23c58758478" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-62e080c4-1c1e-474b-8c1e-e2d031a29f56"> + <g + transform="translate(158.499,137.255)" + id="g5455"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-202d962f-9c87-4ba6-bdb0-d542963a60dd" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.5541 0 0 0.584984 41.5766 55.823)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$n_{z_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-1-5"> + <defs + id="id-4f0a6264-44fa-4419-b663-f12fba190357"> + <g + id="id-eea55ade-e2c2-48c1-a3f1-d65d7b23c75c"> + <symbol + overflow="visible" + id="id-702cf98a-7855-4a56-b3b9-be3e9c89e5eb"> + <path + style="stroke:none" + d="" + id="id-3d08f3b9-fc2d-4c8b-a693-2f069085b4c8" /> + </symbol> + <symbol + overflow="visible" + id="id-4db591ab-5b31-4921-a71b-d732a9a3a154"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-fb3ea09c-6864-4691-95b5-1c3c652a23e5" /> + </symbol> + <symbol + overflow="visible" + id="id-a45ec7ed-aed1-44f6-87e2-879d7497660b"> + <path + style="stroke:none" + d="" + id="id-7b47d29b-e6d8-48a4-b8b1-d1b172f6aa82" /> + </symbol> + <symbol + overflow="visible" + id="id-b6a5b321-fb81-4c79-8c77-e89277728de4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c892cf5-670f-4af9-9c88-c02621bf8637" /> + </symbol> + <symbol + overflow="visible" + id="id-ad80f9d7-8845-4991-af60-575fc64207c6"> + <path + style="stroke:none" + d="" + id="id-62aa46d3-6905-4658-9610-06a86458f6eb" /> + </symbol> + <symbol + overflow="visible" + id="id-25df116e-62f9-4a97-a0aa-f3214438cb8a"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c94b97b0-0e4d-4d84-8e0b-6baff1ddbc84" /> + </symbol> + </g> + </defs> + <g + id="id-59d35469-3df4-4774-807c-a85c375a14d9" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1e18d863-b305-48ee-ab24-c1390922c582"> + <g + transform="translate(148.712, 134.765)" + id="g6019"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-d1bdb664-3813-4978-a3de-6043db78b4cc" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0b03857d-96b0-420b-a542-083214d77acc"> + <g + transform="translate(154.692, 136.259)" + id="g6023"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-58e741b3-5e8c-40d8-a42e-af9bf621a270" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-71d7b44d-bb0b-40e1-a089-131ac614a256"> + <g + transform="translate(158.499, 137.255)" + id="g6027"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-6a32d87d-779d-47ab-898f-cfb399c66b20" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.5541 0 0 0.584984 36.2586 66.9082)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$n_{z_k}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-1-5-3"> + <defs + id="id-b97136dd-f97a-4a19-bfc2-535cc0ff0225"> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83" /> + </symbol> + </g> + </defs> + <g + id="id-0eda9a8f-5cba-48a6-82d1-723ba393e163" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1ba7400b-e448-4815-b9dc-c4f9b38e9d77"> + <g + transform="translate(148.712, 134.765)" + id="g6629"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-7d2401a2-a930-480e-8880-b596ebf68560" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-65c59b1d-cb54-4435-bb74-6c26702bb157"> + <g + transform="translate(154.692, 136.259)" + id="g6633"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-e67e3d4a-b26f-4f10-afdc-b198b1fb6290" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cb3074c6-a03f-4073-a3b6-6790538542ca"> + <g + transform="translate(158.499, 137.316)" + id="g6637"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-b41836f9-37d2-4116-9431-427f90e79c86" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.5541 0 0 0.584984 69.2226 33.5501)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-1-5-3-9"> + <defs + id="id-016c5830-b5cb-4715-89d3-0d230c1cc384"> + <g + id="id-eba692f1-bdd2-4485-a464-9470b20af630"> + <symbol + overflow="visible" + id="id-a8396958-ed2f-495e-b5b4-661e2ff6233a"> + <path + style="stroke:none" + d="" + id="id-abc4eca5-1311-4e0d-b35d-cb0d5f657696" /> + </symbol> + <symbol + overflow="visible" + id="id-ea4261ab-bafd-40f6-9ef3-7034344d6951"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-ab73cb18-6620-4738-9391-092bf86d8402" /> + </symbol> + </g> + </defs> + <g + id="id-0451793a-1cd4-4733-ae2c-0927593fe997" + transform="translate(-149.603, -128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-422a3a82-12ea-4e6e-9092-30ec82236e28"> + <g + transform="translate(148.712, 134.765)" + id="g7269"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-60dc7762-4fed-4f8e-9998-580eb2c9b464" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.5541 0 0 0.584984 98.8404 41.6497)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$3$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-1-5-3-7"> + <defs + id="id-c99c9aed-28f7-4816-852f-e64acd476142"> + <g + id="id-e1c7c39a-e278-4365-9d0f-d1069d80e801"> + <symbol + overflow="visible" + id="id-d68940b5-c11a-421c-a278-45e8ed8c5e4d"> + <path + style="stroke:none" + d="" + id="id-50004078-43d2-42f6-8c2c-9c1f1aa3752b" /> + </symbol> + <symbol + overflow="visible" + id="id-6bc899ec-07b3-488e-98d0-b6608742429c"> + <path + style="stroke:none" + d="m 2.890625,-3.515625 c 0.8125,-0.265625 1.390625,-0.953125 1.390625,-1.75 0,-0.8125 -0.875,-1.375 -1.828125,-1.375 -1,0 -1.765625,0.59375 -1.765625,1.359375 0,0.328125 0.21875,0.515625 0.515625,0.515625 0.296875,0 0.5,-0.21875 0.5,-0.515625 0,-0.484375 -0.46875,-0.484375 -0.609375,-0.484375 0.296875,-0.5 0.953125,-0.625 1.3125,-0.625 0.421875,0 0.96875,0.21875 0.96875,1.109375 0,0.125 -0.03125,0.703125 -0.28125,1.140625 C 2.796875,-3.65625 2.453125,-3.625 2.203125,-3.625 2.125,-3.609375 1.890625,-3.59375 1.8125,-3.59375 c -0.078125,0.015625 -0.140625,0.03125 -0.140625,0.125 0,0.109375 0.0625,0.109375 0.234375,0.109375 h 0.4375 c 0.8125,0 1.1875,0.671875 1.1875,1.65625 0,1.359375 -0.6875,1.640625 -1.125,1.640625 -0.4375,0 -1.1875,-0.171875 -1.53125,-0.75 0.34375,0.046875 0.65625,-0.171875 0.65625,-0.546875 0,-0.359375 -0.265625,-0.5625 -0.546875,-0.5625 -0.25,0 -0.5625,0.140625 -0.5625,0.578125 0,0.90625 0.921875,1.5625 2.015625,1.5625 1.21875,0 2.125,-0.90625 2.125,-1.921875 0,-0.8125 -0.640625,-1.59375 -1.671875,-1.8125 z m 0,0" + id="id-47002757-8afd-4e59-90bd-2a38518992a7" /> + </symbol> + </g> + </defs> + <g + id="id-fde33495-e144-4bdd-9bd0-a004481b5582" + transform="translate(-149.134, -128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-185d51e6-d865-4a17-8bce-cd26dd561351"> + <g + transform="translate(148.712, 134.765)" + id="g7876"> + <path + style="stroke:none" + d="m 2.890625,-3.515625 c 0.8125,-0.265625 1.390625,-0.953125 1.390625,-1.75 0,-0.8125 -0.875,-1.375 -1.828125,-1.375 -1,0 -1.765625,0.59375 -1.765625,1.359375 0,0.328125 0.21875,0.515625 0.515625,0.515625 0.296875,0 0.5,-0.21875 0.5,-0.515625 0,-0.484375 -0.46875,-0.484375 -0.609375,-0.484375 0.296875,-0.5 0.953125,-0.625 1.3125,-0.625 0.421875,0 0.96875,0.21875 0.96875,1.109375 0,0.125 -0.03125,0.703125 -0.28125,1.140625 C 2.796875,-3.65625 2.453125,-3.625 2.203125,-3.625 2.125,-3.609375 1.890625,-3.59375 1.8125,-3.59375 c -0.078125,0.015625 -0.140625,0.03125 -0.140625,0.125 0,0.109375 0.0625,0.109375 0.234375,0.109375 h 0.4375 c 0.8125,0 1.1875,0.671875 1.1875,1.65625 0,1.359375 -0.6875,1.640625 -1.125,1.640625 -0.4375,0 -1.1875,-0.171875 -1.53125,-0.75 0.34375,0.046875 0.65625,-0.171875 0.65625,-0.546875 0,-0.359375 -0.265625,-0.5625 -0.546875,-0.5625 -0.25,0 -0.5625,0.140625 -0.5625,0.578125 0,0.90625 0.921875,1.5625 2.015625,1.5625 1.21875,0 2.125,-0.90625 2.125,-1.921875 0,-0.8125 -0.640625,-1.59375 -1.671875,-1.8125 z m 0,0" + id="id-bc02ccf3-8293-4bdb-b7a2-f5b8987d30eb" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3318" + transform="translate(0,-0.75454133)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-3-2" + cx="112.99427" + cy="59.842358" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,112.044,57.7048)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{t}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-6-3"> + <defs + id="id-b670797f-4679-4aab-bd11-b4e3eb3bf3b5"> + <g + id="id-b83515ba-b48c-49b8-a844-5bf1aba72764"> + <symbol + overflow="visible" + id="id-1443da91-0b3a-4345-aa0f-2096c77ce860"> + <path + style="stroke:none" + d="" + id="id-73285ab0-aed2-4ca0-854c-265452f2571e" /> + </symbol> + <symbol + overflow="visible" + id="id-6ea998af-306e-4d6c-80b0-cd789009aff8"> + <path + style="stroke:none" + d="m 1.03125,-3.953125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 z m 0,0" + id="id-46234536-02a6-450d-b8ae-7b6c6d8ec66f" /> + </symbol> + </g> + </defs> + <g + id="id-c0271557-d7fe-435d-ba30-4b4740217f68" + transform="translate(-148.915,-128.437)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-2adb8022-4fef-4874-ad73-dbc6a7032af0"> + <g + transform="translate(148.712,134.765)" + id="g1252"> + <path + style="stroke:none" + d="m 1.03125,-3.953125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 z m 0,0" + id="id-b499da72-00ec-49c7-8587-72e812a9c95e" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3799" + transform="translate(-0.60989494)"> + <g + id="g3156" + transform="translate(-11.789786,-1.6856517)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833" + cx="70.011894" + cy="42.18951" + r="4.4921422" /> + <g + transform="matrix(0.55409974,0,0,0.58498411,66.626528,39.899151)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{z_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="0.9449006740783156" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.33334" + id="g866"> + <defs + id="id-1e809e81-165d-4546-a013-e3cf86d150e3"> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5" /> + </symbol> + </g> + </defs> + <g + id="id-109d20c4-4451-4b92-a1ac-a968b7e02140" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-2499faef-5c0a-41f6-bda3-13db74ee69e1"> + <g + transform="translate(148.712,134.765)" + id="g854"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d7db6940-de89-47e3-a033-049363ff49cd" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ffaf43f8-bbb4-4154-ad7f-840f271d65cf"> + <g + transform="translate(154.759,136.259)" + id="g858"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-f96a5f13-9133-4906-a110-2b8b9488e204" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0260b20e-ac21-4d3f-a285-2d7e01002974"> + <g + transform="translate(158.565,137.255)" + id="g862"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-36c7b204-6585-4a05-99ee-593991b6f965" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3184" + transform="translate(-11.934691,-3.882734)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-6" + cx="70.156799" + cy="56.775902" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,66.7236,54.4856)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{z_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-5"> + <defs + id="id-4648fc5a-c898-434c-af5f-c0534d61ee65"> + <g + id="id-a0d15d55-c9ae-4d1b-a246-de6159e2f150"> + <symbol + overflow="visible" + id="id-40b33fa1-9b51-4644-904d-cb9657a51cf1"> + <path + style="stroke:none" + d="" + id="id-7c84767c-5058-4a40-83ef-557271c16288" /> + </symbol> + <symbol + overflow="visible" + id="id-b93f01ee-c7fa-43f7-90d5-c22ad372b37a"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-3662a559-3637-4a84-9dc9-6c84df45bf82" /> + </symbol> + <symbol + overflow="visible" + id="id-43ab27cb-8880-4ddf-a916-1cf727caa0e5"> + <path + style="stroke:none" + d="" + id="id-149313cf-16b6-4740-a711-aec81c8e75fd" /> + </symbol> + <symbol + overflow="visible" + id="id-753c04f0-06ae-4990-b1e4-298e87bf2fc1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-57cf8603-682c-4ceb-aee2-2e107b1c406f" /> + </symbol> + <symbol + overflow="visible" + id="id-7711970b-969b-4cb9-8a63-4bf2a5a63b5a"> + <path + style="stroke:none" + d="" + id="id-ad4000b7-f8e8-400c-8ae6-936ced4ad61c" /> + </symbol> + <symbol + overflow="visible" + id="id-0602fc4c-71b4-487d-904f-4d5a4e06e43d"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-d420c112-a63a-4d44-84f0-5d1c7f736aeb" /> + </symbol> + </g> + </defs> + <g + id="id-0d60f8fc-70ba-4ea0-81eb-4ad80ebf6946" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-af85f9a5-4446-474b-a2ed-c8ee2263016d"> + <g + transform="translate(148.712,134.765)" + id="g1819"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-492ea2c0-5b30-4c35-bcb7-b8158023f6a8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70620bc0-2b29-4b71-b25d-385e3b33843a"> + <g + transform="translate(154.759,136.259)" + id="g1823"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-5ab71b69-687f-4f2b-a35d-8d3b454a7348" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f129db3c-8ecb-4ad2-9e9e-10ab81c2fe07"> + <g + transform="translate(158.565,137.255)" + id="g1827"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-b694d8d9-4ef9-4414-a0cd-1a0f31359315" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3241" + transform="translate(-9.890387,-4.5650119)"> + <g + id="g3212"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-9" + cx="68.112495" + cy="82.236786" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,64.571,79.9104)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{z_k}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-26"> + <defs + id="id-96762b80-ea2d-4a5e-a2ad-5d97a096cd52"> + <g + id="id-245294a4-4f69-405f-94a1-9174258337c1"> + <symbol + overflow="visible" + id="id-e2dd9529-fc99-4b31-9c16-14ad4a1fc3be"> + <path + style="stroke:none" + d="" + id="id-17c044fd-5b23-468c-87f6-dd286727df31" /> + </symbol> + <symbol + overflow="visible" + id="id-930379a4-c04b-4aae-ad4e-82d06321f8b7"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-74e35bdc-b2a8-4d6e-9f99-fe9c38fa05d9" /> + </symbol> + <symbol + overflow="visible" + id="id-8ee8024f-7cf2-4e57-ae5a-fbf096019740"> + <path + style="stroke:none" + d="" + id="id-4c0e5c52-ea77-4e1c-a834-c7034310d876" /> + </symbol> + <symbol + overflow="visible" + id="id-b6410325-6d8a-4717-a6ac-7bd7fe997f13"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-eff15891-7f72-4106-a331-7c10fe5720ea" /> + </symbol> + <symbol + overflow="visible" + id="id-07e5ad76-d1ce-4b88-bff8-cf8a734e7c7b"> + <path + style="stroke:none" + d="" + id="id-34c8ed1b-56ff-48e8-be30-235cbf99e5cc" /> + </symbol> + <symbol + overflow="visible" + id="id-2149adb6-8971-4e7e-b40f-0b187a368563"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-853a23b1-76aa-40ee-8675-f64d61e57f7e" /> + </symbol> + </g> + </defs> + <g + id="id-9713bb64-446c-43b4-98c8-f010dc1747ce" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-adc390f0-441a-4783-8568-bb1e92be4889"> + <g + transform="translate(148.712,134.765)" + id="g2366"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-1667236e-545e-4ae8-b84b-7f098e58a0d4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d9e4689f-c1e4-475a-9d17-717c322f1858"> + <g + transform="translate(154.759,136.259)" + id="g2370"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-d4b505ed-697d-4917-a5b5-afe96ed6edc9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e445e258-c48b-423a-bbe5-020f5e09912b"> + <g + transform="translate(158.565,137.316)" + id="g2374"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-cd1190bd-9504-42f0-9cda-b407c5cb01f7" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,58.524851,62.464098)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8"> + <g + id="id-71316add-b757-483c-8195-02b65d505b23"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f"> + <g + transform="translate(148.712,134.765)" + id="g3573"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be"> + <g + transform="translate(153.143,134.765)" + id="g3577"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8"> + <g + transform="translate(157.565,134.765)" + id="g3581"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3878" + transform="translate(-2.7908099)"> + <g + id="g3262" + transform="translate(-4.3642598,-1.3114528)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1" + cx="92.458305" + cy="41.815311" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,89.98,39.6684)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2"> + <defs + id="id-15a6f521-2fe4-4753-8623-832d47d60e24"> + <g + id="id-f665f0ad-6acc-4c65-818f-65538ae870ec"> + <symbol + overflow="visible" + id="id-b528872c-9c37-40cc-8f3c-4a3820527247"> + <path + style="stroke:none" + d="" + id="id-b9b64af8-af4d-498f-81ae-f2cb3b370123" /> + </symbol> + <symbol + overflow="visible" + id="id-d0bf1643-b2f5-444d-a657-4aaefc6c89d4"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-311ed8ac-5c86-4922-8ddd-c8730c4eb1f1" /> + </symbol> + <symbol + overflow="visible" + id="id-1911bbd6-3c25-4e44-b82f-6e209a9efbf4"> + <path + style="stroke:none" + d="" + id="id-ad0a7a76-9842-4d63-89a8-c9c17aa71c17" /> + </symbol> + <symbol + overflow="visible" + id="id-756b752a-2988-4d30-9ec2-f35e31955def"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3ec43921-ba3b-4f7d-b817-b8c615e98630" /> + </symbol> + </g> + </defs> + <g + id="id-cead2aa7-946f-4ead-8279-e9b065b68e9f" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-a55af208-6012-444c-8a5a-d3c5ddd0bb01"> + <g + transform="translate(148.712,134.765)" + id="g1512"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-d2267913-737c-48d1-9245-ad03781200c6" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-04e7d486-2d80-490f-9c17-2027c5db438d"> + <g + transform="translate(154.759,136.259)" + id="g1516"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-e8473c25-707e-4ede-b251-a71e242045d8" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3283" + transform="translate(-3.9925634,-4.8119651)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-1" + cx="92.086609" + cy="57.705132" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,89.5476,55.5583)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-5"> + <defs + id="id-f25c2c64-4dfe-4f14-833a-50688ba672e1"> + <g + id="id-f98b961b-31b5-4c0f-bfb1-2760408a739a"> + <symbol + overflow="visible" + id="id-4737c041-b95c-4219-8e7e-c562852710ea"> + <path + style="stroke:none" + d="" + id="id-c55a79d7-b066-4a99-ae31-2b04d4c628d0" /> + </symbol> + <symbol + overflow="visible" + id="id-80361aa1-942d-4c7e-b9e6-0b746bab4670"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-46772014-ff2f-4c4f-bd9c-546c16e45ebe" /> + </symbol> + <symbol + overflow="visible" + id="id-8dac91f2-ce64-4971-ad7d-d446cd8c9c1c"> + <path + style="stroke:none" + d="" + id="id-604b9e94-17f8-4699-8fca-83a7170f9ad1" /> + </symbol> + <symbol + overflow="visible" + id="id-7656f371-933a-4b40-8c22-717f88b408ac"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-99006318-9528-4ad3-a74f-c639da460421" /> + </symbol> + </g> + </defs> + <g + id="id-52d349e1-f5e4-4979-be96-eb0c9ee8b3d0" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-6c068af8-182e-4513-b413-5641c34ba3e3"> + <g + transform="translate(148.712,134.765)" + id="g2718"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-7154de53-d596-477e-8e1c-be2d76dcdebe" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-114a8c4d-759e-4b5a-8922-68b1628605fa"> + <g + transform="translate(154.759,136.259)" + id="g2722"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-8e15c3ea-b557-40f4-85fa-10d874426fc0" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3304" + transform="translate(-2.4128744,1.5679074)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-1-9" + cx="90.50692" + cy="76.103867" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,87.089,73.9571)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-5-0"> + <defs + id="id-fbc6ebc5-614c-413b-aabe-afcf82be9a44"> + <g + id="id-d7b73406-3b54-4c18-b9d9-a8d48226548b"> + <symbol + overflow="visible" + id="id-7392a411-3fc7-40dd-8159-940d133d1964"> + <path + style="stroke:none" + d="" + id="id-f1141261-817e-4519-a866-9b5fb0d27fe4" /> + </symbol> + <symbol + overflow="visible" + id="id-bb327e41-7636-4bdb-a5ff-468e484b4942"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-c45e9d73-05a0-4b4c-8bfa-22e86bbf9052" /> + </symbol> + <symbol + overflow="visible" + id="id-ed639f13-2e63-4b44-9269-8011bcac5110"> + <path + style="stroke:none" + d="" + id="id-1055d386-f97e-4aca-85f9-52b442a94df3" /> + </symbol> + <symbol + overflow="visible" + id="id-3215daba-e473-42b7-bf0e-512b603ee5ea"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-4bb30a4f-a8ce-4012-95d5-a0da4eb3b353" /> + </symbol> + </g> + </defs> + <g + id="id-3d923e0f-a2be-4d8b-978a-fa754bd42e64" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1733af0a-dd75-4350-8c56-5f694adf9885"> + <g + transform="translate(148.712,134.765)" + id="g3087"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-98092114-1794-4f5a-b393-560db71d0bdd" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4a9f6241-cd96-4f72-b97e-acc7894d3da0"> + <g + transform="translate(154.759,136.259)" + id="g3091"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-8e9beff6-a262-40fa-a2e1-2242bbc5d27f" /> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,88.396788,62.464097)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585-1"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-0"> + <g + id="g3668"> + <symbol + overflow="visible" + id="symbol3662"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path3660" /> + </symbol> + <symbol + overflow="visible" + id="symbol3666"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path3664" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-4" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-7"> + <g + transform="translate(148.712,134.765)" + id="g3573-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-1"> + <g + transform="translate(153.143,134.765)" + id="g3577-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-9"> + <g + transform="translate(157.565,134.765)" + id="g3581-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-2" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow1Lend)" + d="M 33.745855,56.297626 53.402989,42.605547" + id="path3898" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4192)" + d="m 34.497258,58.468169 18.923153,-3.33584" + id="path4182" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4228)" + d="M 33.240731,62.357703 54.096552,75.345461" + id="path4218" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270)" + d="m 62.113175,40.390646 18.588768,0.148211" + id="path4260" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4318)" + d="m 62.21413,52.969117 18.356627,0.05513" + id="path4308" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4372)" + d="m 62.160025,77.401858 18.442318,0.351846" + id="path4362" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4432)" + d="M 62.065902,41.700487 80.97172,50.828768" + id="path4422" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4498)" + d="M 61.085219,56.07705 81.587701,74.497202" + id="path4488" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4570)" + d="M 61.84597,76.017913 82.105385,56.001594" + id="path4560" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4648)" + d="M 61.130933,50.116589 81.48726,42.878927" + id="path4638" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4732)" + d="M 61.043684,43.711029 83.776697,73.154867" + id="path4722" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4822)" + d="m 60.350672,74.205948 22.43012,-29.72668" + id="path4812" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4918)" + d="M 89.508072,42.08863 109.44579,56.431409" + id="path4908" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5020)" + d="m 89.263015,55.033277 19.038815,3.964276" + id="path5010" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker5128)" + d="M 89.783181,76.121616 109.35936,61.777628" + id="path5118" /> + </g> +</svg> diff --git a/doc/optimal_layout_report/figures/flow_graph_param.pdf b/doc/optimal_layout_report/figures/flow_graph_param.pdf Binary files differnew file mode 100644 index 00000000..25b1205a --- /dev/null +++ b/doc/optimal_layout_report/figures/flow_graph_param.pdf diff --git a/doc/optimal_layout_report/figures/flow_graph_param.svg b/doc/optimal_layout_report/figures/flow_graph_param.svg new file mode 100644 index 00000000..1ef27ec5 --- /dev/null +++ b/doc/optimal_layout_report/figures/flow_graph_param.svg @@ -0,0 +1,7817 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:ns3="http://www.iki.fi/pav/software/textext/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + viewBox="0 0 210 297" + version="1.1" + id="svg8" + sodipodi:docname="flow_graph_param.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker29335" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29333" /> + </marker> + <marker + style="overflow:visible" + id="marker29325" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29323" /> + </marker> + <marker + style="overflow:visible" + id="marker29315" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29313" /> + </marker> + <marker + style="overflow:visible" + id="marker29025" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29023" /> + </marker> + <marker + inkscape:stockid="DistanceStart" + orient="auto" + refY="0.0" + refX="0.0" + id="marker28638" + style="overflow:visible" + inkscape:isstock="true"> + <g + id="g28636" + style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"> + <path + id="path28630" + d="M 0,0 L 2,0" + style="fill:#000000;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28632" + d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z " + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28634" + d="M 0,-4 L 0,40" + style="fill:#000000;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + </g> + </marker> + <marker + inkscape:stockid="DistanceStart" + orient="auto" + refY="0.0" + refX="0.0" + id="marker28613" + style="overflow:visible" + inkscape:isstock="true"> + <g + id="g28611" + style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"> + <path + id="path28605" + d="M 0,0 L 2,0" + style="fill:#000000;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28607" + d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z " + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28609" + d="M 0,-4 L 0,40" + style="fill:#000000;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + </g> + </marker> + <marker + style="overflow:visible;" + id="marker5128" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5126" /> + </marker> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-5"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-6"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-2" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-7" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-9" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-3"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-6" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-5"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-9"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-2" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-2"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-8" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-3"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-4"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-7" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-8"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-1"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-0" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-9"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-37"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-5"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-25" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-30"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-7" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-8"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-68" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-4"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-50" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-48"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-71" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-2" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-2"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-61" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-0"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-61" /> + </symbol> + </g> + <g + id="id-f665f0ad-6acc-4c65-818f-65538ae870ec-7"> + <symbol + overflow="visible" + id="id-b528872c-9c37-40cc-8f3c-4a3820527247-7"> + <path + style="stroke:none" + d="" + id="id-b9b64af8-af4d-498f-81ae-f2cb3b370123-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d0bf1643-b2f5-444d-a657-4aaefc6c89d4-7"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-311ed8ac-5c86-4922-8ddd-c8730c4eb1f1-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1911bbd6-3c25-4e44-b82f-6e209a9efbf4-6"> + <path + style="stroke:none" + d="" + id="id-ad0a7a76-9842-4d63-89a8-c9c17aa71c17-5" /> + </symbol> + <symbol + overflow="visible" + id="id-756b752a-2988-4d30-9ec2-f35e31955def-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3ec43921-ba3b-4f7d-b817-b8c615e98630-3" /> + </symbol> + </g> + <g + id="id-f98b961b-31b5-4c0f-bfb1-2760408a739a-8"> + <symbol + overflow="visible" + id="id-4737c041-b95c-4219-8e7e-c562852710ea-5"> + <path + style="stroke:none" + d="" + id="id-c55a79d7-b066-4a99-ae31-2b04d4c628d0-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80361aa1-942d-4c7e-b9e6-0b746bab4670-9"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-46772014-ff2f-4c4f-bd9c-546c16e45ebe-6" /> + </symbol> + <symbol + overflow="visible" + id="id-8dac91f2-ce64-4971-ad7d-d446cd8c9c1c-3"> + <path + style="stroke:none" + d="" + id="id-604b9e94-17f8-4699-8fca-83a7170f9ad1-8" /> + </symbol> + <symbol + overflow="visible" + id="id-7656f371-933a-4b40-8c22-717f88b408ac-5"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-99006318-9528-4ad3-a74f-c639da460421-6" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-3"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-4" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-8"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-5"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-7" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-4"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-1" /> + </symbol> + </g> + <g + id="id-e9cdbc45-842a-4299-856a-e73e8a96598a-8"> + <symbol + overflow="visible" + id="id-4c9afea4-0492-4e68-ad02-526d968a9dda-8"> + <path + style="stroke:none" + d="" + id="id-022447e8-2b8e-45a6-9421-6bb9cee18fb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-eb4351ed-2b75-4189-9149-06b49bb09d39-1"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-9793d5ee-1e50-443d-8e24-59e74686be5c-8" /> + </symbol> + <symbol + overflow="visible" + id="id-acdb85cf-666d-461d-bcc6-3145d4b5a194-9"> + <path + style="stroke:none" + d="" + id="id-974496ba-fe40-4bde-9d6c-97d29282be67-6" /> + </symbol> + <symbol + overflow="visible" + id="id-a9937435-0508-4c68-9850-f26d0b685df1-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-9c0b6904-6368-4d8f-ad75-244ef0a02a48-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4dbc287f-4992-4820-8c67-423900ff8378-3"> + <path + style="stroke:none" + d="" + id="id-d9c1862f-dbd4-4f66-9f79-92002bb14eb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-7933b5d5-7f25-482f-b30b-4ba167fd355d-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7f05503e-8203-4760-910b-5af86e2658b9-6" /> + </symbol> + </g> + <g + id="id-eea55ade-e2c2-48c1-a3f1-d65d7b23c75c-3"> + <symbol + overflow="visible" + id="id-702cf98a-7855-4a56-b3b9-be3e9c89e5eb-0"> + <path + style="stroke:none" + d="" + id="id-3d08f3b9-fc2d-4c8b-a693-2f069085b4c8-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4db591ab-5b31-4921-a71b-d732a9a3a154-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-fb3ea09c-6864-4691-95b5-1c3c652a23e5-5" /> + </symbol> + <symbol + overflow="visible" + id="id-a45ec7ed-aed1-44f6-87e2-879d7497660b-4"> + <path + style="stroke:none" + d="" + id="id-7b47d29b-e6d8-48a4-b8b1-d1b172f6aa82-0" /> + </symbol> + <symbol + overflow="visible" + id="id-b6a5b321-fb81-4c79-8c77-e89277728de4-5"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c892cf5-670f-4af9-9c88-c02621bf8637-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ad80f9d7-8845-4991-af60-575fc64207c6-4"> + <path + style="stroke:none" + d="" + id="id-62aa46d3-6905-4658-9610-06a86458f6eb-6" /> + </symbol> + <symbol + overflow="visible" + id="id-25df116e-62f9-4a97-a0aa-f3214438cb8a-9"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c94b97b0-0e4d-4d84-8e0b-6baff1ddbc84-2" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-6"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-8"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-0" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-1" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-0"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-5" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-0"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-8" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-5"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-0" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-4"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-0"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-6" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-29"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-9" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-08"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-11" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-03"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-3" /> + </symbol> + </g> + <g + id="id-3a24776d-bc3a-4985-8b28-ce4db2a93534-6"> + <symbol + overflow="visible" + id="id-600184e5-ac31-4222-b7ac-c96016dc366e-2"> + <path + style="stroke:none" + d="" + id="id-b7300ca4-41d0-48a7-a3fc-3384bcd315e5-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4a311171-3d88-48c1-a768-920db7a376f3-1"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-5d0de5d4-3de1-4182-916c-5c15cb8a379b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-576666de-5b44-48e6-9102-7af5342bec6c-7"> + <path + style="stroke:none" + d="" + id="id-0e138fba-e636-4a6e-9029-bed27c4c236d-0" /> + </symbol> + <symbol + overflow="visible" + id="id-5c29be59-448a-4add-8ecc-e56873e1ddfc-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-6ac25928-d877-42ea-8378-021164984a12-3" /> + </symbol> + <symbol + overflow="visible" + id="id-2e32c15b-8346-4486-99eb-6ed6ac946f95-6"> + <path + style="stroke:none" + d="" + id="id-e410f52f-63d2-4f94-9516-ca72f51d8167-0" /> + </symbol> + <symbol + overflow="visible" + id="id-6fde21de-66ce-4992-8ea8-55bfd138b407-6"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-a1d7aab6-721b-4b77-952a-736ac7a8cd57-2" /> + </symbol> + </g> + <g + id="id-867ce786-433a-4da2-985c-f4cd6863ba62-8"> + <symbol + overflow="visible" + id="id-122aceff-8d13-469a-b644-0d6fd18cd894-9"> + <path + style="stroke:none" + d="" + id="id-2cd1b095-e373-4c3f-a0aa-744195118e83-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c8aaab59-3861-421a-b529-5baf8e5e105a-3"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-87b88ba1-7415-4d4b-b760-06d0f7266a0e-6" /> + </symbol> + <symbol + overflow="visible" + id="id-1aa2c0b5-6103-4aa2-9d79-186256e46b98-1"> + <path + style="stroke:none" + d="" + id="id-5b56f2fc-39dd-4f93-a95e-522f63446f1d-2" /> + </symbol> + <symbol + overflow="visible" + id="id-94706a17-f2b8-4015-86aa-c8b784d104c0-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-8b337c95-3244-40d9-acd0-15e8cf49b85d-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4b1b0546-799b-4ba0-b279-6150411621c0-1"> + <path + style="stroke:none" + d="" + id="id-76817e90-5713-4d7a-8eea-1d9bc905ce1c-9" /> + </symbol> + <symbol + overflow="visible" + id="id-8c7eaeb2-7288-4b4e-9783-6b0d54556574-4"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-96737164-dbb3-4a15-a741-8519aff719ee-7" /> + </symbol> + </g> + <g + id="id-191a8d0d-801e-4c83-808c-0c3b14a8656f-5"> + <symbol + overflow="visible" + id="id-d2dbfc85-2301-46fd-9709-ae722299c440-4"> + <path + style="stroke:none" + d="" + id="id-bd2b6b64-d0bb-4bfd-9ee5-aa0162ccd436-7" /> + </symbol> + <symbol + overflow="visible" + id="id-8f6eda09-66ab-48f3-bdc5-3268f9982c5c-6"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-c26027ed-aa0b-445f-8a04-0b1d8586f076-5" /> + </symbol> + <symbol + overflow="visible" + id="id-e82a7900-b849-40c5-9d84-f91ba760191e-6"> + <path + style="stroke:none" + d="" + id="id-bdef97d3-91b2-431e-bcba-cd1dde53c3fd-9" /> + </symbol> + <symbol + overflow="visible" + id="id-96bf7acc-5861-4f0a-a6b4-5070340b1159-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-306b6f47-5f0b-477a-bc27-8fd1d14b7fd4-7" /> + </symbol> + <symbol + overflow="visible" + id="id-d6f36ceb-a70c-418b-b2f8-e2c8897f2e1f-4"> + <path + style="stroke:none" + d="" + id="id-d1c9ac07-f16e-48d4-9e4b-fcdc563bd700-5" /> + </symbol> + <symbol + overflow="visible" + id="id-6bdd5aca-01cb-4249-abb6-586c8fc56b95-2"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-bd1f25a0-c96b-4dcb-a3ff-50d4a65385e0-5" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-31"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-0" /> + </symbol> + </g> + <g + id="id-f71ea667-3b4d-4d21-ad1f-0ecb1dd3e484-2"> + <symbol + overflow="visible" + id="id-34dc3a3d-2276-4043-8291-b700fbc2dff1-7"> + <path + style="stroke:none" + d="" + id="id-9cccc023-3ff4-416e-878b-ddafd3dd0fcd-2" /> + </symbol> + <symbol + overflow="visible" + id="id-9bd60f18-4c4d-4ddd-b181-16f7a2d92fbc-2"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d86d8910-8168-40a7-ac81-0c33df86ab0e-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d9fa921e-ba7e-461c-9b85-204169b0b876-1"> + <path + style="stroke:none" + d="" + id="id-513ff48d-b30f-41d2-a80a-6d4ac5c4bdf2-0" /> + </symbol> + <symbol + overflow="visible" + id="id-ba38b8ec-61ee-49f7-aa7b-b60f1f54849e-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-99aee4ff-3e86-462c-8595-98407ac2efa0-1" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-6"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-5"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-6" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-3"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-9" /> + </symbol> + </g> + <g + id="g9297-9"> + <symbol + overflow="visible" + id="symbol9283-8"> + <path + style="stroke:none" + d="" + id="path9281-4" /> + </symbol> + <symbol + overflow="visible" + id="symbol9287-8"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="path9285-1" /> + </symbol> + <symbol + overflow="visible" + id="symbol9291-0"> + <path + style="stroke:none" + d="" + id="path9289-3" /> + </symbol> + <symbol + overflow="visible" + id="symbol9295-0"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path9293-4" /> + </symbol> + </g> + <g + id="id-8b1176ff-fed7-4d1f-a95d-2f901e2aa6da-8"> + <symbol + overflow="visible" + id="id-50ca6f89-1cf3-46ce-b624-794728268749-5"> + <path + style="stroke:none" + d="" + id="id-3007ebfc-2e24-4566-9ce5-f9269724a7af-7" /> + </symbol> + <symbol + overflow="visible" + id="id-0f52c0e5-e7bb-4649-867b-67f9ffd54d5c-4"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-e0a286b4-1895-4457-9d47-fdd1ee2aef8e-1" /> + </symbol> + <symbol + overflow="visible" + id="id-f33a0be7-00c4-4c53-9793-ea8e553e3b04-8"> + <path + style="stroke:none" + d="" + id="id-8d37aeb7-f373-42df-8441-9e8e63c73fea-5" /> + </symbol> + <symbol + overflow="visible" + id="id-331b803c-1ca4-4d9e-ae0a-b94c0868ef22-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-79a21791-6cb0-4234-a47b-4bd9ede6c0b2-7" /> + </symbol> + <symbol + overflow="visible" + id="id-02613bae-770a-4a52-a47b-fef4b2c26411-5"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-afc2da90-6d57-475c-a8d5-7767638414df-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1f8fea30-ac48-4986-984b-906d5fb66dce-8"> + <path + style="stroke:none" + d="" + id="id-2db340cb-906e-44a4-b69f-d20f40866d22-8" /> + </symbol> + <symbol + overflow="visible" + id="id-1159c11c-5ca0-4515-84ea-dbc2c0071b76-3"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-47e8b9e4-606d-4d63-adc7-5bbddf20c9ca-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d2a45eb8-4bc1-4f97-847e-131cb18000c7-8"> + <path + style="stroke:none" + d="" + id="id-b7d83c78-2ab3-430e-8d1b-ea63a6e16936-9" /> + </symbol> + <symbol + overflow="visible" + id="id-c2d57daa-bbd4-45c0-8d46-e646f76639f4-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-530c2961-ca82-486c-a6db-d81ce2884279-4" /> + </symbol> + </g> + <g + id="id-945a6e37-a95b-44e9-82b7-2ac83c7d6d9c-2"> + <symbol + overflow="visible" + id="id-5413b550-28b0-4f27-b0e0-efb018e9abb1-5"> + <path + style="stroke:none" + d="" + id="id-a8d13d71-db36-4835-9549-9f3622025a5e-4" /> + </symbol> + <symbol + overflow="visible" + id="id-12cf6e23-f040-4a9f-99b8-10631bfdf663-0"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-20759e13-f2c8-45c1-b35a-f43212bfcee3-5" /> + </symbol> + <symbol + overflow="visible" + id="id-591b00bb-e13d-4d74-8c6c-fd8f6ea3db65-9"> + <path + style="stroke:none" + d="" + id="id-3c0c7864-f3cb-4470-8f6b-48d3abc32653-4" /> + </symbol> + <symbol + overflow="visible" + id="id-bef4c849-1488-4ffd-88f3-58fc74337fa5-6"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-e2e9ead5-8b0c-48eb-8713-a9278af03c05-9" /> + </symbol> + <symbol + overflow="visible" + id="id-bcb3bf03-198d-41ab-b887-5d49a6fec79b-2"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-9a1955e3-cb8d-48d9-96d1-9989ce648fff-2" /> + </symbol> + <symbol + overflow="visible" + id="id-e586bbb8-1d83-4c06-b2e2-870f9006d650-4"> + <path + style="stroke:none" + d="" + id="id-92894d48-f372-4004-9679-16918abac50d-7" /> + </symbol> + <symbol + overflow="visible" + id="id-f066668e-909e-4312-80d1-04749c262cb4-7"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-973279b7-cd89-4f57-a650-ba85eb525e1d-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9423f50a-7bbb-437e-a3ab-686b0a1c420d-4"> + <path + style="stroke:none" + d="" + id="id-3a813a52-2d44-41db-ac8c-e6155f5cb9b9-8" /> + </symbol> + <symbol + overflow="visible" + id="id-b0386dcd-1db9-41fd-a360-42e59588bfe9-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-918e55b9-f187-4747-989f-66efac9d6872-2" /> + </symbol> + </g> + <g + id="id-58309c68-7535-4da9-8dc6-1b52eaa73e19-8"> + <symbol + overflow="visible" + id="id-29067988-3659-4747-86bb-6cc1b8b5c91e-6"> + <path + style="stroke:none" + d="" + id="id-80cc09ad-f6c7-4d0e-b4a0-0dd52e7cf885-2" /> + </symbol> + <symbol + overflow="visible" + id="id-213f7785-a032-4538-9e90-29c9ecd79a4a-8"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-b0ad5f67-012c-4eb4-9df9-7915797561d9-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80c58fdf-7f87-456a-90d4-ebd25fde26f8-7"> + <path + style="stroke:none" + d="" + id="id-74527db0-d834-4b21-a3a3-787ef4f1584f-2" /> + </symbol> + <symbol + overflow="visible" + id="id-aad71265-bf77-4f0f-8166-b3b625e9d750-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c3fa1ea-dfa0-42fc-92ce-a84f36b57ca7-0" /> + </symbol> + <symbol + overflow="visible" + id="id-e1479489-482e-49ef-a82f-7e97279af4e1-6"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-5e3cb470-a9d3-4ef6-a007-ed9d6b5de59b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-5366a9cc-cff2-4e31-9a8f-998905cec9a9-9"> + <path + style="stroke:none" + d="" + id="id-46c1bd63-2d42-4a96-9494-d4a8f64c983d-9" /> + </symbol> + <symbol + overflow="visible" + id="id-aa6ec137-fdf3-4e1a-a9aa-2340ca00987b-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-b880bd61-8e28-44ff-b1b7-319821d36654-8" /> + </symbol> + <symbol + overflow="visible" + id="id-9f4b5d89-4f82-443e-aeab-44850820982d-1"> + <path + style="stroke:none" + d="" + id="id-d65784a0-aa5d-47b4-bc0b-6bafea1755bf-3" /> + </symbol> + <symbol + overflow="visible" + id="id-042c7792-5675-40b4-a5a6-74b1df22e176-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-0247951f-4384-4d49-ad6d-5360e43ffcae-1" /> + </symbol> + </g> + <g + id="g5405-0"> + <symbol + overflow="visible" + id="symbol5399-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path5397-4" /> + </symbol> + <symbol + overflow="visible" + id="symbol5403-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path5401-2" /> + </symbol> + </g> + <g + id="id-f71ea667-3b4d-4d21-ad1f-0ecb1dd3e484-1"> + <symbol + overflow="visible" + id="id-34dc3a3d-2276-4043-8291-b700fbc2dff1-5"> + <path + style="stroke:none" + d="" + id="id-9cccc023-3ff4-416e-878b-ddafd3dd0fcd-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9bd60f18-4c4d-4ddd-b181-16f7a2d92fbc-9"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d86d8910-8168-40a7-ac81-0c33df86ab0e-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d9fa921e-ba7e-461c-9b85-204169b0b876-4"> + <path + style="stroke:none" + d="" + id="id-513ff48d-b30f-41d2-a80a-6d4ac5c4bdf2-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ba38b8ec-61ee-49f7-aa7b-b60f1f54849e-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-99aee4ff-3e86-462c-8595-98407ac2efa0-0" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-6"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-1"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-0" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-4"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-2"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-2" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-0"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-5" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-5"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-2" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-9"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-0" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-4"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-9"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-9" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-3"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-0"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-5" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-02"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-4"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-3" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-5"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-1" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-9"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-2"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-8" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-8"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-8" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-6"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-8" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-3"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-8" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-3"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-33" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-04" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-2"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-6"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-5" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-2"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-65" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-8"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-7" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-9"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-6" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-0"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-4" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-1"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-048" /> + </symbol> + </g> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-3"> + <g + id="g9835"> + <symbol + overflow="visible" + id="symbol9829"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path9827" /> + </symbol> + <symbol + overflow="visible" + id="symbol9833"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path9831" /> + </symbol> + </g> + </defs> + <g + id="id-b15114a7-ca09-4a21-ad11-725124638424-9"> + <symbol + overflow="visible" + id="id-310b4048-7c0e-46eb-bfd0-a76166008027-6"> + <path + style="stroke:none" + d="" + id="id-d6720d2c-5774-4364-8d54-58341c455226-2" /> + </symbol> + <symbol + overflow="visible" + id="id-380331dc-88ab-482c-b934-cf4ac9c4ff54-1"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-3a19059e-f020-4a72-9f12-a604927b3cd3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-d8429f02-44d9-4eea-baa5-885d8a467e29-0"> + <path + style="stroke:none" + d="" + id="id-2ca3837e-ef16-4602-a5db-d5f0c7eef876-7" /> + </symbol> + <symbol + overflow="visible" + id="id-e6901dc5-9917-4fb0-a181-aa79499a7893-3"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-3d07bff7-8536-4d05-9265-e222d0ded5de-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d654728c-9737-434e-9366-43d67bc9135b-1"> + <path + style="stroke:none" + d="" + id="id-2cb602a0-1505-4afe-9908-6b3a2a7e619e-9" /> + </symbol> + <symbol + overflow="visible" + id="id-364e5767-a7b9-4262-a86d-4fa669215069-0"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92389ee1-b7ce-499d-b00c-189d8877af98-5" /> + </symbol> + </g> + <g + id="id-eb52ad1a-98d6-4508-8c52-d822e8214559-2"> + <symbol + overflow="visible" + id="id-90e0f0c5-a5dc-4c99-be01-17ce75139c28-6"> + <path + style="stroke:none" + d="" + id="id-0aab7f5a-cce1-4a3b-a8f8-a6fa9bdb2442-0" /> + </symbol> + <symbol + overflow="visible" + id="id-350d3c26-9d68-4293-9402-db84f99a56a0-6"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-9989a360-a08e-439e-b73c-db08ffd06058-6" /> + </symbol> + <symbol + overflow="visible" + id="id-6218964a-9604-4244-bd4b-9454bf0bb4b0-4"> + <path + style="stroke:none" + d="" + id="id-d9651d3c-227d-4426-8b25-41f32650ce85-6" /> + </symbol> + <symbol + overflow="visible" + id="id-71be12ed-4366-49ab-b52d-f913ea29ee61-2"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-c69d8307-964b-4a94-852d-813bbd63d286-8" /> + </symbol> + </g> + <g + id="g9297-5"> + <symbol + overflow="visible" + id="symbol9283-3"> + <path + style="stroke:none" + d="" + id="path9281-5" /> + </symbol> + <symbol + overflow="visible" + id="symbol9287-6"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="path9285-2" /> + </symbol> + <symbol + overflow="visible" + id="symbol9291-9"> + <path + style="stroke:none" + d="" + id="path9289-1" /> + </symbol> + <symbol + overflow="visible" + id="symbol9295-2"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path9293-7" /> + </symbol> + </g> + <g + id="g2027"> + <symbol + overflow="visible" + id="symbol1528"> + <path + style="stroke:none;" + d="" + id="path9847" /> + </symbol> + <symbol + overflow="visible" + id="symbol3618"> + <path + style="stroke:none;" + d="M 2.640625 -3.71875 L 3.765625 -3.71875 C 3.4375 -2.25 3.34375 -1.8125 3.34375 -1.140625 C 3.34375 -1 3.34375 -0.734375 3.421875 -0.390625 C 3.53125 0.046875 3.640625 0.109375 3.78125 0.109375 C 3.984375 0.109375 4.203125 -0.0625 4.203125 -0.265625 C 4.203125 -0.328125 4.203125 -0.34375 4.140625 -0.484375 C 3.84375 -1.203125 3.84375 -1.859375 3.84375 -2.140625 C 3.84375 -2.65625 3.921875 -3.203125 4.03125 -3.71875 L 5.15625 -3.71875 C 5.296875 -3.71875 5.65625 -3.71875 5.65625 -4.0625 C 5.65625 -4.296875 5.4375 -4.296875 5.25 -4.296875 L 1.90625 -4.296875 C 1.6875 -4.296875 1.3125 -4.296875 0.875 -3.828125 C 0.53125 -3.4375 0.265625 -2.984375 0.265625 -2.9375 C 0.265625 -2.921875 0.265625 -2.828125 0.390625 -2.828125 C 0.46875 -2.828125 0.484375 -2.875 0.546875 -2.953125 C 1.03125 -3.71875 1.609375 -3.71875 1.8125 -3.71875 L 2.375 -3.71875 C 2.0625 -2.515625 1.53125 -1.3125 1.109375 -0.40625 C 1.03125 -0.25 1.03125 -0.234375 1.03125 -0.15625 C 1.03125 0.03125 1.1875 0.109375 1.3125 0.109375 C 1.609375 0.109375 1.6875 -0.171875 1.8125 -0.53125 C 1.953125 -1 1.953125 -1.015625 2.078125 -1.515625 Z M 2.640625 -3.71875 " + id="path6573" /> + </symbol> + <symbol + overflow="visible" + id="symbol3372"> + <path + style="stroke:none;" + d="M 2.859375 -6.8125 C 2.859375 -6.8125 2.859375 -6.921875 2.734375 -6.921875 C 2.5 -6.921875 1.78125 -6.84375 1.515625 -6.8125 C 1.4375 -6.8125 1.328125 -6.796875 1.328125 -6.625 C 1.328125 -6.5 1.421875 -6.5 1.5625 -6.5 C 2.046875 -6.5 2.0625 -6.4375 2.0625 -6.328125 L 2.03125 -6.125 L 0.59375 -0.390625 C 0.546875 -0.25 0.546875 -0.234375 0.546875 -0.171875 C 0.546875 0.0625 0.75 0.109375 0.84375 0.109375 C 0.96875 0.109375 1.109375 0.015625 1.171875 -0.09375 C 1.21875 -0.1875 1.671875 -2.03125 1.734375 -2.28125 C 2.078125 -2.25 2.890625 -2.09375 2.890625 -1.4375 C 2.890625 -1.359375 2.890625 -1.328125 2.859375 -1.21875 C 2.84375 -1.109375 2.828125 -0.984375 2.828125 -0.875 C 2.828125 -0.296875 3.21875 0.109375 3.734375 0.109375 C 4.03125 0.109375 4.3125 -0.046875 4.53125 -0.421875 C 4.78125 -0.859375 4.890625 -1.40625 4.890625 -1.421875 C 4.890625 -1.53125 4.796875 -1.53125 4.765625 -1.53125 C 4.671875 -1.53125 4.65625 -1.484375 4.625 -1.34375 C 4.421875 -0.625 4.203125 -0.109375 3.765625 -0.109375 C 3.5625 -0.109375 3.4375 -0.21875 3.4375 -0.578125 C 3.4375 -0.75 3.484375 -0.984375 3.515625 -1.140625 C 3.5625 -1.3125 3.5625 -1.34375 3.5625 -1.453125 C 3.5625 -2.09375 2.9375 -2.375 2.078125 -2.5 C 2.390625 -2.671875 2.71875 -2.984375 2.9375 -3.234375 C 3.421875 -3.765625 3.875 -4.1875 4.359375 -4.1875 C 4.421875 -4.1875 4.4375 -4.1875 4.453125 -4.171875 C 4.578125 -4.15625 4.578125 -4.15625 4.671875 -4.09375 C 4.6875 -4.09375 4.6875 -4.078125 4.703125 -4.0625 C 4.234375 -4.03125 4.140625 -3.640625 4.140625 -3.515625 C 4.140625 -3.359375 4.25 -3.171875 4.515625 -3.171875 C 4.78125 -3.171875 5.0625 -3.390625 5.0625 -3.78125 C 5.0625 -4.078125 4.828125 -4.40625 4.390625 -4.40625 C 4.109375 -4.40625 3.65625 -4.328125 2.9375 -3.53125 C 2.59375 -3.15625 2.203125 -2.75 1.828125 -2.609375 Z M 2.859375 -6.8125 " + id="path8281" /> + </symbol> + <symbol + overflow="visible" + id="symbol5758"> + <path + style="stroke:none;" + d="" + id="path3346" /> + </symbol> + <symbol + overflow="visible" + id="symbol4555"> + <path + style="stroke:none;" + d="M 3.515625 -1.265625 L 3.28125 -1.265625 C 3.265625 -1.109375 3.1875 -0.703125 3.09375 -0.640625 C 3.046875 -0.59375 2.515625 -0.59375 2.40625 -0.59375 L 1.125 -0.59375 C 1.859375 -1.234375 2.109375 -1.4375 2.515625 -1.765625 C 3.03125 -2.171875 3.515625 -2.609375 3.515625 -3.265625 C 3.515625 -4.109375 2.78125 -4.625 1.890625 -4.625 C 1.03125 -4.625 0.4375 -4.015625 0.4375 -3.375 C 0.4375 -3.03125 0.734375 -2.984375 0.8125 -2.984375 C 0.96875 -2.984375 1.171875 -3.109375 1.171875 -3.359375 C 1.171875 -3.484375 1.125 -3.734375 0.765625 -3.734375 C 0.984375 -4.21875 1.453125 -4.375 1.78125 -4.375 C 2.484375 -4.375 2.84375 -3.828125 2.84375 -3.265625 C 2.84375 -2.65625 2.40625 -2.1875 2.1875 -1.9375 L 0.515625 -0.265625 C 0.4375 -0.203125 0.4375 -0.1875 0.4375 0 L 3.3125 0 Z M 3.515625 -1.265625 " + id="path2631" /> + </symbol> + <symbol + overflow="visible" + id="symbol3312"> + <path + style="stroke:none;" + d="M 5.359375 -2.34375 C 5.453125 -2.34375 5.609375 -2.34375 5.609375 -2.515625 C 5.609375 -2.6875 5.453125 -2.6875 5.359375 -2.6875 L 0.75 -2.6875 C 0.65625 -2.6875 0.484375 -2.6875 0.484375 -2.515625 C 0.484375 -2.34375 0.640625 -2.34375 0.75 -2.34375 Z M 5.359375 -0.8125 C 5.453125 -0.8125 5.609375 -0.8125 5.609375 -0.96875 C 5.609375 -1.15625 5.453125 -1.15625 5.359375 -1.15625 L 0.75 -1.15625 C 0.640625 -1.15625 0.484375 -1.15625 0.484375 -0.96875 C 0.484375 -0.8125 0.65625 -0.8125 0.75 -0.8125 Z M 5.359375 -0.8125 " + id="path4030" /> + </symbol> + <symbol + overflow="visible" + id="symbol9855"> + <path + style="stroke:none;" + d="M 2.328125 -4.4375 C 2.328125 -4.625 2.328125 -4.625 2.125 -4.625 C 1.671875 -4.1875 1.046875 -4.1875 0.765625 -4.1875 L 0.765625 -3.9375 C 0.921875 -3.9375 1.390625 -3.9375 1.765625 -4.125 L 1.765625 -0.578125 C 1.765625 -0.34375 1.765625 -0.25 1.078125 -0.25 L 0.8125 -0.25 L 0.8125 0 C 0.9375 0 1.796875 -0.03125 2.046875 -0.03125 C 2.265625 -0.03125 3.140625 0 3.296875 0 L 3.296875 -0.25 L 3.03125 -0.25 C 2.328125 -0.25 2.328125 -0.34375 2.328125 -0.578125 Z M 2.328125 -4.4375 " + id="path8801" /> + </symbol> + <symbol + overflow="visible" + id="symbol7864"> + <path + style="stroke:none;" + d="" + id="path785" /> + </symbol> + <symbol + overflow="visible" + id="symbol9766"> + <path + style="stroke:none;" + d="M 1.3125 -3.265625 L 1.3125 -3.515625 C 1.3125 -6.03125 2.546875 -6.390625 3.0625 -6.390625 C 3.296875 -6.390625 3.71875 -6.328125 3.9375 -5.984375 C 3.78125 -5.984375 3.390625 -5.984375 3.390625 -5.546875 C 3.390625 -5.234375 3.625 -5.078125 3.84375 -5.078125 C 4 -5.078125 4.3125 -5.171875 4.3125 -5.5625 C 4.3125 -6.15625 3.875 -6.640625 3.046875 -6.640625 C 1.765625 -6.640625 0.421875 -5.359375 0.421875 -3.15625 C 0.421875 -0.484375 1.578125 0.21875 2.5 0.21875 C 3.609375 0.21875 4.5625 -0.71875 4.5625 -2.03125 C 4.5625 -3.296875 3.671875 -4.25 2.5625 -4.25 C 1.890625 -4.25 1.515625 -3.75 1.3125 -3.265625 Z M 2.5 -0.0625 C 1.875 -0.0625 1.578125 -0.65625 1.515625 -0.8125 C 1.328125 -1.28125 1.328125 -2.078125 1.328125 -2.25 C 1.328125 -3.03125 1.65625 -4.03125 2.546875 -4.03125 C 2.71875 -4.03125 3.171875 -4.03125 3.484375 -3.40625 C 3.65625 -3.046875 3.65625 -2.53125 3.65625 -2.046875 C 3.65625 -1.5625 3.65625 -1.0625 3.484375 -0.703125 C 3.1875 -0.109375 2.734375 -0.0625 2.5 -0.0625 Z M 2.5 -0.0625 " + id="path5845" /> + </symbol> + <symbol + overflow="visible" + id="symbol9105"> + <path + style="stroke:none;" + d="M 6.84375 -3.265625 C 7 -3.265625 7.1875 -3.265625 7.1875 -3.453125 C 7.1875 -3.65625 7 -3.65625 6.859375 -3.65625 L 0.890625 -3.65625 C 0.75 -3.65625 0.5625 -3.65625 0.5625 -3.453125 C 0.5625 -3.265625 0.75 -3.265625 0.890625 -3.265625 Z M 6.859375 -1.328125 C 7 -1.328125 7.1875 -1.328125 7.1875 -1.53125 C 7.1875 -1.71875 7 -1.71875 6.84375 -1.71875 L 0.890625 -1.71875 C 0.75 -1.71875 0.5625 -1.71875 0.5625 -1.53125 C 0.5625 -1.328125 0.75 -1.328125 0.890625 -1.328125 Z M 6.859375 -1.328125 " + id="path8151" /> + </symbol> + <symbol + overflow="visible" + id="symbol1893"> + <path + style="stroke:none;" + d="M 1.765625 -6.921875 L 0.328125 -6.8125 L 0.328125 -6.5 C 1.03125 -6.5 1.109375 -6.4375 1.109375 -5.9375 L 1.109375 -0.75 C 1.109375 -0.3125 1 -0.3125 0.328125 -0.3125 L 0.328125 0 C 0.65625 -0.015625 1.1875 -0.03125 1.4375 -0.03125 C 1.6875 -0.03125 2.171875 -0.015625 2.546875 0 L 2.546875 -0.3125 C 1.875 -0.3125 1.765625 -0.3125 1.765625 -0.75 Z M 1.765625 -6.921875 " + id="path9830" /> + </symbol> + <symbol + overflow="visible" + id="symbol5829"> + <path + style="stroke:none;" + d="M 1.765625 -4.40625 L 0.375 -4.296875 L 0.375 -3.984375 C 1.015625 -3.984375 1.109375 -3.921875 1.109375 -3.4375 L 1.109375 -0.75 C 1.109375 -0.3125 1 -0.3125 0.328125 -0.3125 L 0.328125 0 C 0.640625 -0.015625 1.1875 -0.03125 1.421875 -0.03125 C 1.78125 -0.03125 2.125 -0.015625 2.46875 0 L 2.46875 -0.3125 C 1.796875 -0.3125 1.765625 -0.359375 1.765625 -0.75 Z M 1.796875 -6.140625 C 1.796875 -6.453125 1.5625 -6.671875 1.28125 -6.671875 C 0.96875 -6.671875 0.75 -6.40625 0.75 -6.140625 C 0.75 -5.875 0.96875 -5.609375 1.28125 -5.609375 C 1.5625 -5.609375 1.796875 -5.828125 1.796875 -6.140625 Z M 1.796875 -6.140625 " + id="path4426" /> + </symbol> + <symbol + overflow="visible" + id="symbol9652"> + <path + style="stroke:none;" + d="M 1.09375 -3.421875 L 1.09375 -0.75 C 1.09375 -0.3125 0.984375 -0.3125 0.3125 -0.3125 L 0.3125 0 C 0.671875 -0.015625 1.171875 -0.03125 1.453125 -0.03125 C 1.703125 -0.03125 2.21875 -0.015625 2.5625 0 L 2.5625 -0.3125 C 1.890625 -0.3125 1.78125 -0.3125 1.78125 -0.75 L 1.78125 -2.59375 C 1.78125 -3.625 2.5 -4.1875 3.125 -4.1875 C 3.765625 -4.1875 3.875 -3.65625 3.875 -3.078125 L 3.875 -0.75 C 3.875 -0.3125 3.765625 -0.3125 3.09375 -0.3125 L 3.09375 0 C 3.4375 -0.015625 3.953125 -0.03125 4.21875 -0.03125 C 4.46875 -0.03125 5 -0.015625 5.328125 0 L 5.328125 -0.3125 C 4.671875 -0.3125 4.5625 -0.3125 4.5625 -0.75 L 4.5625 -2.59375 C 4.5625 -3.625 5.265625 -4.1875 5.90625 -4.1875 C 6.53125 -4.1875 6.640625 -3.65625 6.640625 -3.078125 L 6.640625 -0.75 C 6.640625 -0.3125 6.53125 -0.3125 5.859375 -0.3125 L 5.859375 0 C 6.203125 -0.015625 6.71875 -0.03125 6.984375 -0.03125 C 7.25 -0.03125 7.765625 -0.015625 8.109375 0 L 8.109375 -0.3125 C 7.59375 -0.3125 7.34375 -0.3125 7.328125 -0.609375 L 7.328125 -2.515625 C 7.328125 -3.375 7.328125 -3.671875 7.015625 -4.03125 C 6.875 -4.203125 6.546875 -4.40625 5.96875 -4.40625 C 5.140625 -4.40625 4.6875 -3.8125 4.53125 -3.421875 C 4.390625 -4.296875 3.65625 -4.40625 3.203125 -4.40625 C 2.46875 -4.40625 2 -3.984375 1.71875 -3.359375 L 1.71875 -4.40625 L 0.3125 -4.296875 L 0.3125 -3.984375 C 1.015625 -3.984375 1.09375 -3.921875 1.09375 -3.421875 Z M 1.09375 -3.421875 " + id="path6081" /> + </symbol> + <symbol + overflow="visible" + id="symbol9380"> + <path + style="stroke:none;" + d="M 2.9375 -6.375 C 2.9375 -6.625 2.9375 -6.640625 2.703125 -6.640625 C 2.078125 -6 1.203125 -6 0.890625 -6 L 0.890625 -5.6875 C 1.09375 -5.6875 1.671875 -5.6875 2.1875 -5.953125 L 2.1875 -0.78125 C 2.1875 -0.421875 2.15625 -0.3125 1.265625 -0.3125 L 0.953125 -0.3125 L 0.953125 0 C 1.296875 -0.03125 2.15625 -0.03125 2.5625 -0.03125 C 2.953125 -0.03125 3.828125 -0.03125 4.171875 0 L 4.171875 -0.3125 L 3.859375 -0.3125 C 2.953125 -0.3125 2.9375 -0.421875 2.9375 -0.78125 Z M 2.9375 -6.375 " + id="path3882" /> + </symbol> + <symbol + overflow="visible" + id="symbol437"> + <path + style="stroke:none;" + d="" + id="path4428" /> + </symbol> + <symbol + overflow="visible" + id="symbol6172"> + <path + style="stroke:none;" + d="M 0.84375 -0.4375 C 0.828125 -0.34375 0.78125 -0.171875 0.78125 -0.15625 C 0.78125 0 0.90625 0.0625 1.015625 0.0625 C 1.140625 0.0625 1.25 -0.015625 1.296875 -0.078125 C 1.328125 -0.140625 1.375 -0.375 1.421875 -0.515625 C 1.453125 -0.640625 1.53125 -0.96875 1.5625 -1.140625 C 1.609375 -1.296875 1.65625 -1.453125 1.6875 -1.609375 C 1.765625 -1.890625 1.78125 -1.953125 1.984375 -2.234375 C 2.171875 -2.515625 2.5 -2.875 3.03125 -2.875 C 3.421875 -2.875 3.4375 -2.515625 3.4375 -2.390625 C 3.4375 -1.96875 3.140625 -1.203125 3.03125 -0.90625 C 2.953125 -0.703125 2.921875 -0.640625 2.921875 -0.53125 C 2.921875 -0.15625 3.21875 0.0625 3.578125 0.0625 C 4.28125 0.0625 4.578125 -0.890625 4.578125 -1 C 4.578125 -1.09375 4.5 -1.09375 4.46875 -1.09375 C 4.375 -1.09375 4.375 -1.046875 4.34375 -0.96875 C 4.1875 -0.40625 3.875 -0.125 3.609375 -0.125 C 3.453125 -0.125 3.421875 -0.21875 3.421875 -0.375 C 3.421875 -0.53125 3.46875 -0.625 3.59375 -0.9375 C 3.671875 -1.15625 3.953125 -1.890625 3.953125 -2.28125 C 3.953125 -2.953125 3.421875 -3.078125 3.046875 -3.078125 C 2.46875 -3.078125 2.078125 -2.71875 1.875 -2.4375 C 1.828125 -2.921875 1.421875 -3.078125 1.125 -3.078125 C 0.828125 -3.078125 0.671875 -2.859375 0.578125 -2.703125 C 0.421875 -2.4375 0.328125 -2.046875 0.328125 -2 C 0.328125 -1.921875 0.421875 -1.921875 0.453125 -1.921875 C 0.546875 -1.921875 0.546875 -1.9375 0.59375 -2.125 C 0.703125 -2.53125 0.84375 -2.875 1.109375 -2.875 C 1.296875 -2.875 1.34375 -2.71875 1.34375 -2.53125 C 1.34375 -2.40625 1.28125 -2.140625 1.21875 -1.953125 C 1.171875 -1.765625 1.109375 -1.484375 1.078125 -1.328125 Z M 0.84375 -0.4375 " + id="path2642" /> + </symbol> + <symbol + overflow="visible" + id="symbol1880"> + <path + style="stroke:none;" + d="M 2.1875 -4.625 C 2.1875 -4.640625 2.203125 -4.734375 2.203125 -4.734375 C 2.203125 -4.78125 2.1875 -4.84375 2.09375 -4.84375 C 1.953125 -4.84375 1.375 -4.78125 1.203125 -4.765625 C 1.15625 -4.765625 1.046875 -4.75 1.046875 -4.609375 C 1.046875 -4.515625 1.15625 -4.515625 1.234375 -4.515625 C 1.5625 -4.515625 1.5625 -4.453125 1.5625 -4.40625 C 1.5625 -4.359375 1.546875 -4.3125 1.546875 -4.25 L 0.5625 -0.3125 C 0.515625 -0.1875 0.515625 -0.171875 0.515625 -0.15625 C 0.515625 -0.046875 0.609375 0.0625 0.765625 0.0625 C 0.953125 0.0625 1.03125 -0.0625 1.078125 -0.21875 C 1.09375 -0.25 1.390625 -1.484375 1.421875 -1.578125 C 1.921875 -1.53125 2.3125 -1.359375 2.3125 -1 C 2.3125 -0.96875 2.3125 -0.9375 2.296875 -0.859375 C 2.265625 -0.765625 2.265625 -0.71875 2.265625 -0.640625 C 2.265625 -0.15625 2.671875 0.0625 3.015625 0.0625 C 3.6875 0.0625 3.890625 -0.984375 3.890625 -1 C 3.890625 -1.09375 3.8125 -1.09375 3.78125 -1.09375 C 3.6875 -1.09375 3.671875 -1.046875 3.640625 -0.921875 C 3.5625 -0.625 3.375 -0.125 3.03125 -0.125 C 2.84375 -0.125 2.78125 -0.296875 2.78125 -0.484375 C 2.78125 -0.609375 2.78125 -0.625 2.828125 -0.796875 C 2.84375 -0.828125 2.859375 -0.9375 2.859375 -1.015625 C 2.859375 -1.640625 2.03125 -1.734375 1.734375 -1.75 C 1.9375 -1.875 2.1875 -2.109375 2.3125 -2.21875 C 2.671875 -2.546875 3.015625 -2.875 3.40625 -2.875 C 3.484375 -2.875 3.578125 -2.859375 3.640625 -2.78125 C 3.34375 -2.734375 3.28125 -2.5 3.28125 -2.390625 C 3.28125 -2.25 3.390625 -2.140625 3.546875 -2.140625 C 3.75 -2.140625 3.953125 -2.296875 3.953125 -2.578125 C 3.953125 -2.8125 3.78125 -3.078125 3.421875 -3.078125 C 3.015625 -3.078125 2.65625 -2.78125 2.296875 -2.453125 C 2 -2.1875 1.78125 -1.96875 1.484375 -1.84375 Z M 2.1875 -4.625 " + id="path8696" /> + </symbol> + <symbol + overflow="visible" + id="symbol4954"> + <path + style="stroke:none;" + d="" + id="path5507" /> + </symbol> + <symbol + overflow="visible" + id="symbol348"> + <path + style="stroke:none;" + d="M 6.40625 -1.578125 C 5.53125 -0.9375 5.421875 -0.015625 5.421875 -0.015625 C 5.421875 0.09375 5.484375 0.09375 5.578125 0.09375 C 5.703125 0.09375 5.734375 0.09375 5.765625 -0.03125 C 5.8125 -0.203125 5.921875 -0.640625 6.28125 -1.03125 C 6.6875 -1.453125 7.03125 -1.5625 7.328125 -1.65625 C 7.359375 -1.671875 7.390625 -1.703125 7.390625 -1.734375 C 7.390625 -1.8125 7.359375 -1.828125 7.265625 -1.859375 C 6.265625 -2.171875 5.90625 -2.890625 5.75 -3.5 C 5.734375 -3.578125 5.671875 -3.578125 5.578125 -3.578125 C 5.484375 -3.578125 5.421875 -3.578125 5.421875 -3.484375 C 5.421875 -3.46875 5.484375 -3 5.828125 -2.515625 C 5.984375 -2.28125 6.1875 -2.078125 6.40625 -1.921875 L 0.8125 -1.921875 C 0.703125 -1.921875 0.53125 -1.921875 0.53125 -1.75 C 0.53125 -1.578125 0.703125 -1.578125 0.8125 -1.578125 Z M 6.40625 -1.578125 " + id="path5803" /> + </symbol> + <symbol + overflow="visible" + id="symbol5806"> + <path + style="stroke:none;" + d="M 4.03125 -1.90625 C 3.65625 -2.34375 3.546875 -2.453125 3.28125 -2.640625 C 2.859375 -2.953125 2.40625 -3.078125 2.03125 -3.078125 C 1.15625 -3.078125 0.53125 -2.328125 0.53125 -1.5 C 0.53125 -0.6875 1.140625 0.0625 2 0.0625 C 2.96875 0.0625 3.65625 -0.71875 3.90625 -1.09375 C 4.265625 -0.65625 4.390625 -0.546875 4.640625 -0.359375 C 5.078125 -0.046875 5.515625 0.0625 5.90625 0.0625 C 6.765625 0.0625 7.390625 -0.671875 7.390625 -1.5 C 7.390625 -2.328125 6.796875 -3.078125 5.921875 -3.078125 C 4.953125 -3.078125 4.28125 -2.28125 4.03125 -1.90625 Z M 4.25 -1.65625 C 4.53125 -2.109375 5.140625 -2.8125 5.984375 -2.8125 C 6.703125 -2.8125 7.203125 -2.171875 7.203125 -1.5 C 7.203125 -0.84375 6.65625 -0.3125 6.015625 -0.3125 C 5.359375 -0.3125 4.921875 -0.84375 4.25 -1.65625 Z M 3.671875 -1.359375 C 3.40625 -0.90625 2.796875 -0.1875 1.9375 -0.1875 C 1.21875 -0.1875 0.734375 -0.828125 0.734375 -1.5 C 0.734375 -2.171875 1.28125 -2.6875 1.921875 -2.6875 C 2.5625 -2.6875 3.015625 -2.15625 3.671875 -1.359375 Z M 3.671875 -1.359375 " + id="path5376" /> + </symbol> + <symbol + overflow="visible" + id="symbol230"> + <path + style="stroke:none;" + d="" + id="path9947" /> + </symbol> + <symbol + overflow="visible" + id="symbol6017"> + <path + style="stroke:none;" + d="M 12.625 13.953125 L 13.828125 10.765625 L 13.578125 10.765625 C 13.1875 11.796875 12.125 12.484375 10.984375 12.78125 C 10.78125 12.828125 9.796875 13.09375 7.890625 13.09375 L 1.875 13.09375 L 6.953125 7.140625 C 7.015625 7.0625 7.03125 7.03125 7.03125 6.984375 C 7.03125 6.953125 7.03125 6.921875 6.96875 6.828125 L 2.328125 0.484375 L 7.78125 0.484375 C 9.125 0.484375 10.03125 0.625 10.125 0.640625 C 10.65625 0.71875 11.53125 0.890625 12.3125 1.390625 C 12.5625 1.546875 13.234375 2 13.578125 2.796875 L 13.828125 2.796875 L 12.625 0 L 0.84375 0 C 0.609375 0 0.59375 0.015625 0.5625 0.0625 C 0.5625 0.09375 0.5625 0.296875 0.5625 0.40625 L 5.828125 7.609375 L 0.671875 13.671875 C 0.5625 13.78125 0.5625 13.84375 0.5625 13.84375 C 0.5625 13.953125 0.65625 13.953125 0.84375 13.953125 Z M 12.625 13.953125 " + id="path8524" /> + </symbol> + </g> + <g + id="id-c32c4a99-1d4b-4f96-bc99-03794549d9e8-7"> + <symbol + overflow="visible" + id="id-85ce1641-a797-41a3-80d6-c31dc5baab30-9"> + <path + style="stroke:none" + d="" + id="id-05a16e79-fee2-4fcc-a02c-fe91f7bf9dc2-2" /> + </symbol> + <symbol + overflow="visible" + id="id-28f87cb3-8400-4fe5-bae3-8a97938e3f48-0"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-661793dd-c022-4f0a-9b05-38a8f25ce49f-2" /> + </symbol> + </g> + <g + id="id-c32c4a99-1d4b-4f96-bc99-03794549d9e8-9"> + <symbol + overflow="visible" + id="id-85ce1641-a797-41a3-80d6-c31dc5baab30-7"> + <path + style="stroke:none" + d="" + id="id-05a16e79-fee2-4fcc-a02c-fe91f7bf9dc2-3" /> + </symbol> + <symbol + overflow="visible" + id="id-28f87cb3-8400-4fe5-bae3-8a97938e3f48-6"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-661793dd-c022-4f0a-9b05-38a8f25ce49f-1" /> + </symbol> + </g> + <g + id="id-9700d69b-b708-4431-a1bd-03a345ee1a5a-8"> + <symbol + overflow="visible" + id="id-4e951f94-1396-4a8e-b149-617494eecb2b-4"> + <path + style="stroke:none" + d="" + id="id-87fcca55-e309-421c-a723-adc59bdcc982-5" /> + </symbol> + <symbol + overflow="visible" + id="id-f7da61ac-6bdb-4ba0-b20a-93899408e066-0"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-9e10732f-e482-4df9-bc27-e4559cda67d7-3" /> + </symbol> + <symbol + overflow="visible" + id="id-3368cb60-09f8-4f72-9a61-112c593bdc4c-6"> + <path + style="stroke:none" + d="" + id="id-1c3785a5-9e43-4554-8880-001ff4aac126-1" /> + </symbol> + <symbol + overflow="visible" + id="id-94bdc6e4-6d13-4f10-b74b-afab9a024d89-0"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-79b9ccb5-2113-4c1e-9453-80ac7c87e62a-6" /> + </symbol> + <symbol + overflow="visible" + id="id-85ab6bef-c2f5-42ce-9ea8-ba4e0c0853fe-3"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-9ab510cc-98c9-4651-93a0-af115cf1aad3-2" /> + </symbol> + </g> + <g + id="id-9700d69b-b708-4431-a1bd-03a345ee1a5a-5"> + <symbol + overflow="visible" + id="id-4e951f94-1396-4a8e-b149-617494eecb2b-2"> + <path + style="stroke:none" + d="" + id="id-87fcca55-e309-421c-a723-adc59bdcc982-54" /> + </symbol> + <symbol + overflow="visible" + id="id-f7da61ac-6bdb-4ba0-b20a-93899408e066-7"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-9e10732f-e482-4df9-bc27-e4559cda67d7-4" /> + </symbol> + <symbol + overflow="visible" + id="id-3368cb60-09f8-4f72-9a61-112c593bdc4c-4"> + <path + style="stroke:none" + d="" + id="id-1c3785a5-9e43-4554-8880-001ff4aac126-3" /> + </symbol> + <symbol + overflow="visible" + id="id-94bdc6e4-6d13-4f10-b74b-afab9a024d89-07"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-79b9ccb5-2113-4c1e-9453-80ac7c87e62a-8" /> + </symbol> + <symbol + overflow="visible" + id="id-85ab6bef-c2f5-42ce-9ea8-ba4e0c0853fe-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-9ab510cc-98c9-4651-93a0-af115cf1aad3-8" /> + </symbol> + </g> + <g + id="id-9700d69b-b708-4431-a1bd-03a345ee1a5a-4"> + <symbol + overflow="visible" + id="id-4e951f94-1396-4a8e-b149-617494eecb2b-9"> + <path + style="stroke:none" + d="" + id="id-87fcca55-e309-421c-a723-adc59bdcc982-50" /> + </symbol> + <symbol + overflow="visible" + id="id-f7da61ac-6bdb-4ba0-b20a-93899408e066-4"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-9e10732f-e482-4df9-bc27-e4559cda67d7-8" /> + </symbol> + <symbol + overflow="visible" + id="id-3368cb60-09f8-4f72-9a61-112c593bdc4c-7"> + <path + style="stroke:none" + d="" + id="id-1c3785a5-9e43-4554-8880-001ff4aac126-17" /> + </symbol> + <symbol + overflow="visible" + id="id-94bdc6e4-6d13-4f10-b74b-afab9a024d89-2"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-79b9ccb5-2113-4c1e-9453-80ac7c87e62a-7" /> + </symbol> + <symbol + overflow="visible" + id="id-85ab6bef-c2f5-42ce-9ea8-ba4e0c0853fe-2"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-9ab510cc-98c9-4651-93a0-af115cf1aad3-26" /> + </symbol> + </g> + <g + id="id-a01347b0-90cd-4ec9-887d-e01c8629d928-5"> + <symbol + overflow="visible" + id="id-e2096ad2-356a-479f-a2f9-5925f4afcaa1-9"> + <path + style="stroke:none" + d="" + id="id-7837e5a9-dcac-457d-90f5-19f20ee9dd8a-7" /> + </symbol> + <symbol + overflow="visible" + id="id-2f5bd605-362a-4503-ba8c-87e200e07c06-7"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-81206ab1-a3a5-46da-ba36-7c8c717e72e6-6" /> + </symbol> + <symbol + overflow="visible" + id="id-5e0f6526-c13a-40e8-91b2-49ba2188873f-7"> + <path + style="stroke:none" + d="" + id="id-3ee9a253-0b22-457c-bb8d-4226261beb62-3" /> + </symbol> + <symbol + overflow="visible" + id="id-24a2d54f-2c8f-44c8-8f23-2cf5b8a6b3c5-6"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-ff486641-3d0d-487c-8dc8-f94a741f33a6-5" /> + </symbol> + <symbol + overflow="visible" + id="id-1d38454e-e7de-4727-b847-a1bd5002ba1c-6"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-1f75dab9-f01f-4b70-ad77-0266aa16464b-3" /> + </symbol> + <symbol + overflow="visible" + id="id-385e44bb-6401-4a80-a1d1-c074bfab2b38-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-4092b46c-8929-491f-9ddc-bf3b5005c174-4" /> + </symbol> + <symbol + overflow="visible" + id="id-28fbc256-4cf8-4e21-862e-a17885055d04-8"> + <path + style="stroke:none" + d="" + id="id-ccd5aec0-565c-4e9c-9d74-c102587e659c-1" /> + </symbol> + <symbol + overflow="visible" + id="id-a7e0e44a-c9e9-4406-bf0f-6e553e16582e-2"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92de082a-00d6-413f-8025-89281d3ce1e8-9" /> + </symbol> + </g> + <g + id="id-f5eba645-3f13-4a42-aaa6-05aa2197ffd9-0"> + <symbol + overflow="visible" + id="id-97ebea65-8696-4324-b4a9-ea64fea52451-3"> + <path + style="stroke:none" + d="" + id="id-29c62201-07d3-4d0e-9015-fc3b613afc04-0" /> + </symbol> + <symbol + overflow="visible" + id="id-c951b5d4-ec77-491f-8a28-531b7b771e7d-4"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-60f43291-5366-4a80-91e5-189861a482cc-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9aeda8b7-4c1d-427b-81ca-afcaeb0b8c3a-4"> + <path + style="stroke:none" + d="" + id="id-55936e21-63a5-4ee4-bbcc-96e27570a9b1-4" /> + </symbol> + <symbol + overflow="visible" + id="id-f63fe2fd-13ba-4d8b-b4f3-b465c699579c-7"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-141e3032-0ae9-4a99-8a5e-d512025e8347-6" /> + </symbol> + <symbol + overflow="visible" + id="id-be5efca8-361b-4cf3-9be4-6787c3e88072-3"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-c9cb8af7-555f-4c51-a4fc-cc8a8cdc9a6b-1" /> + </symbol> + <symbol + overflow="visible" + id="id-045ed82c-5de9-42f0-a258-77adfaab19a4-7"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-a26948c5-8f06-47e7-a1c5-3884ed945a29-5" /> + </symbol> + <symbol + overflow="visible" + id="id-71580648-a504-4160-a6ce-e1cb5c34587e-9"> + <path + style="stroke:none" + d="" + id="id-854a77bf-ed57-4290-b614-9eaa9f1904b5-6" /> + </symbol> + <symbol + overflow="visible" + id="id-f5c4f8e1-2994-46fe-a65b-0490dea016e9-2"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-e00a1bcc-3781-4b53-86ae-955bf2cf45cf-1" /> + </symbol> + <symbol + overflow="visible" + id="id-855ee492-4f24-4765-a992-322badd0d0ce-7"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-20b0356c-0ed5-4b90-b1e6-80112b710712-8" /> + </symbol> + </g> + <g + id="id-908df72f-de8b-4f86-b543-0e9588cf71ea-8"> + <symbol + overflow="visible" + id="id-7a1b501f-af2a-4dbe-9b31-c0748f2a648e-6"> + <path + style="stroke:none" + d="" + id="id-67261c9d-77e9-4807-af69-99ebd8af83aa-0" /> + </symbol> + <symbol + overflow="visible" + id="id-df1b178e-9d15-4042-ac82-9f6b974bec47-4"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-16e0cdf6-7bb7-4fe4-a149-4671b2166f31-8" /> + </symbol> + <symbol + overflow="visible" + id="id-a1f1af77-8d82-465e-aefd-cd89e83d83d8-8"> + <path + style="stroke:none" + d="" + id="id-482aea71-3488-4c6e-88b4-d8c20b820a44-8" /> + </symbol> + <symbol + overflow="visible" + id="id-4cced342-06dd-456d-be37-7eb6a6de41ef-9"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-e3681581-c4bb-4148-8ef9-ccd2bf3dbb6f-7" /> + </symbol> + <symbol + overflow="visible" + id="id-cd9ebb03-4b32-4b3b-b360-f4c2842e2688-7"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-a71f8592-e5e6-4018-b4cb-349e953753e3-6" /> + </symbol> + <symbol + overflow="visible" + id="id-f22938a5-337e-4b8a-934c-d50ed9388598-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-5417b346-edf6-4199-a9cb-c98c61d0b122-3" /> + </symbol> + <symbol + overflow="visible" + id="id-baa3f21e-be5c-407a-a3df-ec784cc81812-0"> + <path + style="stroke:none" + d="" + id="id-a0cd3ff5-47d7-457b-850c-ae65445c76e0-3" /> + </symbol> + <symbol + overflow="visible" + id="id-58b44953-0b1e-4458-959b-8e58fc88f03e-0"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-344c40c8-bc3d-4556-acaa-163f06cd8f17-9" /> + </symbol> + </g> + <g + id="id-8ecdf416-7420-433d-b232-d25cd2014d41-3"> + <symbol + overflow="visible" + id="id-6085f62c-e7de-4535-a672-6849904ca7a6-6"> + <path + style="stroke:none" + d="" + id="id-b555ae83-e10a-4164-a858-16ba75bae1fb-8" /> + </symbol> + <symbol + overflow="visible" + id="id-0768c856-38ba-4438-9302-d162d012e07e-0"> + <path + style="stroke:none" + d="m 1.03125,-3.953125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 z m 0,0" + id="id-890ce425-b336-4321-8550-e572f39157c7-2" /> + </symbol> + </g> + <g + id="id-00d32c9f-a51c-4240-83bf-259b482dcea1-5"> + <symbol + overflow="visible" + id="id-5f0025dc-030d-4084-af3b-a9a4663a193c-0"> + <path + style="stroke:none" + d="" + id="id-df8af8b7-5886-40e5-899f-47e7cf5b8b17-6" /> + </symbol> + <symbol + overflow="visible" + id="id-cd00f367-5da5-4de6-be52-c7c1883ab922-4"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-221539ed-1bec-4221-89be-2d4dc66dae8b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d0300774-e73b-47c9-9bd5-23f2cd9cfd8e-2"> + <path + style="stroke:none" + d="" + id="id-0b619acc-2494-4ca6-83a3-a836876d0a09-5" /> + </symbol> + <symbol + overflow="visible" + id="id-63aaa364-69ff-4be2-bbf2-1ebe3d6600a5-8"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-44fdab85-d842-4b2b-82ce-7b2e608c47bb-6" /> + </symbol> + </g> + <g + id="id-00d32c9f-a51c-4240-83bf-259b482dcea1-9"> + <symbol + overflow="visible" + id="id-5f0025dc-030d-4084-af3b-a9a4663a193c-08"> + <path + style="stroke:none" + d="" + id="id-df8af8b7-5886-40e5-899f-47e7cf5b8b17-1" /> + </symbol> + <symbol + overflow="visible" + id="id-cd00f367-5da5-4de6-be52-c7c1883ab922-3"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-221539ed-1bec-4221-89be-2d4dc66dae8b-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d0300774-e73b-47c9-9bd5-23f2cd9cfd8e-1"> + <path + style="stroke:none" + d="" + id="id-0b619acc-2494-4ca6-83a3-a836876d0a09-0" /> + </symbol> + <symbol + overflow="visible" + id="id-63aaa364-69ff-4be2-bbf2-1ebe3d6600a5-3"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-44fdab85-d842-4b2b-82ce-7b2e608c47bb-4" /> + </symbol> + </g> + <g + id="id-00d32c9f-a51c-4240-83bf-259b482dcea1-56"> + <symbol + overflow="visible" + id="id-5f0025dc-030d-4084-af3b-a9a4663a193c-6"> + <path + style="stroke:none" + d="" + id="id-df8af8b7-5886-40e5-899f-47e7cf5b8b17-4" /> + </symbol> + <symbol + overflow="visible" + id="id-cd00f367-5da5-4de6-be52-c7c1883ab922-0"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-221539ed-1bec-4221-89be-2d4dc66dae8b-0" /> + </symbol> + <symbol + overflow="visible" + id="id-d0300774-e73b-47c9-9bd5-23f2cd9cfd8e-4"> + <path + style="stroke:none" + d="" + id="id-0b619acc-2494-4ca6-83a3-a836876d0a09-6" /> + </symbol> + <symbol + overflow="visible" + id="id-63aaa364-69ff-4be2-bbf2-1ebe3d6600a5-2"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-44fdab85-d842-4b2b-82ce-7b2e608c47bb-67" /> + </symbol> + </g> + <g + id="id-00d32c9f-a51c-4240-83bf-259b482dcea1-1"> + <symbol + overflow="visible" + id="id-5f0025dc-030d-4084-af3b-a9a4663a193c-3"> + <path + style="stroke:none" + d="" + id="id-df8af8b7-5886-40e5-899f-47e7cf5b8b17-2" /> + </symbol> + <symbol + overflow="visible" + id="id-cd00f367-5da5-4de6-be52-c7c1883ab922-1"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-221539ed-1bec-4221-89be-2d4dc66dae8b-5" /> + </symbol> + <symbol + overflow="visible" + id="id-d0300774-e73b-47c9-9bd5-23f2cd9cfd8e-9"> + <path + style="stroke:none" + d="" + id="id-0b619acc-2494-4ca6-83a3-a836876d0a09-9" /> + </symbol> + <symbol + overflow="visible" + id="id-63aaa364-69ff-4be2-bbf2-1ebe3d6600a5-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-44fdab85-d842-4b2b-82ce-7b2e608c47bb-49" /> + </symbol> + </g> + <g + id="id-0115ca04-b39c-463f-9cf9-fd2fd6f9b127-6"> + <symbol + overflow="visible" + id="id-0c972c03-37a2-436e-8270-b4aa6461fe05-4"> + <path + style="stroke:none" + d="" + id="id-fdfef96b-fba2-4462-b615-e0adca0a752d-1" /> + </symbol> + <symbol + overflow="visible" + id="id-6026ade1-0296-437a-ac81-b26b622433cb-2"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-f7194c14-c8c8-4ffe-9460-61fff463076e-8" /> + </symbol> + <symbol + overflow="visible" + id="id-890cce33-1832-483e-a14d-079e18e9ae16-8"> + <path + style="stroke:none" + d="" + id="id-c8589a12-ddac-4b0d-8e13-9e8c384fc668-9" /> + </symbol> + <symbol + overflow="visible" + id="id-10602ec8-ec5f-4e01-b9b7-5077fe576a8c-2"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-e8405255-02f0-417e-aa2c-1f5db957b561-8" /> + </symbol> + <symbol + overflow="visible" + id="id-00658129-436c-4425-a135-c0956ea2bee3-8"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-f5988f76-d32a-41e4-a747-1160b2456a9f-8" /> + </symbol> + </g> + <g + id="id-66fc4b46-357a-4bba-86b5-2a6dc9c0acd5-0"> + <symbol + overflow="visible" + id="id-11f37e72-5b39-43c6-b256-3fbed0667b86-6"> + <path + style="stroke:none" + d="" + id="id-6e090680-8483-4469-b561-440fa1178c58-8" /> + </symbol> + <symbol + overflow="visible" + id="id-b63a8b2a-d177-45ad-8fc2-8db0616d732c-7"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-e857427e-4838-4ad0-adf4-aa414a33a3a5-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4ad0db2d-d572-4052-b22e-513ba42f8a87-0"> + <path + style="stroke:none" + d="" + id="id-b4220d2d-9a0c-48fa-a360-cbfb6c83d33a-3" /> + </symbol> + <symbol + overflow="visible" + id="id-5cb0af93-e968-4bfe-b221-dc0b41035bdb-3"> + <path + style="stroke:none" + d="m 5.1875,-1.578125 c 0.109375,0 0.28125,0 0.28125,-0.15625 0,-0.1875 -0.171875,-0.1875 -0.28125,-0.1875 H 1.03125 c -0.109375,0 -0.28125,0 -0.28125,0.171875 0,0.171875 0.15625,0.171875 0.28125,0.171875 z m 0,0" + id="id-ee422276-1872-42c3-8843-ce6473b16a23-3" /> + </symbol> + <symbol + overflow="visible" + id="id-8609332e-a450-44bd-81e1-89c481c3e3cd-7"> + <path + style="stroke:none" + d="" + id="id-77b9326b-f4d9-4fb5-bfaf-a327d29c4dc4-3" /> + </symbol> + <symbol + overflow="visible" + id="id-8abe9bda-d09a-43dc-81d4-50ccb4a3c802-2"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-9b0c666b-1479-4414-b258-68ad55055d1f-6" /> + </symbol> + </g> + <g + id="id-b15114a7-ca09-4a21-ad11-725124638424-4"> + <symbol + overflow="visible" + id="id-310b4048-7c0e-46eb-bfd0-a76166008027-9"> + <path + style="stroke:none" + d="" + id="id-d6720d2c-5774-4364-8d54-58341c455226-9" /> + </symbol> + <symbol + overflow="visible" + id="id-380331dc-88ab-482c-b934-cf4ac9c4ff54-4"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-3a19059e-f020-4a72-9f12-a604927b3cd3-5" /> + </symbol> + <symbol + overflow="visible" + id="id-d8429f02-44d9-4eea-baa5-885d8a467e29-9"> + <path + style="stroke:none" + d="" + id="id-2ca3837e-ef16-4602-a5db-d5f0c7eef876-3" /> + </symbol> + <symbol + overflow="visible" + id="id-e6901dc5-9917-4fb0-a181-aa79499a7893-5"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-3d07bff7-8536-4d05-9265-e222d0ded5de-7" /> + </symbol> + <symbol + overflow="visible" + id="id-d654728c-9737-434e-9366-43d67bc9135b-0"> + <path + style="stroke:none" + d="" + id="id-2cb602a0-1505-4afe-9908-6b3a2a7e619e-8" /> + </symbol> + <symbol + overflow="visible" + id="id-364e5767-a7b9-4262-a86d-4fa669215069-1"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92389ee1-b7ce-499d-b00c-189d8877af98-9" /> + </symbol> + </g> + <g + id="id-d345eb5e-8757-4027-92e5-c112761c4a2b-9"> + <symbol + overflow="visible" + id="id-98061386-4070-43b1-bb54-ce248969080b-6"> + <path + style="stroke:none" + d="" + id="id-6a1aaf0c-6751-432f-a1bb-2b86d3e57ece-2" /> + </symbol> + <symbol + overflow="visible" + id="id-5aec679f-f26d-4dac-9b2b-c5eb976649ef-1"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-0e8bb187-3a09-4efb-8c7d-fcd92a6bc4c4-2" /> + </symbol> + <symbol + overflow="visible" + id="id-6ad444e2-ab68-4f93-a659-c3ec3fd9f5e5-0"> + <path + style="stroke:none" + d="" + id="id-59257d8c-7518-424c-9956-2599a744d54f-7" /> + </symbol> + <symbol + overflow="visible" + id="id-2c9a81aa-b0f3-4431-beb0-a4ffd91d56e6-3"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-c7b40002-e2b1-4bbb-a35a-7ab944f141f0-1" /> + </symbol> + </g> + <g + id="id-d345eb5e-8757-4027-92e5-c112761c4a2b-6"> + <symbol + overflow="visible" + id="id-98061386-4070-43b1-bb54-ce248969080b-4"> + <path + style="stroke:none" + d="" + id="id-6a1aaf0c-6751-432f-a1bb-2b86d3e57ece-7" /> + </symbol> + <symbol + overflow="visible" + id="id-5aec679f-f26d-4dac-9b2b-c5eb976649ef-4"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-0e8bb187-3a09-4efb-8c7d-fcd92a6bc4c4-8" /> + </symbol> + <symbol + overflow="visible" + id="id-6ad444e2-ab68-4f93-a659-c3ec3fd9f5e5-5"> + <path + style="stroke:none" + d="" + id="id-59257d8c-7518-424c-9956-2599a744d54f-8" /> + </symbol> + <symbol + overflow="visible" + id="id-2c9a81aa-b0f3-4431-beb0-a4ffd91d56e6-2"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-c7b40002-e2b1-4bbb-a35a-7ab944f141f0-6" /> + </symbol> + </g> + <g + id="id-7227ef66-160c-47d9-9ed5-bb54cf4cb84b-0"> + <symbol + overflow="visible" + id="id-ccac894d-8727-4ec8-8443-76d2c4ce72a3-7"> + <path + style="stroke:none" + d="" + id="id-efd127b0-0efc-4f25-b0f2-ed11b5dfb055-0" /> + </symbol> + <symbol + overflow="visible" + id="id-bdcc8c15-5bd2-4153-8529-5eddbe564815-1"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-470255b0-8cc2-489e-8f7a-f06db9a10204-0" /> + </symbol> + </g> + <g + id="id-dfb94cfe-0183-4b46-bfcc-875bc9dcc70a-4"> + <symbol + overflow="visible" + id="id-67fd2ddd-acfa-491d-8bde-cdfe8bb21885-5"> + <path + style="stroke:none" + d="" + id="id-600760ae-abe2-4327-8148-bc2360c5d35d-2" /> + </symbol> + <symbol + overflow="visible" + id="id-6f0cf77d-91a6-4e41-9672-165b52b8acbc-0"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-f040a633-937d-48f4-b241-2909c9d6ee84-2" /> + </symbol> + <symbol + overflow="visible" + id="id-237c8d20-18f0-457c-a8b9-3679670e6bfa-9"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c7e20ea3-211f-4659-af35-c107230c5ed6-0" /> + </symbol> + <symbol + overflow="visible" + id="id-d76fceb1-e72b-4604-86a0-a41c8fe991a1-9"> + <path + style="stroke:none" + d="" + id="id-b106c50c-98cd-4519-92db-fdeac80dc159-9" /> + </symbol> + <symbol + overflow="visible" + id="id-bb7460ed-ccfd-4835-a060-9f4fbbe578a0-4"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-46a3c354-e7a9-4ee1-adc4-f1233462abce-5" /> + </symbol> + <symbol + overflow="visible" + id="id-753cb3e7-dbb8-42f3-ba09-8b61c5b3bc9f-1"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11b9ce1a-d134-429a-b4b9-dfe60f7a08a6-0" /> + </symbol> + <symbol + overflow="visible" + id="id-9a19dd3f-0821-4da6-ad4c-004ca902e644-3"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-72af876b-7b70-4cc9-9811-9ce4a11b3969-7" /> + </symbol> + <symbol + overflow="visible" + id="id-eb6c42db-2195-47ad-a55c-79ae8ccae6d9-8"> + <path + style="stroke:none" + d="" + id="id-d7845396-f65f-4e66-a7d3-7c61386f8fdb-8" /> + </symbol> + <symbol + overflow="visible" + id="id-521c4670-cd4f-4602-8312-048113ae9a83-6"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-769e2827-1ec3-4b88-8dd0-a0cb30349c30-0" /> + </symbol> + <symbol + overflow="visible" + id="id-bc9fc4fe-ea83-4ce3-b496-41495f1d7422-4"> + <path + style="stroke:none" + d="" + id="id-144b152d-d212-4435-b7bb-25c3b44d6054-6" /> + </symbol> + <symbol + overflow="visible" + id="id-429fe4d7-7592-4bdf-9a68-142fff2a3056-7"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-71cbf7ea-1e95-4fa5-86ed-5e3b5ef78b7a-6" /> + </symbol> + </g> + <g + id="id-dfb94cfe-0183-4b46-bfcc-875bc9dcc70a-8"> + <symbol + overflow="visible" + id="id-67fd2ddd-acfa-491d-8bde-cdfe8bb21885-8"> + <path + style="stroke:none" + d="" + id="id-600760ae-abe2-4327-8148-bc2360c5d35d-5" /> + </symbol> + <symbol + overflow="visible" + id="id-6f0cf77d-91a6-4e41-9672-165b52b8acbc-8"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-f040a633-937d-48f4-b241-2909c9d6ee84-4" /> + </symbol> + <symbol + overflow="visible" + id="id-237c8d20-18f0-457c-a8b9-3679670e6bfa-3"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c7e20ea3-211f-4659-af35-c107230c5ed6-7" /> + </symbol> + <symbol + overflow="visible" + id="id-d76fceb1-e72b-4604-86a0-a41c8fe991a1-1"> + <path + style="stroke:none" + d="" + id="id-b106c50c-98cd-4519-92db-fdeac80dc159-3" /> + </symbol> + <symbol + overflow="visible" + id="id-bb7460ed-ccfd-4835-a060-9f4fbbe578a0-8"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-46a3c354-e7a9-4ee1-adc4-f1233462abce-0" /> + </symbol> + <symbol + overflow="visible" + id="id-753cb3e7-dbb8-42f3-ba09-8b61c5b3bc9f-9"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11b9ce1a-d134-429a-b4b9-dfe60f7a08a6-7" /> + </symbol> + <symbol + overflow="visible" + id="id-9a19dd3f-0821-4da6-ad4c-004ca902e644-9"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-72af876b-7b70-4cc9-9811-9ce4a11b3969-9" /> + </symbol> + <symbol + overflow="visible" + id="id-eb6c42db-2195-47ad-a55c-79ae8ccae6d9-3"> + <path + style="stroke:none" + d="" + id="id-d7845396-f65f-4e66-a7d3-7c61386f8fdb-2" /> + </symbol> + <symbol + overflow="visible" + id="id-521c4670-cd4f-4602-8312-048113ae9a83-4"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-769e2827-1ec3-4b88-8dd0-a0cb30349c30-3" /> + </symbol> + <symbol + overflow="visible" + id="id-bc9fc4fe-ea83-4ce3-b496-41495f1d7422-7"> + <path + style="stroke:none" + d="" + id="id-144b152d-d212-4435-b7bb-25c3b44d6054-1" /> + </symbol> + <symbol + overflow="visible" + id="id-429fe4d7-7592-4bdf-9a68-142fff2a3056-2"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-71cbf7ea-1e95-4fa5-86ed-5e3b5ef78b7a-2" /> + </symbol> + </g> + <g + id="id-dfb94cfe-0183-4b46-bfcc-875bc9dcc70a-48"> + <symbol + overflow="visible" + id="id-67fd2ddd-acfa-491d-8bde-cdfe8bb21885-0"> + <path + style="stroke:none" + d="" + id="id-600760ae-abe2-4327-8148-bc2360c5d35d-8" /> + </symbol> + <symbol + overflow="visible" + id="id-6f0cf77d-91a6-4e41-9672-165b52b8acbc-1"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-f040a633-937d-48f4-b241-2909c9d6ee84-0" /> + </symbol> + <symbol + overflow="visible" + id="id-237c8d20-18f0-457c-a8b9-3679670e6bfa-2"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c7e20ea3-211f-4659-af35-c107230c5ed6-2" /> + </symbol> + <symbol + overflow="visible" + id="id-d76fceb1-e72b-4604-86a0-a41c8fe991a1-97"> + <path + style="stroke:none" + d="" + id="id-b106c50c-98cd-4519-92db-fdeac80dc159-5" /> + </symbol> + <symbol + overflow="visible" + id="id-bb7460ed-ccfd-4835-a060-9f4fbbe578a0-6"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-46a3c354-e7a9-4ee1-adc4-f1233462abce-4" /> + </symbol> + <symbol + overflow="visible" + id="id-753cb3e7-dbb8-42f3-ba09-8b61c5b3bc9f-6"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11b9ce1a-d134-429a-b4b9-dfe60f7a08a6-3" /> + </symbol> + <symbol + overflow="visible" + id="id-9a19dd3f-0821-4da6-ad4c-004ca902e644-7"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-72af876b-7b70-4cc9-9811-9ce4a11b3969-97" /> + </symbol> + <symbol + overflow="visible" + id="id-eb6c42db-2195-47ad-a55c-79ae8ccae6d9-4"> + <path + style="stroke:none" + d="" + id="id-d7845396-f65f-4e66-a7d3-7c61386f8fdb-9" /> + </symbol> + <symbol + overflow="visible" + id="id-521c4670-cd4f-4602-8312-048113ae9a83-1"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-769e2827-1ec3-4b88-8dd0-a0cb30349c30-7" /> + </symbol> + <symbol + overflow="visible" + id="id-bc9fc4fe-ea83-4ce3-b496-41495f1d7422-0"> + <path + style="stroke:none" + d="" + id="id-144b152d-d212-4435-b7bb-25c3b44d6054-60" /> + </symbol> + <symbol + overflow="visible" + id="id-429fe4d7-7592-4bdf-9a68-142fff2a3056-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-71cbf7ea-1e95-4fa5-86ed-5e3b5ef78b7a-5" /> + </symbol> + </g> + <g + id="id-dfb94cfe-0183-4b46-bfcc-875bc9dcc70a-3"> + <symbol + overflow="visible" + id="id-67fd2ddd-acfa-491d-8bde-cdfe8bb21885-4"> + <path + style="stroke:none" + d="" + id="id-600760ae-abe2-4327-8148-bc2360c5d35d-4" /> + </symbol> + <symbol + overflow="visible" + id="id-6f0cf77d-91a6-4e41-9672-165b52b8acbc-3"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-f040a633-937d-48f4-b241-2909c9d6ee84-9" /> + </symbol> + <symbol + overflow="visible" + id="id-237c8d20-18f0-457c-a8b9-3679670e6bfa-7"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c7e20ea3-211f-4659-af35-c107230c5ed6-25" /> + </symbol> + <symbol + overflow="visible" + id="id-d76fceb1-e72b-4604-86a0-a41c8fe991a1-8"> + <path + style="stroke:none" + d="" + id="id-b106c50c-98cd-4519-92db-fdeac80dc159-90" /> + </symbol> + <symbol + overflow="visible" + id="id-bb7460ed-ccfd-4835-a060-9f4fbbe578a0-2"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-46a3c354-e7a9-4ee1-adc4-f1233462abce-47" /> + </symbol> + <symbol + overflow="visible" + id="id-753cb3e7-dbb8-42f3-ba09-8b61c5b3bc9f-65"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11b9ce1a-d134-429a-b4b9-dfe60f7a08a6-71" /> + </symbol> + <symbol + overflow="visible" + id="id-9a19dd3f-0821-4da6-ad4c-004ca902e644-33"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-72af876b-7b70-4cc9-9811-9ce4a11b3969-3" /> + </symbol> + <symbol + overflow="visible" + id="id-eb6c42db-2195-47ad-a55c-79ae8ccae6d9-85"> + <path + style="stroke:none" + d="" + id="id-d7845396-f65f-4e66-a7d3-7c61386f8fdb-1" /> + </symbol> + <symbol + overflow="visible" + id="id-521c4670-cd4f-4602-8312-048113ae9a83-0"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-769e2827-1ec3-4b88-8dd0-a0cb30349c30-8" /> + </symbol> + <symbol + overflow="visible" + id="id-bc9fc4fe-ea83-4ce3-b496-41495f1d7422-76"> + <path + style="stroke:none" + d="" + id="id-144b152d-d212-4435-b7bb-25c3b44d6054-3" /> + </symbol> + <symbol + overflow="visible" + id="id-429fe4d7-7592-4bdf-9a68-142fff2a3056-5"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-71cbf7ea-1e95-4fa5-86ed-5e3b5ef78b7a-0" /> + </symbol> + </g> + <g + id="id-d345eb5e-8757-4027-92e5-c112761c4a2b-0"> + <symbol + overflow="visible" + id="id-98061386-4070-43b1-bb54-ce248969080b-8"> + <path + style="stroke:none" + d="" + id="id-6a1aaf0c-6751-432f-a1bb-2b86d3e57ece-1" /> + </symbol> + <symbol + overflow="visible" + id="id-5aec679f-f26d-4dac-9b2b-c5eb976649ef-2"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-0e8bb187-3a09-4efb-8c7d-fcd92a6bc4c4-26" /> + </symbol> + <symbol + overflow="visible" + id="id-6ad444e2-ab68-4f93-a659-c3ec3fd9f5e5-9"> + <path + style="stroke:none" + d="" + id="id-59257d8c-7518-424c-9956-2599a744d54f-1" /> + </symbol> + <symbol + overflow="visible" + id="id-2c9a81aa-b0f3-4431-beb0-a4ffd91d56e6-0"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-c7b40002-e2b1-4bbb-a35a-7ab944f141f0-4" /> + </symbol> + </g> + <g + id="id-d345eb5e-8757-4027-92e5-c112761c4a2b-00"> + <symbol + overflow="visible" + id="id-98061386-4070-43b1-bb54-ce248969080b-3"> + <path + style="stroke:none" + d="" + id="id-6a1aaf0c-6751-432f-a1bb-2b86d3e57ece-4" /> + </symbol> + <symbol + overflow="visible" + id="id-5aec679f-f26d-4dac-9b2b-c5eb976649ef-9"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-0e8bb187-3a09-4efb-8c7d-fcd92a6bc4c4-27" /> + </symbol> + <symbol + overflow="visible" + id="id-6ad444e2-ab68-4f93-a659-c3ec3fd9f5e5-4"> + <path + style="stroke:none" + d="" + id="id-59257d8c-7518-424c-9956-2599a744d54f-2" /> + </symbol> + <symbol + overflow="visible" + id="id-2c9a81aa-b0f3-4431-beb0-a4ffd91d56e6-5"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-c7b40002-e2b1-4bbb-a35a-7ab944f141f0-2" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-3"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-1"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-8" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-3"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-4" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-2"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-2" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-4"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-5" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-1"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-5"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-7" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-1"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-6" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-8"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-5"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-2" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-1"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-9" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-9"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-6" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-0"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-6" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-4"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-9" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-9"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-0" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-8"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-9" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-0"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-13"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-7" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-4"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-1" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-1"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-3" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-03"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-2" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-17"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-5" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-6"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-5" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-4"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-2" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-02"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-15"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-6" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-5"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-0" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-0"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-34" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-6"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-60" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-2"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-58" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-95"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-06" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-0"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-8" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-89"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-8"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-80" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-37"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-06" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-92"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-1" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-7"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-7" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-9"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-76" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-2"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-71" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-5"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-88" /> + </symbol> + </g> + <g + id="id-2676788f-a519-45c9-bc41-355afc2ee934-4"> + <symbol + overflow="visible" + id="id-dab2e038-2f88-4789-bc06-d3d076818e34-19"> + <path + style="stroke:none" + d="" + id="id-4733e5cc-aa03-4115-aefa-3f2626aeeb9a-5" /> + </symbol> + <symbol + overflow="visible" + id="id-574258f4-9496-42e1-9f3b-8e2df10d6a7c-7"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-3e4b3a09-25bf-466f-9d35-6d2e2e536f26-41" /> + </symbol> + <symbol + overflow="visible" + id="id-68894452-0aa5-402d-923e-f3bf8d4f90f1-22"> + <path + style="stroke:none" + d="" + id="id-244c817d-e5ff-44e9-8b36-449e1d917a7c-16" /> + </symbol> + <symbol + overflow="visible" + id="id-cd29ea50-31a9-4437-b04b-6bfbef80b38f-2"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-14a5be18-9d21-4b48-8afb-01d7b3aee316-0" /> + </symbol> + <symbol + overflow="visible" + id="id-e5ddc1b3-c9dd-43db-aaf9-6516e5db3d53-22"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-2ebc8d88-2128-4645-bb70-a9bbc970afb2-97" /> + </symbol> + <symbol + overflow="visible" + id="id-c2f311f5-7c80-4b6d-8419-0aa1a1d5933e-4"> + <path + style="stroke:none" + d="" + id="id-26d062d7-c4c1-44b0-a5a9-503691901684-3" /> + </symbol> + <symbol + overflow="visible" + id="id-d0b2593c-34a7-4e2f-866e-f9f3c3efe6c6-56"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-f5025c65-9264-4346-811e-eed2cb552001-1" /> + </symbol> + </g> + <g + id="id-7227ef66-160c-47d9-9ed5-bb54cf4cb84b-1"> + <symbol + overflow="visible" + id="id-ccac894d-8727-4ec8-8443-76d2c4ce72a3-2"> + <path + style="stroke:none" + d="" + id="id-efd127b0-0efc-4f25-b0f2-ed11b5dfb055-06" /> + </symbol> + <symbol + overflow="visible" + id="id-bdcc8c15-5bd2-4153-8529-5eddbe564815-8"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-470255b0-8cc2-489e-8f7a-f06db9a10204-7" /> + </symbol> + </g> + <g + id="id-7227ef66-160c-47d9-9ed5-bb54cf4cb84b-9"> + <symbol + overflow="visible" + id="id-ccac894d-8727-4ec8-8443-76d2c4ce72a3-1"> + <path + style="stroke:none" + d="" + id="id-efd127b0-0efc-4f25-b0f2-ed11b5dfb055-2" /> + </symbol> + <symbol + overflow="visible" + id="id-bdcc8c15-5bd2-4153-8529-5eddbe564815-89"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-470255b0-8cc2-489e-8f7a-f06db9a10204-6" /> + </symbol> + </g> + <g + id="id-7227ef66-160c-47d9-9ed5-bb54cf4cb84b-6"> + <symbol + overflow="visible" + id="id-ccac894d-8727-4ec8-8443-76d2c4ce72a3-6"> + <path + style="stroke:none" + d="" + id="id-efd127b0-0efc-4f25-b0f2-ed11b5dfb055-3" /> + </symbol> + <symbol + overflow="visible" + id="id-bdcc8c15-5bd2-4153-8529-5eddbe564815-9"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-470255b0-8cc2-489e-8f7a-f06db9a10204-9" /> + </symbol> + </g> + <g + id="id-7227ef66-160c-47d9-9ed5-bb54cf4cb84b-91"> + <symbol + overflow="visible" + id="id-ccac894d-8727-4ec8-8443-76d2c4ce72a3-3"> + <path + style="stroke:none" + d="" + id="id-efd127b0-0efc-4f25-b0f2-ed11b5dfb055-4" /> + </symbol> + <symbol + overflow="visible" + id="id-bdcc8c15-5bd2-4153-8529-5eddbe564815-5"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-470255b0-8cc2-489e-8f7a-f06db9a10204-8" /> + </symbol> + </g> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.0815041" + inkscape:cx="442.69716" + inkscape:cy="368.96344" + inkscape:document-units="mm" + inkscape:current-layer="g24410" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="992" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g24410" + transform="translate(73.769425,-14.640859)"> + <g + id="g48570"> + <g + transform="matrix(0.515009,0,0,0.543714,123.78943,136.49896)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$z_1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-0"> + <defs + id="id-a11443ae-5680-4fd2-998c-03aac8884898"> + <g + id="id-eb52ad1a-98d6-4508-8c52-d822e8214559"> + <symbol + overflow="visible" + id="id-90e0f0c5-a5dc-4c99-be01-17ce75139c28"> + <path + style="stroke:none" + d="" + id="id-0aab7f5a-cce1-4a3b-a8f8-a6fa9bdb2442" /> + </symbol> + <symbol + overflow="visible" + id="id-350d3c26-9d68-4293-9402-db84f99a56a0"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-9989a360-a08e-439e-b73c-db08ffd06058" /> + </symbol> + <symbol + overflow="visible" + id="id-6218964a-9604-4244-bd4b-9454bf0bb4b0"> + <path + style="stroke:none" + d="" + id="id-d9651d3c-227d-4426-8b25-41f32650ce85" /> + </symbol> + <symbol + overflow="visible" + id="id-71be12ed-4366-49ab-b52d-f913ea29ee61"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-c69d8307-964b-4a94-852d-813bbd63d286" /> + </symbol> + </g> + </defs> + <g + id="id-670fa564-d04f-49e4-89d3-f292cee9d0dd" + transform="translate(-149.134,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-629bac1d-d732-45ea-9e2f-8035df467324"> + <g + transform="translate(148.712,134.765)" + id="g26730"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-0bc4890f-d8a5-4415-b063-687e79c23127" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-42c9571a-ce67-496a-8929-1d871d953abf"> + <g + transform="translate(153.345,136.259)" + id="g26734"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-17fc3d6a-f9b2-4d2c-bb1f-80dcfcdbb3f8" /> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.317947;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker29315);marker-end:url(#marker29335)" + d="m 121.25657,115.45101 v 45.32912" + id="path28223" /> + </g> + <g + id="g48513" + transform="translate(-0.32345724)"> + <g + transform="matrix(0.515009,0,0,0.543714,123.96547,179.02169)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$z_2$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-0-5"> + <defs + id="id-a79d82ac-8aaf-416e-a36b-571e15cb9710"> + <g + id="id-022b9cfd-0373-492a-9e99-748252aaa67d"> + <symbol + overflow="visible" + id="id-387bff1c-c94c-49ed-8e60-e86ce176dbee"> + <path + style="stroke:none" + d="" + id="id-b0e6d18f-27b4-4447-8743-4d8edc538653" /> + </symbol> + <symbol + overflow="visible" + id="id-b7a7550f-7c6c-466b-bc14-15c8477d9fc6"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-12659a36-2fd8-474b-8bbf-c36049526c5b" /> + </symbol> + <symbol + overflow="visible" + id="id-20a34618-31be-42e1-994d-95b52dc1001c"> + <path + style="stroke:none" + d="" + id="id-aa3160c6-d31a-4183-aecc-68c90f87bc71" /> + </symbol> + <symbol + overflow="visible" + id="id-f07fb4a5-caca-4471-bfad-9331d7c6ffb6"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-59300b1b-d873-443e-9730-404955e857fc" /> + </symbol> + </g> + </defs> + <g + id="id-fc18a75c-6e05-429c-8c54-023b26326500" + transform="translate(-149.134,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d45b489c-5200-4750-9613-9332429336f7"> + <g + transform="translate(148.712,134.765)" + id="g27756"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-add79b81-133b-42ad-aa75-a25f6b4a6c85" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-61dde61b-bcd9-43d2-94f3-2cf108756810"> + <g + transform="translate(153.345,136.259)" + id="g27760"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-c4384b96-920c-4538-bd3d-d508259ea6f0" /> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.277183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker29025);marker-end:url(#marker29325)" + d="m 121.48763,166.4603 0.003,28.35274" + id="path28225" /> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,74.710416,117.13462)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\lfloor c_{n_1}/s \\rfloor$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-9"> + <defs + id="id-a762d58c-d888-4047-905e-f4ff0fe350f9"> + <g + id="id-dfb94cfe-0183-4b46-bfcc-875bc9dcc70a"> + <symbol + overflow="visible" + id="id-67fd2ddd-acfa-491d-8bde-cdfe8bb21885"> + <path + style="stroke:none" + d="" + id="id-600760ae-abe2-4327-8148-bc2360c5d35d" /> + </symbol> + <symbol + overflow="visible" + id="id-6f0cf77d-91a6-4e41-9672-165b52b8acbc"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-f040a633-937d-48f4-b241-2909c9d6ee84" /> + </symbol> + <symbol + overflow="visible" + id="id-237c8d20-18f0-457c-a8b9-3679670e6bfa"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c7e20ea3-211f-4659-af35-c107230c5ed6" /> + </symbol> + <symbol + overflow="visible" + id="id-d76fceb1-e72b-4604-86a0-a41c8fe991a1"> + <path + style="stroke:none" + d="" + id="id-b106c50c-98cd-4519-92db-fdeac80dc159" /> + </symbol> + <symbol + overflow="visible" + id="id-bb7460ed-ccfd-4835-a060-9f4fbbe578a0"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-46a3c354-e7a9-4ee1-adc4-f1233462abce" /> + </symbol> + <symbol + overflow="visible" + id="id-753cb3e7-dbb8-42f3-ba09-8b61c5b3bc9f"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11b9ce1a-d134-429a-b4b9-dfe60f7a08a6" /> + </symbol> + <symbol + overflow="visible" + id="id-9a19dd3f-0821-4da6-ad4c-004ca902e644"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-72af876b-7b70-4cc9-9811-9ce4a11b3969" /> + </symbol> + <symbol + overflow="visible" + id="id-eb6c42db-2195-47ad-a55c-79ae8ccae6d9"> + <path + style="stroke:none" + d="" + id="id-d7845396-f65f-4e66-a7d3-7c61386f8fdb" /> + </symbol> + <symbol + overflow="visible" + id="id-521c4670-cd4f-4602-8312-048113ae9a83"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-769e2827-1ec3-4b88-8dd0-a0cb30349c30" /> + </symbol> + <symbol + overflow="visible" + id="id-bc9fc4fe-ea83-4ce3-b496-41495f1d7422"> + <path + style="stroke:none" + d="" + id="id-144b152d-d212-4435-b7bb-25c3b44d6054" /> + </symbol> + <symbol + overflow="visible" + id="id-429fe4d7-7592-4bdf-9a68-142fff2a3056"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-71cbf7ea-1e95-4fa5-86ed-5e3b5ef78b7a" /> + </symbol> + </g> + </defs> + <g + id="id-fac3ac11-3b6b-47d2-aa09-dfdaf7b84821" + transform="translate(-150.446,-127.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c8fbe875-ed9f-4520-9989-915fe1dc2dc0"> + <g + transform="translate(148.712,134.765)" + id="g36873"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-e635def1-731d-43e4-b578-f317b983756a" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e1742512-5824-4ad3-864d-d762ae982907"> + <g + transform="translate(153.14,134.765)" + id="g36877"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-12cb1cb4-be82-4322-8c4e-6bd61a02c560" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cec7e560-13ea-45f0-92f4-afd98f1f2e8d"> + <g + transform="translate(157.452,136.259)" + id="g36881"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-b5c807df-eb24-4599-8881-9156da072a97" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ada8dc53-b15f-4cd7-a92e-46806021c459"> + <g + transform="translate(162.376,137.255)" + id="g36885"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-8db85573-ad59-482c-a758-e312aef35ecd" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-9a9736f0-ccee-4611-a995-59622a667482"> + <g + transform="translate(166.763,134.765)" + id="g36889"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-3230fc58-780e-460d-a1f8-50856bc59626" /> + </g> + <g + transform="translate(171.744,134.765)" + id="g36892"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-798c2f3a-5aa4-4779-aa42-affc0ec3426a" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b28d4152-b18e-46c5-b2a0-f7e8bf48e4ca"> + <g + transform="translate(176.414,134.765)" + id="g36896"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-ef9db707-b15c-41d2-8631-cfabba8950fe" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,75.02685,136.7235)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\lfloor c_{n_2}/s \\rfloor$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-9-2"> + <defs + id="id-419da426-d9a4-470a-81d4-d7a01af45616"> + <g + id="id-9980da0e-4c52-447e-8161-a49d65ccd955"> + <symbol + overflow="visible" + id="id-512e6e0e-4524-4447-a198-a9e245135241"> + <path + style="stroke:none" + d="" + id="id-284788a1-20aa-48c5-95ce-d4a088d3517b" /> + </symbol> + <symbol + overflow="visible" + id="id-9b36a568-b984-4c4a-97aa-571769b40c27"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-d327212f-190c-4f99-8ae6-67614fb8b430" /> + </symbol> + <symbol + overflow="visible" + id="id-e8bf9936-6c31-41ec-ae8d-4a7911ae74c9"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-c1e2e659-ac7a-49d0-b49f-2ec7667c41ec" /> + </symbol> + <symbol + overflow="visible" + id="id-32c8c4c2-9728-46c1-a164-b41b79b4d580"> + <path + style="stroke:none" + d="" + id="id-47f8ede4-569c-4a02-a8cf-33412b472ecc" /> + </symbol> + <symbol + overflow="visible" + id="id-0b4d462c-b107-48f9-9331-7b08e0ce7d25"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-0df717c1-f4c7-40d5-9181-6941d7fcfd3e" /> + </symbol> + <symbol + overflow="visible" + id="id-b20bdc22-89f1-4776-a5c8-164391082d6a"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-086c5b58-e025-4620-a482-3c507b2d9ebc" /> + </symbol> + <symbol + overflow="visible" + id="id-c590d8fb-0760-4ab0-87f9-948d4901aeaa"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-07ef424a-271c-4262-8b3e-3a7c355367e8" /> + </symbol> + <symbol + overflow="visible" + id="id-33bce4af-1d28-463f-a3d4-c73008b5ae90"> + <path + style="stroke:none" + d="" + id="id-6a2bee1d-1d6d-490b-bf8f-c97da0bbfd16" /> + </symbol> + <symbol + overflow="visible" + id="id-c4d0ddd3-e178-4f8a-a56b-be13ac0e53a7"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-6945e5e7-3617-4327-b40f-8eeedfb37348" /> + </symbol> + <symbol + overflow="visible" + id="id-d811b445-aff2-4f8d-b1f9-fdeae96975a9"> + <path + style="stroke:none" + d="" + id="id-4dcc0ba4-9cdc-4b39-a82d-5067368c845b" /> + </symbol> + <symbol + overflow="visible" + id="id-0e745f17-5bbd-4b36-8f2d-da0385192276"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-ce375304-9523-46a3-b450-08ddbe8f0abc" /> + </symbol> + </g> + </defs> + <g + id="id-f17f8559-e751-4dd3-af2e-38fcd4b3bf8e" + transform="translate(-150.446,-127.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-17d5a0d4-ff10-47ef-9684-580bbe95d691"> + <g + transform="translate(148.712,134.765)" + id="g39705"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-b3a28021-a581-4089-846b-8b350a3c9b87" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-26ea252c-df6e-417a-bab4-1aff94a171c0"> + <g + transform="translate(153.14,134.765)" + id="g39709"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-bafe3dd7-10d2-43ea-ba51-c95c8400fe23" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-aba77c32-6685-44e2-b8ed-c4dd8be3d7a5"> + <g + transform="translate(157.452,136.259)" + id="g39713"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-c98451f7-02d4-4ce8-9168-b9a1f1bc9391" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0b5046b0-1ceb-4535-9551-7ad272ae50dc"> + <g + transform="translate(162.376,137.255)" + id="g39717"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-9c6cb7d7-91c7-4a37-8644-9452c7f9c03f" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-eaf36961-766f-42b4-ada6-98119fe5b474"> + <g + transform="translate(166.763,134.765)" + id="g39721"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-e134700b-146e-4bc1-914a-1e2d402e1c83" /> + </g> + <g + transform="translate(171.744,134.765)" + id="g39724"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-105d30eb-f633-4989-ae77-d5cab1ab0d55" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-a89c61f4-c1cc-4831-8358-8ae2ee539a3e"> + <g + transform="translate(176.414,134.765)" + id="g39728"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-a551b963-356d-4792-8150-c0a8c53fedc0" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,74.980557,152.62379)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\lfloor c_{n_3}/s \\rfloor$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-9-0"> + <defs + id="id-3ec317fc-435d-48cb-b113-0555847bc509"> + <g + id="id-613d8853-e4c1-4e09-88ec-be7a0196c404"> + <symbol + overflow="visible" + id="id-f7ae26fb-9cc8-47b1-8958-4016011204e4"> + <path + style="stroke:none" + d="" + id="id-418b7f52-13a8-4845-a1ef-771bc0449562" /> + </symbol> + <symbol + overflow="visible" + id="id-7eddffd2-4f26-4aca-b523-b662da1f9fd5"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-110d6965-902e-45e3-b25b-3c6048f80d65" /> + </symbol> + <symbol + overflow="visible" + id="id-2a6ef4cb-1412-4cb3-986e-5e038155cf62"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-6103b49f-8e05-4abb-ba20-4f171f526a20" /> + </symbol> + <symbol + overflow="visible" + id="id-ee42a8b3-f4cd-48db-ba14-74365b4107d3"> + <path + style="stroke:none" + d="" + id="id-324d78f3-4347-4d1e-b534-1273ef0bbee2" /> + </symbol> + <symbol + overflow="visible" + id="id-3df90b16-0d2c-4f3e-ae85-5d42353a6032"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-f5eb1922-ff7e-4b26-8d9f-43918fec33cf" /> + </symbol> + <symbol + overflow="visible" + id="id-bd8f6c8b-27f1-445a-b416-88727e4843d6"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-3e1eec19-a099-4015-aede-00648bd3e7b9" /> + </symbol> + <symbol + overflow="visible" + id="id-1258b689-18c9-4eca-9837-346dde437ad2"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-8da861bf-fa48-4096-9022-b953f87d8578" /> + </symbol> + <symbol + overflow="visible" + id="id-1ae48de8-9ef9-4ebe-8049-1e40a5941fef"> + <path + style="stroke:none" + d="" + id="id-b843a2f1-bca6-48d9-b7a2-1cb3ec3bb690" /> + </symbol> + <symbol + overflow="visible" + id="id-75ac2a24-9450-4f24-bc02-29b54a15b420"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-27f4cb75-1adc-40a7-9355-a4e51f1223b9" /> + </symbol> + <symbol + overflow="visible" + id="id-909ba9d1-4430-4b4b-8463-67e23184804a"> + <path + style="stroke:none" + d="" + id="id-6f83ed55-6d35-483d-8cd0-93548768a6f1" /> + </symbol> + <symbol + overflow="visible" + id="id-7ed35eeb-6f19-4595-827b-bcd07c7a9631"> + <path + style="stroke:none" + d="m 1.640625,-1.65625 c 0.46875,0 0.765625,0.296875 0.765625,0.78125 0,0.515625 -0.3125,0.78125 -0.75,0.78125 -0.0625,0 -0.65625,0 -0.90625,-0.265625 0.203125,-0.03125 0.265625,-0.171875 0.265625,-0.296875 0,-0.1875 -0.140625,-0.3125 -0.3125,-0.3125 -0.15625,0 -0.296875,0.109375 -0.296875,0.328125 0,0.515625 0.578125,0.75 1.265625,0.75 0.8125,0 1.3125,-0.5 1.3125,-0.984375 0,-0.40625 -0.359375,-0.75 -0.921875,-0.875 0.59375,-0.203125 0.75,-0.578125 0.75,-0.859375 0,-0.40625 -0.5,-0.703125 -1.125,-0.703125 -0.625,0 -1.109375,0.25 -1.109375,0.703125 0,0.234375 0.1875,0.296875 0.28125,0.296875 0.140625,0 0.28125,-0.109375 0.28125,-0.296875 0,-0.109375 -0.0625,-0.25 -0.234375,-0.28125 C 1.109375,-3.109375 1.5625,-3.125 1.671875,-3.125 c 0.359375,0 0.609375,0.171875 0.609375,0.515625 0,0.296875 -0.1875,0.75 -0.703125,0.78125 -0.140625,0 -0.15625,0 -0.296875,0.015625 -0.046875,0 -0.109375,0 -0.109375,0.078125 0,0.078125 0.046875,0.078125 0.140625,0.078125 z m 0,0" + id="id-d3786235-9a6a-421b-8a43-7b10b15088dd" /> + </symbol> + </g> + </defs> + <g + id="id-a626d1d7-fad5-46fc-af3a-0d21335cb4f7" + transform="translate(-150.446,-127.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-400b475f-aa3f-4e65-a66a-4fa9dd357f06"> + <g + transform="translate(148.712,134.765)" + id="g41721"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-cdf05de8-e8ee-4d2b-a590-0997090ad25e" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e4aae720-73a2-440f-aa4a-5715143683dd"> + <g + transform="translate(153.14,134.765)" + id="g41725"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-efc43bfe-9c09-4414-9d2e-ba3e552726f1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ec0c063e-b3f4-4a47-9817-b8e44160ef79"> + <g + transform="translate(157.452,136.259)" + id="g41729"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-cb0b406b-603d-45a0-a0b3-2c3a0516a49e" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-447bdd04-e118-4af6-9c4b-f990ea031568"> + <g + transform="translate(162.376,137.255)" + id="g41733"> + <path + style="stroke:none" + d="m 1.640625,-1.65625 c 0.46875,0 0.765625,0.296875 0.765625,0.78125 0,0.515625 -0.3125,0.78125 -0.75,0.78125 -0.0625,0 -0.65625,0 -0.90625,-0.265625 0.203125,-0.03125 0.265625,-0.171875 0.265625,-0.296875 0,-0.1875 -0.140625,-0.3125 -0.3125,-0.3125 -0.15625,0 -0.296875,0.109375 -0.296875,0.328125 0,0.515625 0.578125,0.75 1.265625,0.75 0.8125,0 1.3125,-0.5 1.3125,-0.984375 0,-0.40625 -0.359375,-0.75 -0.921875,-0.875 0.59375,-0.203125 0.75,-0.578125 0.75,-0.859375 0,-0.40625 -0.5,-0.703125 -1.125,-0.703125 -0.625,0 -1.109375,0.25 -1.109375,0.703125 0,0.234375 0.1875,0.296875 0.28125,0.296875 0.140625,0 0.28125,-0.109375 0.28125,-0.296875 0,-0.109375 -0.0625,-0.25 -0.234375,-0.28125 C 1.109375,-3.109375 1.5625,-3.125 1.671875,-3.125 c 0.359375,0 0.609375,0.171875 0.609375,0.515625 0,0.296875 -0.1875,0.75 -0.703125,0.78125 -0.140625,0 -0.15625,0 -0.296875,0.015625 -0.046875,0 -0.109375,0 -0.109375,0.078125 0,0.078125 0.046875,0.078125 0.140625,0.078125 z m 0,0" + id="id-20d727ba-acd3-43f4-ab03-6ac71a297f7c" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7ab24957-bac4-44f1-816b-bad9220777dd"> + <g + transform="translate(166.763,134.765)" + id="g41737"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-4999e419-17e3-43c3-9237-63e0bbf02433" /> + </g> + <g + transform="translate(171.744,134.765)" + id="g41740"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-708fab32-7e32-47cc-8ce7-5d6653a1a5dd" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-48013b19-7722-4078-9998-a93fb1d95983"> + <g + transform="translate(176.414,134.765)" + id="g41744"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-9052fb27-1b7e-40b3-9560-e6ba76eef5c6" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,73.483552,165.44983)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\lfloor c_{n_4}/s \\rfloor$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-9-1"> + <defs + id="id-c6a7431f-2504-4e68-b1fe-814fb38749f0"> + <g + id="id-88fc4df7-59d0-4b9a-826c-cdc902a970cb"> + <symbol + overflow="visible" + id="id-a8037caa-bc44-45c0-9963-4c1c621ed8c1"> + <path + style="stroke:none" + d="" + id="id-3af6ff30-482b-4d59-9ae4-575801836754" /> + </symbol> + <symbol + overflow="visible" + id="id-953675c7-8551-42c5-b9a4-4d5fc482d182"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-42c06c81-cf85-489f-97bb-357c8473129e" /> + </symbol> + <symbol + overflow="visible" + id="id-12a0603d-6521-4868-91ae-d78bf71dcdd4"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-5a2b8ef6-3597-495d-a3a0-7aba8bdd9916" /> + </symbol> + <symbol + overflow="visible" + id="id-5cd7ab38-e410-4ae7-b822-b9f8bbe254a9"> + <path + style="stroke:none" + d="" + id="id-2868f1cd-d082-4e73-b2ba-d619514c3762" /> + </symbol> + <symbol + overflow="visible" + id="id-4d72d395-60c0-4d09-bb6d-94deb5ab3093"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-3647d2b8-d79b-46df-82c9-a0af454772c0" /> + </symbol> + <symbol + overflow="visible" + id="id-6dea54a7-7535-47a5-888c-4df25ea8a4c0"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-f925883b-c1ee-48c9-b5c4-6def6046c2e0" /> + </symbol> + <symbol + overflow="visible" + id="id-fc448325-ed42-44a8-8125-1886f3132ae6"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-763f879f-2dd1-4e94-97c1-c23b3ac2fbc9" /> + </symbol> + <symbol + overflow="visible" + id="id-f3adeeab-7b2a-4005-a18a-1e1e601120fe"> + <path + style="stroke:none" + d="" + id="id-8ce28139-725c-47fe-a93d-1d742dcbb8b1" /> + </symbol> + <symbol + overflow="visible" + id="id-30d07064-5532-4c63-8a73-8ff1b50d3791"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-fa07f258-1a56-401f-9fb3-65ddccbd27eb" /> + </symbol> + <symbol + overflow="visible" + id="id-aef1e66b-8bda-49b5-8f67-01b95545e067"> + <path + style="stroke:none" + d="" + id="id-2d1e4d56-f948-498d-9226-b5d5e391cf23" /> + </symbol> + <symbol + overflow="visible" + id="id-e6144527-694c-4536-89ba-d53f26729233"> + <path + style="stroke:none" + d="m 3.078125,-0.8125 v -0.21875 h -0.625 v -2.1875 c 0,-0.125 0,-0.15625 -0.140625,-0.15625 -0.09375,0 -0.09375,0 -0.15625,0.078125 L 0.3125,-1.03125 v 0.21875 h 1.65625 v 0.390625 c 0,0.15625 0,0.203125 -0.421875,0.203125 h -0.1875 V 0 c 0.234375,-0.015625 0.5625,-0.015625 0.859375,-0.015625 0.28125,0 0.609375,0 0.84375,0.015625 V -0.21875 H 2.890625 c -0.4375,0 -0.4375,-0.046875 -0.4375,-0.203125 V -0.8125 Z m -1.0625,-2.03125 v 1.8125 h -1.46875 z m 0,0" + id="id-b29b5202-bcef-4a69-9292-55b4868e42f6" /> + </symbol> + </g> + </defs> + <g + id="id-1cd7b675-f335-4716-8dce-fbec1e37f165" + transform="translate(-150.446,-127.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-7a716d6b-4d36-425a-8b6c-7a45db8f91e7"> + <g + transform="translate(148.712,134.765)" + id="g43737"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-af27afb4-b58f-4471-84ad-b45c6b1d84a1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-3306423c-d20f-4cb6-8e7d-04fb190efdf6"> + <g + transform="translate(153.14,134.765)" + id="g43741"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-bc055cad-53c7-4622-9af6-095536435078" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-6e0570dd-d078-49ec-8c39-5ee55d22414a"> + <g + transform="translate(157.452,136.259)" + id="g43745"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-32a7f97f-5a14-4b18-9f6c-3908a16b6c20" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d9434e52-a981-4bbe-9c2f-bee530595478"> + <g + transform="translate(162.376,137.255)" + id="g43749"> + <path + style="stroke:none" + d="m 3.078125,-0.8125 v -0.21875 h -0.625 v -2.1875 c 0,-0.125 0,-0.15625 -0.140625,-0.15625 -0.09375,0 -0.09375,0 -0.15625,0.078125 L 0.3125,-1.03125 v 0.21875 h 1.65625 v 0.390625 c 0,0.15625 0,0.203125 -0.421875,0.203125 h -0.1875 V 0 c 0.234375,-0.015625 0.5625,-0.015625 0.859375,-0.015625 0.28125,0 0.609375,0 0.84375,0.015625 V -0.21875 H 2.890625 c -0.4375,0 -0.4375,-0.046875 -0.4375,-0.203125 V -0.8125 Z m -1.0625,-2.03125 v 1.8125 h -1.46875 z m 0,0" + id="id-7930aeb8-5cbb-4581-8e1d-ea16bd59aa87" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ac107fea-8ad0-4aab-a4c0-2d41cd164e68"> + <g + transform="translate(166.763,134.765)" + id="g43753"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-e2a5588a-43f3-44c2-babc-b7b6f01a7826" /> + </g> + <g + transform="translate(171.744,134.765)" + id="g43756"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-cf385c97-8c16-4fa5-b418-96962e985458" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-47b9582e-6d44-4690-a167-ec78d3aaa52d"> + <g + transform="translate(176.414,134.765)" + id="g43760"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-9ad2e3d0-3852-4d08-9378-22ffcbe81879" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,76.106808,187.26056)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\lfloor c_{n_5}/s \\rfloor$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-9-3"> + <defs + id="id-4cc151b0-189e-49b0-b9d1-ea0d7bb4c808"> + <g + id="id-43441dba-a79e-4af1-83ed-93017754ab7c"> + <symbol + overflow="visible" + id="id-06194ad7-0ac3-4a9d-a7a7-686b34df5463"> + <path + style="stroke:none" + d="" + id="id-6639f5a6-549b-47cb-be81-0b04a41b563f" /> + </symbol> + <symbol + overflow="visible" + id="id-b745c3f6-85cb-4d0e-ac05-5d42d92d5cc0"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-c6a39923-15bb-4d1c-b42f-b460b954f788" /> + </symbol> + <symbol + overflow="visible" + id="id-99c0c816-ff83-4477-9bdb-845d2aaa871b"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-0dd15361-7777-4116-896b-c78d1ef9a1eb" /> + </symbol> + <symbol + overflow="visible" + id="id-174f3d77-5d57-45a6-b1a9-4aaccdc40869"> + <path + style="stroke:none" + d="" + id="id-3eebe3f0-a75b-4f40-a813-563b73517436" /> + </symbol> + <symbol + overflow="visible" + id="id-71959008-00a8-4eae-b758-64ec4011aa16"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-264a855e-71bc-470b-a14d-fb44512b169b" /> + </symbol> + <symbol + overflow="visible" + id="id-f4f0f7e8-dc64-4d67-8147-7fefcd59f1ea"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-11c8acf4-b19e-4ada-ac94-1905deb8ab70" /> + </symbol> + <symbol + overflow="visible" + id="id-12511f0d-421b-4942-b257-7109e162d86d"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-1a48520c-8b55-454f-83ed-bc80d25e2743" /> + </symbol> + <symbol + overflow="visible" + id="id-7c202cbd-da2d-4bf0-8452-163f0fba23c4"> + <path + style="stroke:none" + d="" + id="id-2cfa4249-e0d7-45d8-a55e-01b2f2c42e23" /> + </symbol> + <symbol + overflow="visible" + id="id-66f67bd0-9571-4b15-b181-c6bdcb77c534"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-b7fc5d22-9fcc-4df5-9f38-06cf9818200d" /> + </symbol> + <symbol + overflow="visible" + id="id-e51db6d7-9bba-4484-b153-6fdd0227f41c"> + <path + style="stroke:none" + d="" + id="id-2603aec0-5dcc-4dff-95bc-76c3e1d4481b" /> + </symbol> + <symbol + overflow="visible" + id="id-d09de25e-0a4a-4f1b-bb13-931e25d1f51e"> + <path + style="stroke:none" + d="m 0.984375,-2.75 c 0.25,0.0625 0.484375,0.0625 0.53125,0.0625 0.34375,0 0.59375,-0.09375 0.71875,-0.15625 0.125,-0.0625 0.46875,-0.28125 0.46875,-0.390625 0,-0.078125 -0.0625,-0.078125 -0.078125,-0.078125 -0.015625,0 -0.015625,0 -0.078125,0.015625 -0.1875,0.0625 -0.5,0.140625 -0.828125,0.140625 -0.28125,0 -0.546875,-0.046875 -0.8125,-0.140625 C 0.84375,-3.3125 0.84375,-3.3125 0.828125,-3.3125 0.75,-3.3125 0.75,-3.265625 0.75,-3.1875 v 1.5 c 0,0.09375 0,0.15625 0.109375,0.15625 0.046875,0 0.046875,-0.015625 0.09375,-0.0625 0.1875,-0.21875 0.453125,-0.328125 0.796875,-0.328125 0.28125,0 0.453125,0.15625 0.515625,0.265625 0.109375,0.171875 0.140625,0.390625 0.140625,0.640625 0,0.203125 -0.015625,0.484375 -0.21875,0.671875 -0.21875,0.234375 -0.5,0.25 -0.609375,0.25 -0.328125,0 -0.6875,-0.140625 -0.84375,-0.4375 0.203125,-0.015625 0.28125,-0.15625 0.28125,-0.28125 0,-0.15625 -0.125,-0.28125 -0.28125,-0.28125 -0.109375,0 -0.28125,0.078125 -0.28125,0.296875 0,0.5 0.484375,0.90625 1.125,0.90625 0.75,0 1.359375,-0.5 1.359375,-1.109375 0,-0.5625 -0.484375,-1.09375 -1.171875,-1.09375 -0.3125,0 -0.578125,0.078125 -0.78125,0.25 z m 0,0" + id="id-15b83509-c49e-4abf-a1ff-e8403c4a91b7" /> + </symbol> + </g> + </defs> + <g + id="id-0f85ceaf-4a0a-4815-9158-a036d625307b" + transform="translate(-150.446,-127.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-269f042b-d89a-4d63-93f8-09d8374b3659"> + <g + transform="translate(148.712,134.765)" + id="g45753"> + <path + style="stroke:none" + d="M 3.84375,2.5 C 4,2.5 4.203125,2.5 4.203125,2.296875 4.203125,2.09375 4,2.09375 3.84375,2.09375 H 2.140625 V -7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.140625 C 1.734375,2.453125 1.78125,2.5 2.09375,2.5 Z m 0,0" + id="id-b6767a43-8ead-48f0-b6c0-a1cfa26d9672" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4cef209d-1326-485d-b36a-f1b664601571"> + <g + transform="translate(153.14,134.765)" + id="g45757"> + <path + style="stroke:none" + d="m 3.953125,-3.78125 c -0.171875,0 -0.296875,0 -0.4375,0.125 -0.171875,0.15625 -0.1875,0.328125 -0.1875,0.390625 0,0.25 0.1875,0.359375 0.375,0.359375 0.28125,0 0.546875,-0.25 0.546875,-0.640625 0,-0.484375 -0.46875,-0.859375 -1.171875,-0.859375 -1.34375,0 -2.671875,1.421875 -2.671875,2.828125 0,0.90625 0.578125,1.6875 1.625,1.6875 1.421875,0 2.25,-1.0625 2.25,-1.171875 0,-0.0625 -0.046875,-0.140625 -0.109375,-0.140625 -0.0625,0 -0.078125,0.03125 -0.140625,0.109375 -0.78125,0.984375 -1.875,0.984375 -1.984375,0.984375 -0.625,0 -0.90625,-0.484375 -0.90625,-1.09375 0,-0.40625 0.203125,-1.375 0.546875,-1.984375 0.3125,-0.578125 0.859375,-1 1.40625,-1 0.328125,0 0.71875,0.125 0.859375,0.40625 z m 0,0" + id="id-ada00035-8369-434c-80b0-6211d487a5ff" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-37d12fec-4ff9-4082-a5ad-d6426beab189"> + <g + transform="translate(157.452,136.259)" + id="g45761"> + <path + style="stroke:none" + d="m 0.84375,-0.4375 c -0.015625,0.09375 -0.0625,0.265625 -0.0625,0.28125 0,0.15625 0.125,0.21875 0.234375,0.21875 0.125,0 0.234375,-0.078125 0.28125,-0.140625 0.03125,-0.0625 0.078125,-0.296875 0.125,-0.4375 0.03125,-0.125 0.109375,-0.453125 0.140625,-0.625 0.046875,-0.15625 0.09375,-0.3125 0.125,-0.46875 0.078125,-0.28125 0.09375,-0.34375 0.296875,-0.625 C 2.171875,-2.515625 2.5,-2.875 3.03125,-2.875 c 0.390625,0 0.40625,0.359375 0.40625,0.484375 0,0.421875 -0.296875,1.1875 -0.40625,1.484375 -0.078125,0.203125 -0.109375,0.265625 -0.109375,0.375 0,0.375 0.296875,0.59375 0.65625,0.59375 0.703125,0 1,-0.953125 1,-1.0625 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.09375,0 -0.09375,0.046875 -0.125,0.125 C 4.1875,-0.40625 3.875,-0.125 3.609375,-0.125 c -0.15625,0 -0.1875,-0.09375 -0.1875,-0.25 0,-0.15625 0.046875,-0.25 0.171875,-0.5625 0.078125,-0.21875 0.359375,-0.953125 0.359375,-1.34375 0,-0.671875 -0.53125,-0.796875 -0.90625,-0.796875 -0.578125,0 -0.96875,0.359375 -1.171875,0.640625 -0.046875,-0.484375 -0.453125,-0.640625 -0.75,-0.640625 -0.296875,0 -0.453125,0.21875 -0.546875,0.375 -0.15625,0.265625 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.125 -0.0625,0.390625 -0.125,0.578125 -0.046875,0.1875 -0.109375,0.46875 -0.140625,0.625 z m 0,0" + id="id-9995383a-17ec-4281-b4e7-5d358e256a4e" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-552ac16c-4c8e-45bd-83fb-4948678ff630"> + <g + transform="translate(162.376,137.255)" + id="g45765"> + <path + style="stroke:none" + d="m 0.984375,-2.75 c 0.25,0.0625 0.484375,0.0625 0.53125,0.0625 0.34375,0 0.59375,-0.09375 0.71875,-0.15625 0.125,-0.0625 0.46875,-0.28125 0.46875,-0.390625 0,-0.078125 -0.0625,-0.078125 -0.078125,-0.078125 -0.015625,0 -0.015625,0 -0.078125,0.015625 -0.1875,0.0625 -0.5,0.140625 -0.828125,0.140625 -0.28125,0 -0.546875,-0.046875 -0.8125,-0.140625 C 0.84375,-3.3125 0.84375,-3.3125 0.828125,-3.3125 0.75,-3.3125 0.75,-3.265625 0.75,-3.1875 v 1.5 c 0,0.09375 0,0.15625 0.109375,0.15625 0.046875,0 0.046875,-0.015625 0.09375,-0.0625 0.1875,-0.21875 0.453125,-0.328125 0.796875,-0.328125 0.28125,0 0.453125,0.15625 0.515625,0.265625 0.109375,0.171875 0.140625,0.390625 0.140625,0.640625 0,0.203125 -0.015625,0.484375 -0.21875,0.671875 -0.21875,0.234375 -0.5,0.25 -0.609375,0.25 -0.328125,0 -0.6875,-0.140625 -0.84375,-0.4375 0.203125,-0.015625 0.28125,-0.15625 0.28125,-0.28125 0,-0.15625 -0.125,-0.28125 -0.28125,-0.28125 -0.109375,0 -0.28125,0.078125 -0.28125,0.296875 0,0.5 0.484375,0.90625 1.125,0.90625 0.75,0 1.359375,-0.5 1.359375,-1.109375 0,-0.5625 -0.484375,-1.09375 -1.171875,-1.09375 -0.3125,0 -0.578125,0.078125 -0.78125,0.25 z m 0,0" + id="id-23d07112-73ac-45bc-be7d-f5015afa9a00" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-2cbe04e2-867e-40ec-8902-228bdbf8ef12"> + <g + transform="translate(166.763,134.765)" + id="g45769"> + <path + style="stroke:none" + d="m 4.375,-7.09375 c 0.046875,-0.140625 0.046875,-0.171875 0.046875,-0.1875 0,-0.109375 -0.078125,-0.203125 -0.1875,-0.203125 -0.078125,0 -0.140625,0.03125 -0.171875,0.09375 l -3.46875,9.5 C 0.546875,2.25 0.546875,2.28125 0.546875,2.296875 0.546875,2.40625 0.640625,2.5 0.75,2.5 0.875,2.5 0.90625,2.421875 0.96875,2.25 Z m 0,0" + id="id-172b54c9-d539-4792-b94a-2c559deebc0c" /> + </g> + <g + transform="translate(171.744,134.765)" + id="g45772"> + <path + style="stroke:none" + d="M 3.890625,-3.734375 C 3.625,-3.71875 3.421875,-3.5 3.421875,-3.28125 c 0,0.140625 0.09375,0.296875 0.3125,0.296875 0.21875,0 0.453125,-0.171875 0.453125,-0.5625 C 4.1875,-4 3.765625,-4.40625 3,-4.40625 c -1.3125,0 -1.6875,1.015625 -1.6875,1.453125 0,0.78125 0.734375,0.921875 1.03125,0.984375 0.515625,0.109375 1.03125,0.21875 1.03125,0.765625 0,0.25 -0.21875,1.09375 -1.421875,1.09375 -0.140625,0 -0.90625,0 -1.140625,-0.53125 0.390625,0.046875 0.640625,-0.25 0.640625,-0.53125 0,-0.21875 -0.171875,-0.34375 -0.375,-0.34375 -0.265625,0 -0.5625,0.203125 -0.5625,0.65625 0,0.5625 0.578125,0.96875 1.421875,0.96875 1.625,0 2.015625,-1.203125 2.015625,-1.65625 0,-0.359375 -0.1875,-0.609375 -0.3125,-0.71875 -0.265625,-0.28125 -0.5625,-0.34375 -1,-0.421875 -0.359375,-0.078125 -0.75,-0.15625 -0.75,-0.609375 C 1.890625,-3.578125 2.125,-4.1875 3,-4.1875 c 0.25,0 0.75,0.078125 0.890625,0.453125 z m 0,0" + id="id-a2f15b99-9215-42b3-8032-821609178236" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-8e494d81-eed6-4f20-8cd8-bd5c2acc839c"> + <g + transform="translate(176.414,134.765)" + id="g45776"> + <path + style="stroke:none" + d="m 2.6875,-7.125 c 0,-0.171875 0,-0.359375 -0.203125,-0.359375 -0.203125,0 -0.203125,0.21875 -0.203125,0.359375 V 2.09375 H 0.5625 c -0.140625,0 -0.359375,0 -0.359375,0.203125 C 0.203125,2.5 0.421875,2.5 0.5625,2.5 H 2.328125 C 2.65625,2.5 2.6875,2.46875 2.6875,2.140625 Z m 0,0" + id="id-da648515-8758-429e-8296-74841587c00d" /> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -58.569882,161.85891 36.081935,-33.64433" + id="path46675" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -57.592957,163.61632 34.666608,-21.96501" + id="path46677" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -57.425795,165.6441 34.396275,-1.29004" + id="path46679" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -58.042611,167.14878 35.211877,11.5036" + id="path46681" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -13.94901,123.93963 35.277237,-2.85007" + id="path46683" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -14.167095,127.40906 35.524272,5.9385" + id="path46685" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -14.43601,142.55358 36.283725,-3.39075" + id="path46687" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M -14.428797,138.22429 21.529202,123.81877" + id="path46689" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -14.50708,161.98124 35.132899,0.18761" + id="path46691" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M -14.227272,166.38468 21.73904,174.8371" + id="path46693" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m -14.211844,181.27437 35.676617,-0.76794" + id="path46695" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M -14.030184,178.07427 21.291153,165.28938" + id="path46697" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 29.39709,119.19918 35.808745,0.0306" + id="path46699" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 29.785617,121.45071 65.350313,136.1025" + id="path46701" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 28.751691,123.57068 36.092929,30.2858" + id="path46703" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 27.6792,139.62259 37.662678,47.68634" + id="path46705" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 29.077412,138.42645 36.037186,32.17009" + id="path46707" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 26.989699,158.8351 64.80126,124.23448" + id="path46709" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 29.556739,161.43662 64.849816,141.2088" + id="path46711" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 29.404792,165.07861 35.432216,-6.74839" + id="path46713" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 29.14949,175.68007 35.265989,-1.1479" + id="path46715" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 28.633089,180.77872 35.667159,8.66191" + id="path46717" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 73.287625,121.23048 109.6155,161.07576" + id="path46719" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 73.235603,140.46392 34.951787,22.33053" + id="path46721" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 73.046,157.54841 34.89733,7.1993" + id="path46723" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="m 73.299796,172.13518 35.268694,-5.22616" + id="path46725" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" + d="M 72.897566,187.9668 109.8041,168.43717" + id="path46727" /> + <g + transform="matrix(0.40506592,0,0,0.42764304,-44.345827,140.11983)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-06"> + <defs + id="id-1762abac-3aa4-4112-aeb2-6eb976716074-5"> + <g + id="g46805"> + <symbol + overflow="visible" + id="symbol46791"> + <path + style="stroke:none" + d="" + id="path46789" /> + </symbol> + <symbol + overflow="visible" + id="symbol46795"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path46793" /> + </symbol> + <symbol + overflow="visible" + id="symbol46799"> + <path + style="stroke:none" + d="" + id="path46797" /> + </symbol> + <symbol + overflow="visible" + id="symbol46803"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path46801" /> + </symbol> + </g> + </defs> + <g + id="id-606ca976-1fc0-4ce2-bcd3-cc17f3e3fc2b-2" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-0345f6c4-58bf-432e-829b-1445e64cf9a0-7"> + <g + transform="translate(148.712,134.765)" + id="g29933-4"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-595f2cfd-716d-4a6f-90a9-910ca9bd3fc2-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-71bce2e8-422f-417c-bf78-a63a2de27ed0-3"> + <g + transform="translate(153.863,136.259)" + id="g29937-2"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-ac2c156f-4276-403b-8831-666cbc5ec8e8-8" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-37.53122,161.07381)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-03"> + <defs + id="id-1762abac-3aa4-4112-aeb2-6eb976716074-7"> + <g + id="g46954"> + <symbol + overflow="visible" + id="symbol46940"> + <path + style="stroke:none" + d="" + id="path46938" /> + </symbol> + <symbol + overflow="visible" + id="symbol46944"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path46942" /> + </symbol> + <symbol + overflow="visible" + id="symbol46948"> + <path + style="stroke:none" + d="" + id="path46946" /> + </symbol> + <symbol + overflow="visible" + id="symbol46952"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path46950" /> + </symbol> + </g> + </defs> + <g + id="id-606ca976-1fc0-4ce2-bcd3-cc17f3e3fc2b-4" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-0345f6c4-58bf-432e-829b-1445e64cf9a0-4"> + <g + transform="translate(148.712,134.765)" + id="g29933-3"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-595f2cfd-716d-4a6f-90a9-910ca9bd3fc2-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-71bce2e8-422f-417c-bf78-a63a2de27ed0-6"> + <g + transform="translate(153.863,136.259)" + id="g29937-0"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-ac2c156f-4276-403b-8831-666cbc5ec8e8-89" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-37.795847,151.30336)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-2"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-2"> + <g + id="g47108"> + <symbol + overflow="visible" + id="symbol47082"> + <path + style="stroke:none" + d="" + id="path47080" /> + </symbol> + <symbol + overflow="visible" + id="symbol47086"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47084" /> + </symbol> + <symbol + overflow="visible" + id="symbol47090"> + <path + style="stroke:none" + d="" + id="path47088" /> + </symbol> + <symbol + overflow="visible" + id="symbol47094"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47092" /> + </symbol> + <symbol + overflow="visible" + id="symbol47098"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47096" /> + </symbol> + <symbol + overflow="visible" + id="symbol47102"> + <path + style="stroke:none" + d="" + id="path47100" /> + </symbol> + <symbol + overflow="visible" + id="symbol47106"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47104" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-9" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-8"> + <g + transform="translate(148.712,134.765)" + id="g31666-1"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-3"> + <g + transform="translate(153.863,136.259)" + id="g31670-3"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-9"> + <g + transform="translate(163.563,134.765)" + id="g31674-8"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-6" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-7"> + <g + transform="translate(173.525,134.765)" + id="g31678-0"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-8"> + <g + transform="translate(178.676,136.259)" + id="g31682-4"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-8" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-48.299299,175.30238)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-1"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-6"> + <g + id="g47243"> + <symbol + overflow="visible" + id="symbol47217"> + <path + style="stroke:none" + d="" + id="path47215" /> + </symbol> + <symbol + overflow="visible" + id="symbol47221"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47219" /> + </symbol> + <symbol + overflow="visible" + id="symbol47225"> + <path + style="stroke:none" + d="" + id="path47223" /> + </symbol> + <symbol + overflow="visible" + id="symbol47229"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47227" /> + </symbol> + <symbol + overflow="visible" + id="symbol47233"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47231" /> + </symbol> + <symbol + overflow="visible" + id="symbol47237"> + <path + style="stroke:none" + d="" + id="path47235" /> + </symbol> + <symbol + overflow="visible" + id="symbol47241"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47239" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-3" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-1"> + <g + transform="translate(148.712,134.765)" + id="g31666-4"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-9"> + <g + transform="translate(153.863,136.259)" + id="g31670-6"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-77" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-3"> + <g + transform="translate(163.563,134.765)" + id="g31674-7"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-2"> + <g + transform="translate(173.525,134.765)" + id="g31678-2"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-5"> + <g + transform="translate(178.676,136.259)" + id="g31682-0"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-9" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-7.271113,142.22664)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-0"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-4"> + <g + id="g47378"> + <symbol + overflow="visible" + id="symbol47352"> + <path + style="stroke:none" + d="" + id="path47350" /> + </symbol> + <symbol + overflow="visible" + id="symbol47356"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47354" /> + </symbol> + <symbol + overflow="visible" + id="symbol47360"> + <path + style="stroke:none" + d="" + id="path47358" /> + </symbol> + <symbol + overflow="visible" + id="symbol47364"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47362" /> + </symbol> + <symbol + overflow="visible" + id="symbol47368"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47366" /> + </symbol> + <symbol + overflow="visible" + id="symbol47372"> + <path + style="stroke:none" + d="" + id="path47370" /> + </symbol> + <symbol + overflow="visible" + id="symbol47376"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47374" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-2" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-17"> + <g + transform="translate(148.712,134.765)" + id="g31666-2"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-1"> + <g + transform="translate(153.863,136.259)" + id="g31670-65"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-78" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-5"> + <g + transform="translate(163.563,134.765)" + id="g31674-9"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-2" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-73"> + <g + transform="translate(173.525,134.765)" + id="g31678-6"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-47" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-9"> + <g + transform="translate(178.676,136.259)" + id="g31682-7"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-2" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-8.7457839,135.87241)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-21"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-63"> + <g + id="g47513"> + <symbol + overflow="visible" + id="symbol47487"> + <path + style="stroke:none" + d="" + id="path47485" /> + </symbol> + <symbol + overflow="visible" + id="symbol47491"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47489" /> + </symbol> + <symbol + overflow="visible" + id="symbol47495"> + <path + style="stroke:none" + d="" + id="path47493" /> + </symbol> + <symbol + overflow="visible" + id="symbol47499"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47497" /> + </symbol> + <symbol + overflow="visible" + id="symbol47503"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47501" /> + </symbol> + <symbol + overflow="visible" + id="symbol47507"> + <path + style="stroke:none" + d="" + id="path47505" /> + </symbol> + <symbol + overflow="visible" + id="symbol47511"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47509" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-37" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-82"> + <g + transform="translate(148.712,134.765)" + id="g31666-10"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-8"> + <g + transform="translate(153.863,136.259)" + id="g31670-5"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-0"> + <g + transform="translate(163.563,134.765)" + id="g31674-73"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-23"> + <g + transform="translate(173.525,134.765)" + id="g31678-07"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-7"> + <g + transform="translate(178.676,136.259)" + id="g31682-6"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-91" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-9.759494,176.54988)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-19"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-0"> + <g + id="g47648"> + <symbol + overflow="visible" + id="symbol47622"> + <path + style="stroke:none" + d="" + id="path47620" /> + </symbol> + <symbol + overflow="visible" + id="symbol47626"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47624" /> + </symbol> + <symbol + overflow="visible" + id="symbol47630"> + <path + style="stroke:none" + d="" + id="path47628" /> + </symbol> + <symbol + overflow="visible" + id="symbol47634"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47632" /> + </symbol> + <symbol + overflow="visible" + id="symbol47638"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47636" /> + </symbol> + <symbol + overflow="visible" + id="symbol47642"> + <path + style="stroke:none" + d="" + id="path47640" /> + </symbol> + <symbol + overflow="visible" + id="symbol47646"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47644" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-4" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-5"> + <g + transform="translate(148.712,134.765)" + id="g31666-6"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-56" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-84"> + <g + transform="translate(153.863,136.259)" + id="g31670-8"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-38"> + <g + transform="translate(163.563,134.765)" + id="g31674-75"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-24" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-5"> + <g + transform="translate(173.525,134.765)" + id="g31678-05"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-73" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-2"> + <g + transform="translate(178.676,136.259)" + id="g31682-72"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-1" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-11.275455,181.73424)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\rho_\\mathbf{N}-\\rho_\\mathbf{Z}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-0-3"> + <defs + id="id-dd9e6770-89ad-4047-83fb-288e781cfae2-49"> + <g + id="g47783"> + <symbol + overflow="visible" + id="symbol47757"> + <path + style="stroke:none" + d="" + id="path47755" /> + </symbol> + <symbol + overflow="visible" + id="symbol47761"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="path47759" /> + </symbol> + <symbol + overflow="visible" + id="symbol47765"> + <path + style="stroke:none" + d="" + id="path47763" /> + </symbol> + <symbol + overflow="visible" + id="symbol47769"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="path47767" /> + </symbol> + <symbol + overflow="visible" + id="symbol47773"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="path47771" /> + </symbol> + <symbol + overflow="visible" + id="symbol47777"> + <path + style="stroke:none" + d="" + id="path47775" /> + </symbol> + <symbol + overflow="visible" + id="symbol47781"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="path47779" /> + </symbol> + </g> + </defs> + <g + id="id-25d10de2-50d9-480c-bf15-ca0fe6087a55-40" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-88199d7b-8f3d-45e0-bdf0-9533cfe8b132-3"> + <g + transform="translate(148.712,134.765)" + id="g31666-12"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-e46ea34b-9973-4ddf-86e8-18d24f4fb584-7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d87d38a9-7bab-47d8-baf3-ce0713a971ec-7"> + <g + transform="translate(153.863,136.259)" + id="g31670-9"> + <path + style="stroke:none" + d="M 2.28125,-4.6875 C 2.1875,-4.78125 2.1875,-4.78125 2.03125,-4.78125 H 0.390625 v 0.390625 h 0.75 V -0.5625 c 0,0.109375 0,0.109375 -0.015625,0.125 -0.0625,0.046875 -0.421875,0.046875 -0.5,0.046875 H 0.390625 V 0 c 0.09375,0 0.734375,-0.03125 1,-0.03125 C 1.65625,-0.03125 2.328125,0 2.375,0 V -0.390625 H 2.140625 c -0.09375,0 -0.234375,0 -0.34375,-0.015625 C 1.640625,-0.421875 1.625,-0.421875 1.625,-0.5625 v -3.484375 l 3.734375,3.96875 C 5.421875,0 5.453125,0 5.59375,0 5.796875,0 5.828125,-0.03125 5.828125,-0.25 v -3.96875 c 0,-0.109375 0.015625,-0.109375 0.03125,-0.125 0.0625,-0.046875 0.40625,-0.046875 0.484375,-0.046875 H 6.578125 V -4.78125 c -0.09375,0 -0.71875,0.03125 -0.984375,0.03125 -0.265625,0 -0.9375,-0.03125 -1,-0.03125 v 0.390625 h 0.234375 c 0.109375,0 0.25,0 0.34375,0.015625 0.171875,0.015625 0.171875,0.015625 0.171875,0.15625 v 2.796875 z m 0,0" + id="id-b4239361-8de6-453e-bb45-9bca6d8a4f22-81" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-969ce66b-90d1-4a4f-a402-c283b8df8557-07"> + <g + transform="translate(163.563,134.765)" + id="g31674-6"> + <path + style="stroke:none" + d="m 6.5625,-2.296875 c 0.171875,0 0.359375,0 0.359375,-0.203125 0,-0.1875 -0.1875,-0.1875 -0.359375,-0.1875 H 1.171875 c -0.171875,0 -0.34375,0 -0.34375,0.1875 0,0.203125 0.171875,0.203125 0.34375,0.203125 z m 0,0" + id="id-5761f5ef-127a-458c-959c-2ec47f0167f8-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-70b6acfe-175f-4e7b-b0e0-229adc0025b8-1"> + <g + transform="translate(173.525,134.765)" + id="g31678-02"> + <path + style="stroke:none" + d="m 0.328125,1.71875 c -0.03125,0.125 -0.03125,0.140625 -0.03125,0.171875 0,0.140625 0.109375,0.265625 0.28125,0.265625 0.203125,0 0.328125,-0.1875 0.34375,-0.21875 0.0625,-0.078125 0.375,-1.421875 0.640625,-2.5 0.203125,0.40625 0.515625,0.671875 0.984375,0.671875 C 3.71875,0.109375 5,-1.296875 5,-2.78125 c 0,-1.0625 -0.65625,-1.625 -1.375,-1.625 -0.96875,0 -2.015625,1 -2.3125,2.21875 z m 2.21875,-1.828125 C 1.84375,-0.109375 1.6875,-0.90625 1.6875,-1 c 0,-0.03125 0.046875,-0.234375 0.078125,-0.359375 0.28125,-1.125 0.375,-1.484375 0.59375,-1.875 0.4375,-0.734375 0.9375,-0.953125 1.234375,-0.953125 0.375,0 0.6875,0.296875 0.6875,0.984375 0,0.546875 -0.28125,1.65625 -0.546875,2.140625 -0.328125,0.640625 -0.8125,0.953125 -1.1875,0.953125 z m 0,0" + id="id-5b1d2c68-4073-4540-b28d-87fd18d5bb87-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7d9a71cf-9ff6-498b-9cbf-2d0e821a2946-1"> + <g + transform="translate(178.676,136.259)" + id="g31682-9"> + <path + style="stroke:none" + d="M 4.890625,-4.375 C 4.96875,-4.453125 4.96875,-4.46875 4.96875,-4.578125 4.96875,-4.78125 4.875,-4.78125 4.71875,-4.78125 H 0.75 L 0.640625,-3.109375 H 1.09375 c 0.078125,-1.25 1.15625,-1.28125 1.578125,-1.28125 h 1 L 0.59375,-0.421875 C 0.515625,-0.34375 0.515625,-0.328125 0.515625,-0.21875 0.515625,0 0.609375,0 0.765625,0 H 4.875 l 0.140625,-1.953125 h -0.4375 C 4.5,-0.84375 4.03125,-0.421875 2.921875,-0.421875 h -1.09375 z m 0,0" + id="id-82ba62c1-7c86-4c2a-add3-c2ef93ab9b9c-7" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-6.202225,158.18375)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-1"> + <defs + id="id-8c25a1aa-1f58-4aca-9861-afdb4f0f4cfe-3"> + <g + id="g47887"> + <symbol + overflow="visible" + id="symbol47881"> + <path + style="stroke:none" + d="" + id="path47879" /> + </symbol> + <symbol + overflow="visible" + id="symbol47885"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="path47883" /> + </symbol> + </g> + </defs> + <g + id="id-64520949-1711-454c-bb71-2ee9495c8a41-4" + transform="translate(-149.603,-128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c193bae0-ec5b-48e8-9e45-b79390a0cfbb-9"> + <g + transform="translate(148.712,134.765)" + id="g35121-2"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-de33b5b0-585c-4134-91a0-c7fc6f17949b-4" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-6.202225,164.4865)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-4"> + <defs + id="id-8c25a1aa-1f58-4aca-9861-afdb4f0f4cfe-5"> + <g + id="g47936"> + <symbol + overflow="visible" + id="symbol47930"> + <path + style="stroke:none" + d="" + id="path47928" /> + </symbol> + <symbol + overflow="visible" + id="symbol47934"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="path47932" /> + </symbol> + </g> + </defs> + <g + id="id-64520949-1711-454c-bb71-2ee9495c8a41-0" + transform="translate(-149.603,-128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c193bae0-ec5b-48e8-9e45-b79390a0cfbb-6"> + <g + transform="translate(148.712,134.765)" + id="g35121-4"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-de33b5b0-585c-4134-91a0-c7fc6f17949b-0" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-5.676692,125.16281)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-94"> + <defs + id="id-8c25a1aa-1f58-4aca-9861-afdb4f0f4cfe-54"> + <g + id="g47985"> + <symbol + overflow="visible" + id="symbol47979"> + <path + style="stroke:none" + d="" + id="path47977" /> + </symbol> + <symbol + overflow="visible" + id="symbol47983"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="path47981" /> + </symbol> + </g> + </defs> + <g + id="id-64520949-1711-454c-bb71-2ee9495c8a41-5" + transform="translate(-149.603,-128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c193bae0-ec5b-48e8-9e45-b79390a0cfbb-2"> + <g + transform="translate(148.712,134.765)" + id="g35121-1"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-de33b5b0-585c-4134-91a0-c7fc6f17949b-3" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.40506592,0,0,0.42764304,-5.764281,119.64472)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-5-4-0"> + <defs + id="id-8c25a1aa-1f58-4aca-9861-afdb4f0f4cfe-9"> + <g + id="g48034"> + <symbol + overflow="visible" + id="symbol48028"> + <path + style="stroke:none" + d="" + id="path48026" /> + </symbol> + <symbol + overflow="visible" + id="symbol48032"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="path48030" /> + </symbol> + </g> + </defs> + <g + id="id-64520949-1711-454c-bb71-2ee9495c8a41-57" + transform="translate(-149.603,-128.124)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c193bae0-ec5b-48e8-9e45-b79390a0cfbb-3"> + <g + transform="translate(148.712,134.765)" + id="g35121-3"> + <path + style="stroke:none" + d="m 2.9375,-6.375 c 0,-0.25 0,-0.265625 -0.234375,-0.265625 C 2.078125,-6 1.203125,-6 0.890625,-6 v 0.3125 c 0.203125,0 0.78125,0 1.296875,-0.265625 v 5.171875 c 0,0.359375 -0.03125,0.46875 -0.921875,0.46875 h -0.3125 V 0 c 0.34375,-0.03125 1.203125,-0.03125 1.609375,-0.03125 0.390625,0 1.265625,0 1.609375,0.03125 v -0.3125 h -0.3125 c -0.90625,0 -0.921875,-0.109375 -0.921875,-0.46875 z m 0,0" + id="id-de33b5b0-585c-4134-91a0-c7fc6f17949b-8" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g26471" + transform="translate(-77.515812,96.131383)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3" + cx="89.263428" + cy="53.86829" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,88.2697,52.2609)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{s}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6"> + <defs + id="id-c7917549-bead-4fe2-8914-f2edc72486e9"> + <g + id="id-c32c4a99-1d4b-4f96-bc99-03794549d9e8"> + <symbol + overflow="visible" + id="id-85ce1641-a797-41a3-80d6-c31dc5baab30"> + <path + style="stroke:none" + d="" + id="id-05a16e79-fee2-4fcc-a02c-fe91f7bf9dc2" /> + </symbol> + <symbol + overflow="visible" + id="id-28f87cb3-8400-4fe5-bae3-8a97938e3f48"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-661793dd-c022-4f0a-9b05-38a8f25ce49f" /> + </symbol> + </g> + </defs> + <g + id="id-2c7c9baf-4fd8-4d72-a946-9b8bde48793c" + transform="translate(-149.087,-130.249)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-f2a89e2f-db57-484c-b956-cb454c2c249e"> + <g + transform="translate(148.712,134.765)" + id="g4390"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-0b53c534-8c19-4b2e-aa7c-a35279bc41c7" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27296" + transform="translate(97.504076,126.44992)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6" + cx="88.699356" + cy="23.549749" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,87.7489,21.4125)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{t}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1"> + <defs + id="id-aae89ce6-5911-4a24-8e24-a5bfc94528ad"> + <g + id="id-8ecdf416-7420-433d-b232-d25cd2014d41"> + <symbol + overflow="visible" + id="id-6085f62c-e7de-4535-a672-6849904ca7a6"> + <path + style="stroke:none" + d="" + id="id-b555ae83-e10a-4164-a858-16ba75bae1fb" /> + </symbol> + <symbol + overflow="visible" + id="id-0768c856-38ba-4438-9302-d162d012e07e"> + <path + style="stroke:none" + d="m 1.03125,-3.953125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 z m 0,0" + id="id-890ce425-b336-4321-8550-e572f39157c7" /> + </symbol> + </g> + </defs> + <g + id="id-49cd7bfd-c6b1-4faf-9ed9-d007d5869376" + transform="translate(-148.915,-128.437)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-67e3cf82-3212-44a0-9470-ac0443790c56"> + <g + transform="translate(148.712,134.765)" + id="g5514"> + <path + style="stroke:none" + d="m 1.03125,-3.953125 v 2.734375 c 0,1.0625 0.859375,1.28125 1.578125,1.28125 0.75,0 1.203125,-0.578125 1.203125,-1.296875 v -0.53125 H 3.34375 V -1.25 c 0,0.671875 -0.328125,0.90625 -0.609375,0.90625 -0.578125,0 -0.578125,-0.640625 -0.578125,-0.859375 v -2.75 H 3.625 v -0.46875 H 2.15625 v -1.90625 H 1.6875 c 0,1 -0.484375,1.984375 -1.484375,2.015625 v 0.359375 z m 0,0" + id="id-7cd1d6f5-1c23-4ccf-a5f7-cf6b1181294d" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g28418"> + <g + id="g29000" + transform="translate(14.165741,-2.1923528)"> + <g + id="g27840" + transform="translate(0.44265148)"> + <g + id="g26551" + transform="translate(-48.087203,37.470493)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-2-92" + cx="88.840378" + cy="75.725845" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,85.676379,72.17292)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{p}_1^+$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-2-6"> + <defs + id="id-cbff7919-d4b5-4394-ba48-48d13b56c92f-6"> + <g + id="g8083"> + <symbol + overflow="visible" + id="symbol8065"> + <path + style="stroke:none" + d="" + id="path8063" /> + </symbol> + <symbol + overflow="visible" + id="symbol8069"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="path8067" /> + </symbol> + <symbol + overflow="visible" + id="symbol8073"> + <path + style="stroke:none" + d="" + id="path8071" /> + </symbol> + <symbol + overflow="visible" + id="symbol8077"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="path8075" /> + </symbol> + <symbol + overflow="visible" + id="symbol8081"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path8079" /> + </symbol> + </g> + </defs> + <g + id="id-555eaf7c-0241-4a4f-bd71-2c21d29baebe-1" + transform="translate(-149.087,-126.191)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-a72af59c-4bac-4834-aaf7-058eb01357e1-0"> + <g + transform="translate(148.712,134.765)" + id="g7749-6"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-b6cae2af-8878-418c-b019-25bd92521491-15" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e2990b93-d2b9-4670-be91-f0ef68d3dd3d-9"> + <g + transform="translate(155.077,130.503)" + id="g7753-49"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-3b4c96ca-b7a4-44ac-8947-f1231a5944c1-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-658bb807-40cf-4a1e-81af-d1ca8d66f367-9"> + <g + transform="translate(155.077,137.421)" + id="g7757-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3572f7f0-1828-4196-b2a7-2f7f0b732bbf-7" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g26525" + transform="translate(-32.011321,50.83425)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-2" + cx="72.764496" + cy="77.277023" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,69.6395,74.423)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{p}_1^-$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-2"> + <defs + id="id-cc436e79-6d21-4a5d-8360-872182a76ed8"> + <g + id="id-f7896580-d5f5-44b5-8526-74c57a51e963"> + <symbol + overflow="visible" + id="id-72d0a318-ebd4-41a6-8243-cfe5f7021f68"> + <path + style="stroke:none" + d="" + id="id-2736591c-ab1a-48f1-b671-fcf4894e6aad" /> + </symbol> + <symbol + overflow="visible" + id="id-bc8e730a-5028-46b4-8a57-31c0ef87b9f5"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-1d94dd4f-b0fb-4016-8a10-db8000e9bc01" /> + </symbol> + <symbol + overflow="visible" + id="id-eb7ca2e4-d9ed-48e2-8e86-9adebdbb0caa"> + <path + style="stroke:none" + d="" + id="id-4a7e82ed-2d34-47a7-8cd3-93f0b7a95072" /> + </symbol> + <symbol + overflow="visible" + id="id-e962f5f5-c727-4c52-8543-b55b4ae5c87f"> + <path + style="stroke:none" + d="m 5.1875,-1.578125 c 0.109375,0 0.28125,0 0.28125,-0.15625 0,-0.1875 -0.171875,-0.1875 -0.28125,-0.1875 H 1.03125 c -0.109375,0 -0.28125,0 -0.28125,0.171875 0,0.171875 0.15625,0.171875 0.28125,0.171875 z m 0,0" + id="id-2be5b272-3044-4a33-9e29-9d179bd5dce5" /> + </symbol> + <symbol + overflow="visible" + id="id-d67a516a-d3b4-4f8f-9673-2fa8e6de6e36"> + <path + style="stroke:none" + d="" + id="id-a011e2d6-6cd7-40d7-a9a5-b5d61b196f33" /> + </symbol> + <symbol + overflow="visible" + id="id-57f0a5c5-5958-4f1c-95df-8516d9f9e9de"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-40194a35-d743-4167-8b56-e34dc886968b" /> + </symbol> + </g> + </defs> + <g + id="id-d54a5e56-c45b-49da-9d08-d0dda768479c" + transform="translate(-149.087,-128.581)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-b422c3ac-1b12-43f7-8f3a-db2ae4188297"> + <g + transform="translate(148.712,134.765)" + id="g9284"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-fde23558-b7ac-4af3-9e96-b5497023a0e5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-998eda56-ce89-426d-b4f3-da151dddb054"> + <g + transform="translate(155.077,130.503)" + id="g9288"> + <path + style="stroke:none" + d="m 5.1875,-1.578125 c 0.109375,0 0.28125,0 0.28125,-0.15625 0,-0.1875 -0.171875,-0.1875 -0.28125,-0.1875 H 1.03125 c -0.109375,0 -0.28125,0 -0.28125,0.171875 0,0.171875 0.15625,0.171875 0.28125,0.171875 z m 0,0" + id="id-93e7af07-d4e3-4216-8fae-8b5de5d40dff" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0f9adf07-2769-4ec4-a084-94d359631a65"> + <g + transform="translate(155.077,137.421)" + id="g9292"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-82fa32c6-12c3-44d2-9f33-a48890c69d77" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-8" + transform="matrix(0,0.96576732,-0.96576732,0,171.045,41.875233)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-0"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-29" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-6"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-1"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-4"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-22" /> + </g> + </g> + </g> + <g + id="g27894" + transform="translate(-26.938574,38.914846)"> + <g + id="g26497-9" + transform="translate(-4.7711169,20.125469)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-2-9-4" + cx="72.905518" + cy="93.070869" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,69.7415,89.5176)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{p}_2^+$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-2-4-2"> + <defs + id="id-11dc312f-0805-48d3-9d1b-a1a01bfddabd-2"> + <g + id="g27626"> + <symbol + overflow="visible" + id="symbol27608"> + <path + style="stroke:none" + d="" + id="path27606" /> + </symbol> + <symbol + overflow="visible" + id="symbol27612"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="path27610" /> + </symbol> + <symbol + overflow="visible" + id="symbol27616"> + <path + style="stroke:none" + d="" + id="path27614" /> + </symbol> + <symbol + overflow="visible" + id="symbol27620"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="path27618" /> + </symbol> + <symbol + overflow="visible" + id="symbol27624"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="path27622" /> + </symbol> + </g> + </defs> + <g + id="id-feffe247-4099-4d6e-99cd-f50d785976e9-6" + transform="translate(-149.087,-126.191)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-ebe7a007-371a-41bd-b1ae-09e510aa7d3b-8"> + <g + transform="translate(148.712,134.765)" + id="g10486-3"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-68da610c-1fc4-4ae5-9ee0-0f9083e3846e-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-95f86fce-3c44-4736-b9c2-69b022370c73-3"> + <g + transform="translate(155.077,130.503)" + id="g10490-3"> + <path + style="stroke:none" + d="m 3.21875,-1.578125 h 2.140625 c 0.09375,0 0.25,0 0.25,-0.15625 0,-0.1875 -0.15625,-0.1875 -0.25,-0.1875 H 3.21875 V -4.0625 c 0,-0.078125 0,-0.25 -0.15625,-0.25 -0.171875,0 -0.171875,0.15625 -0.171875,0.25 v 2.140625 H 0.75 c -0.09375,0 -0.265625,0 -0.265625,0.171875 0,0.171875 0.15625,0.171875 0.265625,0.171875 H 2.890625 V 0.5625 c 0,0.09375 0,0.265625 0.15625,0.265625 0.171875,0 0.171875,-0.171875 0.171875,-0.265625 z m 0,0" + id="id-f70ee1c6-5f69-4f2e-86f3-2238535e6d6c-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-45ce6d79-6cca-422a-bb80-03cb1f30fa36-8"> + <g + transform="translate(155.077,137.421)" + id="g10494-0"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-372a0257-6671-439b-bfec-29c7490b927b-4" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g26579-7" + transform="translate(-20.705977,36.027518)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-2-93-6" + cx="88.840378" + cy="92.083755" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,85.7154,89.2297)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{p}_2^-$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-2-7-8"> + <defs + id="id-419a2143-5415-4f34-a3da-99e3b97b61cc-9"> + <g + id="g27666"> + <symbol + overflow="visible" + id="symbol27644"> + <path + style="stroke:none" + d="" + id="path27642" /> + </symbol> + <symbol + overflow="visible" + id="symbol27648"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="path27646" /> + </symbol> + <symbol + overflow="visible" + id="symbol27652"> + <path + style="stroke:none" + d="" + id="path27650" /> + </symbol> + <symbol + overflow="visible" + id="symbol27656"> + <path + style="stroke:none" + d="m 5.1875,-1.578125 c 0.109375,0 0.28125,0 0.28125,-0.15625 0,-0.1875 -0.171875,-0.1875 -0.28125,-0.1875 H 1.03125 c -0.109375,0 -0.28125,0 -0.28125,0.171875 0,0.171875 0.15625,0.171875 0.28125,0.171875 z m 0,0" + id="path27654" /> + </symbol> + <symbol + overflow="visible" + id="symbol27660"> + <path + style="stroke:none" + d="" + id="path27658" /> + </symbol> + <symbol + overflow="visible" + id="symbol27664"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="path27662" /> + </symbol> + </g> + </defs> + <g + id="id-22981f9c-7129-4d29-ac71-fe33050ce9d5-5" + transform="translate(-149.087,-128.581)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-955cfe51-1891-42b4-b609-82658f81695e-2"> + <g + transform="translate(148.712,134.765)" + id="g11688-6"> + <path + style="stroke:none" + d="m 2.1875,-3.28125 c 0,-0.1875 0.015625,-0.203125 0.15625,-0.34375 0.390625,-0.40625 0.921875,-0.46875 1.140625,-0.46875 0.65625,0 1.21875,0.609375 1.21875,1.875 0,1.40625 -0.703125,1.921875 -1.34375,1.921875 -0.140625,0 -0.609375,0 -1.0625,-0.546875 C 2.1875,-0.96875 2.1875,-0.984375 2.1875,-1.171875 Z m 0,2.890625 c 0.4375,0.34375 0.875,0.453125 1.28125,0.453125 1.5,0 2.515625,-0.90625 2.515625,-2.28125 0,-1.328125 -0.90625,-2.265625 -2.34375,-2.265625 -0.75,0 -1.28125,0.3125 -1.5,0.484375 V -4.484375 L 0.375,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.375 V 1.46875 H 0.375 V 1.9375 C 0.640625,1.921875 1.25,1.90625 1.625,1.90625 c 0.390625,0 0.984375,0.015625 1.25,0.03125 V 1.46875 H 2.1875 Z m 0,0" + id="id-fb6cff27-25a3-4c4c-a332-5674b274d4da-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-2666335c-fba9-43e3-bd44-c2255b06ab31-8"> + <g + transform="translate(155.077,130.503)" + id="g11692-7"> + <path + style="stroke:none" + d="m 5.1875,-1.578125 c 0.109375,0 0.28125,0 0.28125,-0.15625 0,-0.1875 -0.171875,-0.1875 -0.28125,-0.1875 H 1.03125 c -0.109375,0 -0.28125,0 -0.28125,0.171875 0,0.171875 0.15625,0.171875 0.28125,0.171875 z m 0,0" + id="id-bc7bcd3e-5dcd-4e53-926e-46d5230ae6b6-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b65e27da-76c8-482c-83d9-ddb3240ca129-6"> + <g + transform="translate(155.077,137.421)" + id="g11696-0"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-e50eb5b3-2097-423d-bb46-3fd4794d6db0-4" /> + </g> + </g> + </g> + </g> + </g> + </g> + </g> + <g + id="g28882" + transform="translate(0.02761459,2.2741605)"> + <g + id="g27198" + transform="translate(71.041038,62.848048)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6-2" + cx="71.520828" + cy="42.215851" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,69.019147,40.199105)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{n}_1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1-8"> + <defs + id="id-45914acb-032b-43c0-8ddd-38b2b8e72e9d"> + <g + id="id-00d32c9f-a51c-4240-83bf-259b482dcea1"> + <symbol + overflow="visible" + id="id-5f0025dc-030d-4084-af3b-a9a4663a193c"> + <path + style="stroke:none" + d="" + id="id-df8af8b7-5886-40e5-899f-47e7cf5b8b17" /> + </symbol> + <symbol + overflow="visible" + id="id-cd00f367-5da5-4de6-be52-c7c1883ab922"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-221539ed-1bec-4221-89be-2d4dc66dae8b" /> + </symbol> + <symbol + overflow="visible" + id="id-d0300774-e73b-47c9-9bd5-23f2cd9cfd8e"> + <path + style="stroke:none" + d="" + id="id-0b619acc-2494-4ca6-83a3-a836876d0a09" /> + </symbol> + <symbol + overflow="visible" + id="id-63aaa364-69ff-4be2-bbf2-1ebe3d6600a5"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-44fdab85-d842-4b2b-82ce-7b2e608c47bb" /> + </symbol> + </g> + </defs> + <g + id="id-be1f0151-7451-43cc-bfe9-647862687e9f" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d96c88b2-1cab-47e1-ae80-299a6ef6b8f2"> + <g + transform="translate(148.712,134.765)" + id="g19902"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-bc0d7caf-2778-4642-a548-a6faae4744b5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-6c03ebd3-7519-48eb-b795-e18d50886574"> + <g + transform="translate(155.077,136.259)" + id="g19906"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-c84b09a8-63f6-4fa7-939d-6b09c812f5bc" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27219" + transform="translate(90.642332,85.114141)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6-2-1" + cx="51.919533" + cy="36.998241" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,49.357347,34.981277)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{n}_2$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1-8-0"> + <defs + id="id-51e1d412-5bfa-4632-89f0-b48ad485b5b1"> + <g + id="id-60fe5164-3be3-433a-b56a-1d9a52e3bffc"> + <symbol + overflow="visible" + id="id-c39314af-29bf-4333-8757-9fbf0676c7b7"> + <path + style="stroke:none" + d="" + id="id-c176c63e-3dbd-462c-ae01-78d17f3d1184" /> + </symbol> + <symbol + overflow="visible" + id="id-aad606d6-3c24-4d59-949f-9b99fac1ea03"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-ca0aa8f2-c168-4ce1-9294-323d8ed7633a" /> + </symbol> + <symbol + overflow="visible" + id="id-60075ebc-cbe6-4a81-ad84-0b3b5f3ec421"> + <path + style="stroke:none" + d="" + id="id-ff6b42e9-f25e-4ac6-ba4f-bbbeddf939b7" /> + </symbol> + <symbol + overflow="visible" + id="id-3c4237f6-ad71-4ecd-a7dc-92a2ee1074d6"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-c5c5c25b-a32c-41c5-afd6-fc5df6dc2433" /> + </symbol> + </g> + </defs> + <g + id="id-1ae23398-236e-4189-a33a-cdab5d56e111" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-3733dc23-c0fe-472c-97e9-1256c40960ac"> + <g + transform="translate(148.712,134.765)" + id="g21756"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-7f97ed92-b8d2-4eed-80b4-f07128538896" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-aae71f97-eb1e-4778-91de-50e87fe45e23"> + <g + transform="translate(155.077,136.259)" + id="g21760"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d41f9e61-3c29-426d-9614-9c23f51f4042" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27240" + transform="translate(90.501314,83.830472)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6-2-6" + cx="52.060551" + cy="55.330383" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,49.481047,53.272267)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{n}_3$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1-8-2"> + <defs + id="id-110ae961-4b05-441d-a0bb-28d87ee5fc89"> + <g + id="id-aff5bb63-998c-4e5e-ab3d-8efb11040c2d"> + <symbol + overflow="visible" + id="id-1be7eff2-41dc-44e4-a88f-7cbbd6109bb2"> + <path + style="stroke:none" + d="" + id="id-27187d80-2a7e-4165-af43-e8de998169fc" /> + </symbol> + <symbol + overflow="visible" + id="id-ad4a0718-8961-4b72-86ea-d560142fa3e8"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-05965ada-79f7-4e9b-90d2-00d4024a5cfe" /> + </symbol> + <symbol + overflow="visible" + id="id-51bdd8aa-a682-4abc-a01e-4fb818b5e3da"> + <path + style="stroke:none" + d="" + id="id-fe7837e8-2233-4c61-a92f-f100e1ff6fff" /> + </symbol> + <symbol + overflow="visible" + id="id-f487420a-75a3-4cde-a6be-196da607c53c"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-9da7bd1d-0e69-4a41-9050-52a67a174659" /> + </symbol> + </g> + </defs> + <g + id="id-235262a9-19de-46dd-832d-cc8ed5548361" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-93f279de-884e-428c-9d07-4d71f20b6847"> + <g + transform="translate(148.712,134.765)" + id="g23257"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-ac7f498e-fb71-4eb9-81bf-a4e53b3355ea" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-88c35522-c6db-453c-bb64-6ebaaeede29e"> + <g + transform="translate(155.077,136.259)" + id="g23261"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-2965f1ea-d259-4b06-a204-c05af60f68ad" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27261" + transform="translate(70.617988,101.58403)" + inkscape:transform-center-x="31.462444" + inkscape:transform-center-y="-39.124011"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6-2-3" + cx="71.943878" + cy="54.625301" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,69.333947,52.608367)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{n}_4$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1-8-3"> + <defs + id="id-bdd040f6-8d63-4a5f-9831-e2068ca29838"> + <g + id="id-cd602e19-e307-4934-9bf6-688302bef207"> + <symbol + overflow="visible" + id="id-7e3eb14d-ddac-4fa3-b49b-5b23808e6d11"> + <path + style="stroke:none" + d="" + id="id-26dd23b8-40e3-473a-9482-9af887c63f39" /> + </symbol> + <symbol + overflow="visible" + id="id-6c92e5a4-681b-4478-8a6e-1aa65babdef9"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-314cadac-24dd-4bfc-aa58-eda03ad91536" /> + </symbol> + <symbol + overflow="visible" + id="id-cb937a67-ffbc-45a4-8f15-68c6c2f50410"> + <path + style="stroke:none" + d="" + id="id-1ff7268a-6274-4630-9dd1-17bcef99942a" /> + </symbol> + <symbol + overflow="visible" + id="id-789237d4-74db-4d8d-9bf4-25894a7f99c0"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-a03236c6-c587-49f4-8ea9-830382d3c730" /> + </symbol> + </g> + </defs> + <g + id="id-46adb2c6-8b7f-48da-b88b-f683e7c0f4ac" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1d3d6b1e-c406-4398-9d84-a0daadb4ec05"> + <g + transform="translate(148.712,134.765)" + id="g24758"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-dda84927-c29c-4726-81be-694dd23af394" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-388bb5e8-6daf-4c39-88d6-aff509f27241"> + <g + transform="translate(155.077,136.259)" + id="g24762"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-fd433ea1-eff7-4101-b171-e84bf6949b8d" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27282" + transform="translate(86.834885,106.92813)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-3-6-2-60" + cx="55.726978" + cy="66.329666" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,53.164847,64.271567)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{n}_5$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-6-1-8-27"> + <defs + id="id-2daf03c9-c51e-4488-bd2a-c98f2432e115"> + <g + id="id-b478188a-876f-49bd-b98e-6895f4efc723"> + <symbol + overflow="visible" + id="id-68dbef6e-830b-4d56-8e2f-1f0a7753f80a"> + <path + style="stroke:none" + d="" + id="id-50bf5820-460d-4c1e-bd50-603ee4a921b0" /> + </symbol> + <symbol + overflow="visible" + id="id-0faba2fa-a520-45cb-a3cd-dba5db952691"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-864b1b7f-f9d0-4a31-a581-6a01cc8d66c7" /> + </symbol> + <symbol + overflow="visible" + id="id-5007b378-8f66-403c-a44a-60f2c28139da"> + <path + style="stroke:none" + d="" + id="id-fadf5266-8a39-4d4a-87cf-fe9e10947c15" /> + </symbol> + <symbol + overflow="visible" + id="id-b35389b7-05ed-4d09-b918-c800c21a236f"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-991a11f4-1697-4677-ac30-cb50ebd29149" /> + </symbol> + </g> + </defs> + <g + id="id-38730de9-b460-4b61-90b5-4671c831bb14" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-020157b9-9609-47cb-80d5-ecd64d306e7e"> + <g + transform="translate(148.712,134.765)" + id="g26259"> + <path + style="stroke:none" + d="m 1.140625,-3.546875 v 3.078125 h -0.6875 V 0 c 0.28125,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 v -0.46875 h -0.6875 v -2.078125 c 0,-1.09375 0.859375,-1.578125 1.5,-1.578125 0.328125,0 0.546875,0.203125 0.546875,0.96875 v 2.6875 H 3.625 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.25,-0.03125 0.390625,0 0.984375,0.015625 1.25,0.03125 V -0.46875 H 5.4375 v -2.578125 c 0,-1.046875 -0.53125,-1.4375 -1.53125,-1.4375 -0.953125,0 -1.484375,0.5625 -1.75,1.078125 V -4.484375 L 0.453125,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 z m 0,0" + id="id-07f3eaa9-4d87-4cbe-a579-3b8705b29a55" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-313a52af-f738-4fb4-926a-dd7797bdde1b"> + <g + transform="translate(155.077,136.259)" + id="g26263"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-2120d8a4-f44f-4d71-b4d5-4096e01ddf3e" /> + </g> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-8-7" + transform="matrix(0,0.96576732,-0.96576732,0,271.77993,41.074646)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-0-9"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-4-3"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-29-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-6-2"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-1-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-0-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-4-0"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-2-1"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-22-7" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g28614" + transform="translate(21.871283,-1.3436526)"> + <g + id="g28244" + transform="translate(-26.61125,47.552324)"> + <g + id="g28058" + transform="translate(-6.3702406,-11.121029)"> + <g + id="g27177" + transform="matrix(1.4900032,0,0,1.4900032,-136.83736,-23.879228)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.280019;stop-color:#000000" + id="path833-9-6-6-7-4" + cx="165.71983" + cy="102.00683" + r="3.0310459" /> + <g + transform="matrix(0.231666,0,0,0.244577,163.09695,100.93597)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{p_2,z_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="0.6747439928928148" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.2380339792592646" + id="g866-26-1-2-1-8"> + <defs + id="id-6bb3ead9-cd6c-469c-afff-26f679272086"> + <g + id="id-908df72f-de8b-4f86-b543-0e9588cf71ea"> + <symbol + overflow="visible" + id="id-7a1b501f-af2a-4dbe-9b31-c0748f2a648e"> + <path + style="stroke:none" + d="" + id="id-67261c9d-77e9-4807-af69-99ebd8af83aa" /> + </symbol> + <symbol + overflow="visible" + id="id-df1b178e-9d15-4042-ac82-9f6b974bec47"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-16e0cdf6-7bb7-4fe4-a149-4671b2166f31" /> + </symbol> + <symbol + overflow="visible" + id="id-a1f1af77-8d82-465e-aefd-cd89e83d83d8"> + <path + style="stroke:none" + d="" + id="id-482aea71-3488-4c6e-88b4-d8c20b820a44" /> + </symbol> + <symbol + overflow="visible" + id="id-4cced342-06dd-456d-be37-7eb6a6de41ef"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-e3681581-c4bb-4148-8ef9-ccd2bf3dbb6f" /> + </symbol> + <symbol + overflow="visible" + id="id-cd9ebb03-4b32-4b3b-b360-f4c2842e2688"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-a71f8592-e5e6-4018-b4cb-349e953753e3" /> + </symbol> + <symbol + overflow="visible" + id="id-f22938a5-337e-4b8a-934c-d50ed9388598"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-5417b346-edf6-4199-a9cb-c98c61d0b122" /> + </symbol> + <symbol + overflow="visible" + id="id-baa3f21e-be5c-407a-a3df-ec784cc81812"> + <path + style="stroke:none" + d="" + id="id-a0cd3ff5-47d7-457b-850c-ae65445c76e0" /> + </symbol> + <symbol + overflow="visible" + id="id-58b44953-0b1e-4458-959b-8e58fc88f03e"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-344c40c8-bc3d-4556-acaa-163f06cd8f17" /> + </symbol> + </g> + </defs> + <g + id="id-0a35047f-44d6-4acc-8f7a-8f255890a07a" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-831f7fb0-6d9c-4aac-9309-422b1d4479b1"> + <g + transform="translate(148.712,134.765)" + id="g16813"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-6d043273-cc0e-461e-9f0b-14afd25b1249" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-a75e980b-0906-412d-8ac5-44a93cf62ca0"> + <g + transform="translate(154.759,136.259)" + id="g16817"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-69d1322a-b039-4dc5-9376-5a91c6d32ebb" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b5e9a90-a427-4ce2-912f-288e915bcedf"> + <g + transform="translate(158.866,137.255)" + id="g16821"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-b771975e-cd6c-4ec8-a2cc-2a0fe5f497d1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0fd35d3b-e27d-4b06-bc87-20229c8236c8"> + <g + transform="translate(162.754,136.259)" + id="g16825"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-881a57b4-5bb4-46b0-89e2-645ce3a85aaf" /> + </g> + <g + transform="translate(165.12,136.259)" + id="g16828"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-b43407c6-1f55-4457-a191-69076e104b54" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-257ec4eb-40c2-4cb2-9039-16c401cfd241"> + <g + transform="translate(168.927,137.255)" + id="g16832"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-704431a3-12c5-4ae1-a67e-231df6890ce4" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27095" + transform="matrix(1.4900032,0,0,1.4900032,-78.845606,-49.089805)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.280019;stop-color:#000000" + id="path833-9-6-6-7-4-3" + cx="126.79928" + cy="108.91664" + r="3.0310459" /> + <g + transform="matrix(0.231666,0,0,0.244577,124.19595,107.84577)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{p_2,z_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="0.6747439928928148" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.2380339792592646" + id="g866-26-1-2-1-8-3"> + <defs + id="id-27a3932f-c54e-41ce-9f99-dc9c6ccaebe2"> + <g + id="id-e53b5bdc-3c1f-4e8b-b820-301ab026db7a"> + <symbol + overflow="visible" + id="id-98159872-7f01-4ce6-851a-6f3733cd71cd"> + <path + style="stroke:none" + d="" + id="id-d15731a5-f68e-432f-babf-adc7869fcc85" /> + </symbol> + <symbol + overflow="visible" + id="id-9c5fe564-3af7-42ca-a946-365142d98464"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-ed55e7a8-6e9a-4e0d-8d92-9350106c0715" /> + </symbol> + <symbol + overflow="visible" + id="id-1305386c-b867-40ed-974b-65843b730256"> + <path + style="stroke:none" + d="" + id="id-ac488bf6-1937-4799-855f-9c8ce350519f" /> + </symbol> + <symbol + overflow="visible" + id="id-9e4e0c21-7ce5-4706-a986-af8e83e05a50"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-fb52b0da-2654-4621-a73e-d5e5dab95d6c" /> + </symbol> + <symbol + overflow="visible" + id="id-b8e623a3-c6ed-40d3-9777-65903f9c2e5d"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-b3c486bc-657c-403e-b5b3-b7eb76aaa4ac" /> + </symbol> + <symbol + overflow="visible" + id="id-cb10adbd-4487-4959-8aa7-e7b6d7a3a4ca"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-c50052a6-b2f3-4305-bc28-402f90765124" /> + </symbol> + <symbol + overflow="visible" + id="id-45a108eb-9e0c-4646-85e5-bcf4e6670f19"> + <path + style="stroke:none" + d="" + id="id-5c7ce7a6-0865-47e3-b37d-5f63c05d7b8a" /> + </symbol> + <symbol + overflow="visible" + id="id-3331477a-a7c0-489d-a742-c1afc0a8c519"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c2bea3d0-dfaf-437a-b60a-026cefd7160d" /> + </symbol> + <symbol + overflow="visible" + id="id-e72f95ad-cb60-425c-8d74-6f88b8b5297b"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-00131303-28bf-4d82-899b-c8a64959e991" /> + </symbol> + </g> + </defs> + <g + id="id-162413c7-9d8d-4cf1-afd4-b2ce178ff5e9" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c3517f41-de2f-44a0-a47f-f672739b3898"> + <g + transform="translate(148.712,134.765)" + id="g18403"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-a57a897a-9dfb-4c7f-b58e-49fca5b9a427" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-89b7546f-22db-49aa-be07-446713573ba7"> + <g + transform="translate(154.759,136.259)" + id="g18407"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-73c2cfa4-a25c-4ef4-ba87-ca908ba83be8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-83027bb8-9821-407c-8165-34cf67f14153"> + <g + transform="translate(158.866,137.255)" + id="g18411"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-63d251b1-dc82-4804-a58f-c90428a0e075" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e2cb03da-7216-4b10-9a96-4da7739e68a2"> + <g + transform="translate(162.754,136.259)" + id="g18415"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-6013bb53-cd42-440b-b039-08a7c5ff9137" /> + </g> + <g + transform="translate(165.12,136.259)" + id="g18418"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-b05524b7-bfaa-403f-83d5-2c94df92ba2d" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-d0a26a9d-651d-4ba4-891e-1afd6a5f7fc0"> + <g + transform="translate(168.927,137.255)" + id="g18422"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-aa00fc60-7143-48e5-a2d2-c395683f4ae1" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-0" + transform="matrix(0,0.569333,-0.569333,0,180.13919,39.692814)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-5"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-290" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-2"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-8"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-04"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-0" /> + </g> + </g> + </g> + </g> + <g + id="g28151" + transform="translate(-6.2632879,5.7011351)"> + <g + id="g27976" + transform="translate(-11.60293,-11.121029)"> + <g + id="g27053" + transform="matrix(1.4900032,0,0,1.4900032,-84.679622,-37.241249)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.280019;stop-color:#000000" + id="path833-9-6-6" + cx="120.57026" + cy="100.96461" + r="3.0310459" /> + <g + transform="matrix(0.23166559,0,0,0.24457726,117.96773,99.893767)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{p_1,z_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="0.5954852130115595" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.21007325185277634" + id="g866-26-1-2"> + <defs + id="id-b3fb168d-1b8c-4896-9470-aed341c3026a"> + <g + id="id-a01347b0-90cd-4ec9-887d-e01c8629d928"> + <symbol + overflow="visible" + id="id-e2096ad2-356a-479f-a2f9-5925f4afcaa1"> + <path + style="stroke:none" + d="" + id="id-7837e5a9-dcac-457d-90f5-19f20ee9dd8a" /> + </symbol> + <symbol + overflow="visible" + id="id-2f5bd605-362a-4503-ba8c-87e200e07c06"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-81206ab1-a3a5-46da-ba36-7c8c717e72e6" /> + </symbol> + <symbol + overflow="visible" + id="id-5e0f6526-c13a-40e8-91b2-49ba2188873f"> + <path + style="stroke:none" + d="" + id="id-3ee9a253-0b22-457c-bb8d-4226261beb62" /> + </symbol> + <symbol + overflow="visible" + id="id-24a2d54f-2c8f-44c8-8f23-2cf5b8a6b3c5"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-ff486641-3d0d-487c-8dc8-f94a741f33a6" /> + </symbol> + <symbol + overflow="visible" + id="id-1d38454e-e7de-4727-b847-a1bd5002ba1c"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-1f75dab9-f01f-4b70-ad77-0266aa16464b" /> + </symbol> + <symbol + overflow="visible" + id="id-385e44bb-6401-4a80-a1d1-c074bfab2b38"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-4092b46c-8929-491f-9ddc-bf3b5005c174" /> + </symbol> + <symbol + overflow="visible" + id="id-28fbc256-4cf8-4e21-862e-a17885055d04"> + <path + style="stroke:none" + d="" + id="id-ccd5aec0-565c-4e9c-9d74-c102587e659c" /> + </symbol> + <symbol + overflow="visible" + id="id-a7e0e44a-c9e9-4406-bf0f-6e553e16582e"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92de082a-00d6-413f-8025-89281d3ce1e8" /> + </symbol> + </g> + </defs> + <g + id="id-02466583-a73b-45db-88a3-b2f309d65223" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-b77590cd-8bb6-4e9b-a9e9-43e2d4512f6c"> + <g + transform="translate(148.712,134.765)" + id="g13742"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d993cba8-29d8-46ad-ae22-b50c82fa33bf" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-dbe35584-1fc4-4028-aac8-6a3b16bacd1c"> + <g + transform="translate(154.759,136.259)" + id="g13746"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-ab2422b4-af17-4ec6-860b-a60bbeb54267" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-187ba614-4d81-4901-8ff9-b5a39917b63e"> + <g + transform="translate(158.866,137.255)" + id="g13750"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-9798eacf-653e-47b2-9812-318c566cb1fc" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f7fb31c4-44da-4e9b-a759-b0f5326d3802"> + <g + transform="translate(162.754,136.259)" + id="g13754"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-a830757a-e380-4cda-b37c-9a64027f51bf" /> + </g> + <g + transform="translate(165.12,136.259)" + id="g13757"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-dd3d1bf3-9bbd-49a0-bbe2-ca431d43b77a" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-992f9d25-4a01-4d6b-b189-46b09afcf3ab"> + <g + transform="translate(168.927,137.255)" + id="g13761"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-50883ac2-dba6-4261-96b5-dd09f4d93028" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g27137" + transform="matrix(1.4900032,0,0,1.4900032,-124.21744,-20.72751)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.280019;stop-color:#000000" + id="path833-9-6-6-7" + cx="147.10565" + cy="99.891586" + r="3.0310459" /> + <g + transform="matrix(0.231666,0,0,0.244577,144.48295,98.820767)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{p_1,z_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="0.6747439928928148" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.2380339792592646" + id="g866-26-1-2-1"> + <defs + id="id-7a78ca20-af1b-4c5e-ba5f-5b76430e2c48"> + <g + id="id-f5eba645-3f13-4a42-aaa6-05aa2197ffd9"> + <symbol + overflow="visible" + id="id-97ebea65-8696-4324-b4a9-ea64fea52451"> + <path + style="stroke:none" + d="" + id="id-29c62201-07d3-4d0e-9015-fc3b613afc04" /> + </symbol> + <symbol + overflow="visible" + id="id-c951b5d4-ec77-491f-8a28-531b7b771e7d"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-60f43291-5366-4a80-91e5-189861a482cc" /> + </symbol> + <symbol + overflow="visible" + id="id-9aeda8b7-4c1d-427b-81ca-afcaeb0b8c3a"> + <path + style="stroke:none" + d="" + id="id-55936e21-63a5-4ee4-bbcc-96e27570a9b1" /> + </symbol> + <symbol + overflow="visible" + id="id-f63fe2fd-13ba-4d8b-b4f3-b465c699579c"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-141e3032-0ae9-4a99-8a5e-d512025e8347" /> + </symbol> + <symbol + overflow="visible" + id="id-be5efca8-361b-4cf3-9be4-6787c3e88072"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-c9cb8af7-555f-4c51-a4fc-cc8a8cdc9a6b" /> + </symbol> + <symbol + overflow="visible" + id="id-045ed82c-5de9-42f0-a258-77adfaab19a4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-a26948c5-8f06-47e7-a1c5-3884ed945a29" /> + </symbol> + <symbol + overflow="visible" + id="id-71580648-a504-4160-a6ce-e1cb5c34587e"> + <path + style="stroke:none" + d="" + id="id-854a77bf-ed57-4290-b614-9eaa9f1904b5" /> + </symbol> + <symbol + overflow="visible" + id="id-f5c4f8e1-2994-46fe-a65b-0490dea016e9"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-e00a1bcc-3781-4b53-86ae-955bf2cf45cf" /> + </symbol> + <symbol + overflow="visible" + id="id-855ee492-4f24-4765-a992-322badd0d0ce"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-20b0356c-0ed5-4b90-b1e6-80112b710712" /> + </symbol> + </g> + </defs> + <g + id="id-08e1a23c-ed07-45f4-8f1a-e5bf8cf2ae4a" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-26f6dbc6-fe38-4197-8a1b-4e8335d53043"> + <g + transform="translate(148.712,134.765)" + id="g15266"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-ca119fa4-cd61-4432-8e59-91cc415f4d76" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-5c645b54-a853-4e56-b608-12eca7fb31a1"> + <g + transform="translate(154.759,136.259)" + id="g15270"> + <path + style="stroke:none" + d="m 0.515625,0.84375 c -0.046875,0.203125 -0.0625,0.25 -0.328125,0.25 -0.09375,0 -0.1875,0 -0.1875,0.15625 0,0.078125 0.0625,0.109375 0.09375,0.109375 0.171875,0 0.40625,-0.03125 0.59375,-0.03125 0.234375,0 0.5,0.03125 0.734375,0.03125 0.0625,0 0.140625,-0.03125 0.140625,-0.15625 0,-0.109375 -0.09375,-0.109375 -0.1875,-0.109375 -0.15625,0 -0.34375,0 -0.34375,-0.078125 0,-0.03125 0.0625,-0.21875 0.078125,-0.3125 0.09375,-0.375 0.1875,-0.75 0.265625,-1.046875 0.078125,0.140625 0.296875,0.40625 0.71875,0.40625 0.84375,0 1.78125,-0.9375 1.78125,-1.96875 0,-0.8125 -0.5625,-1.171875 -1.03125,-1.171875 -0.4375,0 -0.8125,0.296875 -1,0.5 -0.109375,-0.40625 -0.5,-0.5 -0.71875,-0.5 -0.265625,0 -0.4375,0.1875 -0.546875,0.375 -0.140625,0.234375 -0.25,0.65625 -0.25,0.703125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.015625 0.140625,-0.203125 0.109375,-0.40625 0.25,-0.75 0.515625,-0.75 0.1875,0 0.234375,0.15625 0.234375,0.34375 0,0.078125 -0.015625,0.15625 -0.03125,0.203125 z M 1.84375,-2.234375 C 2.25,-2.78125 2.59375,-2.875 2.8125,-2.875 c 0.28125,0 0.515625,0.203125 0.515625,0.671875 0,0.28125 -0.15625,1 -0.359375,1.40625 -0.1875,0.34375 -0.515625,0.671875 -0.875,0.671875 -0.5,0 -0.625,-0.53125 -0.625,-0.609375 0,-0.03125 0.015625,-0.078125 0.015625,-0.109375 z m 0,0" + id="id-01089a11-5664-4955-9cdc-8cce84f02556" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b9301779-edfa-4884-ab29-80d9485c8345"> + <g + transform="translate(158.866,137.255)" + id="g15274"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-aac2ff88-4842-4eb2-a043-b49187211dea" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-683056a8-25ea-43ac-8abb-87507d0164eb"> + <g + transform="translate(162.754,136.259)" + id="g15278"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-55495a28-c2ef-47ab-b47c-875c30fe9b10" /> + </g> + <g + transform="translate(165.12,136.259)" + id="g15281"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-23379bdf-22c4-43d9-91eb-5f7ed839bbd8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7c9ddda4-4445-4233-a8fc-e51b40a7fcb2"> + <g + transform="translate(168.927,137.255)" + id="g15285"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-f71de9cf-41e1-4f0e-993a-d9dfc5a1d202" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-91" + transform="matrix(0,0.569333,-0.569333,0,159.79122,39.692814)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-9"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-25" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-4"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-93"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-05" /> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-8-1" + transform="matrix(0,0.96576732,-0.96576732,0,206.7428,45.622967)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-0-0"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-4-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-29-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-6-7"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-1-0"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-0-8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-4-6"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-2-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-22-4" /> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/doc/optimal_layout_report/figures/mini_node.pdf b/doc/optimal_layout_report/figures/mini_node.pdf Binary files differnew file mode 100644 index 00000000..6df8a5b2 --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_node.pdf diff --git a/doc/optimal_layout_report/figures/mini_node.svg b/doc/optimal_layout_report/figures/mini_node.svg new file mode 100644 index 00000000..b044b0cd --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_node.svg @@ -0,0 +1,3962 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:ns3="http://www.iki.fi/pav/software/textext/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + viewBox="0 0 210 297" + version="1.1" + id="svg8" + sodipodi:docname="mini_node.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="marker29335" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29333" /> + </marker> + <marker + style="overflow:visible" + id="marker29325" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29323" /> + </marker> + <marker + style="overflow:visible" + id="marker29315" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29313" /> + </marker> + <marker + style="overflow:visible" + id="marker29025" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotM" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path29023" /> + </marker> + <marker + inkscape:stockid="DistanceStart" + orient="auto" + refY="0.0" + refX="0.0" + id="marker28638" + style="overflow:visible" + inkscape:isstock="true"> + <g + id="g28636" + style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"> + <path + id="path28630" + d="M 0,0 L 2,0" + style="fill:#000000;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28632" + d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z " + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28634" + d="M 0,-4 L 0,40" + style="fill:#000000;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + </g> + </marker> + <marker + inkscape:stockid="DistanceStart" + orient="auto" + refY="0.0" + refX="0.0" + id="marker28613" + style="overflow:visible" + inkscape:isstock="true"> + <g + id="g28611" + style="stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1"> + <path + id="path28605" + d="M 0,0 L 2,0" + style="fill:#000000;stroke:#000000;stroke-width:1.15;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28607" + d="M 0,0 L 13,4 L 9,0 13,-4 L 0,0 z " + style="fill:#000000;fill-rule:evenodd;stroke:#000000;stroke-opacity:1;fill-opacity:1" /> + <path + id="path28609" + d="M 0,-4 L 0,40" + style="fill:#000000;stroke:#000000;stroke-width:1;stroke-linecap:square;stroke-opacity:1;fill-opacity:1" /> + </g> + </marker> + <marker + style="overflow:visible;" + id="marker5128" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5126" /> + </marker> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-5"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-6"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-2" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-7" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-9" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-3"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-6" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-5"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-9"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-2" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-2"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-8" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-3"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-4"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-7" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-8"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-1"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-0" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-9"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-37"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-5"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-25" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-30"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-7" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-8"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-68" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-4"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-50" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-48"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-71" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-2" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-2"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-61" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-0"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-61" /> + </symbol> + </g> + <g + id="id-f665f0ad-6acc-4c65-818f-65538ae870ec-7"> + <symbol + overflow="visible" + id="id-b528872c-9c37-40cc-8f3c-4a3820527247-7"> + <path + style="stroke:none" + d="" + id="id-b9b64af8-af4d-498f-81ae-f2cb3b370123-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d0bf1643-b2f5-444d-a657-4aaefc6c89d4-7"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-311ed8ac-5c86-4922-8ddd-c8730c4eb1f1-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1911bbd6-3c25-4e44-b82f-6e209a9efbf4-6"> + <path + style="stroke:none" + d="" + id="id-ad0a7a76-9842-4d63-89a8-c9c17aa71c17-5" /> + </symbol> + <symbol + overflow="visible" + id="id-756b752a-2988-4d30-9ec2-f35e31955def-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3ec43921-ba3b-4f7d-b817-b8c615e98630-3" /> + </symbol> + </g> + <g + id="id-f98b961b-31b5-4c0f-bfb1-2760408a739a-8"> + <symbol + overflow="visible" + id="id-4737c041-b95c-4219-8e7e-c562852710ea-5"> + <path + style="stroke:none" + d="" + id="id-c55a79d7-b066-4a99-ae31-2b04d4c628d0-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80361aa1-942d-4c7e-b9e6-0b746bab4670-9"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-46772014-ff2f-4c4f-bd9c-546c16e45ebe-6" /> + </symbol> + <symbol + overflow="visible" + id="id-8dac91f2-ce64-4971-ad7d-d446cd8c9c1c-3"> + <path + style="stroke:none" + d="" + id="id-604b9e94-17f8-4699-8fca-83a7170f9ad1-8" /> + </symbol> + <symbol + overflow="visible" + id="id-7656f371-933a-4b40-8c22-717f88b408ac-5"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-99006318-9528-4ad3-a74f-c639da460421-6" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-3"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-4" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-8"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-5"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-7" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-4"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-1" /> + </symbol> + </g> + <g + id="id-e9cdbc45-842a-4299-856a-e73e8a96598a-8"> + <symbol + overflow="visible" + id="id-4c9afea4-0492-4e68-ad02-526d968a9dda-8"> + <path + style="stroke:none" + d="" + id="id-022447e8-2b8e-45a6-9421-6bb9cee18fb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-eb4351ed-2b75-4189-9149-06b49bb09d39-1"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-9793d5ee-1e50-443d-8e24-59e74686be5c-8" /> + </symbol> + <symbol + overflow="visible" + id="id-acdb85cf-666d-461d-bcc6-3145d4b5a194-9"> + <path + style="stroke:none" + d="" + id="id-974496ba-fe40-4bde-9d6c-97d29282be67-6" /> + </symbol> + <symbol + overflow="visible" + id="id-a9937435-0508-4c68-9850-f26d0b685df1-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-9c0b6904-6368-4d8f-ad75-244ef0a02a48-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4dbc287f-4992-4820-8c67-423900ff8378-3"> + <path + style="stroke:none" + d="" + id="id-d9c1862f-dbd4-4f66-9f79-92002bb14eb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-7933b5d5-7f25-482f-b30b-4ba167fd355d-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7f05503e-8203-4760-910b-5af86e2658b9-6" /> + </symbol> + </g> + <g + id="id-eea55ade-e2c2-48c1-a3f1-d65d7b23c75c-3"> + <symbol + overflow="visible" + id="id-702cf98a-7855-4a56-b3b9-be3e9c89e5eb-0"> + <path + style="stroke:none" + d="" + id="id-3d08f3b9-fc2d-4c8b-a693-2f069085b4c8-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4db591ab-5b31-4921-a71b-d732a9a3a154-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-fb3ea09c-6864-4691-95b5-1c3c652a23e5-5" /> + </symbol> + <symbol + overflow="visible" + id="id-a45ec7ed-aed1-44f6-87e2-879d7497660b-4"> + <path + style="stroke:none" + d="" + id="id-7b47d29b-e6d8-48a4-b8b1-d1b172f6aa82-0" /> + </symbol> + <symbol + overflow="visible" + id="id-b6a5b321-fb81-4c79-8c77-e89277728de4-5"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c892cf5-670f-4af9-9c88-c02621bf8637-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ad80f9d7-8845-4991-af60-575fc64207c6-4"> + <path + style="stroke:none" + d="" + id="id-62aa46d3-6905-4658-9610-06a86458f6eb-6" /> + </symbol> + <symbol + overflow="visible" + id="id-25df116e-62f9-4a97-a0aa-f3214438cb8a-9"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c94b97b0-0e4d-4d84-8e0b-6baff1ddbc84-2" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-6"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-8"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-0" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-1" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-0"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-5" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-0"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-8" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-5"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-0" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-4"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-0"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-6" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-29"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-9" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-08"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-11" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-03"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-3" /> + </symbol> + </g> + <g + id="id-3a24776d-bc3a-4985-8b28-ce4db2a93534-6"> + <symbol + overflow="visible" + id="id-600184e5-ac31-4222-b7ac-c96016dc366e-2"> + <path + style="stroke:none" + d="" + id="id-b7300ca4-41d0-48a7-a3fc-3384bcd315e5-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4a311171-3d88-48c1-a768-920db7a376f3-1"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-5d0de5d4-3de1-4182-916c-5c15cb8a379b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-576666de-5b44-48e6-9102-7af5342bec6c-7"> + <path + style="stroke:none" + d="" + id="id-0e138fba-e636-4a6e-9029-bed27c4c236d-0" /> + </symbol> + <symbol + overflow="visible" + id="id-5c29be59-448a-4add-8ecc-e56873e1ddfc-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-6ac25928-d877-42ea-8378-021164984a12-3" /> + </symbol> + <symbol + overflow="visible" + id="id-2e32c15b-8346-4486-99eb-6ed6ac946f95-6"> + <path + style="stroke:none" + d="" + id="id-e410f52f-63d2-4f94-9516-ca72f51d8167-0" /> + </symbol> + <symbol + overflow="visible" + id="id-6fde21de-66ce-4992-8ea8-55bfd138b407-6"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-a1d7aab6-721b-4b77-952a-736ac7a8cd57-2" /> + </symbol> + </g> + <g + id="id-867ce786-433a-4da2-985c-f4cd6863ba62-8"> + <symbol + overflow="visible" + id="id-122aceff-8d13-469a-b644-0d6fd18cd894-9"> + <path + style="stroke:none" + d="" + id="id-2cd1b095-e373-4c3f-a0aa-744195118e83-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c8aaab59-3861-421a-b529-5baf8e5e105a-3"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-87b88ba1-7415-4d4b-b760-06d0f7266a0e-6" /> + </symbol> + <symbol + overflow="visible" + id="id-1aa2c0b5-6103-4aa2-9d79-186256e46b98-1"> + <path + style="stroke:none" + d="" + id="id-5b56f2fc-39dd-4f93-a95e-522f63446f1d-2" /> + </symbol> + <symbol + overflow="visible" + id="id-94706a17-f2b8-4015-86aa-c8b784d104c0-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-8b337c95-3244-40d9-acd0-15e8cf49b85d-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4b1b0546-799b-4ba0-b279-6150411621c0-1"> + <path + style="stroke:none" + d="" + id="id-76817e90-5713-4d7a-8eea-1d9bc905ce1c-9" /> + </symbol> + <symbol + overflow="visible" + id="id-8c7eaeb2-7288-4b4e-9783-6b0d54556574-4"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-96737164-dbb3-4a15-a741-8519aff719ee-7" /> + </symbol> + </g> + <g + id="id-191a8d0d-801e-4c83-808c-0c3b14a8656f-5"> + <symbol + overflow="visible" + id="id-d2dbfc85-2301-46fd-9709-ae722299c440-4"> + <path + style="stroke:none" + d="" + id="id-bd2b6b64-d0bb-4bfd-9ee5-aa0162ccd436-7" /> + </symbol> + <symbol + overflow="visible" + id="id-8f6eda09-66ab-48f3-bdc5-3268f9982c5c-6"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-c26027ed-aa0b-445f-8a04-0b1d8586f076-5" /> + </symbol> + <symbol + overflow="visible" + id="id-e82a7900-b849-40c5-9d84-f91ba760191e-6"> + <path + style="stroke:none" + d="" + id="id-bdef97d3-91b2-431e-bcba-cd1dde53c3fd-9" /> + </symbol> + <symbol + overflow="visible" + id="id-96bf7acc-5861-4f0a-a6b4-5070340b1159-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-306b6f47-5f0b-477a-bc27-8fd1d14b7fd4-7" /> + </symbol> + <symbol + overflow="visible" + id="id-d6f36ceb-a70c-418b-b2f8-e2c8897f2e1f-4"> + <path + style="stroke:none" + d="" + id="id-d1c9ac07-f16e-48d4-9e4b-fcdc563bd700-5" /> + </symbol> + <symbol + overflow="visible" + id="id-6bdd5aca-01cb-4249-abb6-586c8fc56b95-2"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-bd1f25a0-c96b-4dcb-a3ff-50d4a65385e0-5" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-31"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-0" /> + </symbol> + </g> + <g + id="id-f71ea667-3b4d-4d21-ad1f-0ecb1dd3e484-2"> + <symbol + overflow="visible" + id="id-34dc3a3d-2276-4043-8291-b700fbc2dff1-7"> + <path + style="stroke:none" + d="" + id="id-9cccc023-3ff4-416e-878b-ddafd3dd0fcd-2" /> + </symbol> + <symbol + overflow="visible" + id="id-9bd60f18-4c4d-4ddd-b181-16f7a2d92fbc-2"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d86d8910-8168-40a7-ac81-0c33df86ab0e-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d9fa921e-ba7e-461c-9b85-204169b0b876-1"> + <path + style="stroke:none" + d="" + id="id-513ff48d-b30f-41d2-a80a-6d4ac5c4bdf2-0" /> + </symbol> + <symbol + overflow="visible" + id="id-ba38b8ec-61ee-49f7-aa7b-b60f1f54849e-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-99aee4ff-3e86-462c-8595-98407ac2efa0-1" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="marker4270-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-5" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-7" /> + </marker> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-6"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-5"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-6" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-3"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-9" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="marker4270-7-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-9" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-1-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-5-3" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-7-8" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-7-5" /> + </marker> + <g + id="g9297-9"> + <symbol + overflow="visible" + id="symbol9283-8"> + <path + style="stroke:none" + d="" + id="path9281-4" /> + </symbol> + <symbol + overflow="visible" + id="symbol9287-8"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="path9285-1" /> + </symbol> + <symbol + overflow="visible" + id="symbol9291-0"> + <path + style="stroke:none" + d="" + id="path9289-3" /> + </symbol> + <symbol + overflow="visible" + id="symbol9295-0"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path9293-4" /> + </symbol> + </g> + <g + id="id-8b1176ff-fed7-4d1f-a95d-2f901e2aa6da-8"> + <symbol + overflow="visible" + id="id-50ca6f89-1cf3-46ce-b624-794728268749-5"> + <path + style="stroke:none" + d="" + id="id-3007ebfc-2e24-4566-9ce5-f9269724a7af-7" /> + </symbol> + <symbol + overflow="visible" + id="id-0f52c0e5-e7bb-4649-867b-67f9ffd54d5c-4"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-e0a286b4-1895-4457-9d47-fdd1ee2aef8e-1" /> + </symbol> + <symbol + overflow="visible" + id="id-f33a0be7-00c4-4c53-9793-ea8e553e3b04-8"> + <path + style="stroke:none" + d="" + id="id-8d37aeb7-f373-42df-8441-9e8e63c73fea-5" /> + </symbol> + <symbol + overflow="visible" + id="id-331b803c-1ca4-4d9e-ae0a-b94c0868ef22-9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-79a21791-6cb0-4234-a47b-4bd9ede6c0b2-7" /> + </symbol> + <symbol + overflow="visible" + id="id-02613bae-770a-4a52-a47b-fef4b2c26411-5"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-afc2da90-6d57-475c-a8d5-7767638414df-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1f8fea30-ac48-4986-984b-906d5fb66dce-8"> + <path + style="stroke:none" + d="" + id="id-2db340cb-906e-44a4-b69f-d20f40866d22-8" /> + </symbol> + <symbol + overflow="visible" + id="id-1159c11c-5ca0-4515-84ea-dbc2c0071b76-3"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-47e8b9e4-606d-4d63-adc7-5bbddf20c9ca-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d2a45eb8-4bc1-4f97-847e-131cb18000c7-8"> + <path + style="stroke:none" + d="" + id="id-b7d83c78-2ab3-430e-8d1b-ea63a6e16936-9" /> + </symbol> + <symbol + overflow="visible" + id="id-c2d57daa-bbd4-45c0-8d46-e646f76639f4-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-530c2961-ca82-486c-a6db-d81ce2884279-4" /> + </symbol> + </g> + <g + id="id-945a6e37-a95b-44e9-82b7-2ac83c7d6d9c-2"> + <symbol + overflow="visible" + id="id-5413b550-28b0-4f27-b0e0-efb018e9abb1-5"> + <path + style="stroke:none" + d="" + id="id-a8d13d71-db36-4835-9549-9f3622025a5e-4" /> + </symbol> + <symbol + overflow="visible" + id="id-12cf6e23-f040-4a9f-99b8-10631bfdf663-0"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-20759e13-f2c8-45c1-b35a-f43212bfcee3-5" /> + </symbol> + <symbol + overflow="visible" + id="id-591b00bb-e13d-4d74-8c6c-fd8f6ea3db65-9"> + <path + style="stroke:none" + d="" + id="id-3c0c7864-f3cb-4470-8f6b-48d3abc32653-4" /> + </symbol> + <symbol + overflow="visible" + id="id-bef4c849-1488-4ffd-88f3-58fc74337fa5-6"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-e2e9ead5-8b0c-48eb-8713-a9278af03c05-9" /> + </symbol> + <symbol + overflow="visible" + id="id-bcb3bf03-198d-41ab-b887-5d49a6fec79b-2"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-9a1955e3-cb8d-48d9-96d1-9989ce648fff-2" /> + </symbol> + <symbol + overflow="visible" + id="id-e586bbb8-1d83-4c06-b2e2-870f9006d650-4"> + <path + style="stroke:none" + d="" + id="id-92894d48-f372-4004-9679-16918abac50d-7" /> + </symbol> + <symbol + overflow="visible" + id="id-f066668e-909e-4312-80d1-04749c262cb4-7"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-973279b7-cd89-4f57-a650-ba85eb525e1d-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9423f50a-7bbb-437e-a3ab-686b0a1c420d-4"> + <path + style="stroke:none" + d="" + id="id-3a813a52-2d44-41db-ac8c-e6155f5cb9b9-8" /> + </symbol> + <symbol + overflow="visible" + id="id-b0386dcd-1db9-41fd-a360-42e59588bfe9-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-918e55b9-f187-4747-989f-66efac9d6872-2" /> + </symbol> + </g> + <g + id="id-58309c68-7535-4da9-8dc6-1b52eaa73e19-8"> + <symbol + overflow="visible" + id="id-29067988-3659-4747-86bb-6cc1b8b5c91e-6"> + <path + style="stroke:none" + d="" + id="id-80cc09ad-f6c7-4d0e-b4a0-0dd52e7cf885-2" /> + </symbol> + <symbol + overflow="visible" + id="id-213f7785-a032-4538-9e90-29c9ecd79a4a-8"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-b0ad5f67-012c-4eb4-9df9-7915797561d9-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80c58fdf-7f87-456a-90d4-ebd25fde26f8-7"> + <path + style="stroke:none" + d="" + id="id-74527db0-d834-4b21-a3a3-787ef4f1584f-2" /> + </symbol> + <symbol + overflow="visible" + id="id-aad71265-bf77-4f0f-8166-b3b625e9d750-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c3fa1ea-dfa0-42fc-92ce-a84f36b57ca7-0" /> + </symbol> + <symbol + overflow="visible" + id="id-e1479489-482e-49ef-a82f-7e97279af4e1-6"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-5e3cb470-a9d3-4ef6-a007-ed9d6b5de59b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-5366a9cc-cff2-4e31-9a8f-998905cec9a9-9"> + <path + style="stroke:none" + d="" + id="id-46c1bd63-2d42-4a96-9494-d4a8f64c983d-9" /> + </symbol> + <symbol + overflow="visible" + id="id-aa6ec137-fdf3-4e1a-a9aa-2340ca00987b-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-b880bd61-8e28-44ff-b1b7-319821d36654-8" /> + </symbol> + <symbol + overflow="visible" + id="id-9f4b5d89-4f82-443e-aeab-44850820982d-1"> + <path + style="stroke:none" + d="" + id="id-d65784a0-aa5d-47b4-bc0b-6bafea1755bf-3" /> + </symbol> + <symbol + overflow="visible" + id="id-042c7792-5675-40b4-a5a6-74b1df22e176-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-0247951f-4384-4d49-ad6d-5360e43ffcae-1" /> + </symbol> + </g> + <g + id="g5405-0"> + <symbol + overflow="visible" + id="symbol5399-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path5397-4" /> + </symbol> + <symbol + overflow="visible" + id="symbol5403-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path5401-2" /> + </symbol> + </g> + <g + id="id-f71ea667-3b4d-4d21-ad1f-0ecb1dd3e484-1"> + <symbol + overflow="visible" + id="id-34dc3a3d-2276-4043-8291-b700fbc2dff1-5"> + <path + style="stroke:none" + d="" + id="id-9cccc023-3ff4-416e-878b-ddafd3dd0fcd-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9bd60f18-4c4d-4ddd-b181-16f7a2d92fbc-9"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d86d8910-8168-40a7-ac81-0c33df86ab0e-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d9fa921e-ba7e-461c-9b85-204169b0b876-4"> + <path + style="stroke:none" + d="" + id="id-513ff48d-b30f-41d2-a80a-6d4ac5c4bdf2-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ba38b8ec-61ee-49f7-aa7b-b60f1f54849e-1"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-99aee4ff-3e86-462c-8595-98407ac2efa0-0" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-6"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-1"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-0" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-4"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-2" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-2"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-2" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-0"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-5" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-5"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-2" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-9"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-0" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-4"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-9"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-9" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-3"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-0"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-5" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-02"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-4"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-3" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-5"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-1" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-9"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-2"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-8" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-8"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-8" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-6"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-8" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-3"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-8" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-3"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-33" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-04" /> + </symbol> + </g> + <g + id="id-3dd9cb25-d8bd-4dc2-8273-d7c70d917f95-2"> + <symbol + overflow="visible" + id="id-d8a0ff0d-809d-4bcd-a58a-2bfbeec9c60b-6"> + <path + style="stroke:none" + d="" + id="id-3c760ccd-e80e-4aff-b97d-43dfe4ec5786-5" /> + </symbol> + <symbol + overflow="visible" + id="id-11720994-ac59-4f48-b2ec-903fd008e9d7-2"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0e848706-d066-42a0-8094-73a654a15a4b-65" /> + </symbol> + <symbol + overflow="visible" + id="id-e3c71763-ea79-4aae-a08c-cbf6475bf644-8"> + <path + style="stroke:none" + d="" + id="id-8ede1f05-b6ab-4daa-8c2a-61b53065ee5e-7" /> + </symbol> + <symbol + overflow="visible" + id="id-38128339-202c-45b3-8c2b-93e27d8e0313-9"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c5c824f9-8bf0-4998-a405-4a2b8257fc16-6" /> + </symbol> + <symbol + overflow="visible" + id="id-4308d98e-09ef-4d6f-ac9e-2e47ab175120-0"> + <path + style="stroke:none" + d="" + id="id-252f59a8-9cf1-4882-9572-5ca5c2c28b8a-4" /> + </symbol> + <symbol + overflow="visible" + id="id-d1ff7ffe-4bae-494f-b96b-420a591d1181-1"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-67bf598d-87db-40b4-a708-8d12284c270f-048" /> + </symbol> + </g> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-3"> + <g + id="g9835"> + <symbol + overflow="visible" + id="symbol9829"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path9827" /> + </symbol> + <symbol + overflow="visible" + id="symbol9833"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path9831" /> + </symbol> + </g> + </defs> + <marker + style="overflow:visible" + id="marker4270-7-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-99" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-4-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-99-9" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-4-5-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-99-9-7" /> + </marker> + <marker + style="overflow:visible" + id="marker4270-7-4-5-5-8" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="matrix(-0.8,0,0,-0.8,-10,0)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,0 5,-5 -12.5,0 5,5 Z" + id="path4268-7-99-9-7-1" /> + </marker> + <g + id="id-b15114a7-ca09-4a21-ad11-725124638424-9"> + <symbol + overflow="visible" + id="id-310b4048-7c0e-46eb-bfd0-a76166008027-6"> + <path + style="stroke:none" + d="" + id="id-d6720d2c-5774-4364-8d54-58341c455226-2" /> + </symbol> + <symbol + overflow="visible" + id="id-380331dc-88ab-482c-b934-cf4ac9c4ff54-1"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-3a19059e-f020-4a72-9f12-a604927b3cd3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-d8429f02-44d9-4eea-baa5-885d8a467e29-0"> + <path + style="stroke:none" + d="" + id="id-2ca3837e-ef16-4602-a5db-d5f0c7eef876-7" /> + </symbol> + <symbol + overflow="visible" + id="id-e6901dc5-9917-4fb0-a181-aa79499a7893-3"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-3d07bff7-8536-4d05-9265-e222d0ded5de-1" /> + </symbol> + <symbol + overflow="visible" + id="id-d654728c-9737-434e-9366-43d67bc9135b-1"> + <path + style="stroke:none" + d="" + id="id-2cb602a0-1505-4afe-9908-6b3a2a7e619e-9" /> + </symbol> + <symbol + overflow="visible" + id="id-364e5767-a7b9-4262-a86d-4fa669215069-0"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92389ee1-b7ce-499d-b00c-189d8877af98-5" /> + </symbol> + </g> + <g + id="id-eb52ad1a-98d6-4508-8c52-d822e8214559-2"> + <symbol + overflow="visible" + id="id-90e0f0c5-a5dc-4c99-be01-17ce75139c28-6"> + <path + style="stroke:none" + d="" + id="id-0aab7f5a-cce1-4a3b-a8f8-a6fa9bdb2442-0" /> + </symbol> + <symbol + overflow="visible" + id="id-350d3c26-9d68-4293-9402-db84f99a56a0-6"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-9989a360-a08e-439e-b73c-db08ffd06058-6" /> + </symbol> + <symbol + overflow="visible" + id="id-6218964a-9604-4244-bd4b-9454bf0bb4b0-4"> + <path + style="stroke:none" + d="" + id="id-d9651d3c-227d-4426-8b25-41f32650ce85-6" /> + </symbol> + <symbol + overflow="visible" + id="id-71be12ed-4366-49ab-b52d-f913ea29ee61-2"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-c69d8307-964b-4a94-852d-813bbd63d286-8" /> + </symbol> + </g> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="1.8762584" + inkscape:cx="565.87924" + inkscape:cy="219.4027" + inkscape:document-units="mm" + inkscape:current-layer="g24410" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="992" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48" + transform="matrix(0,0.569333,-0.569333,0,204.88008,-31.590907)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1"> + <g + transform="translate(148.712,134.765)" + id="g3573-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3"> + <g + transform="translate(153.143,134.765)" + id="g3577-9"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8"> + <g + transform="translate(157.565,134.765)" + id="g3581-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5" /> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7" + transform="matrix(0,0.569333,-0.569333,0,242.65143,-1.4306635)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7" /> + </g> + </g> + </g> + <g + id="g24410" + transform="translate(73.769425,-14.640859)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-76" + cx="92.458305" + cy="41.815311" + r="4.4921422" /> + <g + transform="matrix(0.515009,0,0,0.543714,89.2473,39.6505)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{u}_{v_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13"> + <defs + id="id-b780726d-e34e-4d25-81b3-f183d1f09d35"> + <g + id="id-b15114a7-ca09-4a21-ad11-725124638424"> + <symbol + overflow="visible" + id="id-310b4048-7c0e-46eb-bfd0-a76166008027"> + <path + style="stroke:none" + d="" + id="id-d6720d2c-5774-4364-8d54-58341c455226" /> + </symbol> + <symbol + overflow="visible" + id="id-380331dc-88ab-482c-b934-cf4ac9c4ff54"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-3a19059e-f020-4a72-9f12-a604927b3cd3" /> + </symbol> + <symbol + overflow="visible" + id="id-d8429f02-44d9-4eea-baa5-885d8a467e29"> + <path + style="stroke:none" + d="" + id="id-2ca3837e-ef16-4602-a5db-d5f0c7eef876" /> + </symbol> + <symbol + overflow="visible" + id="id-e6901dc5-9917-4fb0-a181-aa79499a7893"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-3d07bff7-8536-4d05-9265-e222d0ded5de" /> + </symbol> + <symbol + overflow="visible" + id="id-d654728c-9737-434e-9366-43d67bc9135b"> + <path + style="stroke:none" + d="" + id="id-2cb602a0-1505-4afe-9908-6b3a2a7e619e" /> + </symbol> + <symbol + overflow="visible" + id="id-364e5767-a7b9-4262-a86d-4fa669215069"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-92389ee1-b7ce-499d-b00c-189d8877af98" /> + </symbol> + </g> + </defs> + <g + id="id-8be54d3b-d8f5-48f8-af23-3a13605c56b8" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-0883fc9e-49d1-4539-8d95-7e67c8f3fb4c"> + <g + transform="translate(148.712,134.765)" + id="g19864"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-e6d691c4-ff51-4af9-b89d-5151dc65963d" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-bf0fde30-a752-4026-bff5-0f557ff3ccd1"> + <g + transform="translate(155.077,136.259)" + id="g19868"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-da164201-d337-42ed-8e0d-1bec40c3f63b" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-47c329ac-2bd8-4dc5-a838-0177b0f30867"> + <g + transform="translate(159.062,137.255)" + id="g19872"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-a5908090-d1e3-4f5a-ad79-dfcf6bce4a49" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.515009,0,0,0.543714,102.29442,52.084138)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$z_1$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-0"> + <defs + id="id-a11443ae-5680-4fd2-998c-03aac8884898"> + <g + id="id-eb52ad1a-98d6-4508-8c52-d822e8214559"> + <symbol + overflow="visible" + id="id-90e0f0c5-a5dc-4c99-be01-17ce75139c28"> + <path + style="stroke:none" + d="" + id="id-0aab7f5a-cce1-4a3b-a8f8-a6fa9bdb2442" /> + </symbol> + <symbol + overflow="visible" + id="id-350d3c26-9d68-4293-9402-db84f99a56a0"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-9989a360-a08e-439e-b73c-db08ffd06058" /> + </symbol> + <symbol + overflow="visible" + id="id-6218964a-9604-4244-bd4b-9454bf0bb4b0"> + <path + style="stroke:none" + d="" + id="id-d9651d3c-227d-4426-8b25-41f32650ce85" /> + </symbol> + <symbol + overflow="visible" + id="id-71be12ed-4366-49ab-b52d-f913ea29ee61"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-c69d8307-964b-4a94-852d-813bbd63d286" /> + </symbol> + </g> + </defs> + <g + id="id-670fa564-d04f-49e4-89d3-f292cee9d0dd" + transform="translate(-149.134,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-629bac1d-d732-45ea-9e2f-8035df467324"> + <g + transform="translate(148.712,134.765)" + id="g26730"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-0bc4890f-d8a5-4415-b063-687e79c23127" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-42c9571a-ce67-496a-8929-1d871d953abf"> + <g + transform="translate(153.345,136.259)" + id="g26734"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-17fc3d6a-f9b2-4d2c-bb1f-80dcfcdbb3f8" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.515009,0,0,0.543714,102.23809,76.905914)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$z_2$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-0-5"> + <defs + id="id-a79d82ac-8aaf-416e-a36b-571e15cb9710"> + <g + id="id-022b9cfd-0373-492a-9e99-748252aaa67d"> + <symbol + overflow="visible" + id="id-387bff1c-c94c-49ed-8e60-e86ce176dbee"> + <path + style="stroke:none" + d="" + id="id-b0e6d18f-27b4-4447-8743-4d8edc538653" /> + </symbol> + <symbol + overflow="visible" + id="id-b7a7550f-7c6c-466b-bc14-15c8477d9fc6"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-12659a36-2fd8-474b-8bbf-c36049526c5b" /> + </symbol> + <symbol + overflow="visible" + id="id-20a34618-31be-42e1-994d-95b52dc1001c"> + <path + style="stroke:none" + d="" + id="id-aa3160c6-d31a-4183-aecc-68c90f87bc71" /> + </symbol> + <symbol + overflow="visible" + id="id-f07fb4a5-caca-4471-bfad-9331d7c6ffb6"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-59300b1b-d873-443e-9730-404955e857fc" /> + </symbol> + </g> + </defs> + <g + id="id-fc18a75c-6e05-429c-8c54-023b26326500" + transform="translate(-149.134,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d45b489c-5200-4750-9613-9332429336f7"> + <g + transform="translate(148.712,134.765)" + id="g27756"> + <path + style="stroke:none" + d="m 1.328125,-0.828125 c 0.53125,-0.578125 0.828125,-0.828125 1.1875,-1.140625 0,0 0.609375,-0.53125 0.96875,-0.890625 C 4.4375,-3.78125 4.65625,-4.265625 4.65625,-4.3125 c 0,-0.09375 -0.09375,-0.09375 -0.109375,-0.09375 -0.078125,0 -0.09375,0.015625 -0.15625,0.109375 -0.296875,0.484375 -0.5,0.640625 -0.734375,0.640625 -0.25,0 -0.359375,-0.15625 -0.515625,-0.328125 -0.1875,-0.21875 -0.359375,-0.421875 -0.6875,-0.421875 -0.75,0 -1.203125,0.921875 -1.203125,1.140625 0,0.046875 0.03125,0.109375 0.109375,0.109375 0.09375,0 0.109375,-0.046875 0.140625,-0.109375 0.1875,-0.46875 0.765625,-0.46875 0.84375,-0.46875 0.203125,0 0.390625,0.0625 0.625,0.140625 0.40625,0.15625 0.515625,0.15625 0.765625,0.15625 -0.359375,0.421875 -1.1875,1.140625 -1.375,1.296875 l -0.90625,0.84375 C 0.78125,-0.625 0.421875,-0.0625 0.421875,0.015625 c 0,0.09375 0.109375,0.09375 0.125,0.09375 0.078125,0 0.09375,-0.015625 0.15625,-0.125 0.234375,-0.359375 0.53125,-0.625 0.859375,-0.625 0.21875,0 0.328125,0.09375 0.578125,0.375 0.15625,0.21875 0.34375,0.375 0.625,0.375 1,0 1.578125,-1.265625 1.578125,-1.53125 0,-0.046875 -0.046875,-0.109375 -0.125,-0.109375 -0.09375,0 -0.109375,0.0625 -0.140625,0.140625 C 3.84375,-0.75 3.203125,-0.5625 2.875,-0.5625 c -0.1875,0 -0.375,-0.0625 -0.578125,-0.125 -0.34375,-0.125 -0.5,-0.171875 -0.703125,-0.171875 -0.015625,0 -0.171875,0 -0.265625,0.03125 z m 0,0" + id="id-add79b81-133b-42ad-aa75-a25f6b4a6c85" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-61dde61b-bcd9-43d2-94f3-2cf108756810"> + <g + transform="translate(153.345,136.259)" + id="g27760"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-c4384b96-920c-4538-bd3d-d508259ea6f0" /> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker29315);marker-end:url(#marker29335)" + d="M 99.761563,38.217555 V 69.706602" + id="path28223" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.265;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#marker29025);marker-end:url(#marker29325)" + d="m 99.757563,74.368522 0.008,8.438784" + id="path28225" /> + </g> + <g + id="g24438" + transform="translate(74.777741,-17.574269)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-76-4" + cx="91.449989" + cy="56.940018" + r="4.4921422" /> + <g + transform="matrix(0.515009,0,0,0.543714,88.1947,54.7752)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{u}_{v_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-2"> + <defs + id="id-8f11701c-4dab-4a5f-8771-999cfd5ed1fa"> + <g + id="id-30510b08-7734-4fd5-b159-b76ecb33013b"> + <symbol + overflow="visible" + id="id-2961f993-f97b-4ee1-9d2f-5268c11398a0"> + <path + style="stroke:none" + d="" + id="id-ddf725b8-080b-49fd-bfd7-bd3ecaee28cc" /> + </symbol> + <symbol + overflow="visible" + id="id-f3b1f3bc-1567-42bf-b5e6-26d5707ffbb8"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-2eebffef-347d-420c-812f-b0a4af4881ed" /> + </symbol> + <symbol + overflow="visible" + id="id-aa26cb96-498f-4cd2-b409-7c60eda19c5f"> + <path + style="stroke:none" + d="" + id="id-5cefe848-a7d1-4adf-afda-f08ed966326b" /> + </symbol> + <symbol + overflow="visible" + id="id-1d375acc-dadc-4eea-b2e0-58c13c3afe1d"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-035d9138-4d06-4565-bd96-bfd78304ad71" /> + </symbol> + <symbol + overflow="visible" + id="id-6d207ea7-9e4f-4b0d-8420-d74f8a0bb8d7"> + <path + style="stroke:none" + d="" + id="id-ee6d7794-8a5b-4588-938d-04d7a0ae0d1d" /> + </symbol> + <symbol + overflow="visible" + id="id-ab2d3123-45ef-4677-9517-26a71b3485ba"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-3308d970-4d64-4ce6-b220-bb6bd6165752" /> + </symbol> + </g> + </defs> + <g + id="id-34acc751-e11b-4cc7-9911-4d0ae3207020" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d65e3a5b-054f-48a2-8bc0-aff334ca7257"> + <g + transform="translate(148.712,134.765)" + id="g20903"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-131833f1-3651-4a3b-b0a4-5edeb079b2c3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-2f9115db-d780-4dd2-b4e9-bd9c6d7f86c6"> + <g + transform="translate(155.077,136.259)" + id="g20907"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-c86d5ab8-8d94-4c26-8883-5ef06c407760" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4fb98a21-51a7-40f7-87de-49ce4247f04c"> + <g + transform="translate(159.062,137.255)" + id="g20911"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-0672656c-a479-499c-895c-2b9c4de89147" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g24466" + transform="translate(74.921784,-18.058922)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-76-6" + cx="91.305946" + cy="69.615959" + r="4.4921422" /> + <g + transform="matrix(0.515009,0,0,0.543714,88.0385,67.4215)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{u}_{v_3}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-25"> + <defs + id="id-9f02248e-2188-4291-b6ed-d1237ae0613c"> + <g + id="id-2a0f0ca1-6181-4403-907a-55c0dccd34af"> + <symbol + overflow="visible" + id="id-16ed2af1-d7db-481f-9b05-966c51297bd5"> + <path + style="stroke:none" + d="" + id="id-9ff7e98d-8e7a-47c8-9ab2-9af716d6dc84" /> + </symbol> + <symbol + overflow="visible" + id="id-91ea47fb-f870-4fc8-9085-82eb0df482ad"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-0a027810-8442-4623-bfb9-0856dc5adfa6" /> + </symbol> + <symbol + overflow="visible" + id="id-96c04f4c-aa14-42d2-adbb-4db161208b11"> + <path + style="stroke:none" + d="" + id="id-979250eb-df1c-415d-b93c-a4c6b6771a22" /> + </symbol> + <symbol + overflow="visible" + id="id-751fcaa7-ab19-4de7-b8bf-6bed03650313"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-af7f9a5b-00d0-40fe-8192-1d4c5d1bf56c" /> + </symbol> + <symbol + overflow="visible" + id="id-b3166a87-57ee-4a25-a359-e97cb3f1886a"> + <path + style="stroke:none" + d="" + id="id-82137dbf-838e-4e9a-9cd1-d2f5d9b1d580" /> + </symbol> + <symbol + overflow="visible" + id="id-dfaf2751-7388-4f62-84a4-bf7d7f46b0f7"> + <path + style="stroke:none" + d="m 1.640625,-1.65625 c 0.46875,0 0.765625,0.296875 0.765625,0.78125 0,0.515625 -0.3125,0.78125 -0.75,0.78125 -0.0625,0 -0.65625,0 -0.90625,-0.265625 0.203125,-0.03125 0.265625,-0.171875 0.265625,-0.296875 0,-0.1875 -0.140625,-0.3125 -0.3125,-0.3125 -0.15625,0 -0.296875,0.109375 -0.296875,0.328125 0,0.515625 0.578125,0.75 1.265625,0.75 0.8125,0 1.3125,-0.5 1.3125,-0.984375 0,-0.40625 -0.359375,-0.75 -0.921875,-0.875 0.59375,-0.203125 0.75,-0.578125 0.75,-0.859375 0,-0.40625 -0.5,-0.703125 -1.125,-0.703125 -0.625,0 -1.109375,0.25 -1.109375,0.703125 0,0.234375 0.1875,0.296875 0.28125,0.296875 0.140625,0 0.28125,-0.109375 0.28125,-0.296875 0,-0.109375 -0.0625,-0.25 -0.234375,-0.28125 C 1.109375,-3.109375 1.5625,-3.125 1.671875,-3.125 c 0.359375,0 0.609375,0.171875 0.609375,0.515625 0,0.296875 -0.1875,0.75 -0.703125,0.78125 -0.140625,0 -0.15625,0 -0.296875,0.015625 -0.046875,0 -0.109375,0 -0.109375,0.078125 0,0.078125 0.046875,0.078125 0.140625,0.078125 z m 0,0" + id="id-e87bb530-ca7b-4027-9427-5733eedc0af8" /> + </symbol> + </g> + </defs> + <g + id="id-5c6360ab-bb5f-458e-b46b-374cfe9c0d43" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-31dae273-b1e6-4edc-9dab-8e65beed875f"> + <g + transform="translate(148.712,134.765)" + id="g21942"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-a750a409-cf86-4a94-b2b3-ffcba528d108" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-6fa762a8-1197-4314-b407-c3d6069b3b3e"> + <g + transform="translate(155.077,136.259)" + id="g21946"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-366983cd-0011-4995-ad06-52d3675ba25d" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-5c841653-2569-48da-b085-6b9264aa1c85"> + <g + transform="translate(159.062,137.255)" + id="g21950"> + <path + style="stroke:none" + d="m 1.640625,-1.65625 c 0.46875,0 0.765625,0.296875 0.765625,0.78125 0,0.515625 -0.3125,0.78125 -0.75,0.78125 -0.0625,0 -0.65625,0 -0.90625,-0.265625 0.203125,-0.03125 0.265625,-0.171875 0.265625,-0.296875 0,-0.1875 -0.140625,-0.3125 -0.3125,-0.3125 -0.15625,0 -0.296875,0.109375 -0.296875,0.328125 0,0.515625 0.578125,0.75 1.265625,0.75 0.8125,0 1.3125,-0.5 1.3125,-0.984375 0,-0.40625 -0.359375,-0.75 -0.921875,-0.875 0.59375,-0.203125 0.75,-0.578125 0.75,-0.859375 0,-0.40625 -0.5,-0.703125 -1.125,-0.703125 -0.625,0 -1.109375,0.25 -1.109375,0.703125 0,0.234375 0.1875,0.296875 0.28125,0.296875 0.140625,0 0.28125,-0.109375 0.28125,-0.296875 0,-0.109375 -0.0625,-0.25 -0.234375,-0.28125 C 1.109375,-3.109375 1.5625,-3.125 1.671875,-3.125 c 0.359375,0 0.609375,0.171875 0.609375,0.515625 0,0.296875 -0.1875,0.75 -0.703125,0.78125 -0.140625,0 -0.15625,0 -0.296875,0.015625 -0.046875,0 -0.109375,0 -0.109375,0.078125 0,0.078125 0.046875,0.078125 0.140625,0.078125 z m 0,0" + id="id-7d6d95fd-e83c-4d73-96ef-0aaded6d077d" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g24494" + transform="translate(74.921784,-19.695938)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-76-41" + cx="91.305946" + cy="83.444267" + r="4.4921422" /> + <g + transform="matrix(0.515009,0,0,0.543714,88.0144,81.2795)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{u}_{v_4}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-28"> + <defs + id="id-d449062f-ff31-4600-9bef-99b8e1d648c4"> + <g + id="id-a89101cb-965b-4798-941e-b7efa0bd6152"> + <symbol + overflow="visible" + id="id-3109833d-4333-4e93-8fdd-1fffbb006aa2"> + <path + style="stroke:none" + d="" + id="id-9ddb5159-265d-4c11-a0f0-e5678854c622" /> + </symbol> + <symbol + overflow="visible" + id="id-f8a7b5f9-a4b6-429d-b064-2cb73707a350"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-957a0772-f252-480b-96bc-ac54bb88517a" /> + </symbol> + <symbol + overflow="visible" + id="id-f6409c77-91f6-42b9-8605-81748501bcb8"> + <path + style="stroke:none" + d="" + id="id-a310ae88-53bb-47f8-83ca-9a0edc0bc664" /> + </symbol> + <symbol + overflow="visible" + id="id-205e4939-3a4e-458c-9820-ada1ab8369ed"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-5b42ea04-5023-4abd-b41b-67f4ec4881d7" /> + </symbol> + <symbol + overflow="visible" + id="id-aebef0f5-8ed0-4e3d-83ee-ff49c8514585"> + <path + style="stroke:none" + d="" + id="id-b1f7c061-6512-44c5-9362-dccf095b588e" /> + </symbol> + <symbol + overflow="visible" + id="id-817027f1-51a9-48ab-abda-b6c7ed18e8fd"> + <path + style="stroke:none" + d="m 3.078125,-0.8125 v -0.21875 h -0.625 v -2.1875 c 0,-0.125 0,-0.15625 -0.140625,-0.15625 -0.09375,0 -0.09375,0 -0.15625,0.078125 L 0.3125,-1.03125 v 0.21875 h 1.65625 v 0.390625 c 0,0.15625 0,0.203125 -0.421875,0.203125 h -0.1875 V 0 c 0.234375,-0.015625 0.5625,-0.015625 0.859375,-0.015625 0.28125,0 0.609375,0 0.84375,0.015625 V -0.21875 H 2.890625 c -0.4375,0 -0.4375,-0.046875 -0.4375,-0.203125 V -0.8125 Z m -1.0625,-2.03125 v 1.8125 h -1.46875 z m 0,0" + id="id-e1f68fa8-a032-4d6a-8312-b7160aaa2cc7" /> + </symbol> + </g> + </defs> + <g + id="id-25c35880-564f-40ce-aadb-7c08f55befc5" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c4f1985a-5078-4d3e-b8ed-cf21deaf3894"> + <g + transform="translate(148.712,134.765)" + id="g22981"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-5de4116d-6929-4460-9b81-a1fa840e6489" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-df740d97-8437-4733-8477-2841e8cff77f"> + <g + transform="translate(155.077,136.259)" + id="g22985"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-293816eb-0662-49b0-bea7-28b241eee240" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-256bb376-6491-4521-b32d-59dfb544b338"> + <g + transform="translate(159.062,137.255)" + id="g22989"> + <path + style="stroke:none" + d="m 3.078125,-0.8125 v -0.21875 h -0.625 v -2.1875 c 0,-0.125 0,-0.15625 -0.140625,-0.15625 -0.09375,0 -0.09375,0 -0.15625,0.078125 L 0.3125,-1.03125 v 0.21875 h 1.65625 v 0.390625 c 0,0.15625 0,0.203125 -0.421875,0.203125 h -0.1875 V 0 c 0.234375,-0.015625 0.5625,-0.015625 0.859375,-0.015625 0.28125,0 0.609375,0 0.84375,0.015625 V -0.21875 H 2.890625 c -0.4375,0 -0.4375,-0.046875 -0.4375,-0.203125 V -0.8125 Z m -1.0625,-2.03125 v 1.8125 h -1.46875 z m 0,0" + id="id-dd5e2c73-b569-417a-a8e3-8d6485e06ab9" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g24522" + transform="translate(74.345604,-20.32463)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-76-3" + cx="91.882126" + cy="96.264252" + r="4.4921422" /> + <g + transform="matrix(0.515009,0,0,0.543714,88.6268,94.0697)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{u}_{v_5}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.5" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.5291668956255673" + id="g866-2-13-7"> + <defs + id="id-525d9370-71fd-418b-a54d-a7559a427518"> + <g + id="id-81776753-6357-47ae-be02-7130b734cbd6"> + <symbol + overflow="visible" + id="id-2f1e3580-a485-41d3-85ba-38e205c7773b"> + <path + style="stroke:none" + d="" + id="id-9e24f081-d9e5-414c-9562-86e7ea95d8fa" /> + </symbol> + <symbol + overflow="visible" + id="id-7b96ef11-a7e8-4175-8fbd-6550f1860b28"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-7f4d9fab-a55d-4854-9a5a-64f8a537ceea" /> + </symbol> + <symbol + overflow="visible" + id="id-dcce8706-86fc-4a12-93c3-745b3b48522b"> + <path + style="stroke:none" + d="" + id="id-dd7db2ae-b691-49f7-b5cb-19799b844746" /> + </symbol> + <symbol + overflow="visible" + id="id-2bf57ad6-b0d5-4cf9-8858-7c6da4ba32dd"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-7cdacf57-0553-4799-be89-192f69f02dc8" /> + </symbol> + <symbol + overflow="visible" + id="id-f7b73519-d3c2-43f5-a559-e52d16e07f2d"> + <path + style="stroke:none" + d="" + id="id-5b2d9418-8247-4e22-a220-23c243bd71c0" /> + </symbol> + <symbol + overflow="visible" + id="id-4f60c04d-7c4d-4d73-ae62-3513bed2deb5"> + <path + style="stroke:none" + d="m 0.984375,-2.75 c 0.25,0.0625 0.484375,0.0625 0.53125,0.0625 0.34375,0 0.59375,-0.09375 0.71875,-0.15625 0.125,-0.0625 0.46875,-0.28125 0.46875,-0.390625 0,-0.078125 -0.0625,-0.078125 -0.078125,-0.078125 -0.015625,0 -0.015625,0 -0.078125,0.015625 -0.1875,0.0625 -0.5,0.140625 -0.828125,0.140625 -0.28125,0 -0.546875,-0.046875 -0.8125,-0.140625 C 0.84375,-3.3125 0.84375,-3.3125 0.828125,-3.3125 0.75,-3.3125 0.75,-3.265625 0.75,-3.1875 v 1.5 c 0,0.09375 0,0.15625 0.109375,0.15625 0.046875,0 0.046875,-0.015625 0.09375,-0.0625 0.1875,-0.21875 0.453125,-0.328125 0.796875,-0.328125 0.28125,0 0.453125,0.15625 0.515625,0.265625 0.109375,0.171875 0.140625,0.390625 0.140625,0.640625 0,0.203125 -0.015625,0.484375 -0.21875,0.671875 -0.21875,0.234375 -0.5,0.25 -0.609375,0.25 -0.328125,0 -0.6875,-0.140625 -0.84375,-0.4375 0.203125,-0.015625 0.28125,-0.15625 0.28125,-0.28125 0,-0.15625 -0.125,-0.28125 -0.28125,-0.28125 -0.109375,0 -0.28125,0.078125 -0.28125,0.296875 0,0.5 0.484375,0.90625 1.125,0.90625 0.75,0 1.359375,-0.5 1.359375,-1.109375 0,-0.5625 -0.484375,-1.09375 -1.171875,-1.09375 -0.3125,0 -0.578125,0.078125 -0.78125,0.25 z m 0,0" + id="id-f71d3f01-b281-440e-8934-3596b6b51eae" /> + </symbol> + </g> + </defs> + <g + id="id-f718af03-9ab4-4d7f-ad24-e28e58546fcb" + transform="translate(-149.165,-130.281)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-59eafef2-d7e1-4072-9d8e-d713917cd0ca"> + <g + transform="translate(148.712,134.765)" + id="g24020"> + <path + style="stroke:none" + d="M 4.359375,-0.71875 V 0.0625 L 6.125,0 v -0.46875 c -0.609375,0 -0.6875,0 -0.6875,-0.390625 v -3.625 L 3.625,-4.40625 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 1.90625 c 0,0.8125 -0.515625,1.34375 -1.234375,1.34375 -0.78125,0 -0.8125,-0.25 -0.8125,-0.796875 v -3.390625 l -1.8125,0.078125 v 0.46875 c 0.609375,0 0.6875,0 0.6875,0.390625 v 2.328125 c 0,1.0625 0.796875,1.28125 1.796875,1.28125 0.25,0 0.96875,0 1.421875,-0.78125 z m 0,0" + id="id-88e21b0a-7ad0-417a-87ba-fc3939d4ca59" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-dfbd88fb-e624-41c1-aa94-a402992137e3"> + <g + transform="translate(155.077,136.259)" + id="g24024"> + <path + style="stroke:none" + d="m 3.71875,-2.53125 c 0,-0.546875 -0.328125,-0.546875 -0.34375,-0.546875 -0.1875,0 -0.375,0.1875 -0.375,0.375 0,0.109375 0.0625,0.171875 0.109375,0.203125 0.125,0.109375 0.265625,0.28125 0.265625,0.5625 0,0.3125 -0.46875,1.8125 -1.296875,1.8125 -0.5625,0 -0.5625,-0.5 -0.5625,-0.625 0,-0.3125 0.125,-0.703125 0.390625,-1.359375 C 1.953125,-2.25 2,-2.359375 2,-2.46875 2,-2.84375 1.6875,-3.078125 1.34375,-3.078125 0.640625,-3.078125 0.328125,-2.125 0.328125,-2 c 0,0.078125 0.09375,0.078125 0.125,0.078125 0.09375,0 0.09375,-0.03125 0.125,-0.109375 C 0.734375,-2.59375 1.03125,-2.875 1.3125,-2.875 c 0.125,0 0.171875,0.078125 0.171875,0.234375 0,0.171875 -0.046875,0.3125 -0.125,0.46875 -0.296875,0.78125 -0.375,1.078125 -0.375,1.328125 0,0.6875 0.546875,0.90625 1.078125,0.90625 1.171875,0 1.65625,-2.015625 1.65625,-2.59375 z m 0,0" + id="id-f89cf5b7-ce27-44f5-a14a-7acdccbe9ee7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-862beb6c-b57e-417f-8603-b2e05d990f56"> + <g + transform="translate(159.062,137.255)" + id="g24028"> + <path + style="stroke:none" + d="m 0.984375,-2.75 c 0.25,0.0625 0.484375,0.0625 0.53125,0.0625 0.34375,0 0.59375,-0.09375 0.71875,-0.15625 0.125,-0.0625 0.46875,-0.28125 0.46875,-0.390625 0,-0.078125 -0.0625,-0.078125 -0.078125,-0.078125 -0.015625,0 -0.015625,0 -0.078125,0.015625 -0.1875,0.0625 -0.5,0.140625 -0.828125,0.140625 -0.28125,0 -0.546875,-0.046875 -0.8125,-0.140625 C 0.84375,-3.3125 0.84375,-3.3125 0.828125,-3.3125 0.75,-3.3125 0.75,-3.265625 0.75,-3.1875 v 1.5 c 0,0.09375 0,0.15625 0.109375,0.15625 0.046875,0 0.046875,-0.015625 0.09375,-0.0625 0.1875,-0.21875 0.453125,-0.328125 0.796875,-0.328125 0.28125,0 0.453125,0.15625 0.515625,0.265625 0.109375,0.171875 0.140625,0.390625 0.140625,0.640625 0,0.203125 -0.015625,0.484375 -0.21875,0.671875 -0.21875,0.234375 -0.5,0.25 -0.609375,0.25 -0.328125,0 -0.6875,-0.140625 -0.84375,-0.4375 0.203125,-0.015625 0.28125,-0.15625 0.28125,-0.28125 0,-0.15625 -0.125,-0.28125 -0.28125,-0.28125 -0.109375,0 -0.28125,0.078125 -0.28125,0.296875 0,0.5 0.484375,0.90625 1.125,0.90625 0.75,0 1.359375,-0.5 1.359375,-1.109375 0,-0.5625 -0.484375,-1.09375 -1.171875,-1.09375 -0.3125,0 -0.578125,0.078125 -0.78125,0.25 z m 0,0" + id="id-62223988-6229-45fd-addd-59f0f7f30ae2" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g10297" + transform="translate(0.1126499)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7" + cx="150.3588" + cy="38.079559" + r="4.4921422" + transform="translate(-30.339869,0.01340608)" /> + <g + transform="matrix(0.55409999,0,0,0.58498399,117.54052,36.094154)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1"> + <defs + id="id-fe0395f9-cd9e-4370-972a-09b96d88acd1-7"> + <g + id="g9297"> + <symbol + overflow="visible" + id="symbol9283"> + <path + style="stroke:none" + d="" + id="path9281" /> + </symbol> + <symbol + overflow="visible" + id="symbol9287"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="path9285" /> + </symbol> + <symbol + overflow="visible" + id="symbol9291"> + <path + style="stroke:none" + d="" + id="path9289" /> + </symbol> + <symbol + overflow="visible" + id="symbol9295"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path9293" /> + </symbol> + </g> + </defs> + <g + id="id-7457a538-d31c-4782-b54c-900abce06f81-5" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9046b2be-23a5-484a-aa3e-6ee99c22343e-9"> + <g + transform="translate(148.712,134.765)" + id="g3356-4"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-639a072d-d722-49fa-9a16-92456d870490-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-064cff21-d081-4fc0-8c9f-3ad5839426f9-0"> + <g + transform="translate(154.759,136.259)" + id="g3360-9"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-80e94a18-ccd4-4ad2-9c5c-5e4866b6db59-1" /> + </g> + </g> + </g> + </g> + <g + id="g10025"> + <g + id="g3799-3" + transform="translate(84.418525,-17.043995)"> + <g + id="g8974" + transform="matrix(0.59548521,0,0,0.59548521,19.480669,21.053929)"> + <g + id="g3156-6" + transform="translate(-11.789786,-1.6856517)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-7" + cx="70.011894" + cy="42.18951" + r="4.4921422" /> + <g + transform="matrix(0.377673,0,0,0.398724,66.4383,40.4741)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y\n}_{z_1,1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.1" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.38805578110885036" + id="g866-53"> + <defs + id="id-6be0af8f-52f7-4cd6-9b57-971846d210d0"> + <g + id="id-8b1176ff-fed7-4d1f-a95d-2f901e2aa6da"> + <symbol + overflow="visible" + id="id-50ca6f89-1cf3-46ce-b624-794728268749"> + <path + style="stroke:none" + d="" + id="id-3007ebfc-2e24-4566-9ce5-f9269724a7af" /> + </symbol> + <symbol + overflow="visible" + id="id-0f52c0e5-e7bb-4649-867b-67f9ffd54d5c"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-e0a286b4-1895-4457-9d47-fdd1ee2aef8e" /> + </symbol> + <symbol + overflow="visible" + id="id-f33a0be7-00c4-4c53-9793-ea8e553e3b04"> + <path + style="stroke:none" + d="" + id="id-8d37aeb7-f373-42df-8441-9e8e63c73fea" /> + </symbol> + <symbol + overflow="visible" + id="id-331b803c-1ca4-4d9e-ae0a-b94c0868ef22"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-79a21791-6cb0-4234-a47b-4bd9ede6c0b2" /> + </symbol> + <symbol + overflow="visible" + id="id-02613bae-770a-4a52-a47b-fef4b2c26411"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-afc2da90-6d57-475c-a8d5-7767638414df" /> + </symbol> + <symbol + overflow="visible" + id="id-1f8fea30-ac48-4986-984b-906d5fb66dce"> + <path + style="stroke:none" + d="" + id="id-2db340cb-906e-44a4-b69f-d20f40866d22" /> + </symbol> + <symbol + overflow="visible" + id="id-1159c11c-5ca0-4515-84ea-dbc2c0071b76"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-47e8b9e4-606d-4d63-adc7-5bbddf20c9ca" /> + </symbol> + <symbol + overflow="visible" + id="id-d2a45eb8-4bc1-4f97-847e-131cb18000c7"> + <path + style="stroke:none" + d="" + id="id-b7d83c78-2ab3-430e-8d1b-ea63a6e16936" /> + </symbol> + <symbol + overflow="visible" + id="id-c2d57daa-bbd4-45c0-8d46-e646f76639f4"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-530c2961-ca82-486c-a6db-d81ce2884279" /> + </symbol> + </g> + </defs> + <g + id="id-b65296b8-cd1e-4853-bf30-f01f997445fc" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-ff31267b-1011-4ebe-a2b3-322e67482823"> + <g + transform="translate(148.712,134.765)" + id="g7575"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-fb26ff1a-890e-4a88-ba4a-5caf57890df3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ec56088c-bb0d-471c-abe7-c18498ca6c04"> + <g + transform="translate(154.759,136.259)" + id="g7579"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-aa616a6c-a072-4034-9cdf-2e0b544efe58" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-55a64f55-78ec-4ba3-9ad9-8551d4676701"> + <g + transform="translate(158.565,137.255)" + id="g7583"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-8f9cb614-bd57-4124-828b-80379cb59b0c" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-e6d6b41a-348c-445d-b6d0-7b54b1956bdb"> + <g + transform="translate(162.454,136.259)" + id="g7587"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-1bb9f3d5-cd2b-46f6-bac3-e24c728635a9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f49d8197-a2da-489d-b770-b1923dd1c1dc"> + <g + transform="translate(164.82,136.259)" + id="g7591"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-d99894be-3c76-4844-b308-43a751048c67" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3184-5" + transform="translate(-11.934691,-3.882734)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-6-9" + cx="70.156799" + cy="56.775902" + r="4.4921422" /> + <g + transform="matrix(0.377673,0,0,0.398723,66.5834,55.0601)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_2,1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.1" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.3880552944864945" + id="g866-5-2"> + <defs + id="id-557dc6da-601e-4c39-aaf4-3c6cf1e4bd70"> + <g + id="id-945a6e37-a95b-44e9-82b7-2ac83c7d6d9c"> + <symbol + overflow="visible" + id="id-5413b550-28b0-4f27-b0e0-efb018e9abb1"> + <path + style="stroke:none" + d="" + id="id-a8d13d71-db36-4835-9549-9f3622025a5e" /> + </symbol> + <symbol + overflow="visible" + id="id-12cf6e23-f040-4a9f-99b8-10631bfdf663"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-20759e13-f2c8-45c1-b35a-f43212bfcee3" /> + </symbol> + <symbol + overflow="visible" + id="id-591b00bb-e13d-4d74-8c6c-fd8f6ea3db65"> + <path + style="stroke:none" + d="" + id="id-3c0c7864-f3cb-4470-8f6b-48d3abc32653" /> + </symbol> + <symbol + overflow="visible" + id="id-bef4c849-1488-4ffd-88f3-58fc74337fa5"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-e2e9ead5-8b0c-48eb-8713-a9278af03c05" /> + </symbol> + <symbol + overflow="visible" + id="id-bcb3bf03-198d-41ab-b887-5d49a6fec79b"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-9a1955e3-cb8d-48d9-96d1-9989ce648fff" /> + </symbol> + <symbol + overflow="visible" + id="id-e586bbb8-1d83-4c06-b2e2-870f9006d650"> + <path + style="stroke:none" + d="" + id="id-92894d48-f372-4004-9679-16918abac50d" /> + </symbol> + <symbol + overflow="visible" + id="id-f066668e-909e-4312-80d1-04749c262cb4"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-973279b7-cd89-4f57-a650-ba85eb525e1d" /> + </symbol> + <symbol + overflow="visible" + id="id-9423f50a-7bbb-437e-a3ab-686b0a1c420d"> + <path + style="stroke:none" + d="" + id="id-3a813a52-2d44-41db-ac8c-e6155f5cb9b9" /> + </symbol> + <symbol + overflow="visible" + id="id-b0386dcd-1db9-41fd-a360-42e59588bfe9"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-918e55b9-f187-4747-989f-66efac9d6872" /> + </symbol> + </g> + </defs> + <g + id="id-25cbd960-346c-44d5-a7a7-cd259f220412" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-e070969d-cbbb-4e16-8382-3bd97bcb823c"> + <g + transform="translate(148.712,134.765)" + id="g8161"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-e26019c6-b7f9-4b86-8846-e0ed96094457" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ea6ef407-f30f-4578-8380-be23faf354d2"> + <g + transform="translate(154.759,136.259)" + id="g8165"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1067d6bd-46da-4bdd-8d6a-ccf22d52d139" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0e4c0db8-7660-4dc5-b68a-dda7cfd5c269"> + <g + transform="translate(158.565,137.255)" + id="g8169"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-1603147b-17cc-4897-bc31-1789f0b0948c" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-746c89f4-82f5-4adc-9cd1-a83e90a088ce"> + <g + transform="translate(162.454,136.259)" + id="g8173"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-975b9346-f9d9-4fca-9c96-3533ca1ad123" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-6261188b-d4ca-4286-b5ad-16403a3817c3"> + <g + transform="translate(164.82,136.259)" + id="g8177"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-6d9313f7-331a-417f-8898-9220a3bedaa8" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3241-2" + transform="translate(-9.890387,-8.2691788)"> + <g + id="g3212-0"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-9-6" + cx="68.112495" + cy="82.236786" + r="4.4921422" /> + <g + transform="matrix(0.377673,0,0,0.398723,64.4508,80.521)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_k,1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.1" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.3880552944864945" + id="g866-26-1"> + <defs + id="id-2323ec52-c994-466e-8d33-618ba88d4860"> + <g + id="id-58309c68-7535-4da9-8dc6-1b52eaa73e19"> + <symbol + overflow="visible" + id="id-29067988-3659-4747-86bb-6cc1b8b5c91e"> + <path + style="stroke:none" + d="" + id="id-80cc09ad-f6c7-4d0e-b4a0-0dd52e7cf885" /> + </symbol> + <symbol + overflow="visible" + id="id-213f7785-a032-4538-9e90-29c9ecd79a4a"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-b0ad5f67-012c-4eb4-9df9-7915797561d9" /> + </symbol> + <symbol + overflow="visible" + id="id-80c58fdf-7f87-456a-90d4-ebd25fde26f8"> + <path + style="stroke:none" + d="" + id="id-74527db0-d834-4b21-a3a3-787ef4f1584f" /> + </symbol> + <symbol + overflow="visible" + id="id-aad71265-bf77-4f0f-8166-b3b625e9d750"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c3fa1ea-dfa0-42fc-92ce-a84f36b57ca7" /> + </symbol> + <symbol + overflow="visible" + id="id-e1479489-482e-49ef-a82f-7e97279af4e1"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-5e3cb470-a9d3-4ef6-a007-ed9d6b5de59b" /> + </symbol> + <symbol + overflow="visible" + id="id-5366a9cc-cff2-4e31-9a8f-998905cec9a9"> + <path + style="stroke:none" + d="" + id="id-46c1bd63-2d42-4a96-9494-d4a8f64c983d" /> + </symbol> + <symbol + overflow="visible" + id="id-aa6ec137-fdf3-4e1a-a9aa-2340ca00987b"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-b880bd61-8e28-44ff-b1b7-319821d36654" /> + </symbol> + <symbol + overflow="visible" + id="id-9f4b5d89-4f82-443e-aeab-44850820982d"> + <path + style="stroke:none" + d="" + id="id-d65784a0-aa5d-47b4-bc0b-6bafea1755bf" /> + </symbol> + <symbol + overflow="visible" + id="id-042c7792-5675-40b4-a5a6-74b1df22e176"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-0247951f-4384-4d49-ad6d-5360e43ffcae" /> + </symbol> + </g> + </defs> + <g + id="id-377717a6-de98-4b04-af83-580aa9c91cb5" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-865943bf-ed0d-49b3-bfd3-2c7c1863acea"> + <g + transform="translate(148.712,134.765)" + id="g8759"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-deeebaa0-f246-455c-bb25-c359b03afc42" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f3ba9b81-94ca-42ff-9a63-303a7219a2ca"> + <g + transform="translate(154.759,136.259)" + id="g8763"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-8da0be5a-e5a2-48a6-97d6-93bada94716d" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ba3748b7-b86a-4dad-bed6-65fae8eef817"> + <g + transform="translate(158.565,137.316)" + id="g8767"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-cf22f53f-b2a3-4e40-a835-7c6d41c24c47" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-1ad87ffc-08c4-4089-8756-c42664031daa"> + <g + transform="translate(162.921,136.259)" + id="g8771"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-c230669e-37cb-4e21-b60e-f8881d4e0907" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-88830b4d-ed53-4e7a-92c6-6b719406a084"> + <g + transform="translate(165.287,136.259)" + id="g8775"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-7b3e9969-44c1-45d9-9a03-ef47af2f5c8b" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,58.524851,60.34743)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585-8"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-4"> + <g + id="g5405"> + <symbol + overflow="visible" + id="symbol5399"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path5397" /> + </symbol> + <symbol + overflow="visible" + id="symbol5403"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path5401" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-6" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-8"> + <g + transform="translate(148.712,134.765)" + id="g3573-9"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-2" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-6"> + <g + transform="translate(153.143,134.765)" + id="g3577-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-95"> + <g + transform="translate(157.565,134.765)" + id="g3581-0"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-4" /> + </g> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7)" + d="M 123.76463,35.576286 135.63397,29.31187" + id="path4260-1" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-1)" + d="m 135.86319,36.066561 -11.0209,1.680237" + id="path4260-1-9" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-7)" + d="m 123.32254,41.369235 12.15101,6.16385" + id="path4260-1-6" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-4)" + d="m 141.22891,28.199035 20.1827,-1.019358" + id="path4260-1-4" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-4-5)" + d="m 161.74555,37.989892 -20.50217,-8.10921" + id="path4260-1-4-3" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-4-5-5)" + d="M 162.54596,48.792117 140.04573,30.56522" + id="path4260-1-4-3-0" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-4-5-5-8)" + d="M 162.80641,60.927672 140.71487,37.474567" + id="path4260-1-4-3-0-9" + sodipodi:nodetypes="cc" /> + </g> + </g> + <g + id="g10297-6" + transform="translate(0.1126499,36.580412)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-7-1" + cx="150.3588" + cy="38.079559" + r="4.4921422" + transform="translate(-30.339869,0.01340608)" /> + <g + id="g10025-7"> + <g + id="g3799-3-5" + transform="translate(84.418525,-17.043995)"> + <g + id="g8974-9" + transform="matrix(0.59548521,0,0,0.59548521,19.480669,21.053929)"> + <g + id="g3156-6-6" + transform="translate(-11.789786,-1.6856517)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-7-2" + cx="70.011894" + cy="42.18951" + r="4.4921422" /> + <g + transform="matrix(0.343339,0,0,0.362476,66.1854,40.6058)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y\n}_{z_1,N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.0" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.35277775916857346" + id="g866-53-1"> + <defs + id="id-2e1e9694-27de-4bc5-b6f1-155c33ca7154"> + <g + id="id-18ab7cc1-d512-4dbc-b490-f9b5797772ae"> + <symbol + overflow="visible" + id="id-0ae35fa3-5805-446c-a162-5e7066b04c1d"> + <path + style="stroke:none" + d="" + id="id-3ce9d299-a7e8-494e-b4da-236b2e8af455" /> + </symbol> + <symbol + overflow="visible" + id="id-d104c6f6-83e7-4c3b-bdb0-bda62469c803"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-03cb2b92-56ef-4164-a181-b7e036961d69" /> + </symbol> + <symbol + overflow="visible" + id="id-0063ec77-d1ef-4294-aded-6fb34b25452c"> + <path + style="stroke:none" + d="" + id="id-ed240e9e-fb6f-47f0-9fec-19e256b65474" /> + </symbol> + <symbol + overflow="visible" + id="id-b78aa94e-a748-4118-8254-bc4ac4401cd3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-6ccbc17b-d54d-4ffd-828f-0971e1a0568c" /> + </symbol> + <symbol + overflow="visible" + id="id-8853ccd5-1c22-411f-a77b-11473226831f"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-ea30ef66-1636-4670-bd31-f38f7da9b3d7" /> + </symbol> + <symbol + overflow="visible" + id="id-06f084b3-c80b-4d0d-bbdb-d3d84bb857a5"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-6d6f3605-9595-4e8e-8584-43290a4b83ae" /> + </symbol> + <symbol + overflow="visible" + id="id-6679a993-2e9a-4274-a282-8c4ab5d5b4cb"> + <path + style="stroke:none" + d="" + id="id-092365e5-8b02-4a40-9174-02e022ad759b" /> + </symbol> + <symbol + overflow="visible" + id="id-4116aa0e-8949-444b-b832-4fc27ef35cfd"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-95c724ad-ef6f-43d5-8ea4-d475d235e132" /> + </symbol> + </g> + </defs> + <g + id="id-a0537bbc-3bb0-4a7a-b63d-6f4dfc0f829f" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-c59b42d5-3fb3-4ed4-858f-117ad8f713e1"> + <g + transform="translate(148.712,134.765)" + id="g15539"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-ac69d72b-4256-416e-9547-ec4829beffc8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-072d89c1-5443-4204-8c93-9ec1dca8e4ce"> + <g + transform="translate(154.759,136.259)" + id="g15543"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-e06bdaea-9917-42af-bdeb-f797778559f9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b45d471-ace3-4bd5-9bdf-b6b120381159"> + <g + transform="translate(158.565,137.255)" + id="g15547"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-f94bf12b-d26e-4e59-a91a-9848ca49bd48" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-c2947fab-b7a7-45e2-a961-95c3091e6151"> + <g + transform="translate(162.454,136.259)" + id="g15551"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-63dd9231-82e4-41b6-8c18-4073708f3295" /> + </g> + <g + transform="translate(164.82,136.259)" + id="g15554"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-d23c3a57-d52c-4660-adf7-6c9cba0ade41" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3184-5-0" + transform="translate(-11.934691,-3.882734)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-6-9-3" + cx="70.156799" + cy="56.775902" + r="4.4921422" /> + <g + transform="matrix(0.343339,0,0,0.362475,66.3305,55.1918)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_2,N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.0" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.35277727254600744" + id="g866-5-2-0"> + <defs + id="id-fa6ad06a-6ea2-420e-bf32-9c1035756bb8"> + <g + id="id-67377935-c67d-4294-b80f-d5c7090e76a2"> + <symbol + overflow="visible" + id="id-11f194a2-4f1e-4e9d-9c12-eaeb0576ba4f"> + <path + style="stroke:none" + d="" + id="id-35e81819-81cf-43ec-a106-5d598095ec61" /> + </symbol> + <symbol + overflow="visible" + id="id-7ae560de-c3d3-4d52-bf1a-ed1cc7022b0d"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-cd1638bf-25f8-4395-99ad-736d7cbaac2c" /> + </symbol> + <symbol + overflow="visible" + id="id-077cd2a9-f72c-4998-9f28-c2ca79278d8c"> + <path + style="stroke:none" + d="" + id="id-3e48370c-8ec9-4101-b706-4d7965684719" /> + </symbol> + <symbol + overflow="visible" + id="id-9e7e9970-d3d6-4748-affa-3a7f38b6e332"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-42a3207a-aa68-4ae0-84e4-803708d270d8" /> + </symbol> + <symbol + overflow="visible" + id="id-f832a4db-9150-4235-a7ce-ed944b41d8ec"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-75959ca4-ca20-4ec0-986b-895097752c6a" /> + </symbol> + <symbol + overflow="visible" + id="id-50f56806-6f07-4f35-a21c-dc678513aa0d"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-4f1a7a33-b9b5-4560-8236-311299d342bf" /> + </symbol> + <symbol + overflow="visible" + id="id-8506b1c1-8634-4ac2-b48f-3dd43b2cb5b8"> + <path + style="stroke:none" + d="" + id="id-ca9fad8a-6b86-4caf-a1f5-3ef8c9866904" /> + </symbol> + <symbol + overflow="visible" + id="id-e812e2db-3284-42c0-ba52-be0102cd4361"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-74d32960-e886-4533-b740-1c7dccd1a5c5" /> + </symbol> + </g> + </defs> + <g + id="id-690cecd6-813b-4235-a29e-fb0e2e06c91f" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-8c788b86-d904-4af3-b989-634f9a9dedfa"> + <g + transform="translate(148.712,134.765)" + id="g14712"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-eb409d9f-f3f9-4b36-b171-69b8152ade11" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-5e8fe62b-067f-448e-b856-e2ba25399d64"> + <g + transform="translate(154.759,136.259)" + id="g14716"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-17d610ce-19cb-43c9-9be3-6919457982a8" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-9e3b10e4-e32c-4f42-ab9d-cc3c6e8453ff"> + <g + transform="translate(158.565,137.255)" + id="g14720"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-06549e56-7f18-4cd0-ac67-0ab3ba9e14fa" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f993e053-b2c5-4fff-8030-89911bcd9745"> + <g + transform="translate(162.454,136.259)" + id="g14724"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-0f9626a6-dcbd-489e-bf4b-cf1fe8bb15e9" /> + </g> + <g + transform="translate(164.82,136.259)" + id="g14727"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-c3d305d1-9a67-47fe-9c62-1a741616d1fd" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3241-2-6" + transform="translate(-9.890387,-8.2691788)"> + <g + id="g3212-0-4"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-9-6-6" + cx="68.112495" + cy="82.236786" + r="4.4921422" /> + <g + transform="matrix(0.343339,0,0,0.362475,64.2061,80.6526)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_k,N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.0" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.35277727254600744" + id="g866-26-1-2"> + <defs + id="id-298e0f63-7d86-40dd-aeeb-eb3472603432"> + <g + id="id-dd266ffb-8bd6-4b8b-908e-347b77cce2f0"> + <symbol + overflow="visible" + id="id-54f93a05-f33f-4e1f-b14b-033dbe0100e1"> + <path + style="stroke:none" + d="" + id="id-662a621e-5e45-40f5-8ea1-8f20c3f932d5" /> + </symbol> + <symbol + overflow="visible" + id="id-d6fd58c8-7306-441f-a7a0-bbba8e210d18"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-eedc4925-c0b2-4708-83aa-15c1b0378193" /> + </symbol> + <symbol + overflow="visible" + id="id-c4ef2db4-0efb-43a7-9f72-cb56a42f6ac4"> + <path + style="stroke:none" + d="" + id="id-727aa764-3087-45d8-9639-138ba68080ef" /> + </symbol> + <symbol + overflow="visible" + id="id-818fcb3c-8f9a-4bca-9cb9-20409f7ecdd9"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-4b0f8225-b958-420c-9925-ed7980d0bea7" /> + </symbol> + <symbol + overflow="visible" + id="id-4a5bb1b9-44a1-495b-970d-c3000f4357b0"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-e6a10cba-4376-48b7-af5c-c1d263a490b6" /> + </symbol> + <symbol + overflow="visible" + id="id-0f0ba165-1d40-4c1f-adba-e72a1f9040f5"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-1a3fd7c0-5d35-445b-ad7f-95596e6bb0c6" /> + </symbol> + <symbol + overflow="visible" + id="id-ff109d01-388b-448f-9978-0aa115e2b857"> + <path + style="stroke:none" + d="" + id="id-c448260a-4a67-4cfc-b867-a7747c30dba7" /> + </symbol> + <symbol + overflow="visible" + id="id-16ce620d-5aa1-4693-b9dc-7b93aa698785"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-ef1023f0-c94f-4abd-a191-51cf1f501069" /> + </symbol> + </g> + </defs> + <g + id="id-6a466e26-0a4e-4ab6-a17c-a4034b0e58e0" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d88a4264-ca84-44e4-a93e-09647b1019a3"> + <g + transform="translate(148.712,134.765)" + id="g16474"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-26351d39-f081-4dc0-98b9-930543e5c1c1" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cfe36fd9-f569-43bb-8ebb-304ed516d808"> + <g + transform="translate(154.759,136.259)" + id="g16478"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-c2b2bcb1-47a8-4b4e-8ea7-2391e9d1a814" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-7ab8b2f8-e8ca-41a2-94e1-e7bed9b6c779"> + <g + transform="translate(158.565,137.316)" + id="g16482"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-9d3ab79d-6e09-4ed3-b956-f0fefafee598" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-0da4babe-cdbc-4790-ad86-4deb739a699d"> + <g + transform="translate(162.921,136.259)" + id="g16486"> + <path + style="stroke:none" + d="m 1.46875,-0.109375 c 0,0.375 -0.0625,0.828125 -0.546875,1.265625 C 0.90625,1.1875 0.875,1.21875 0.875,1.25 c 0,0.046875 0.0625,0.09375 0.09375,0.09375 0.109375,0 0.703125,-0.5625 0.703125,-1.390625 0,-0.421875 -0.171875,-0.75 -0.5,-0.75 -0.21875,0 -0.390625,0.171875 -0.390625,0.390625 C 0.78125,-0.1875 0.9375,0 1.1875,0 1.359375,0 1.46875,-0.109375 1.46875,-0.109375 Z m 0,0" + id="id-d89a1d55-b72f-4420-b4c5-c8faaa78d823" /> + </g> + <g + transform="translate(165.287,136.259)" + id="g16489"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-af2a8735-1b1c-4743-ab87-7cbdcc972bb9" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,58.524851,60.34743)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585-8-6"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-4-4"> + <g + id="g10972"> + <symbol + overflow="visible" + id="symbol10966"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path10964" /> + </symbol> + <symbol + overflow="visible" + id="symbol10970"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path10968" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-6-6" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-8-7"> + <g + transform="translate(148.712,134.765)" + id="g3573-9-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-2-6" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-6-9"> + <g + transform="translate(153.143,134.765)" + id="g3577-6-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-4-7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-95-2"> + <g + transform="translate(157.565,134.765)" + id="g3581-0-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-4-2" /> + </g> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-0)" + d="M 123.76463,35.576286 135.63397,29.31187" + id="path4260-1-99" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-1-6)" + d="m 124.35444,38.164321 11.0209,-1.680237" + id="path4260-1-9-6" + sodipodi:nodetypes="cc" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270-7-7-8)" + d="m 135.87179,47.647478 -12.15101,-6.16385" + id="path4260-1-6-0" + sodipodi:nodetypes="cc" /> + </g> + <g + transform="matrix(0.5541,0,0,0.584984,116.601,36.0943)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855802346762" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-1-1"> + <defs + id="id-d3fb6856-5d38-43e1-965f-380ef846a3f0"> + <g + id="id-5db43806-ce80-48c5-8991-17f0ecf77a78"> + <symbol + overflow="visible" + id="id-9f75520a-2f6e-43a3-a5fc-b484d7c34025"> + <path + style="stroke:none" + d="" + id="id-918e2cb1-bfb3-4125-ae37-98ecf49ea82d" /> + </symbol> + <symbol + overflow="visible" + id="id-32e7f17d-1aa5-4c05-8c87-5c52cf4df567"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5ca8e939-cf8d-49f5-89e4-8f4e371df442" /> + </symbol> + <symbol + overflow="visible" + id="id-e85cff33-aae1-47c5-b492-c54acacf6be2"> + <path + style="stroke:none" + d="" + id="id-ff587f55-c7f0-4a92-9b00-5b074f56717a" /> + </symbol> + <symbol + overflow="visible" + id="id-58db586a-9b92-4cf8-ab2b-eb4fa0eea663"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-f02e888d-d17e-4050-a624-3be22c21f74c" /> + </symbol> + </g> + </defs> + <g + id="id-65fe7cf0-7c06-4e65-a635-382721b5c5f4" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-d24f6bde-c234-4f10-8294-f57b54c2b5bb"> + <g + transform="translate(148.712,134.765)" + id="g12211"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-9411c0c9-acaf-47b2-842a-da578cdcd85c" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4b88eec4-a4f8-4042-b489-653f0c2c9913"> + <g + transform="translate(154.759,136.259)" + id="g12215"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-8d28aa9c-1d28-4bfe-a918-c2ba22fa7138" /> + </g> + </g> + </g> + </g> + </g> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-48-7-9" + transform="matrix(0,0.569333,-0.569333,0,227.58806,-26.352687)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-1-8-7"> + <g + transform="translate(148.712,134.765)" + id="g3573-2-9-8"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-9-1-2" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-3-5-5"> + <g + transform="translate(153.143,134.765)" + id="g3577-9-4-3"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-0-9-4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-8-2-9"> + <g + transform="translate(157.565,134.765)" + id="g3581-8-5-0"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-5-7-2" /> + </g> + </g> + </g> + </g> +</svg> diff --git a/doc/optimal_layout_report/figures/mini_zone.pdf b/doc/optimal_layout_report/figures/mini_zone.pdf Binary files differnew file mode 100644 index 00000000..36085c52 --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_zone.pdf diff --git a/doc/optimal_layout_report/figures/mini_zone.svg b/doc/optimal_layout_report/figures/mini_zone.svg new file mode 100644 index 00000000..5c505539 --- /dev/null +++ b/doc/optimal_layout_report/figures/mini_zone.svg @@ -0,0 +1,1562 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:ns3="http://www.iki.fi/pav/software/textext/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + viewBox="0 0 210 297" + version="1.1" + id="svg8" + sodipodi:docname="mini_zone.svg" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)"> + <defs + id="defs2"> + <marker + style="overflow:visible;" + id="marker5128" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path5126" /> + </marker> + <marker + style="overflow:visible;" + id="marker4822" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4820" /> + </marker> + <marker + style="overflow:visible;" + id="marker4732" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4730" /> + </marker> + <marker + style="overflow:visible;" + id="marker4648" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4646" /> + </marker> + <marker + style="overflow:visible;" + id="marker4570" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4568" /> + </marker> + <marker + style="overflow:visible;" + id="marker4498" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4496" /> + </marker> + <marker + style="overflow:visible;" + id="marker4432" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4430" /> + </marker> + <marker + style="overflow:visible;" + id="marker4372" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4370" /> + </marker> + <marker + style="overflow:visible;" + id="marker4318" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4316" /> + </marker> + <marker + style="overflow:visible;" + id="marker4270" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Lend" + inkscape:isstock="true" + inkscape:collect="always"> + <path + transform="scale(0.8) rotate(180) translate(12.5,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path4268" /> + </marker> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-5"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-5" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-6"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-2" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-2"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-7" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-9" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-3"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-6" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-5"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-9"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-2" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-2"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-8" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-3"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-9" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-4"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-7" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-8"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-5"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-6" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-1"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-0" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-9"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-37"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-5"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-25" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-7" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-4" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-30"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-7" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-8"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-68" /> + </symbol> + </g> + <g + id="id-1326d3bc-9eb9-41c7-a782-1493224ab9b8-4"> + <symbol + overflow="visible" + id="id-526e90b2-6c3e-41c5-8d6f-f0cd897f75fc-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-f90a0839-69b8-41f4-bfca-4510a71f784f-50" /> + </symbol> + <symbol + overflow="visible" + id="id-9161cfde-34a8-4083-835e-e3ff87402147-48"> + <path + style="stroke:none;stroke-width:0" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-5b87e3e3-95fa-4c6d-b0f4-0d87595f99ea-71" /> + </symbol> + <symbol + overflow="visible" + id="id-71a1d34a-b2d8-4880-a0ab-e2cc1c41148f-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-9f84e59d-4dcd-4022-8f5f-2e2ac2123cd8-2" /> + </symbol> + <symbol + overflow="visible" + id="id-c3155d45-1683-4dca-bea0-1830721f6bea-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-518cc7d9-1fe0-430f-b9d0-f705991de9b3-2" /> + </symbol> + <symbol + overflow="visible" + id="id-80fd135c-95aa-4d43-a203-46c244616eee-2"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-efe98237-6fd5-4c48-9bb8-22812bd06c8b-61" /> + </symbol> + <symbol + overflow="visible" + id="id-282f7dff-00f0-4136-a937-90b7ec5ce165-0"> + <path + style="stroke:none;stroke-width:0" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-5cef49ea-eac5-4e19-9115-8a792ca899e5-61" /> + </symbol> + </g> + <g + id="id-f665f0ad-6acc-4c65-818f-65538ae870ec-7"> + <symbol + overflow="visible" + id="id-b528872c-9c37-40cc-8f3c-4a3820527247-7"> + <path + style="stroke:none" + d="" + id="id-b9b64af8-af4d-498f-81ae-f2cb3b370123-6" /> + </symbol> + <symbol + overflow="visible" + id="id-d0bf1643-b2f5-444d-a657-4aaefc6c89d4-7"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-311ed8ac-5c86-4922-8ddd-c8730c4eb1f1-3" /> + </symbol> + <symbol + overflow="visible" + id="id-1911bbd6-3c25-4e44-b82f-6e209a9efbf4-6"> + <path + style="stroke:none" + d="" + id="id-ad0a7a76-9842-4d63-89a8-c9c17aa71c17-5" /> + </symbol> + <symbol + overflow="visible" + id="id-756b752a-2988-4d30-9ec2-f35e31955def-6"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-3ec43921-ba3b-4f7d-b817-b8c615e98630-3" /> + </symbol> + </g> + <g + id="id-f98b961b-31b5-4c0f-bfb1-2760408a739a-8"> + <symbol + overflow="visible" + id="id-4737c041-b95c-4219-8e7e-c562852710ea-5"> + <path + style="stroke:none" + d="" + id="id-c55a79d7-b066-4a99-ae31-2b04d4c628d0-0" /> + </symbol> + <symbol + overflow="visible" + id="id-80361aa1-942d-4c7e-b9e6-0b746bab4670-9"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-46772014-ff2f-4c4f-bd9c-546c16e45ebe-6" /> + </symbol> + <symbol + overflow="visible" + id="id-8dac91f2-ce64-4971-ad7d-d446cd8c9c1c-3"> + <path + style="stroke:none" + d="" + id="id-604b9e94-17f8-4699-8fca-83a7170f9ad1-8" /> + </symbol> + <symbol + overflow="visible" + id="id-7656f371-933a-4b40-8c22-717f88b408ac-5"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-99006318-9528-4ad3-a74f-c639da460421-6" /> + </symbol> + </g> + <g + id="id-71316add-b757-483c-8195-02b65d505b23-3"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b-0"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f-4" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f-4"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe-4" /> + </symbol> + </g> + <g + id="id-47935b59-06ee-4c7d-aad1-b2eb9c1ecfff-8"> + <symbol + overflow="visible" + id="id-30a4c9fc-8faf-46a0-bc6c-a9f87fef6253-5"> + <path + style="stroke:none" + d="" + id="id-786b0d14-3a5a-48ea-b6c0-3bcb1008f442-7" /> + </symbol> + <symbol + overflow="visible" + id="id-ae643f90-7e2b-4001-aa11-715997a19ee5-4"> + <path + style="stroke:none" + d="M 2.109375,-2.9375 C 1.734375,-3 1.09375,-3.109375 1.09375,-3.578125 c 0,-0.625 0.921875,-0.625 1.109375,-0.625 0.75,0 1.125,0.296875 1.171875,0.84375 0.015625,0.15625 0.03125,0.203125 0.234375,0.203125 0.234375,0 0.234375,-0.046875 0.234375,-0.28125 v -0.796875 c 0,-0.1875 0,-0.28125 -0.171875,-0.28125 -0.046875,0 -0.0625,0 -0.453125,0.1875 -0.265625,-0.125 -0.609375,-0.1875 -1,-0.1875 -0.3125,0 -1.84375,0 -1.84375,1.3125 0,0.390625 0.203125,0.65625 0.40625,0.828125 0.390625,0.34375 0.78125,0.40625 1.546875,0.546875 0.359375,0.0625 1.09375,0.1875 1.09375,0.78125 0,0.75 -0.90625,0.75 -1.125,0.75 -1.0625,0 -1.3125,-0.734375 -1.4375,-1.15625 C 0.8125,-1.59375 0.75,-1.59375 0.625,-1.59375 c -0.25,0 -0.25,0.0625 -0.25,0.28125 v 1.09375 c 0,0.1875 0,0.28125 0.1875,0.28125 0.0625,0 0.078125,0 0.296875,-0.15625 0.015625,0 0.234375,-0.140625 0.25,-0.171875 0.46875,0.328125 0.984375,0.328125 1.1875,0.328125 0.3125,0 1.84375,0 1.84375,-1.453125 0,-0.4375 -0.203125,-0.78125 -0.546875,-1.0625 C 3.203125,-2.734375 2.875,-2.796875 2.109375,-2.9375 Z m 0,0" + id="id-9b3da47a-1b25-40c1-9823-033905267525-1" /> + </symbol> + </g> + <g + id="id-e9cdbc45-842a-4299-856a-e73e8a96598a-8"> + <symbol + overflow="visible" + id="id-4c9afea4-0492-4e68-ad02-526d968a9dda-8"> + <path + style="stroke:none" + d="" + id="id-022447e8-2b8e-45a6-9421-6bb9cee18fb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-eb4351ed-2b75-4189-9149-06b49bb09d39-1"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-9793d5ee-1e50-443d-8e24-59e74686be5c-8" /> + </symbol> + <symbol + overflow="visible" + id="id-acdb85cf-666d-461d-bcc6-3145d4b5a194-9"> + <path + style="stroke:none" + d="" + id="id-974496ba-fe40-4bde-9d6c-97d29282be67-6" /> + </symbol> + <symbol + overflow="visible" + id="id-a9937435-0508-4c68-9850-f26d0b685df1-4"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-9c0b6904-6368-4d8f-ad75-244ef0a02a48-3" /> + </symbol> + <symbol + overflow="visible" + id="id-4dbc287f-4992-4820-8c67-423900ff8378-3"> + <path + style="stroke:none" + d="" + id="id-d9c1862f-dbd4-4f66-9f79-92002bb14eb8-3" /> + </symbol> + <symbol + overflow="visible" + id="id-7933b5d5-7f25-482f-b30b-4ba167fd355d-8"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7f05503e-8203-4760-910b-5af86e2658b9-6" /> + </symbol> + </g> + <g + id="id-eea55ade-e2c2-48c1-a3f1-d65d7b23c75c-3"> + <symbol + overflow="visible" + id="id-702cf98a-7855-4a56-b3b9-be3e9c89e5eb-0"> + <path + style="stroke:none" + d="" + id="id-3d08f3b9-fc2d-4c8b-a693-2f069085b4c8-9" /> + </symbol> + <symbol + overflow="visible" + id="id-4db591ab-5b31-4921-a71b-d732a9a3a154-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-fb3ea09c-6864-4691-95b5-1c3c652a23e5-5" /> + </symbol> + <symbol + overflow="visible" + id="id-a45ec7ed-aed1-44f6-87e2-879d7497660b-4"> + <path + style="stroke:none" + d="" + id="id-7b47d29b-e6d8-48a4-b8b1-d1b172f6aa82-0" /> + </symbol> + <symbol + overflow="visible" + id="id-b6a5b321-fb81-4c79-8c77-e89277728de4-5"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-1c892cf5-670f-4af9-9c88-c02621bf8637-9" /> + </symbol> + <symbol + overflow="visible" + id="id-ad80f9d7-8845-4991-af60-575fc64207c6-4"> + <path + style="stroke:none" + d="" + id="id-62aa46d3-6905-4658-9610-06a86458f6eb-6" /> + </symbol> + <symbol + overflow="visible" + id="id-25df116e-62f9-4a97-a0aa-f3214438cb8a-9"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-c94b97b0-0e4d-4d84-8e0b-6baff1ddbc84-2" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-6"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-8"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-0" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-2"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-1" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-0"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-5" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-1"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-1" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-0"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-8" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-5"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-0" /> + </symbol> + </g> + <g + id="id-e222d3e7-5a3e-4726-a518-5c6732a58b38-4"> + <symbol + overflow="visible" + id="id-078cb2fa-d1b6-4887-ba5f-5b66b97fd3ed-0"> + <path + style="stroke:none" + d="" + id="id-61f320b7-89e9-479b-bc4e-49a54067dc37-6" /> + </symbol> + <symbol + overflow="visible" + id="id-59aac359-51b0-40e5-b69b-22218a35fc49-29"> + <path + style="stroke:none" + d="m 0.875,-0.59375 c -0.03125,0.15625 -0.09375,0.390625 -0.09375,0.4375 0,0.171875 0.140625,0.265625 0.296875,0.265625 0.125,0 0.296875,-0.078125 0.375,-0.28125 0,-0.015625 0.125,-0.484375 0.1875,-0.734375 l 0.21875,-0.890625 C 1.90625,-2.03125 1.96875,-2.25 2.03125,-2.46875 c 0.03125,-0.171875 0.109375,-0.46875 0.125,-0.5 0.140625,-0.3125 0.671875,-1.21875 1.625,-1.21875 0.453125,0 0.53125,0.375 0.53125,0.703125 0,0.609375 -0.484375,1.890625 -0.640625,2.3125 C 3.578125,-0.9375 3.5625,-0.8125 3.5625,-0.703125 c 0,0.46875 0.359375,0.8125 0.828125,0.8125 0.9375,0 1.296875,-1.453125 1.296875,-1.53125 0,-0.109375 -0.078125,-0.109375 -0.109375,-0.109375 -0.109375,0 -0.109375,0.03125 -0.15625,0.1875 -0.203125,0.671875 -0.53125,1.234375 -1.015625,1.234375 -0.171875,0 -0.234375,-0.09375 -0.234375,-0.328125 0,-0.25 0.078125,-0.484375 0.171875,-0.703125 0.1875,-0.53125 0.609375,-1.625 0.609375,-2.203125 0,-0.65625 -0.421875,-1.0625 -1.140625,-1.0625 -0.90625,0 -1.390625,0.640625 -1.5625,0.875 -0.046875,-0.5625 -0.453125,-0.875 -0.921875,-0.875 -0.453125,0 -0.640625,0.390625 -0.734375,0.5625 C 0.421875,-3.5 0.296875,-2.90625 0.296875,-2.875 c 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.015625 0.171875,-0.234375 0.171875,-0.703125 0.375,-1.1875 0.734375,-1.1875 0.1875,0 0.296875,0.125 0.296875,0.453125 0,0.21875 -0.03125,0.328125 -0.15625,0.84375 z m 0,0" + id="id-92fad41b-7616-42ba-92ca-aab660696a81-9" /> + </symbol> + <symbol + overflow="visible" + id="id-2a7c3fec-733a-4dd6-91b6-c39d5a40c7f2-08"> + <path + style="stroke:none" + d="" + id="id-861ee250-5da7-465e-9e31-9df2fb1caca2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-c4424853-cb4a-455a-86b7-76f979819c20-3"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-7bbf4d7e-e0a1-496f-b1d4-619a2e578da8-11" /> + </symbol> + <symbol + overflow="visible" + id="id-57147852-035b-4ec9-98bd-1874c4e26ec3-03"> + <path + style="stroke:none" + d="" + id="id-6bd1fefe-bc6f-4f64-9e15-3452b2cae843-4" /> + </symbol> + <symbol + overflow="visible" + id="id-c777c81c-fd27-4557-a370-a3cf2891daa4-0"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-89ae508b-1dad-4bbf-985c-254ae964db83-3" /> + </symbol> + </g> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="3.058469" + inkscape:cx="270.02089" + inkscape:cy="225.59891" + inkscape:document-units="mm" + inkscape:current-layer="layer1" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="992" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g3799" + transform="translate(27.41052,-0.31919255)"> + <g + id="g3156" + transform="translate(-11.789786,-1.6856517)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833" + cx="70.011894" + cy="42.18951" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,66.6264,39.8993)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y\n}_{z_1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866"> + <defs + id="id-2636fe0b-9762-4ca4-813d-b2ce753fe790"> + <g + id="id-3a24776d-bc3a-4985-8b28-ce4db2a93534"> + <symbol + overflow="visible" + id="id-600184e5-ac31-4222-b7ac-c96016dc366e"> + <path + style="stroke:none" + d="" + id="id-b7300ca4-41d0-48a7-a3fc-3384bcd315e5" /> + </symbol> + <symbol + overflow="visible" + id="id-4a311171-3d88-48c1-a768-920db7a376f3"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-5d0de5d4-3de1-4182-916c-5c15cb8a379b" /> + </symbol> + <symbol + overflow="visible" + id="id-576666de-5b44-48e6-9102-7af5342bec6c"> + <path + style="stroke:none" + d="" + id="id-0e138fba-e636-4a6e-9029-bed27c4c236d" /> + </symbol> + <symbol + overflow="visible" + id="id-5c29be59-448a-4add-8ecc-e56873e1ddfc"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-6ac25928-d877-42ea-8378-021164984a12" /> + </symbol> + <symbol + overflow="visible" + id="id-2e32c15b-8346-4486-99eb-6ed6ac946f95"> + <path + style="stroke:none" + d="" + id="id-e410f52f-63d2-4f94-9516-ca72f51d8167" /> + </symbol> + <symbol + overflow="visible" + id="id-6fde21de-66ce-4992-8ea8-55bfd138b407"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-a1d7aab6-721b-4b77-952a-736ac7a8cd57" /> + </symbol> + </g> + </defs> + <g + id="id-8c6ff4a6-68eb-4206-8060-5d7007792515" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-8efd288b-f0f2-4296-a9f1-cac190774b32"> + <g + transform="translate(148.712,134.765)" + id="g1712"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-1548e258-efc7-459a-bc01-f9ee355424e4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ab138df8-5b8c-4c74-b4ba-4caf02976f79"> + <g + transform="translate(154.759,136.259)" + id="g1716"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-c1ae41a5-8830-47b8-a863-ac8f23b1df74" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4a8f4d85-f21b-4f6c-ae5b-294f07fa8748"> + <g + transform="translate(158.565,137.255)" + id="g1720"> + <path + style="stroke:none" + d="M 1.984375,-3.171875 C 1.984375,-3.3125 1.96875,-3.3125 1.796875,-3.3125 1.453125,-3 0.890625,-3 0.796875,-3 H 0.71875 v 0.21875 h 0.078125 c 0.109375,0 0.4375,-0.015625 0.734375,-0.140625 v 2.5 c 0,0.140625 0,0.203125 -0.53125,0.203125 H 0.75 V 0 c 0.265625,-0.015625 0.71875,-0.015625 1,-0.015625 0.296875,0 0.734375,0 1.015625,0.015625 v -0.21875 h -0.25 c -0.53125,0 -0.53125,-0.0625 -0.53125,-0.203125 z m 0,0" + id="id-7c51b778-070f-4b89-a68d-9247bbd1e0d7" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3184" + transform="translate(-11.934691,-3.882734)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-6" + cx="70.156799" + cy="56.775902" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,66.7235,54.4857)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-5"> + <defs + id="id-dd161dc7-8c43-4f06-9a21-26f3ea528e79"> + <g + id="id-867ce786-433a-4da2-985c-f4cd6863ba62"> + <symbol + overflow="visible" + id="id-122aceff-8d13-469a-b644-0d6fd18cd894"> + <path + style="stroke:none" + d="" + id="id-2cd1b095-e373-4c3f-a0aa-744195118e83" /> + </symbol> + <symbol + overflow="visible" + id="id-c8aaab59-3861-421a-b529-5baf8e5e105a"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-87b88ba1-7415-4d4b-b760-06d0f7266a0e" /> + </symbol> + <symbol + overflow="visible" + id="id-1aa2c0b5-6103-4aa2-9d79-186256e46b98"> + <path + style="stroke:none" + d="" + id="id-5b56f2fc-39dd-4f93-a95e-522f63446f1d" /> + </symbol> + <symbol + overflow="visible" + id="id-94706a17-f2b8-4015-86aa-c8b784d104c0"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-8b337c95-3244-40d9-acd0-15e8cf49b85d" /> + </symbol> + <symbol + overflow="visible" + id="id-4b1b0546-799b-4ba0-b279-6150411621c0"> + <path + style="stroke:none" + d="" + id="id-76817e90-5713-4d7a-8eea-1d9bc905ce1c" /> + </symbol> + <symbol + overflow="visible" + id="id-8c7eaeb2-7288-4b4e-9783-6b0d54556574"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-96737164-dbb3-4a15-a741-8519aff719ee" /> + </symbol> + </g> + </defs> + <g + id="id-b2f31055-228e-4d73-a8a8-dee36d48fc0f" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-e2036fc1-e798-4522-adef-b2797b0e27fd"> + <g + transform="translate(148.712,134.765)" + id="g2255"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-baa0ad4a-9471-4005-86ac-dd9317a7b9e9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-fbf7a242-0bdc-4892-a923-589de186d052"> + <g + transform="translate(154.759,136.259)" + id="g2259"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-fa03edd7-94b2-4808-ad00-70b12badf4e5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-54ec91f2-d1eb-4b65-9128-255ff5527fe4"> + <g + transform="translate(158.565,137.255)" + id="g2263"> + <path + style="stroke:none" + d="M 2.9375,-0.96875 H 2.71875 c 0,0.09375 -0.0625,0.40625 -0.140625,0.453125 -0.03125,0.03125 -0.453125,0.03125 -0.53125,0.03125 H 1.078125 C 1.40625,-0.71875 1.765625,-1 2.0625,-1.203125 c 0.453125,-0.3125 0.875,-0.59375 0.875,-1.125 0,-0.640625 -0.609375,-0.984375 -1.3125,-0.984375 -0.671875,0 -1.171875,0.375 -1.171875,0.875 0,0.25 0.21875,0.296875 0.296875,0.296875 0.125,0 0.28125,-0.09375 0.28125,-0.296875 0,-0.171875 -0.125,-0.28125 -0.28125,-0.28125 0.140625,-0.234375 0.4375,-0.375 0.765625,-0.375 0.484375,0 0.890625,0.28125 0.890625,0.765625 0,0.421875 -0.296875,0.75 -0.671875,1.0625 l -1.21875,1.03125 C 0.46875,-0.1875 0.453125,-0.1875 0.453125,-0.15625 V 0 h 2.3125 z m 0,0" + id="id-b20a4806-946f-4574-b7de-3c0e66b39dae" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3241" + transform="translate(-9.890387,-4.5650119)"> + <g + id="g3212"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-9" + cx="68.112495" + cy="82.236786" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,64.5709,79.9105)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{y}_{z_k}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-26"> + <defs + id="id-dd426ff9-7249-4fe5-ad49-8c73f7d9f037"> + <g + id="id-191a8d0d-801e-4c83-808c-0c3b14a8656f"> + <symbol + overflow="visible" + id="id-d2dbfc85-2301-46fd-9709-ae722299c440"> + <path + style="stroke:none" + d="" + id="id-bd2b6b64-d0bb-4bfd-9ee5-aa0162ccd436" /> + </symbol> + <symbol + overflow="visible" + id="id-8f6eda09-66ab-48f3-bdc5-3268f9982c5c"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-c26027ed-aa0b-445f-8a04-0b1d8586f076" /> + </symbol> + <symbol + overflow="visible" + id="id-e82a7900-b849-40c5-9d84-f91ba760191e"> + <path + style="stroke:none" + d="" + id="id-bdef97d3-91b2-431e-bcba-cd1dde53c3fd" /> + </symbol> + <symbol + overflow="visible" + id="id-96bf7acc-5861-4f0a-a6b4-5070340b1159"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-306b6f47-5f0b-477a-bc27-8fd1d14b7fd4" /> + </symbol> + <symbol + overflow="visible" + id="id-d6f36ceb-a70c-418b-b2f8-e2c8897f2e1f"> + <path + style="stroke:none" + d="" + id="id-d1c9ac07-f16e-48d4-9e4b-fcdc563bd700" /> + </symbol> + <symbol + overflow="visible" + id="id-6bdd5aca-01cb-4249-abb6-586c8fc56b95"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-bd1f25a0-c96b-4dcb-a3ff-50d4a65385e0" /> + </symbol> + </g> + </defs> + <g + id="id-9bd53b7e-64eb-47eb-aac8-3b28b0b544df" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-8a98d8ce-7feb-4c28-a5ce-32a6cc33db02"> + <g + transform="translate(148.712,134.765)" + id="g2798"> + <path + style="stroke:none" + d="m 5.046875,-3.75 c 0.0625,-0.140625 0.09375,-0.203125 0.734375,-0.203125 v -0.46875 C 5.546875,-4.40625 5.25,-4.390625 5,-4.390625 c -0.25,0 -0.703125,-0.03125 -0.90625,-0.03125 v 0.46875 c 0.015625,0 0.46875,0 0.46875,0.109375 0,0.015625 -0.046875,0.109375 -0.0625,0.125 L 3.359375,-1.265625 2.09375,-3.953125 H 2.625 v -0.46875 c -0.328125,0.015625 -1.21875,0.03125 -1.234375,0.03125 -0.28125,0 -0.71875,-0.03125 -1.125,-0.03125 v 0.46875 h 0.625 L 2.765625,0 2.53125,0.484375 C 2.3125,0.953125 2,1.640625 1.28125,1.640625 1.140625,1.640625 1.125,1.625 1.046875,1.59375 1.140625,1.5625 1.359375,1.421875 1.359375,1.0625 1.359375,0.734375 1.125,0.5 0.78125,0.5 0.515625,0.5 0.21875,0.6875 0.21875,1.078125 0.21875,1.578125 0.6875,2 1.28125,2 2.046875,2 2.625,1.375 2.90625,0.8125 Z m 0,0" + id="id-6dd91f69-45c4-455c-91b4-09d6301c4986" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-84e7ed14-ad3a-4fb5-b8a4-0244f6a9c440"> + <g + transform="translate(154.759,136.259)" + id="g2802"> + <path + style="stroke:none" + d="m 1.171875,-0.609375 c 0.1875,-0.1875 0.3125,-0.3125 0.890625,-0.796875 0.15625,-0.109375 0.671875,-0.53125 0.875,-0.71875 0.421875,-0.421875 0.6875,-0.78125 0.6875,-0.859375 0,-0.09375 -0.078125,-0.09375 -0.109375,-0.09375 -0.0625,0 -0.09375,0.015625 -0.125,0.078125 -0.21875,0.3125 -0.359375,0.421875 -0.53125,0.421875 -0.078125,0 -0.1875,0 -0.390625,-0.203125 -0.234375,-0.25 -0.390625,-0.296875 -0.546875,-0.296875 -0.5625,0 -0.9375,0.609375 -0.9375,0.8125 0,0.078125 0.0625,0.09375 0.109375,0.09375 0.09375,0 0.109375,-0.015625 0.125,-0.09375 0.109375,-0.25 0.5,-0.265625 0.609375,-0.265625 0.171875,0 0.34375,0.046875 0.4375,0.0625 0.390625,0.078125 0.4375,0.078125 0.609375,0.078125 -0.171875,0.203125 -0.296875,0.328125 -0.96875,0.84375 -0.546875,0.4375 -0.734375,0.609375 -0.859375,0.75 -0.421875,0.40625 -0.625,0.71875 -0.625,0.78125 0,0.078125 0.09375,0.078125 0.125,0.078125 0.0625,0 0.078125,0 0.109375,-0.0625 0.1875,-0.265625 0.40625,-0.421875 0.640625,-0.421875 0.09375,0 0.1875,0 0.375,0.171875 0.21875,0.21875 0.359375,0.3125 0.59375,0.3125 C 3,0.0625 3.46875,-0.78125 3.46875,-1.015625 3.46875,-1.09375 3.390625,-1.09375 3.359375,-1.09375 3.265625,-1.09375 3.25,-1.0625 3.21875,-0.984375 3.09375,-0.640625 2.6875,-0.46875 2.34375,-0.46875 2.1875,-0.46875 2,-0.515625 1.828125,-0.546875 1.515625,-0.625 1.453125,-0.625 1.328125,-0.625 c -0.015625,0 -0.109375,0 -0.15625,0.015625 z m 0,0" + id="id-4971546a-a3a0-4d8b-84c7-5fa4583361eb" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-c04b5388-16fc-459b-9339-37364a31ecab"> + <g + transform="translate(158.565,137.316)" + id="g2806"> + <path + style="stroke:none" + d="m 1.828125,-3.265625 c 0.03125,-0.078125 0.03125,-0.078125 0.03125,-0.109375 0,-0.078125 -0.078125,-0.078125 -0.15625,-0.078125 L 1.09375,-3.40625 c -0.09375,0 -0.109375,0 -0.125,0.03125 -0.015625,0.015625 -0.03125,0.078125 -0.03125,0.109375 0,0.078125 0.078125,0.078125 0.140625,0.078125 0.015625,0 0.09375,0 0.171875,0.015625 0.09375,0.015625 0.09375,0.03125 0.09375,0.0625 0,0.015625 0,0.03125 -0.015625,0.125 l -0.6875,2.75 C 0.625,-0.171875 0.625,-0.15625 0.625,-0.125 c 0,0.109375 0.078125,0.1875 0.1875,0.1875 0.1875,0 0.234375,-0.1875 0.25,-0.265625 l 0.234375,-0.90625 c 0.125,0 0.75,0.03125 0.75,0.390625 0,0.03125 0,0.046875 -0.015625,0.109375 -0.015625,0.078125 -0.015625,0.09375 -0.015625,0.125 0,0.359375 0.3125,0.546875 0.609375,0.546875 0.5,0 0.703125,-0.71875 0.703125,-0.78125 0,-0.0625 -0.078125,-0.0625 -0.109375,-0.0625 -0.078125,0 -0.09375,0.015625 -0.109375,0.109375 -0.046875,0.171875 -0.203125,0.5625 -0.46875,0.5625 -0.1875,0 -0.203125,-0.1875 -0.203125,-0.296875 0,0 0,-0.078125 0.015625,-0.15625 0.015625,-0.078125 0.03125,-0.140625 0.03125,-0.171875 0,-0.4375 -0.5625,-0.515625 -0.890625,-0.546875 0.140625,-0.078125 0.359375,-0.25 0.4375,-0.3125 0.28125,-0.21875 0.5625,-0.4375 0.84375,-0.4375 0.109375,0 0.140625,0.03125 0.171875,0.0625 0,0 -0.03125,0.015625 -0.046875,0.015625 -0.21875,0.078125 -0.21875,0.28125 -0.21875,0.296875 0,0.078125 0.0625,0.203125 0.21875,0.203125 0.09375,0 0.3125,-0.078125 0.3125,-0.359375 0,-0.234375 -0.1875,-0.390625 -0.4375,-0.390625 -0.328125,0 -0.625,0.234375 -0.984375,0.515625 -0.171875,0.140625 -0.34375,0.265625 -0.546875,0.359375 z m 0,0" + id="id-337d80fb-5433-41ca-b01f-ba48bbb16ee3" /> + </g> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,58.524851,62.464098)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8"> + <g + id="id-71316add-b757-483c-8195-02b65d505b23"> + <symbol + overflow="visible" + id="id-c8bc3666-affb-46c2-bef9-2fbbe8cb5a5b"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-16e8a8b6-0ef9-495f-bb2a-dad69d9a779f" /> + </symbol> + <symbol + overflow="visible" + id="id-42113c59-1a6b-4fa3-a92c-5a205e35714f"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-7e639714-71bd-465b-95ea-f8586e48e3fe" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f"> + <g + transform="translate(148.712,134.765)" + id="g3573"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be"> + <g + transform="translate(153.143,134.765)" + id="g3577"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8"> + <g + transform="translate(157.565,134.765)" + id="g3581"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3878" + transform="translate(-30.33987,0.01340608)"> + <g + id="g3262" + transform="translate(-4.3642598,-1.3114528)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1" + cx="92.458305" + cy="41.815311" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,89.9799,39.8165)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{1}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2"> + <defs + id="id-fe0395f9-cd9e-4370-972a-09b96d88acd1"> + <g + id="id-f71ea667-3b4d-4d21-ad1f-0ecb1dd3e484"> + <symbol + overflow="visible" + id="id-34dc3a3d-2276-4043-8291-b700fbc2dff1"> + <path + style="stroke:none" + d="" + id="id-9cccc023-3ff4-416e-878b-ddafd3dd0fcd" /> + </symbol> + <symbol + overflow="visible" + id="id-9bd60f18-4c4d-4ddd-b181-16f7a2d92fbc"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-d86d8910-8168-40a7-ac81-0c33df86ab0e" /> + </symbol> + <symbol + overflow="visible" + id="id-d9fa921e-ba7e-461c-9b85-204169b0b876"> + <path + style="stroke:none" + d="" + id="id-513ff48d-b30f-41d2-a80a-6d4ac5c4bdf2" /> + </symbol> + <symbol + overflow="visible" + id="id-ba38b8ec-61ee-49f7-aa7b-b60f1f54849e"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-99aee4ff-3e86-462c-8595-98407ac2efa0" /> + </symbol> + </g> + </defs> + <g + id="id-7457a538-d31c-4782-b54c-900abce06f81" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9046b2be-23a5-484a-aa3e-6ee99c22343e"> + <g + transform="translate(148.712,134.765)" + id="g3356"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-639a072d-d722-49fa-9a16-92456d870490" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-064cff21-d081-4fc0-8c9f-3ad5839426f9"> + <g + transform="translate(154.759,136.259)" + id="g3360"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-80e94a18-ccd4-4ad2-9c5c-5e4866b6db59" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3283" + transform="translate(-3.9925634,-4.8119651)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-1" + cx="92.086609" + cy="57.705132" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,89.5475,55.7064)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{2}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-5"> + <defs + id="id-77f68d2a-c2f9-48c8-8993-8efb8b34d9f5"> + <g + id="id-abe8a3bc-85ee-4f02-a887-c867e14959b8"> + <symbol + overflow="visible" + id="id-fbacd89e-2090-4b40-a74a-3dfe2fb70b5e"> + <path + style="stroke:none" + d="" + id="id-ecbe8803-8e5e-4431-855d-f86b824a37ac" /> + </symbol> + <symbol + overflow="visible" + id="id-67555b5d-488a-498e-aa6d-f0685007fa6a"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-45b8292f-2141-4717-8b93-13cc4b1e7600" /> + </symbol> + <symbol + overflow="visible" + id="id-1ff3e1b2-c563-4d19-8308-f34ee2684edc"> + <path + style="stroke:none" + d="" + id="id-332a3b9e-8bd7-485c-8536-1775c6ad0998" /> + </symbol> + <symbol + overflow="visible" + id="id-a04d510d-e57c-4217-a9e3-a98a6de9bd7a"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-033d1653-6b73-4c76-834d-982626218923" /> + </symbol> + </g> + </defs> + <g + id="id-d2e8e97e-f23d-45de-b147-830116cd626e" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-254e875d-a383-4b50-8a37-10e7c9445709"> + <g + transform="translate(148.712,134.765)" + id="g3884"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-c116ffb0-dfc7-45af-adac-3b5cd07f2b26" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ea7e390c-c93f-4488-b1dd-c7c5f9bfa3f0"> + <g + transform="translate(154.759,136.259)" + id="g3888"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-8bb5c526-c137-4e14-bf30-a590d6b27d3f" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g3304" + transform="translate(-2.4128744,1.5679074)"> + <circle + style="fill:none;stroke:#000000;stroke-width:0.414999;stop-color:#000000" + id="path833-1-1-9" + cx="90.50692" + cy="76.103867" + r="4.4921422" /> + <g + transform="matrix(0.5541,0,0,0.584984,87.0889,74.1052)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\mathbf{x}_{N}$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:inkscapeversion="1.0.2" + ns3:jacobian_sqrt="0.569332621935543" + id="g866-2-5-0"> + <defs + id="id-60b6648a-17d8-4c9f-babe-d2cc8e7a2b92"> + <g + id="id-505fedce-5614-4920-9da1-a16e0a782c8b"> + <symbol + overflow="visible" + id="id-83debd16-ddeb-4494-8c91-20135ca817ab"> + <path + style="stroke:none" + d="" + id="id-10392253-c7a5-44c1-b983-0c981604bc1a" /> + </symbol> + <symbol + overflow="visible" + id="id-ce12f4cb-7915-45f5-9078-f61e1273cb01"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-9a0d67a2-032d-4a9d-80ab-3ff8916e2a30" /> + </symbol> + <symbol + overflow="visible" + id="id-c4497416-eaf0-40cc-9e67-394437f3270e"> + <path + style="stroke:none" + d="" + id="id-71c066d5-98f1-4546-9369-b1ca0f220039" /> + </symbol> + <symbol + overflow="visible" + id="id-99fc2c53-022a-4bb8-bc47-ca77504fa07c"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-138fb327-4d56-45af-bfe7-27e73d6bd174" /> + </symbol> + </g> + </defs> + <g + id="id-1eda3810-3b2c-4771-9830-c066bd784ae9" + transform="translate(-148.931,-130.343)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5cac368a-b442-4fef-b8e7-fe85e02ccb68"> + <g + transform="translate(148.712,134.765)" + id="g4412"> + <path + style="stroke:none" + d="M 3.453125,-2.453125 4.609375,-3.75 C 4.75,-3.890625 4.8125,-3.953125 5.625,-3.953125 v -0.46875 c -0.34375,0.015625 -0.859375,0.03125 -0.90625,0.03125 -0.25,0 -0.75,-0.03125 -1.03125,-0.03125 v 0.46875 c 0.140625,0 0.265625,0.015625 0.375,0.078125 -0.03125,0.0625 -0.03125,0.09375 -0.078125,0.125 L 3.15625,-2.8125 2.171875,-3.953125 h 0.40625 v -0.46875 c -0.265625,0 -0.890625,0.03125 -1.21875,0.03125 -0.3125,0 -0.765625,-0.03125 -1.09375,-0.03125 v 0.46875 h 0.71875 L 2.53125,-2.125 1.21875,-0.65625 c -0.15625,0.1875 -0.515625,0.1875 -1,0.1875 V 0 c 0.34375,-0.015625 0.875,-0.03125 0.921875,-0.03125 0.25,0 0.828125,0.015625 1.015625,0.03125 v -0.46875 c -0.171875,0 -0.359375,-0.046875 -0.359375,-0.109375 0,-0.015625 0,-0.015625 0.0625,-0.09375 l 0.96875,-1.09375 1.09375,1.296875 H 3.53125 V 0 c 0.265625,-0.015625 0.875,-0.03125 1.203125,-0.03125 0.3125,0 0.765625,0.015625 1.09375,0.03125 V -0.46875 H 5.125 Z m 0,0" + id="id-ef3a3390-3e56-44a2-a42f-26c88efb896e" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-6454910b-7317-4b34-887b-30b4dcf24510"> + <g + transform="translate(154.759,136.259)" + id="g4416"> + <path + style="stroke:none" + d="M 5.8125,-4 C 5.875,-4.265625 6,-4.5 6.546875,-4.515625 c 0.03125,0 0.140625,0 0.140625,-0.140625 0,-0.046875 -0.03125,-0.109375 -0.109375,-0.109375 -0.21875,0 -0.484375,0.03125 -0.71875,0.03125 -0.171875,0 -0.5625,-0.03125 -0.734375,-0.03125 -0.03125,0 -0.140625,0 -0.140625,0.15625 0,0.09375 0.09375,0.09375 0.15625,0.09375 0.328125,0.015625 0.4375,0.125 0.4375,0.296875 0,0.046875 0,0.09375 -0.03125,0.15625 l -0.75,3.046875 -1.765625,-3.625 c -0.0625,-0.125 -0.078125,-0.125 -0.25,-0.125 H 1.828125 c -0.125,0 -0.21875,0 -0.21875,0.15625 0,0.09375 0.078125,0.09375 0.234375,0.09375 0.140625,0 0.296875,0.015625 0.4375,0.046875 L 1.359375,-0.75 c -0.0625,0.265625 -0.1875,0.484375 -0.734375,0.5 -0.046875,0 -0.140625,0 -0.140625,0.140625 C 0.484375,-0.03125 0.53125,0 0.578125,0 0.8125,0 1.078125,-0.03125 1.3125,-0.03125 1.484375,-0.03125 1.875,0 2.046875,0 2.125,0 2.1875,-0.03125 2.1875,-0.140625 2.1875,-0.25 2.109375,-0.25 2.03125,-0.25 c -0.4375,-0.015625 -0.4375,-0.203125 -0.4375,-0.296875 0,-0.03125 0,-0.0625 0.015625,-0.171875 l 0.90625,-3.5625 2.03125,4.15625 C 4.59375,0 4.625,0 4.703125,0 4.8125,0 4.8125,-0.015625 4.84375,-0.140625 Z m 0,0" + id="id-bcce5074-f926-4564-be67-9314782824d1" /> + </g> + </g> + </g> + </g> + </g> + <g + transform="matrix(0,0.569333,-0.569333,0,88.396788,62.464097)" + ns3:version="1.8.1" + ns3:texconverter="pdflatex" + ns3:pdfconverter="inkscape" + ns3:text="$\\dots$" + ns3:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns3:scale="1.613855830703636" + ns3:alignment="middle center" + ns3:stroke-to-path="0" + ns3:jacobian_sqrt="0.569333" + id="g3585-1"> + <defs + id="id-2d87e1eb-bc7d-4d81-9582-86bf8727c9c8-0"> + <g + id="g3668"> + <symbol + overflow="visible" + id="symbol3662"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path3660" /> + </symbol> + <symbol + overflow="visible" + id="symbol3666"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="path3664" /> + </symbol> + </g> + </defs> + <g + id="id-23aff8e1-1381-4a2c-abe7-6876395be91e-4" + transform="translate(-149.571,-133.702)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b54ebfc-dda4-4ec4-bcb2-23140a03764f-7"> + <g + transform="translate(148.712,134.765)" + id="g3573-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-72082536-97ab-43a3-b518-c109a83a7e12-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-cce936cb-daec-4765-a3e4-f9a896a5c2be-1"> + <g + transform="translate(153.143,134.765)" + id="g3577-7"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-10f522ad-8f94-43e2-a1c5-58b79872198f-5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-35f841a6-d98a-45f1-b1da-d546a3d5cbe8-9"> + <g + transform="translate(157.565,134.765)" + id="g3581-6"> + <path + style="stroke:none;stroke-width:0" + d="m 1.90625,-0.53125 c 0,-0.28125 -0.234375,-0.53125 -0.515625,-0.53125 -0.296875,0 -0.53125,0.25 -0.53125,0.53125 C 0.859375,-0.234375 1.09375,0 1.390625,0 1.671875,0 1.90625,-0.234375 1.90625,-0.53125 Z m 0,0" + id="id-0465aa74-fcdf-4786-a696-48e096109a98-2" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4270)" + d="m 62.113175,40.390646 18.588768,0.148211" + id="path4260" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4318)" + d="m 81.084009,52.969117 -18.356627,0.05513" + id="path4308" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4372)" + d="M 81.113378,77.401858 62.67106,77.753704" + id="path4362" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4432)" + d="M 62.065902,41.700487 80.97172,50.828768" + id="path4422" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4498)" + d="M 61.085219,56.07705 81.587701,74.497202" + id="path4488" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4570)" + d="M 82.377799,55.734693 62.118384,75.751012" + id="path4560" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4648)" + d="M 81.926913,42.831499 61.570586,50.069161" + id="path4638" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4732)" + d="M 61.043684,43.711029 83.776697,73.154867" + id="path4722" /> + <path + style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker4822)" + d="m 60.350672,74.205948 22.43012,-29.72668" + id="path4812" /> + </g> +</svg> diff --git a/doc/optimal_layout_report/figures/naive.pdf b/doc/optimal_layout_report/figures/naive.pdf Binary files differnew file mode 100644 index 00000000..f32e4273 --- /dev/null +++ b/doc/optimal_layout_report/figures/naive.pdf diff --git a/doc/optimal_layout_report/figures/naive.svg b/doc/optimal_layout_report/figures/naive.svg new file mode 100644 index 00000000..0a40c45f --- /dev/null +++ b/doc/optimal_layout_report/figures/naive.svg @@ -0,0 +1,3899 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + xmlns:ns4="http://www.iki.fi/pav/software/textext/" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="210mm" + height="297mm" + viewBox="0 0 210 297" + version="1.1" + id="svg8" + inkscape:version="1.0.2 (e86c870879, 2021-01-15)" + sodipodi:docname="naive.svg"> + <defs + id="defs2"> + <marker + style="overflow:visible" + id="Arrow1Sstart" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Sstart" + inkscape:isstock="true"> + <path + transform="scale(0.2) translate(6,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path16095" /> + </marker> + <marker + style="overflow:visible;" + id="Arrow1Send" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Send" + inkscape:isstock="true"> + <path + transform="scale(0.2) rotate(180) translate(6,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path16098" /> + </marker> + <marker + style="overflow:visible" + id="Arrow2Mstart" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow2Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.6) translate(0,0)" + d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " + style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" + id="path16107" /> + </marker> + <marker + style="overflow:visible" + id="Arrow1Mstart" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="Arrow1Mstart" + inkscape:isstock="true"> + <path + transform="scale(0.4) translate(10,0)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " + id="path16089" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill-rule:evenodd;fill:#ffffff;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z " + id="path943" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondLend" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="EmptyDiamondLend" + inkscape:isstock="true"> + <path + transform="scale(0.8) translate(-7,0)" + style="fill-rule:evenodd;fill:#ffffff;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 L -7.0710894,0 L 0,7.0710589 L 7.0710462,0 L 0,-7.0710768 z " + id="path961" /> + </marker> + <marker + style="overflow:visible" + id="marker1859" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1857" /> + </marker> + <marker + style="overflow:visible" + id="DotL" + refX="0.0" + refY="0.0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="scale(0.8) translate(7.4, 1)" + style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" + d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0 C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z " + id="path898" /> + </marker> + <marker + style="overflow:visible" + id="marker1207-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1205-3" /> + </marker> + <marker + style="overflow:visible" + id="marker1207-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1205-2" /> + </marker> + <marker + style="overflow:visible" + id="marker1207-5-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1205-3-1" /> + </marker> + <marker + style="overflow:visible" + id="marker1207-0" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1205-9" /> + </marker> + <marker + style="overflow:visible" + id="marker1207-5-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="DotL" + inkscape:isstock="true"> + <path + transform="matrix(0.8,0,0,0.8,5.92,0.8)" + style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z" + id="path1205-3-6" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-8" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6" /> + </marker> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-6"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-2"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-9" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-1"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-2" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-0" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-9"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-3" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="EmptyDiamondL-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-9" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-2" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-0" /> + </marker> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-2"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-28"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-97" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-3"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-6" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-2" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-93"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-1" /> + </symbol> + </g> + <g + id="g1774-6"> + <symbol + overflow="visible" + id="symbol1760-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1758-2" /> + </symbol> + <symbol + overflow="visible" + id="symbol1764-0"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path1762-6" /> + </symbol> + <symbol + overflow="visible" + id="symbol1768-1"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1766-5" /> + </symbol> + <symbol + overflow="visible" + id="symbol1772-5"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path1770-4" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="EmptyDiamondL-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-5" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-25" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-4" /> + </marker> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-8"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-6"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-8" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-8"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-4" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-1" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-4"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-9" /> + </symbol> + </g> + <g + id="g1774-8"> + <symbol + overflow="visible" + id="symbol1760-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1758-1" /> + </symbol> + <symbol + overflow="visible" + id="symbol1764-7"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path1762-2" /> + </symbol> + <symbol + overflow="visible" + id="symbol1768-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1766-2" /> + </symbol> + <symbol + overflow="visible" + id="symbol1772-2"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path1770-6" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="EmptyDiamondL-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-0" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-9" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-1" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-7-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-9-7" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-2-1" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-0-1" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-4-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-5-9" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-25-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-4-7" /> + </marker> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-3"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-4" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-81"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-29" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-39"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-08" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-8"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-5" /> + </symbol> + </g> + <g + id="g1774-4"> + <symbol + overflow="visible" + id="symbol1760-8"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1758-10" /> + </symbol> + <symbol + overflow="visible" + id="symbol1764-3"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path1762-0" /> + </symbol> + <symbol + overflow="visible" + id="symbol1768-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1766-4" /> + </symbol> + <symbol + overflow="visible" + id="symbol1772-4"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path1770-47" /> + </symbol> + </g> + <g + id="id-7b56b902-8866-4577-b5da-ecfb51bdf6f9-5"> + <symbol + overflow="visible" + id="id-3e5877d5-f4e1-472d-ad63-1055980d8386-7"> + <path + style="stroke:none" + d="" + id="id-f143eef6-d9a8-48f7-aca8-e6538b6fab70-4" /> + </symbol> + <symbol + overflow="visible" + id="id-0bc1646c-7d22-4518-85b7-7b4eb12d7991-1"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e28260b8-c5fd-4ceb-ae5e-454f1753865c-8" /> + </symbol> + <symbol + overflow="visible" + id="id-29f9d707-252a-4b91-b32f-da0fa5a665a9-5"> + <path + style="stroke:none" + d="" + id="id-5591ae31-445d-45f3-ae87-90c1426801c2-9" /> + </symbol> + <symbol + overflow="visible" + id="id-a02c79ac-4833-46e7-925f-e4a40d6224f1-7"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d0e16da0-84ab-4c10-885d-dd101d01d6bc-5" /> + </symbol> + </g> + <g + id="id-2b5d3ab8-df6d-4c56-84de-0c679fadd19e-3"> + <symbol + overflow="visible" + id="id-665acd82-83c0-47bf-9e6f-5812bd595525-8"> + <path + style="stroke:none" + d="" + id="id-802c0224-ca95-4fc3-b86b-e1dd6e515f4c-6" /> + </symbol> + <symbol + overflow="visible" + id="id-45128bd5-8125-471f-b95e-e1c8b9a9b715-0"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-c0d07a42-b161-466e-98fb-56a8a0c00c90-4" /> + </symbol> + <symbol + overflow="visible" + id="id-63ea8027-5e29-4fa5-b9db-e81d1c7a33cc-8"> + <path + style="stroke:none" + d="" + id="id-7140c39f-b29d-4f37-8556-9c617be6d2dd-8" /> + </symbol> + <symbol + overflow="visible" + id="id-4dd45505-10f1-44e6-9b72-7809753922eb-8"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-69043952-8323-4b78-b627-deb20a2b2221-9" /> + </symbol> + </g> + <g + id="id-69101753-94b7-4873-a3de-ba7b8209d990-4"> + <symbol + overflow="visible" + id="id-a4fedb3d-069b-4d70-83b1-ae1f2daa2385-0"> + <path + style="stroke:none" + d="" + id="id-3046391b-4187-4be6-a912-d0505a66eb38-5" /> + </symbol> + <symbol + overflow="visible" + id="id-be0e0a31-e1c3-4836-a7d1-2fc7dbdafac3-9"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-86d33dad-f2f7-418c-b83f-02f4c9bc7aeb-4" /> + </symbol> + <symbol + overflow="visible" + id="id-deb89c92-53c2-46ce-abcc-fe4828c3d78c-6"> + <path + style="stroke:none" + d="" + id="id-f8c129ac-9366-4d46-a498-a6af5a7b0df1-9" /> + </symbol> + <symbol + overflow="visible" + id="id-fcd4a719-1594-4896-89dd-9dd04b3dab86-2"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-1ec7f68d-30dc-4659-bb62-b9ac49b4a1b4-2" /> + </symbol> + </g> + <g + id="id-c9cd1e12-25e4-417c-a906-010fda19535d-3"> + <symbol + overflow="visible" + id="id-4d466315-5777-4e4e-9fc0-3db80afdf07d-6"> + <path + style="stroke:none" + d="" + id="id-152d50bf-2f53-40a8-b30b-f913378a3609-8" /> + </symbol> + <symbol + overflow="visible" + id="id-6cc5f286-cfc6-4c8a-ae12-29ffa839af48-0"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cf567697-b6cd-4f03-a190-84d8e40101b6-2" /> + </symbol> + <symbol + overflow="visible" + id="id-db2d4f7f-7daf-49c5-a630-3bda61f0be82-1"> + <path + style="stroke:none" + d="" + id="id-b4fd64dc-2d9f-4046-9b52-06c81f8758a4-0" /> + </symbol> + <symbol + overflow="visible" + id="id-b4ff667c-0374-498a-8386-69eef1264b90-5"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-a2e192af-e89c-416a-aec3-b76af30c1df0-1" /> + </symbol> + </g> + <marker + style="overflow:visible" + id="EmptyDiamondL-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-2" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-5" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-8" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-7-6" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-9-2" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-2-8" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-0-4" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-4-7" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-5-2" /> + </marker> + <marker + style="overflow:visible" + id="EmptyDiamondL-3-25-4" + refX="0" + refY="0" + orient="auto" + inkscape:stockid="EmptyDiamondL" + inkscape:isstock="true"> + <path + transform="scale(0.8)" + style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" + d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 Z" + id="path943-6-4-0" /> + </marker> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-1"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-1" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-10"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-3" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-4"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-03" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-91"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-96" /> + </symbol> + </g> + <g + id="g1774-67"> + <symbol + overflow="visible" + id="symbol1760-5"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1758-6" /> + </symbol> + <symbol + overflow="visible" + id="symbol1764-9"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path1762-8" /> + </symbol> + <symbol + overflow="visible" + id="symbol1768-72"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1766-8" /> + </symbol> + <symbol + overflow="visible" + id="symbol1772-29"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path1770-9" /> + </symbol> + </g> + <g + id="id-7b56b902-8866-4577-b5da-ecfb51bdf6f9-1"> + <symbol + overflow="visible" + id="id-3e5877d5-f4e1-472d-ad63-1055980d8386-4"> + <path + style="stroke:none" + d="" + id="id-f143eef6-d9a8-48f7-aca8-e6538b6fab70-9" /> + </symbol> + <symbol + overflow="visible" + id="id-0bc1646c-7d22-4518-85b7-7b4eb12d7991-10"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e28260b8-c5fd-4ceb-ae5e-454f1753865c-7" /> + </symbol> + <symbol + overflow="visible" + id="id-29f9d707-252a-4b91-b32f-da0fa5a665a9-58"> + <path + style="stroke:none" + d="" + id="id-5591ae31-445d-45f3-ae87-90c1426801c2-7" /> + </symbol> + <symbol + overflow="visible" + id="id-a02c79ac-4833-46e7-925f-e4a40d6224f1-0"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d0e16da0-84ab-4c10-885d-dd101d01d6bc-4" /> + </symbol> + </g> + <g + id="id-2b5d3ab8-df6d-4c56-84de-0c679fadd19e-0"> + <symbol + overflow="visible" + id="id-665acd82-83c0-47bf-9e6f-5812bd595525-5"> + <path + style="stroke:none" + d="" + id="id-802c0224-ca95-4fc3-b86b-e1dd6e515f4c-5" /> + </symbol> + <symbol + overflow="visible" + id="id-45128bd5-8125-471f-b95e-e1c8b9a9b715-2"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-c0d07a42-b161-466e-98fb-56a8a0c00c90-9" /> + </symbol> + <symbol + overflow="visible" + id="id-63ea8027-5e29-4fa5-b9db-e81d1c7a33cc-0"> + <path + style="stroke:none" + d="" + id="id-7140c39f-b29d-4f37-8556-9c617be6d2dd-2" /> + </symbol> + <symbol + overflow="visible" + id="id-4dd45505-10f1-44e6-9b72-7809753922eb-83"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-69043952-8323-4b78-b627-deb20a2b2221-8" /> + </symbol> + </g> + <g + id="id-69101753-94b7-4873-a3de-ba7b8209d990-9"> + <symbol + overflow="visible" + id="id-a4fedb3d-069b-4d70-83b1-ae1f2daa2385-9"> + <path + style="stroke:none" + d="" + id="id-3046391b-4187-4be6-a912-d0505a66eb38-3" /> + </symbol> + <symbol + overflow="visible" + id="id-be0e0a31-e1c3-4836-a7d1-2fc7dbdafac3-6"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-86d33dad-f2f7-418c-b83f-02f4c9bc7aeb-0" /> + </symbol> + <symbol + overflow="visible" + id="id-deb89c92-53c2-46ce-abcc-fe4828c3d78c-5"> + <path + style="stroke:none" + d="" + id="id-f8c129ac-9366-4d46-a498-a6af5a7b0df1-0" /> + </symbol> + <symbol + overflow="visible" + id="id-fcd4a719-1594-4896-89dd-9dd04b3dab86-29"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-1ec7f68d-30dc-4659-bb62-b9ac49b4a1b4-4" /> + </symbol> + </g> + <g + id="id-c9cd1e12-25e4-417c-a906-010fda19535d-2"> + <symbol + overflow="visible" + id="id-4d466315-5777-4e4e-9fc0-3db80afdf07d-2"> + <path + style="stroke:none" + d="" + id="id-152d50bf-2f53-40a8-b30b-f913378a3609-6" /> + </symbol> + <symbol + overflow="visible" + id="id-6cc5f286-cfc6-4c8a-ae12-29ffa839af48-4"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cf567697-b6cd-4f03-a190-84d8e40101b6-1" /> + </symbol> + <symbol + overflow="visible" + id="id-db2d4f7f-7daf-49c5-a630-3bda61f0be82-2"> + <path + style="stroke:none" + d="" + id="id-b4fd64dc-2d9f-4046-9b52-06c81f8758a4-8" /> + </symbol> + <symbol + overflow="visible" + id="id-b4ff667c-0374-498a-8386-69eef1264b90-8"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-a2e192af-e89c-416a-aec3-b76af30c1df0-9" /> + </symbol> + </g> + <g + id="id-6665708f-288d-4525-92eb-a06c4892867b-3"> + <symbol + overflow="visible" + id="id-dd44434a-953f-4b45-92a4-9abe7ef9d3ae-8"> + <path + style="stroke:none" + d="" + id="id-9ac9378b-2d2d-440f-a1d5-af260cb7e544-0" /> + </symbol> + <symbol + overflow="visible" + id="id-dbde01f5-f4e2-40b7-88a3-b8851429abee-4"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-d843451a-a637-4d3a-943f-db8d14113881-7" /> + </symbol> + <symbol + overflow="visible" + id="id-1043abfb-ae0c-4c87-a0c9-f8e738a6eda9-6"> + <path + style="stroke:none" + d="" + id="id-85cedea2-f5e6-4191-adf4-ded1c4c32acc-8" /> + </symbol> + <symbol + overflow="visible" + id="id-7e05db1f-d678-46b2-9ab7-e9f2a82049bc-9"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-67bf08a2-065c-450a-8490-b9d084062846-0" /> + </symbol> + </g> + <g + id="id-7b56b902-8866-4577-b5da-ecfb51bdf6f9-6"> + <symbol + overflow="visible" + id="id-3e5877d5-f4e1-472d-ad63-1055980d8386-5"> + <path + style="stroke:none" + d="" + id="id-f143eef6-d9a8-48f7-aca8-e6538b6fab70-2" /> + </symbol> + <symbol + overflow="visible" + id="id-0bc1646c-7d22-4518-85b7-7b4eb12d7991-6"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e28260b8-c5fd-4ceb-ae5e-454f1753865c-5" /> + </symbol> + <symbol + overflow="visible" + id="id-29f9d707-252a-4b91-b32f-da0fa5a665a9-8"> + <path + style="stroke:none" + d="" + id="id-5591ae31-445d-45f3-ae87-90c1426801c2-79" /> + </symbol> + <symbol + overflow="visible" + id="id-a02c79ac-4833-46e7-925f-e4a40d6224f1-6"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d0e16da0-84ab-4c10-885d-dd101d01d6bc-0" /> + </symbol> + </g> + <g + id="id-0e4d47f0-68c0-4acd-9fe2-14ede5ac4464-2"> + <symbol + overflow="visible" + id="id-4c254f50-cdc5-4053-83de-01ff30672e43-4"> + <path + style="stroke:none" + d="" + id="id-7fbf67cc-4273-4944-be5b-4ab85569977e-7" /> + </symbol> + <symbol + overflow="visible" + id="id-1efbc5ff-fb42-4154-a235-97d4578b6849-9"> + <path + style="stroke:none" + d="m 4.25,-6.046875 c 0.078125,-0.28125 0.109375,-0.34375 0.234375,-0.375 0.09375,-0.015625 0.421875,-0.015625 0.625,-0.015625 1.015625,0 1.453125,0.03125 1.453125,0.8125 0,0.15625 -0.03125,0.546875 -0.078125,0.796875 0,0.046875 -0.03125,0.15625 -0.03125,0.1875 0,0.0625 0.03125,0.140625 0.125,0.140625 0.109375,0 0.125,-0.078125 0.15625,-0.234375 L 7,-6.46875 C 7.015625,-6.515625 7.015625,-6.609375 7.015625,-6.640625 7.015625,-6.75 6.921875,-6.75 6.75,-6.75 H 1.21875 c -0.234375,0 -0.25,0.015625 -0.328125,0.203125 l -0.59375,1.75 c 0,0.015625 -0.0625,0.15625 -0.0625,0.1875 0,0.046875 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.171875,-0.21875 C 1.0625,-6.265625 1.328125,-6.4375 2.796875,-6.4375 H 3.1875 c 0.28125,0 0.28125,0.03125 0.28125,0.125 0,0.046875 -0.03125,0.171875 -0.046875,0.203125 L 2.09375,-0.78125 C 2,-0.421875 1.96875,-0.3125 0.90625,-0.3125 c -0.359375,0 -0.421875,0 -0.421875,0.1875 C 0.484375,0 0.59375,0 0.65625,0 c 0.265625,0 0.546875,-0.015625 0.8125,-0.015625 0.28125,0 0.578125,-0.015625 0.859375,-0.015625 0.28125,0 0.546875,0.015625 0.828125,0.015625 C 3.4375,-0.015625 3.734375,0 4.015625,0 c 0.09375,0 0.21875,0 0.21875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.34375,-0.109375 -0.234375,0 -0.375,0 -0.625,-0.015625 -0.296875,-0.03125 -0.375,-0.0625 -0.375,-0.21875 0,-0.015625 0,-0.0625 0.046875,-0.203125 z m 0,0" + id="id-62288179-3c36-4f09-83a2-0ed7f09ba897-3" /> + </symbol> + <symbol + overflow="visible" + id="id-510b55d0-476a-49c1-a6bf-4c152294ca51-9"> + <path + style="stroke:none" + d="" + id="id-14281c3c-de0f-4bf7-979b-05462753b978-2" /> + </symbol> + <symbol + overflow="visible" + id="id-5a487d30-b5c6-4679-bdc4-81122ed9a222-8"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-f6397913-560e-447a-9a39-8fb9345d39da-3" /> + </symbol> + </g> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944-25"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59-49" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0-9"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0-45" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e-9"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a-3" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04-5"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1-7" /> + </symbol> + </g> + <g + id="id-7b56b902-8866-4577-b5da-ecfb51bdf6f9-4"> + <symbol + overflow="visible" + id="id-3e5877d5-f4e1-472d-ad63-1055980d8386-9"> + <path + style="stroke:none" + d="" + id="id-f143eef6-d9a8-48f7-aca8-e6538b6fab70-0" /> + </symbol> + <symbol + overflow="visible" + id="id-0bc1646c-7d22-4518-85b7-7b4eb12d7991-2"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e28260b8-c5fd-4ceb-ae5e-454f1753865c-0" /> + </symbol> + <symbol + overflow="visible" + id="id-29f9d707-252a-4b91-b32f-da0fa5a665a9-1"> + <path + style="stroke:none" + d="" + id="id-5591ae31-445d-45f3-ae87-90c1426801c2-96" /> + </symbol> + <symbol + overflow="visible" + id="id-a02c79ac-4833-46e7-925f-e4a40d6224f1-2"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d0e16da0-84ab-4c10-885d-dd101d01d6bc-1" /> + </symbol> + </g> + <g + id="id-80d0c048-18de-47d6-bfc7-08ad18ee361d-6"> + <symbol + overflow="visible" + id="id-0b41afc7-0269-4345-80f4-73e127106311-0"> + <path + style="stroke:none" + d="" + id="id-d5da8a58-3faf-4451-99b0-0e50003f15d3-7" /> + </symbol> + <symbol + overflow="visible" + id="id-2552d758-fbbf-48fb-affb-9e7622950e3c-0"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-f0bc5016-44ee-4794-9fe2-874250c11cf2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-959192e1-f39b-46c7-b889-6c49823038ed-0"> + <path + style="stroke:none" + d="" + id="id-abe6214d-e31f-4809-a6dc-f03361f3ede2-1" /> + </symbol> + <symbol + overflow="visible" + id="id-e1bcded8-43f1-4baa-88a5-aa6664cf553d-3"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-15fad481-e040-42b9-b454-1cb36a130bda-7" /> + </symbol> + </g> + <g + id="id-58e655c1-8382-470a-9d30-c856c8d47107-0"> + <symbol + overflow="visible" + id="id-eacff867-bae7-4f05-8147-5a0a0850a787-9"> + <path + style="stroke:none" + d="" + id="id-e1da6a9e-b798-4bf4-9526-5fe15a382a9a-9" /> + </symbol> + <symbol + overflow="visible" + id="id-93de29de-8e47-4925-bf1a-77e11a33af88-4"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-9b6737f7-7c76-4c92-82bf-40adcbd0a534-5" /> + </symbol> + <symbol + overflow="visible" + id="id-166f4abf-05fb-4225-bff5-749abbd2921f-1"> + <path + style="stroke:none" + d="" + id="id-7b3db869-b56d-4869-b6d0-5d0d8c4f2832-0" /> + </symbol> + <symbol + overflow="visible" + id="id-920e9399-0d69-4778-a1ad-35041055e881-3"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-974d6e0e-058a-47a7-b230-b3f0eccf444e-7" /> + </symbol> + </g> + <g + id="id-403f0fcb-9231-45b1-ba08-fe6df0c2bd39-9"> + <symbol + overflow="visible" + id="id-40bb89fa-8c9b-4055-91a5-b73eb4851746-7"> + <path + style="stroke:none" + d="" + id="id-1da14606-4367-4846-b434-83c9a10207ad-5" /> + </symbol> + <symbol + overflow="visible" + id="id-64ce4c64-992f-4473-82d4-f6ea7455d26e-9"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-10a6d073-3fb3-45a2-9938-8e22ba58f149-7" /> + </symbol> + <symbol + overflow="visible" + id="id-1226aa72-1baa-43b0-be73-9087e3732b3b-8"> + <path + style="stroke:none" + d="" + id="id-0ddb7887-1442-45f7-85b1-af0a13b33663-5" /> + </symbol> + <symbol + overflow="visible" + id="id-3ba0bf37-aa3f-4821-9e62-5ea1d38e4615-3"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-7614f977-d54d-4c9f-bde2-e75fb14a262a-3" /> + </symbol> + </g> + <g + id="id-3cca11b4-b384-4dca-bab9-0c5b627b3fda-1"> + <symbol + overflow="visible" + id="id-3a750352-64b3-4848-9913-0cbd337b18bc-9"> + <path + style="stroke:none" + d="" + id="id-747173a5-7de2-43a2-9f83-1520f86f8155-0" /> + </symbol> + <symbol + overflow="visible" + id="id-ee8e1e3f-1333-4d7a-9a80-f2c7d6f2d1e2-9"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-02968750-3f82-477e-9a47-eb724c8d6ee6-8" /> + </symbol> + <symbol + overflow="visible" + id="id-04bd2ca3-5f10-42f5-9f40-4022a20d3618-8"> + <path + style="stroke:none" + d="" + id="id-98661886-6776-41a7-8535-26655917b4bb-5" /> + </symbol> + <symbol + overflow="visible" + id="id-8385a096-ba68-47b9-8b6f-9ad8c3771eab-8"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-dd347ed4-e532-45ce-b476-4c311032035e-4" /> + </symbol> + </g> + <g + id="id-d544a572-2ec5-4862-9dec-d406cf600b8b-9"> + <symbol + overflow="visible" + id="id-88596d14-ec3c-419c-bc9d-6063019eedf3-3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-e61318e7-f47a-47dd-9fac-ead51f3b0435-2" /> + </symbol> + <symbol + overflow="visible" + id="id-f44ab54a-f016-472f-b3b5-97e652bbfd86-4"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-54332ba6-b4cc-49aa-bea0-18799db7d422-3" /> + </symbol> + <symbol + overflow="visible" + id="id-91d4680b-37b1-426a-9dcf-eaa1baf39aa6-7"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-4914b0b6-0260-4241-95ad-39004a7d616a-1" /> + </symbol> + <symbol + overflow="visible" + id="id-ffdbe191-2ee9-4d56-a9c6-8bffb7cf6f44-2"> + <path + style="stroke:none;stroke-width:0" + d="m 3.734375,-4.203125 c 0.0625,-0.09375 0.0625,-0.109375 0.0625,-0.28125 H 1.96875 C 1.6875,-4.484375 1.609375,-4.5 1.359375,-4.515625 1,-4.546875 0.984375,-4.59375 0.96875,-4.703125 H 0.734375 l -0.25,1.484375 H 0.71875 c 0.015625,-0.109375 0.09375,-0.5625 0.203125,-0.640625 0.046875,-0.03125 0.625,-0.03125 0.71875,-0.03125 H 3.15625 c -0.21875,0.28125 -0.578125,0.71875 -0.71875,0.921875 -0.90625,1.1875 -1,2.296875 -1,2.703125 0,0.078125 0,0.40625 0.328125,0.40625 0.34375,0 0.34375,-0.3125 0.34375,-0.40625 v -0.28125 c 0,-1.34375 0.28125,-1.96875 0.578125,-2.34375 z m 0,0" + id="id-09b10cdf-2f0e-4eea-8c88-95250998a53c-2" /> + </symbol> + </g> + </defs> + <sodipodi:namedview + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="2.7884842" + inkscape:cx="274.05049" + inkscape:cy="335.18314" + inkscape:document-units="mm" + inkscape:current-layer="g1667-7-3-6" + inkscape:document-rotation="0" + showgrid="false" + inkscape:window-width="1920" + inkscape:window-height="992" + inkscape:window-x="0" + inkscape:window-y="32" + inkscape:window-maximized="1" /> + <metadata + id="metadata5"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title /> + </cc:Work> + </rdf:RDF> + </metadata> + <g + inkscape:label="Layer 1" + inkscape:groupmode="layer" + id="layer1"> + <g + id="g1667-7-4" + transform="translate(49.9217, -0.111288)"> + <g + id="g3888-62" + transform="translate(-0.207162, 14.6917)"> + <g + id="g1667-2-1" + transform="translate(-28.47048,-0.98227303)"> + <g + transform="matrix(0.33334,0,0,0.33334,44.673856,76.997332)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$N$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-9-3"> + <defs + id="id-4290d6c4-65ca-47bc-982b-dd1a8fe13f21"> + <g + id="id-2c514563-f61d-45b1-b16a-412f9e3f02b8"> + <symbol + overflow="visible" + id="id-9d908648-8efd-4d55-94e5-ecd20bf0a074"> + <path + style="stroke:none" + d="" + id="id-da69a5dd-c8eb-4da6-91d8-09c539e59309" /> + </symbol> + <symbol + overflow="visible" + id="id-580e16f1-3b7c-492e-81b0-f59eb1c97dc9"> + <path + style="stroke:none" + d="M 7.53125,-5.765625 C 7.640625,-6.15625 7.8125,-6.46875 8.609375,-6.5 c 0.046875,0 0.171875,-0.015625 0.171875,-0.203125 0,0 0,-0.109375 -0.125,-0.109375 -0.328125,0 -0.6875,0.03125 -1.015625,0.03125 -0.328125,0 -0.6875,-0.03125 -1.015625,-0.03125 -0.0625,0 -0.171875,0 -0.171875,0.203125 C 6.453125,-6.5 6.546875,-6.5 6.625,-6.5 c 0.578125,0.015625 0.6875,0.21875 0.6875,0.4375 0,0.03125 -0.03125,0.1875 -0.03125,0.203125 l -1.125,4.4375 L 3.953125,-6.625 C 3.875,-6.796875 3.875,-6.8125 3.640625,-6.8125 h -1.34375 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.046875,0 0.671875,0 0.671875,0.09375 L 1.640625,-1.0625 c -0.109375,0.40625 -0.28125,0.71875 -1.078125,0.75 -0.0625,0 -0.171875,0.015625 -0.171875,0.203125 0,0.0625 0.046875,0.109375 0.125,0.109375 0.328125,0 0.671875,-0.03125 1,-0.03125 C 1.859375,-0.03125 2.21875,0 2.546875,0 2.59375,0 2.71875,0 2.71875,-0.203125 2.71875,-0.296875 2.625,-0.3125 2.515625,-0.3125 1.9375,-0.328125 1.859375,-0.546875 1.859375,-0.75 c 0,-0.0625 0.015625,-0.125 0.046875,-0.234375 l 1.3125,-5.25 C 3.265625,-6.1875 3.265625,-6.15625 3.3125,-6.0625 l 2.484375,5.875 C 5.859375,-0.015625 5.890625,0 5.984375,0 6.09375,0 6.09375,-0.03125 6.140625,-0.203125 Z m 0,0" + id="id-4b408017-1859-4d5f-8d21-f61b0e610caa" /> + </symbol> + </g> + </defs> + <g + id="id-3997685d-9ea3-49d1-9b6c-1e3df8746a63" + transform="translate(-149.103,-127.953)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-5b6ea8ec-783d-4885-8db9-3e6206d128dd"> + <g + transform="translate(148.712,134.765)" + id="g17770"> + <path + style="stroke:none" + d="M 7.53125,-5.765625 C 7.640625,-6.15625 7.8125,-6.46875 8.609375,-6.5 c 0.046875,0 0.171875,-0.015625 0.171875,-0.203125 0,0 0,-0.109375 -0.125,-0.109375 -0.328125,0 -0.6875,0.03125 -1.015625,0.03125 -0.328125,0 -0.6875,-0.03125 -1.015625,-0.03125 -0.0625,0 -0.171875,0 -0.171875,0.203125 C 6.453125,-6.5 6.546875,-6.5 6.625,-6.5 c 0.578125,0.015625 0.6875,0.21875 0.6875,0.4375 0,0.03125 -0.03125,0.1875 -0.03125,0.203125 l -1.125,4.4375 L 3.953125,-6.625 C 3.875,-6.796875 3.875,-6.8125 3.640625,-6.8125 h -1.34375 c -0.1875,0 -0.28125,0 -0.28125,0.203125 0,0.109375 0.09375,0.109375 0.28125,0.109375 0.046875,0 0.671875,0 0.671875,0.09375 L 1.640625,-1.0625 c -0.109375,0.40625 -0.28125,0.71875 -1.078125,0.75 -0.0625,0 -0.171875,0.015625 -0.171875,0.203125 0,0.0625 0.046875,0.109375 0.125,0.109375 0.328125,0 0.671875,-0.03125 1,-0.03125 C 1.859375,-0.03125 2.21875,0 2.546875,0 2.59375,0 2.71875,0 2.71875,-0.203125 2.71875,-0.296875 2.625,-0.3125 2.515625,-0.3125 1.9375,-0.328125 1.859375,-0.546875 1.859375,-0.75 c 0,-0.0625 0.015625,-0.125 0.046875,-0.234375 l 1.3125,-5.25 C 3.265625,-6.1875 3.265625,-6.15625 3.3125,-6.0625 l 2.484375,5.875 C 5.859375,-0.015625 5.890625,0 5.984375,0 6.09375,0 6.09375,-0.03125 6.140625,-0.203125 Z m 0,0" + id="id-de270731-cb0e-45ea-9dc6-f080a2842866" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g18569"> + <g + id="g3888" + transform="translate(9.3749998e-7,-14.6917)"> + <g + id="g1667" + transform="translate(-49.921698,0.11128778)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197" /> + <g + transform="matrix(0.33334017,0,0,0.33334017,41.326272,68.878231)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_1$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="1.0" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.352778" + id="g1620"> + <defs + id="id-1a34d974-d0d9-4ad5-944d-0c45f52863cb"> + <g + id="id-bff70df4-6322-4cef-b2f2-eb529fa18944"> + <symbol + overflow="visible" + id="id-bf511177-5ad3-4f29-8068-1cfd33c05d66"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-b65f5d62-bdbe-425c-b3f2-2e340f258b59" /> + </symbol> + <symbol + overflow="visible" + id="id-16eb84ac-14b0-4bd3-a0f6-9f965ee31cd0"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cee4ec54-27ef-45a2-b751-fd07d9e838e0" /> + </symbol> + <symbol + overflow="visible" + id="id-9a0f12f5-22d3-4c59-ab65-b00f783cf86e"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-3b000875-96d2-4155-9b0c-e63bba75f62a" /> + </symbol> + <symbol + overflow="visible" + id="id-dfe71ac3-1330-45aa-a1b7-6592aa5cbd04"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-32a2e394-a19b-40ce-a1b4-0551d665a7d1" /> + </symbol> + </g> + </defs> + <g + id="id-f0b3a1d5-8944-4bc7-95dc-bf25189f01bb" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-b5311cac-bf5c-4bdd-becd-ecdc7c3216fa"> + <g + transform="translate(148.712,134.765)" + id="g1612"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-dd956fe5-fe9f-4f17-a859-c8b8906f72fb" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b6ee06aa-cf47-4a4d-a61a-df047b77ac93"> + <g + transform="translate(153.541,136.259)" + id="g1616"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-125afcb3-4406-49b5-bdd4-0c13fee87b9d" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334017,0,0,0.33334017,111.76877,73.279525)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_1$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="1.0" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.352778" + id="g1620-4"> + <defs + id="id-1a34d974-d0d9-4ad5-944d-0c45f52863cb-9"> + <g + id="g20750"> + <symbol + overflow="visible" + id="symbol20736"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path20734" /> + </symbol> + <symbol + overflow="visible" + id="symbol20740"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path20738" /> + </symbol> + <symbol + overflow="visible" + id="symbol20744"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path20742" /> + </symbol> + <symbol + overflow="visible" + id="symbol20748"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path20746" /> + </symbol> + </g> + </defs> + <g + id="id-f0b3a1d5-8944-4bc7-95dc-bf25189f01bb-0" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-b5311cac-bf5c-4bdd-becd-ecdc7c3216fa-8"> + <g + transform="translate(148.712,134.765)" + id="g1612-1"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-dd956fe5-fe9f-4f17-a859-c8b8906f72fb-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b6ee06aa-cf47-4a4d-a61a-df047b77ac93-9"> + <g + transform="translate(153.541,136.259)" + id="g1616-7"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-125afcb3-4406-49b5-bdd4-0c13fee87b9d-82" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-7" + transform="translate(-39.975231,0.10828665)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5" /> + <g + transform="matrix(0.33334017,0,0,0.33334017,41.326272,68.878231)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_1$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="1.0" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.352778" + id="g1620-3"> + <defs + id="id-1a34d974-d0d9-4ad5-944d-0c45f52863cb-5"> + <g + id="g1774"> + <symbol + overflow="visible" + id="symbol1760"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1758" /> + </symbol> + <symbol + overflow="visible" + id="symbol1764"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path1762" /> + </symbol> + <symbol + overflow="visible" + id="symbol1768"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path1766" /> + </symbol> + <symbol + overflow="visible" + id="symbol1772"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="path1770" /> + </symbol> + </g> + </defs> + <g + id="id-f0b3a1d5-8944-4bc7-95dc-bf25189f01bb-6" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-b5311cac-bf5c-4bdd-becd-ecdc7c3216fa-0"> + <g + transform="translate(148.712,134.765)" + id="g1612-6"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-dd956fe5-fe9f-4f17-a859-c8b8906f72fb-2" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-b6ee06aa-cf47-4a4d-a61a-df047b77ac93-6"> + <g + transform="translate(153.541,136.259)" + id="g1616-1"> + <path + style="stroke:none;stroke-width:0" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-125afcb3-4406-49b5-bdd4-0c13fee87b9d-8" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-2" + transform="translate(-29.98968,0.07606031)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-7)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-3" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2898,68.8781)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_2\n$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7"> + <defs + id="id-7cf824c2-7ff5-49d6-8bed-941e7a5aefec"> + <g + id="id-7b56b902-8866-4577-b5da-ecfb51bdf6f9"> + <symbol + overflow="visible" + id="id-3e5877d5-f4e1-472d-ad63-1055980d8386"> + <path + style="stroke:none" + d="" + id="id-f143eef6-d9a8-48f7-aca8-e6538b6fab70" /> + </symbol> + <symbol + overflow="visible" + id="id-0bc1646c-7d22-4518-85b7-7b4eb12d7991"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e28260b8-c5fd-4ceb-ae5e-454f1753865c" /> + </symbol> + <symbol + overflow="visible" + id="id-29f9d707-252a-4b91-b32f-da0fa5a665a9"> + <path + style="stroke:none" + d="" + id="id-5591ae31-445d-45f3-ae87-90c1426801c2" /> + </symbol> + <symbol + overflow="visible" + id="id-a02c79ac-4833-46e7-925f-e4a40d6224f1"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-d0e16da0-84ab-4c10-885d-dd101d01d6bc" /> + </symbol> + </g> + </defs> + <g + id="id-90ea81d7-bf52-46d0-9b5e-dbcb09168ef4" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9383a849-76eb-46cc-924e-f9b3d0ebd129"> + <g + transform="translate(148.712,134.765)" + id="g2859"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-74dc01ba-8081-4c65-b7c5-1c03d07fab43" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-278c94cd-4ffd-4318-b8bb-c423dcf2ce61"> + <g + transform="translate(153.541,136.259)" + id="g2863"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-68b1e3e5-95b7-423c-85b4-21aeb97ec453" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,20.9648,60.152967)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$T_1$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-73"> + <defs + id="id-71b7de40-aaac-4962-891c-50784b77b859"> + <g + id="id-0e4d47f0-68c0-4acd-9fe2-14ede5ac4464"> + <symbol + overflow="visible" + id="id-4c254f50-cdc5-4053-83de-01ff30672e43"> + <path + style="stroke:none" + d="" + id="id-7fbf67cc-4273-4944-be5b-4ab85569977e" /> + </symbol> + <symbol + overflow="visible" + id="id-1efbc5ff-fb42-4154-a235-97d4578b6849"> + <path + style="stroke:none" + d="m 4.25,-6.046875 c 0.078125,-0.28125 0.109375,-0.34375 0.234375,-0.375 0.09375,-0.015625 0.421875,-0.015625 0.625,-0.015625 1.015625,0 1.453125,0.03125 1.453125,0.8125 0,0.15625 -0.03125,0.546875 -0.078125,0.796875 0,0.046875 -0.03125,0.15625 -0.03125,0.1875 0,0.0625 0.03125,0.140625 0.125,0.140625 0.109375,0 0.125,-0.078125 0.15625,-0.234375 L 7,-6.46875 C 7.015625,-6.515625 7.015625,-6.609375 7.015625,-6.640625 7.015625,-6.75 6.921875,-6.75 6.75,-6.75 H 1.21875 c -0.234375,0 -0.25,0.015625 -0.328125,0.203125 l -0.59375,1.75 c 0,0.015625 -0.0625,0.15625 -0.0625,0.1875 0,0.046875 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.171875,-0.21875 C 1.0625,-6.265625 1.328125,-6.4375 2.796875,-6.4375 H 3.1875 c 0.28125,0 0.28125,0.03125 0.28125,0.125 0,0.046875 -0.03125,0.171875 -0.046875,0.203125 L 2.09375,-0.78125 C 2,-0.421875 1.96875,-0.3125 0.90625,-0.3125 c -0.359375,0 -0.421875,0 -0.421875,0.1875 C 0.484375,0 0.59375,0 0.65625,0 c 0.265625,0 0.546875,-0.015625 0.8125,-0.015625 0.28125,0 0.578125,-0.015625 0.859375,-0.015625 0.28125,0 0.546875,0.015625 0.828125,0.015625 C 3.4375,-0.015625 3.734375,0 4.015625,0 c 0.09375,0 0.21875,0 0.21875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.34375,-0.109375 -0.234375,0 -0.375,0 -0.625,-0.015625 -0.296875,-0.03125 -0.375,-0.0625 -0.375,-0.21875 0,-0.015625 0,-0.0625 0.046875,-0.203125 z m 0,0" + id="id-62288179-3c36-4f09-83a2-0ed7f09ba897" /> + </symbol> + <symbol + overflow="visible" + id="id-510b55d0-476a-49c1-a6bf-4c152294ca51"> + <path + style="stroke:none" + d="" + id="id-14281c3c-de0f-4bf7-979b-05462753b978" /> + </symbol> + <symbol + overflow="visible" + id="id-5a487d30-b5c6-4679-bdc4-81122ed9a222"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-f6397913-560e-447a-9a39-8fb9345d39da" /> + </symbol> + </g> + </defs> + <g + id="id-c9a8c9ba-efc9-422f-b652-a044adf16cc6" + transform="translate(-148.946,-128.015)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-fb1b0af0-65ba-4c03-92a9-ba60679702a2"> + <g + transform="translate(148.712,134.765)" + id="g19527"> + <path + style="stroke:none" + d="m 4.25,-6.046875 c 0.078125,-0.28125 0.109375,-0.34375 0.234375,-0.375 0.09375,-0.015625 0.421875,-0.015625 0.625,-0.015625 1.015625,0 1.453125,0.03125 1.453125,0.8125 0,0.15625 -0.03125,0.546875 -0.078125,0.796875 0,0.046875 -0.03125,0.15625 -0.03125,0.1875 0,0.0625 0.03125,0.140625 0.125,0.140625 0.109375,0 0.125,-0.078125 0.15625,-0.234375 L 7,-6.46875 C 7.015625,-6.515625 7.015625,-6.609375 7.015625,-6.640625 7.015625,-6.75 6.921875,-6.75 6.75,-6.75 H 1.21875 c -0.234375,0 -0.25,0.015625 -0.328125,0.203125 l -0.59375,1.75 c 0,0.015625 -0.0625,0.15625 -0.0625,0.1875 0,0.046875 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.171875,-0.21875 C 1.0625,-6.265625 1.328125,-6.4375 2.796875,-6.4375 H 3.1875 c 0.28125,0 0.28125,0.03125 0.28125,0.125 0,0.046875 -0.03125,0.171875 -0.046875,0.203125 L 2.09375,-0.78125 C 2,-0.421875 1.96875,-0.3125 0.90625,-0.3125 c -0.359375,0 -0.421875,0 -0.421875,0.1875 C 0.484375,0 0.59375,0 0.65625,0 c 0.265625,0 0.546875,-0.015625 0.8125,-0.015625 0.28125,0 0.578125,-0.015625 0.859375,-0.015625 0.28125,0 0.546875,0.015625 0.828125,0.015625 C 3.4375,-0.015625 3.734375,0 4.015625,0 c 0.09375,0 0.21875,0 0.21875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.34375,-0.109375 -0.234375,0 -0.375,0 -0.625,-0.015625 -0.296875,-0.03125 -0.375,-0.0625 -0.375,-0.21875 0,-0.015625 0,-0.0625 0.046875,-0.203125 z m 0,0" + id="id-cc4328e7-20d2-4ce1-a170-9eaa021986d7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4e0d269c-9c36-4288-96ef-e8b1170f55b5"> + <g + transform="translate(154.534,136.259)" + id="g19531"> + <path + style="stroke:none" + d="m 2.328125,-4.4375 c 0,-0.1875 0,-0.1875 -0.203125,-0.1875 -0.453125,0.4375 -1.078125,0.4375 -1.359375,0.4375 v 0.25 c 0.15625,0 0.625,0 1,-0.1875 v 3.546875 c 0,0.234375 0,0.328125 -0.6875,0.328125 H 0.8125 V 0 c 0.125,0 0.984375,-0.03125 1.234375,-0.03125 0.21875,0 1.09375,0.03125 1.25,0.03125 V -0.25 H 3.03125 c -0.703125,0 -0.703125,-0.09375 -0.703125,-0.328125 z m 0,0" + id="id-636c73de-7421-4988-afc9-e1c5c68aaa7f" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,31.298167,60.063567)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$T_2$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-73-8"> + <defs + id="id-9f6e8d63-a3f5-4090-beee-7ba173d204cf"> + <g + id="id-11bba8f3-a1cb-48d5-99f1-9384e3bacc34"> + <symbol + overflow="visible" + id="id-c17b7df3-dace-4fec-8d6c-d76031893ce7"> + <path + style="stroke:none" + d="" + id="id-6335dd9b-dde3-4c98-a6cf-6d7e285e86ec" /> + </symbol> + <symbol + overflow="visible" + id="id-a1607264-892d-44a3-b9d7-6f47cbdcbc76"> + <path + style="stroke:none" + d="m 4.25,-6.046875 c 0.078125,-0.28125 0.109375,-0.34375 0.234375,-0.375 0.09375,-0.015625 0.421875,-0.015625 0.625,-0.015625 1.015625,0 1.453125,0.03125 1.453125,0.8125 0,0.15625 -0.03125,0.546875 -0.078125,0.796875 0,0.046875 -0.03125,0.15625 -0.03125,0.1875 0,0.0625 0.03125,0.140625 0.125,0.140625 0.109375,0 0.125,-0.078125 0.15625,-0.234375 L 7,-6.46875 C 7.015625,-6.515625 7.015625,-6.609375 7.015625,-6.640625 7.015625,-6.75 6.921875,-6.75 6.75,-6.75 H 1.21875 c -0.234375,0 -0.25,0.015625 -0.328125,0.203125 l -0.59375,1.75 c 0,0.015625 -0.0625,0.15625 -0.0625,0.1875 0,0.046875 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.171875,-0.21875 C 1.0625,-6.265625 1.328125,-6.4375 2.796875,-6.4375 H 3.1875 c 0.28125,0 0.28125,0.03125 0.28125,0.125 0,0.046875 -0.03125,0.171875 -0.046875,0.203125 L 2.09375,-0.78125 C 2,-0.421875 1.96875,-0.3125 0.90625,-0.3125 c -0.359375,0 -0.421875,0 -0.421875,0.1875 C 0.484375,0 0.59375,0 0.65625,0 c 0.265625,0 0.546875,-0.015625 0.8125,-0.015625 0.28125,0 0.578125,-0.015625 0.859375,-0.015625 0.28125,0 0.546875,0.015625 0.828125,0.015625 C 3.4375,-0.015625 3.734375,0 4.015625,0 c 0.09375,0 0.21875,0 0.21875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.34375,-0.109375 -0.234375,0 -0.375,0 -0.625,-0.015625 -0.296875,-0.03125 -0.375,-0.0625 -0.375,-0.21875 0,-0.015625 0,-0.0625 0.046875,-0.203125 z m 0,0" + id="id-83767759-c306-405d-8669-a58cf639f7e4" /> + </symbol> + <symbol + overflow="visible" + id="id-693197ac-3223-42f6-96f8-c133b35a9444"> + <path + style="stroke:none" + d="" + id="id-ebf384fa-5505-4a77-8fe6-42bdabf5b308" /> + </symbol> + <symbol + overflow="visible" + id="id-3e24a20e-5682-4611-baa0-024d1f645c23"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-28d9ed01-70e8-435c-a6a8-3f4783443870" /> + </symbol> + </g> + </defs> + <g + id="id-3129793a-6106-4bae-90a0-a82abf77e865" + transform="translate(-148.946,-128.015)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-2771df67-0777-4a05-b772-6722336f691a"> + <g + transform="translate(148.712,134.765)" + id="g20323"> + <path + style="stroke:none" + d="m 4.25,-6.046875 c 0.078125,-0.28125 0.109375,-0.34375 0.234375,-0.375 0.09375,-0.015625 0.421875,-0.015625 0.625,-0.015625 1.015625,0 1.453125,0.03125 1.453125,0.8125 0,0.15625 -0.03125,0.546875 -0.078125,0.796875 0,0.046875 -0.03125,0.15625 -0.03125,0.1875 0,0.0625 0.03125,0.140625 0.125,0.140625 0.109375,0 0.125,-0.078125 0.15625,-0.234375 L 7,-6.46875 C 7.015625,-6.515625 7.015625,-6.609375 7.015625,-6.640625 7.015625,-6.75 6.921875,-6.75 6.75,-6.75 H 1.21875 c -0.234375,0 -0.25,0.015625 -0.328125,0.203125 l -0.59375,1.75 c 0,0.015625 -0.0625,0.15625 -0.0625,0.1875 0,0.046875 0.0625,0.109375 0.125,0.109375 0.09375,0 0.109375,-0.0625 0.171875,-0.21875 C 1.0625,-6.265625 1.328125,-6.4375 2.796875,-6.4375 H 3.1875 c 0.28125,0 0.28125,0.03125 0.28125,0.125 0,0.046875 -0.03125,0.171875 -0.046875,0.203125 L 2.09375,-0.78125 C 2,-0.421875 1.96875,-0.3125 0.90625,-0.3125 c -0.359375,0 -0.421875,0 -0.421875,0.1875 C 0.484375,0 0.59375,0 0.65625,0 c 0.265625,0 0.546875,-0.015625 0.8125,-0.015625 0.28125,0 0.578125,-0.015625 0.859375,-0.015625 0.28125,0 0.546875,0.015625 0.828125,0.015625 C 3.4375,-0.015625 3.734375,0 4.015625,0 c 0.09375,0 0.21875,0 0.21875,-0.203125 0,-0.109375 -0.078125,-0.109375 -0.34375,-0.109375 -0.234375,0 -0.375,0 -0.625,-0.015625 -0.296875,-0.03125 -0.375,-0.0625 -0.375,-0.21875 0,-0.015625 0,-0.0625 0.046875,-0.203125 z m 0,0" + id="id-9fe92c87-73df-4662-ab54-561dbf84c30f" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-57ec2b1a-2883-4c89-ae83-fa81880fc194"> + <g + transform="translate(154.534,136.259)" + id="g20327"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-1a60a001-f928-4bf1-8ce7-ffe119327661" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,95.010005,76.396198)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_2\n$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-5"> + <defs + id="id-7cf824c2-7ff5-49d6-8bed-941e7a5aefec-3"> + <g + id="g20862"> + <symbol + overflow="visible" + id="symbol20848"> + <path + style="stroke:none" + d="" + id="path20846" /> + </symbol> + <symbol + overflow="visible" + id="symbol20852"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path20850" /> + </symbol> + <symbol + overflow="visible" + id="symbol20856"> + <path + style="stroke:none" + d="" + id="path20854" /> + </symbol> + <symbol + overflow="visible" + id="symbol20860"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="path20858" /> + </symbol> + </g> + </defs> + <g + id="id-90ea81d7-bf52-46d0-9b5e-dbcb09168ef4-2" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9383a849-76eb-46cc-924e-f9b3d0ebd129-0"> + <g + transform="translate(148.712,134.765)" + id="g2859-7"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-74dc01ba-8081-4c65-b7c5-1c03d07fab43-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-278c94cd-4ffd-4318-b8bb-c423dcf2ce61-1"> + <g + transform="translate(153.541,136.259)" + id="g2863-1"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-68b1e3e5-95b7-423c-85b4-21aeb97ec453-9" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-7-3" + transform="translate(-20.043212,0.07305921)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:0.465, 0.93;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-2)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5-6" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2898,68.8781)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_2$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-1"> + <defs + id="id-532b908d-cf13-4963-929d-ad02323db742"> + <g + id="id-2b5d3ab8-df6d-4c56-84de-0c679fadd19e"> + <symbol + overflow="visible" + id="id-665acd82-83c0-47bf-9e6f-5812bd595525"> + <path + style="stroke:none" + d="" + id="id-802c0224-ca95-4fc3-b86b-e1dd6e515f4c" /> + </symbol> + <symbol + overflow="visible" + id="id-45128bd5-8125-471f-b95e-e1c8b9a9b715"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-c0d07a42-b161-466e-98fb-56a8a0c00c90" /> + </symbol> + <symbol + overflow="visible" + id="id-63ea8027-5e29-4fa5-b9db-e81d1c7a33cc"> + <path + style="stroke:none" + d="" + id="id-7140c39f-b29d-4f37-8556-9c617be6d2dd" /> + </symbol> + <symbol + overflow="visible" + id="id-4dd45505-10f1-44e6-9b72-7809753922eb"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-69043952-8323-4b78-b627-deb20a2b2221" /> + </symbol> + </g> + </defs> + <g + id="id-67fc4bf5-c423-46d3-a7ba-4b4f2cddcfac" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-e4990684-4d9a-430e-8f28-5e6add94b57f"> + <g + transform="translate(148.712,134.765)" + id="g3105"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-3b3621e9-21bd-4284-a581-31d54e94a9cf" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-47fccbbc-69c3-46f4-b094-2a68ec4ce8e1"> + <g + transform="translate(153.541,136.259)" + id="g3109"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-735d300e-aa16-41a1-a196-c7db1775dd96" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-74" + transform="translate(-9.9464663,0.00300113)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-4)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-4" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2898,68.8781)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_2$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-30"> + <defs + id="id-1736464e-2c79-473b-8734-6896b2853f2d"> + <g + id="id-69101753-94b7-4873-a3de-ba7b8209d990"> + <symbol + overflow="visible" + id="id-a4fedb3d-069b-4d70-83b1-ae1f2daa2385"> + <path + style="stroke:none" + d="" + id="id-3046391b-4187-4be6-a912-d0505a66eb38" /> + </symbol> + <symbol + overflow="visible" + id="id-be0e0a31-e1c3-4836-a7d1-2fc7dbdafac3"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-86d33dad-f2f7-418c-b83f-02f4c9bc7aeb" /> + </symbol> + <symbol + overflow="visible" + id="id-deb89c92-53c2-46ce-abcc-fe4828c3d78c"> + <path + style="stroke:none" + d="" + id="id-f8c129ac-9366-4d46-a498-a6af5a7b0df1" /> + </symbol> + <symbol + overflow="visible" + id="id-fcd4a719-1594-4896-89dd-9dd04b3dab86"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-1ec7f68d-30dc-4659-bb62-b9ac49b4a1b4" /> + </symbol> + </g> + </defs> + <g + id="id-7f7230d4-a5ef-46e8-9b2f-be3bd1b3d9fc" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-e0ae7b06-5324-4229-8a5c-9dc70cbc248b"> + <g + transform="translate(148.712,134.765)" + id="g3351"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cb949f06-1abe-4f67-bea8-ff599f2c1ece" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-8b9197ca-9e60-4fd3-a63f-7a27ee505097"> + <g + transform="translate(153.541,136.259)" + id="g3355"> + <path + style="stroke:none" + d="M 3.515625,-1.265625 H 3.28125 c -0.015625,0.15625 -0.09375,0.5625 -0.1875,0.625 C 3.046875,-0.59375 2.515625,-0.59375 2.40625,-0.59375 H 1.125 c 0.734375,-0.640625 0.984375,-0.84375 1.390625,-1.171875 0.515625,-0.40625 1,-0.84375 1,-1.5 0,-0.84375 -0.734375,-1.359375 -1.625,-1.359375 -0.859375,0 -1.453125,0.609375 -1.453125,1.25 0,0.34375 0.296875,0.390625 0.375,0.390625 0.15625,0 0.359375,-0.125 0.359375,-0.375 0,-0.125 -0.046875,-0.375 -0.40625,-0.375 C 0.984375,-4.21875 1.453125,-4.375 1.78125,-4.375 c 0.703125,0 1.0625,0.546875 1.0625,1.109375 0,0.609375 -0.4375,1.078125 -0.65625,1.328125 L 0.515625,-0.265625 C 0.4375,-0.203125 0.4375,-0.1875 0.4375,0 h 2.875 z m 0,0" + id="id-34a5f412-fb96-442a-984f-de8b6ff3b8b4" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-25)" + d="m 42.563016,70.061578 2.683925,0.06539" + id="path1197-5-9" + sodipodi:nodetypes="cc" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2794,68.8547)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_3$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-5"> + <defs + id="id-7fcd93c0-5f80-40df-9485-b5e606d0fe70"> + <g + id="id-c9cd1e12-25e4-417c-a906-010fda19535d"> + <symbol + overflow="visible" + id="id-4d466315-5777-4e4e-9fc0-3db80afdf07d"> + <path + style="stroke:none" + d="" + id="id-152d50bf-2f53-40a8-b30b-f913378a3609" /> + </symbol> + <symbol + overflow="visible" + id="id-6cc5f286-cfc6-4c8a-ae12-29ffa839af48"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cf567697-b6cd-4f03-a190-84d8e40101b6" /> + </symbol> + <symbol + overflow="visible" + id="id-db2d4f7f-7daf-49c5-a630-3bda61f0be82"> + <path + style="stroke:none" + d="" + id="id-b4fd64dc-2d9f-4046-9b52-06c81f8758a4" /> + </symbol> + <symbol + overflow="visible" + id="id-b4ff667c-0374-498a-8386-69eef1264b90"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-a2e192af-e89c-416a-aec3-b76af30c1df0" /> + </symbol> + </g> + </defs> + <g + id="id-35b942dd-916b-4369-9996-cc6c3eafdeca" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-622b2bec-3cf7-48e5-beea-6985a7a85f5d"> + <g + transform="translate(148.712,134.765)" + id="g3603"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-435b84de-62a2-481c-93dd-1879d379dcb6" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f944b06f-832b-4d4a-b687-7c0049467eeb"> + <g + transform="translate(153.541,136.259)" + id="g3607"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-864c306a-4102-4d7d-85e1-50690315df1b" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-73" + transform="translate(-49.921699,-7.234542)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-9)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-6" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2794,68.8547)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_3$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449001921888555" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-5"> + <defs + id="id-9d8b7985-5b90-4c1b-96e5-0546ae02e6a4"> + <g + id="id-7be6aaa9-eaf9-45ad-8b1a-ab98a87c247e"> + <symbol + overflow="visible" + id="id-e407c94f-ed91-4c29-9163-1c0d14906d36"> + <path + style="stroke:none" + d="" + id="id-46c6035b-bebf-4289-835c-90a83b1ba57f" /> + </symbol> + <symbol + overflow="visible" + id="id-f98b1ee2-5dc1-4d1f-9195-2ac907831ebc"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-5730a185-71e9-4dd4-a978-d5cbaf5264a6" /> + </symbol> + <symbol + overflow="visible" + id="id-a32f519f-cc93-4f6b-ada9-1ec36101e236"> + <path + style="stroke:none" + d="" + id="id-1a389400-2350-4c0a-864b-e85f041cf16a" /> + </symbol> + <symbol + overflow="visible" + id="id-819b1ca2-49e0-4614-9531-f1cf92bb0beb"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-7f4ea42f-2a98-41c6-ac97-34aa9653b8ec" /> + </symbol> + </g> + </defs> + <g + id="id-77d55186-2979-4727-bbb6-1a4fc8e685e8" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-bc24bbf9-4da4-476d-b1a4-68288aa1a14d"> + <g + transform="translate(148.712,134.765)" + id="g7846"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-fc6348d7-5ab7-4b01-baad-ac311b86182d" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-4dadb7fe-6b13-4ec0-b71b-1c9443c6186d"> + <g + transform="translate(153.541,136.259)" + id="g7850"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-8c958543-e8db-4d10-a8fd-dcd7658c8f93" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-7-1" + transform="translate(-39.97523,-7.2375433)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-9)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5-5" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2794,68.8547)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_3$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-9"> + <defs + id="id-78a9bd45-dec2-4342-bdbb-1a9493417890"> + <g + id="id-80d0c048-18de-47d6-bfc7-08ad18ee361d"> + <symbol + overflow="visible" + id="id-0b41afc7-0269-4345-80f4-73e127106311"> + <path + style="stroke:none" + d="" + id="id-d5da8a58-3faf-4451-99b0-0e50003f15d3" /> + </symbol> + <symbol + overflow="visible" + id="id-2552d758-fbbf-48fb-affb-9e7622950e3c"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-f0bc5016-44ee-4794-9fe2-874250c11cf2" /> + </symbol> + <symbol + overflow="visible" + id="id-959192e1-f39b-46c7-b889-6c49823038ed"> + <path + style="stroke:none" + d="" + id="id-abe6214d-e31f-4809-a6dc-f03361f3ede2" /> + </symbol> + <symbol + overflow="visible" + id="id-e1bcded8-43f1-4baa-88a5-aa6664cf553d"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-15fad481-e040-42b9-b454-1cb36a130bda" /> + </symbol> + </g> + </defs> + <g + id="id-7c53eb2d-a814-46e4-a275-e9f92e274eed" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-4cb3bf77-7485-4281-b69e-18badced3b87"> + <g + transform="translate(148.712,134.765)" + id="g7267"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-ccc7e34c-6381-4a34-8b6b-51b0829708d7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-bee359c4-3861-465c-84fc-713ff554332d"> + <g + transform="translate(153.541,136.259)" + id="g7271"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-6ae9baef-e28b-48fe-b99a-d87f279a74e4" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,104.90821,78.53009)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_3$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-9-8"> + <defs + id="id-78a9bd45-dec2-4342-bdbb-1a9493417890-9"> + <g + id="g21418"> + <symbol + overflow="visible" + id="symbol21404"> + <path + style="stroke:none" + d="" + id="path21402" /> + </symbol> + <symbol + overflow="visible" + id="symbol21408"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path21406" /> + </symbol> + <symbol + overflow="visible" + id="symbol21412"> + <path + style="stroke:none" + d="" + id="path21410" /> + </symbol> + <symbol + overflow="visible" + id="symbol21416"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="path21414" /> + </symbol> + </g> + </defs> + <g + id="id-7c53eb2d-a814-46e4-a275-e9f92e274eed-7" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-4cb3bf77-7485-4281-b69e-18badced3b87-2"> + <g + transform="translate(148.712,134.765)" + id="g7267-6"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-ccc7e34c-6381-4a34-8b6b-51b0829708d7-4" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-bee359c4-3861-465c-84fc-713ff554332d-5"> + <g + transform="translate(153.541,136.259)" + id="g7271-2"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="id-6ae9baef-e28b-48fe-b99a-d87f279a74e4-0" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-2-2" + transform="translate(-29.989679,-7.2697697)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-7-7)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-3-1" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2611,68.878)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_4$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-7"> + <defs + id="id-75deb2b8-0879-46ea-9f68-51b3ee9fd4c6"> + <g + id="id-58e655c1-8382-470a-9d30-c856c8d47107"> + <symbol + overflow="visible" + id="id-eacff867-bae7-4f05-8147-5a0a0850a787"> + <path + style="stroke:none" + d="" + id="id-e1da6a9e-b798-4bf4-9526-5fe15a382a9a" /> + </symbol> + <symbol + overflow="visible" + id="id-93de29de-8e47-4925-bf1a-77e11a33af88"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-9b6737f7-7c76-4c92-82bf-40adcbd0a534" /> + </symbol> + <symbol + overflow="visible" + id="id-166f4abf-05fb-4225-bff5-749abbd2921f"> + <path + style="stroke:none" + d="" + id="id-7b3db869-b56d-4869-b6d0-5d0d8c4f2832" /> + </symbol> + <symbol + overflow="visible" + id="id-920e9399-0d69-4778-a1ad-35041055e881"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-974d6e0e-058a-47a7-b230-b3f0eccf444e" /> + </symbol> + </g> + </defs> + <g + id="id-eefba4d2-19d9-4ad4-904b-de5d863bd288" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1455704c-756b-49cb-a3f3-b78c612d5939"> + <g + transform="translate(148.712,134.765)" + id="g8485"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-0336e39c-d7cb-4ce0-923c-1e46a2f3b885" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-faf32796-52f8-45d4-a127-72b9f731d82a"> + <g + transform="translate(153.541,136.259)" + id="g8489"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-dbf0e94e-d8b3-4970-b7ee-b381439debdf" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,99.960885,76.969139)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_4$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-7-2" + inkscape:transform-center-x="5.9861928" + inkscape:transform-center-y="4.6624891"> + <defs + id="id-75deb2b8-0879-46ea-9f68-51b3ee9fd4c6-9"> + <g + id="g21717"> + <symbol + overflow="visible" + id="symbol21703"> + <path + style="stroke:none" + d="" + id="path21701" /> + </symbol> + <symbol + overflow="visible" + id="symbol21707"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path21705" /> + </symbol> + <symbol + overflow="visible" + id="symbol21711"> + <path + style="stroke:none" + d="" + id="path21709" /> + </symbol> + <symbol + overflow="visible" + id="symbol21715"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="path21713" /> + </symbol> + </g> + </defs> + <g + id="id-eefba4d2-19d9-4ad4-904b-de5d863bd288-8" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-1455704c-756b-49cb-a3f3-b78c612d5939-8"> + <g + transform="translate(148.712,134.765)" + id="g8485-6"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-0336e39c-d7cb-4ce0-923c-1e46a2f3b885-0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-faf32796-52f8-45d4-a127-72b9f731d82a-4"> + <g + transform="translate(153.541,136.259)" + id="g8489-6"> + <path + style="stroke:none" + d="m 3.6875,-1.140625 v -0.25 H 2.90625 V -4.5 c 0,-0.140625 0,-0.203125 -0.140625,-0.203125 -0.09375,0 -0.125,0 -0.1875,0.109375 l -2.3125,3.203125 v 0.25 h 2.0625 v 0.5625 c 0,0.25 0,0.328125 -0.578125,0.328125 H 1.5625 V 0 C 1.921875,-0.015625 2.359375,-0.03125 2.609375,-0.03125 2.875,-0.03125 3.3125,-0.015625 3.671875,0 v -0.25 h -0.1875 C 2.90625,-0.25 2.90625,-0.328125 2.90625,-0.578125 v -0.5625 z M 2.375,-3.9375 v 2.546875 H 0.53125 Z m 0,0" + id="id-dbf0e94e-d8b3-4970-b7ee-b381439debdf-7" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-7-3-6" + transform="translate(-20.043211,-7.2727708)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:0.465, 0.93;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-2-1)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5-6-4" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2898,68.8546)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-1-3"> + <defs + id="id-9d025603-8cd5-4d4c-99d9-f93fa0c5873f"> + <g + id="id-403f0fcb-9231-45b1-ba08-fe6df0c2bd39"> + <symbol + overflow="visible" + id="id-40bb89fa-8c9b-4055-91a5-b73eb4851746"> + <path + style="stroke:none" + d="" + id="id-1da14606-4367-4846-b434-83c9a10207ad" /> + </symbol> + <symbol + overflow="visible" + id="id-64ce4c64-992f-4473-82d4-f6ea7455d26e"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-10a6d073-3fb3-45a2-9938-8e22ba58f149" /> + </symbol> + <symbol + overflow="visible" + id="id-1226aa72-1baa-43b0-be73-9087e3732b3b"> + <path + style="stroke:none" + d="" + id="id-0ddb7887-1442-45f7-85b1-af0a13b33663" /> + </symbol> + <symbol + overflow="visible" + id="id-3ba0bf37-aa3f-4821-9e62-5ea1d38e4615"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-7614f977-d54d-4c9f-bde2-e75fb14a262a" /> + </symbol> + </g> + </defs> + <g + id="id-7d4e11d7-70ed-46cd-992b-ebee2c367dd4" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-22fd4e56-2026-4141-916c-349cac08aca1"> + <g + transform="translate(148.712,134.765)" + id="g9104"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-11700703-9a61-4b0f-bd16-4419c2090da5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f2503d15-dbc2-4819-b544-70581a437849"> + <g + transform="translate(153.541,136.259)" + id="g9108"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-2b8f869f-ce8a-4c5e-9f31-28205d70ab54" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,72.057617,62.146167)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-1-3-6"> + <defs + id="id-9d025603-8cd5-4d4c-99d9-f93fa0c5873f-0"> + <g + id="g21829"> + <symbol + overflow="visible" + id="symbol21815"> + <path + style="stroke:none" + d="" + id="path21813" /> + </symbol> + <symbol + overflow="visible" + id="symbol21819"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path21817" /> + </symbol> + <symbol + overflow="visible" + id="symbol21823"> + <path + style="stroke:none" + d="" + id="path21821" /> + </symbol> + <symbol + overflow="visible" + id="symbol21827"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="path21825" /> + </symbol> + </g> + </defs> + <g + id="id-7d4e11d7-70ed-46cd-992b-ebee2c367dd4-8" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-22fd4e56-2026-4141-916c-349cac08aca1-3"> + <g + transform="translate(148.712,134.765)" + id="g9104-7"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-11700703-9a61-4b0f-bd16-4419c2090da5-9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-f2503d15-dbc2-4819-b544-70581a437849-3"> + <g + transform="translate(153.541,136.259)" + id="g9108-7"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-2b8f869f-ce8a-4c5e-9f31-28205d70ab54-8" /> + </g> + </g> + </g> + </g> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.414999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000" + id="path22828" + cx="73.031082" + cy="62.741909" + rx="4.0084567" + ry="3.2678444" /> + </g> + <g + id="g1667-74-0" + transform="translate(-9.9464654,-7.3428289)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-4-5)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-4-9" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.2898,68.8546)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-30-2"> + <defs + id="id-0b1e7c64-dfda-4fd2-88ac-fdde82fd43e8"> + <g + id="id-03c42355-8700-42d2-9f89-1c4d1d5909fe"> + <symbol + overflow="visible" + id="id-5881da08-26b3-44cb-b411-6e461db6b4a9"> + <path + style="stroke:none" + d="" + id="id-8c6b44be-6c7e-4f42-a7a7-9f763b4a1fdb" /> + </symbol> + <symbol + overflow="visible" + id="id-0d50b91b-fe56-4fd3-bdb5-fb8b3b05f802"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-ffbbdd17-0dc9-41e5-8cb8-dedd97a968c1" /> + </symbol> + <symbol + overflow="visible" + id="id-73160538-e89b-4e37-ae07-b56c4bac91b6"> + <path + style="stroke:none" + d="" + id="id-75428323-6471-42ce-8b01-91e92e3f3fb9" /> + </symbol> + <symbol + overflow="visible" + id="id-9922c34b-0e60-49a1-a537-61768a35e804"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-16127d8e-bfaf-4817-8186-383f02d9fc53" /> + </symbol> + </g> + </defs> + <g + id="id-384cf002-968e-4731-a6d3-fd35e23d18a1" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-6f811a71-b49d-492d-b18f-7f1c83232de2"> + <g + transform="translate(148.712,134.765)" + id="g9723"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-cf286e75-0a20-4756-bcbd-83592d1212e0" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-9ef40ca0-33e3-4938-876d-d70cc2168c3d"> + <g + transform="translate(153.541,136.259)" + id="g9727"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-0da26084-30b9-4a95-8695-40f5c97e9b39" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-25-7)" + d="m 42.563017,62.715748 2.683925,0.06539" + id="path1197-5-9-2" + sodipodi:nodetypes="cc" /> + <g + transform="matrix(0.33334,0,0,0.33334,41.289801,61.50877)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-5-8"> + <defs + id="id-c4516f0a-89b0-4d85-b7fc-44e55570e086"> + <g + id="id-44a1f15f-0704-4baf-9742-f7f3ec4c8238"> + <symbol + overflow="visible" + id="id-98d84fb5-648c-4d9d-9c56-a3873325556e"> + <path + style="stroke:none" + d="" + id="id-02d4564b-f7da-4ff8-a125-fa2af2724023" /> + </symbol> + <symbol + overflow="visible" + id="id-ca9611f4-2d0c-4a77-9006-9f3ed3b096cf"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-eaea4e96-0a46-4c0e-a91d-1d4c1db2cf40" /> + </symbol> + <symbol + overflow="visible" + id="id-ebb1040e-67a2-4a7c-9713-e45274d501c5"> + <path + style="stroke:none" + d="" + id="id-82783ea1-ed3b-472b-bc27-d0520e8cfe2c" /> + </symbol> + <symbol + overflow="visible" + id="id-178a7282-2291-4377-887b-0fbffbef3499"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-a0afde87-b88e-4c3e-bc4b-921a0a92c178" /> + </symbol> + </g> + </defs> + <g + id="id-bdb50afd-a136-42c6-a519-eb20af620570" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-a903e865-96f8-4021-b277-0bc02655ec19"> + <g + transform="translate(148.712,134.765)" + id="g10336"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-0d7fd559-e36e-40bb-9150-48249bdf634a" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-29db0d2f-ffbc-412e-89ce-51d4ad133cc8"> + <g + transform="translate(153.541,136.259)" + id="g10340"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-086632cc-da62-49b9-a0f0-c419e99285a7" /> + </g> + </g> + </g> + </g> + <g + id="g1667-9" + transform="translate(-49.921698,0.11128778)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-6)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-9" /> + <g + transform="matrix(0.33334 0 0 0.33334 41.2898 68.8547)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-0"> + <defs + id="id-47552d6d-373b-4fd2-849c-2c882a44f8c4"> + <g + id="id-a08a7281-3971-4e6d-8715-e5c7376c2fb3"> + <symbol + overflow="visible" + id="id-c247f091-0689-4a23-8ece-0b615e3aed9f"> + <path + style="stroke:none" + d="" + id="id-a7924319-a904-45a4-8da0-b1141ba6c6b4" /> + </symbol> + <symbol + overflow="visible" + id="id-f02b3ecb-8ba0-422b-a6f1-23af10c1e147"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-2359dfb4-f34c-403e-b3a4-3f5303f394a9" /> + </symbol> + <symbol + overflow="visible" + id="id-38c6e1f8-09f5-46cf-8edd-28164518a09d"> + <path + style="stroke:none" + d="" + id="id-b047135a-6e77-4277-bf18-32214f7cf85a" /> + </symbol> + <symbol + overflow="visible" + id="id-22e6eb32-f695-4c86-91b3-08958c64b2ca"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-62d79c71-a729-49a3-b145-ab2338077fca" /> + </symbol> + </g> + </defs> + <g + id="id-129f226a-d89e-4af3-9f02-c96e954812b5" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-ce6ef499-9ee2-4b9d-9c9b-8095641932dc"> + <g + transform="translate(148.712, 134.765)" + id="g10991"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-0d693efe-bd9f-4eba-9ac4-534198948cf9" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-60bf8283-05e6-4629-acba-a37065123927"> + <g + transform="translate(153.541, 136.259)" + id="g10995"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-81d10110-a2c6-4435-8f8d-e4efcfcbb43b" /> + </g> + </g> + </g> + </g> + </g> + <g + id="g1667-7-0" + transform="translate(-39.975231,0.10828665)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-5)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5-4" /> + <g + transform="matrix(0.33334 0 0 0.33334 41.2898 68.8547)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-6"> + <defs + id="id-49d458e8-1060-4d98-a2d8-24452e2a0903"> + <g + id="id-aa8ac109-fc43-41ac-a551-a431a615923e"> + <symbol + overflow="visible" + id="id-b46a06c9-408a-43e4-8dc8-def4510d2c63"> + <path + style="stroke:none" + d="" + id="id-13ade768-9db1-40fe-89b4-9ebbae0d35b8" /> + </symbol> + <symbol + overflow="visible" + id="id-635d3aa8-96ed-49c9-8447-5acebbf1d6d3"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-4d35c0ce-0b4c-4145-bc44-c2f8819e4c6d" /> + </symbol> + <symbol + overflow="visible" + id="id-bbf4d911-17e2-4114-a7fb-cbea02a80051"> + <path + style="stroke:none" + d="" + id="id-d4e210b5-cfb6-4912-979f-29bed02758cc" /> + </symbol> + <symbol + overflow="visible" + id="id-613ebf74-76ea-4488-83fe-b54ac3c1c714"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-be313dca-7b0c-4a48-bacf-cf8daa06e5cf" /> + </symbol> + </g> + </defs> + <g + id="id-7c72e8d2-23eb-4bde-9a26-7ead8fbf98c0" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-2f11dc2d-b332-48a5-b2dc-a4b8641ef12e"> + <g + transform="translate(148.712, 134.765)" + id="g11610"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-b1cf70a3-2f50-429d-8e0a-c9788be2c3e5" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-221b7dae-601d-4a53-a8a2-340bd5d437c0"> + <g + transform="translate(153.541, 136.259)" + id="g11614"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-a7d364f9-c5c7-4870-a6da-281c35f3c8cf" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-7-6)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-3-5" + transform="translate(-29.98968,0.07606031)" /> + <g + transform="matrix(0.33334,0,0,0.33334,11.30012,68.93066)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_5$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-7-9"> + <defs + id="id-5095a9f7-c751-4c97-a82c-191119077faa"> + <g + id="id-6665708f-288d-4525-92eb-a06c4892867b"> + <symbol + overflow="visible" + id="id-dd44434a-953f-4b45-92a4-9abe7ef9d3ae"> + <path + style="stroke:none" + d="" + id="id-9ac9378b-2d2d-440f-a1d5-af260cb7e544" /> + </symbol> + <symbol + overflow="visible" + id="id-dbde01f5-f4e2-40b7-88a3-b8851429abee"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-d843451a-a637-4d3a-943f-db8d14113881" /> + </symbol> + <symbol + overflow="visible" + id="id-1043abfb-ae0c-4c87-a0c9-f8e738a6eda9"> + <path + style="stroke:none" + d="" + id="id-85cedea2-f5e6-4191-adf4-ded1c4c32acc" /> + </symbol> + <symbol + overflow="visible" + id="id-7e05db1f-d678-46b2-9ab7-e9f2a82049bc"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-67bf08a2-065c-450a-8490-b9d084062846" /> + </symbol> + </g> + </defs> + <g + id="id-b87053f3-f5a3-41cb-aca1-4a0aefc17047" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-6476caae-441b-4a86-9075-79da7325f724"> + <g + transform="translate(148.712, 134.765)" + id="g12229"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-d22da642-bd9c-41de-9727-a585d12c07ea" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-ac7b7263-e3b1-4d28-a2ed-347b769a752a"> + <g + transform="translate(153.541, 136.259)" + id="g12233"> + <path + style="stroke:none" + d="m 1.078125,-3.890625 c 0.359375,0.09375 0.5625,0.09375 0.671875,0.09375 0.921875,0 1.46875,-0.625 1.46875,-0.734375 0,-0.078125 -0.046875,-0.09375 -0.078125,-0.09375 -0.015625,0 -0.03125,0 -0.0625,0.015625 -0.171875,0.0625 -0.53125,0.203125 -1.046875,0.203125 -0.203125,0 -0.5625,-0.015625 -1.015625,-0.1875 C 0.9375,-4.625 0.921875,-4.625 0.921875,-4.625 c -0.09375,0 -0.09375,0.078125 -0.09375,0.1875 v 2.046875 c 0,0.125 0,0.203125 0.109375,0.203125 0.0625,0 0.078125,0 0.140625,-0.09375 0.296875,-0.375 0.734375,-0.4375 0.96875,-0.4375 0.421875,0 0.609375,0.328125 0.640625,0.390625 0.125,0.234375 0.171875,0.5 0.171875,0.90625 0,0.203125 0,0.609375 -0.21875,0.921875 -0.171875,0.25 -0.46875,0.421875 -0.8125,0.421875 -0.453125,0 -0.921875,-0.25 -1.09375,-0.71875 0.265625,0.015625 0.40625,-0.15625 0.40625,-0.34375 0,-0.296875 -0.265625,-0.34375 -0.359375,-0.34375 0,0 -0.34375,0 -0.34375,0.375 0,0.625 0.578125,1.25 1.40625,1.25 0.890625,0 1.671875,-0.65625 1.671875,-1.546875 0,-0.78125 -0.59375,-1.5 -1.453125,-1.5 -0.3125,0 -0.671875,0.0625 -0.984375,0.328125 z m 0,0" + id="id-123ba228-28d4-404e-ac9c-219d626adc02" /> + </g> + </g> + </g> + </g> + <g + id="g1667-7-3-0" + transform="translate(-20.043212,0.07305921)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:0.465, 0.93;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-2-8)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-5-6-42" /> + <g + transform="matrix(0.33334 0 0 0.33334 41.2793 68.8546)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_6$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-1-2"> + <defs + id="id-340e0317-f822-4bec-bb3a-9e837f4583d5"> + <g + id="id-3cca11b4-b384-4dca-bab9-0c5b627b3fda"> + <symbol + overflow="visible" + id="id-3a750352-64b3-4848-9913-0cbd337b18bc"> + <path + style="stroke:none" + d="" + id="id-747173a5-7de2-43a2-9f83-1520f86f8155" /> + </symbol> + <symbol + overflow="visible" + id="id-ee8e1e3f-1333-4d7a-9a80-f2c7d6f2d1e2"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-02968750-3f82-477e-9a47-eb724c8d6ee6" /> + </symbol> + <symbol + overflow="visible" + id="id-04bd2ca3-5f10-42f5-9f40-4022a20d3618"> + <path + style="stroke:none" + d="" + id="id-98661886-6776-41a7-8535-26655917b4bb" /> + </symbol> + <symbol + overflow="visible" + id="id-8385a096-ba68-47b9-8b6f-9ad8c3771eab"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-dd347ed4-e532-45ce-b476-4c311032035e" /> + </symbol> + </g> + </defs> + <g + id="id-ac82f790-61ec-4b14-a841-d6e5e1c6944e" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-28e507f1-d3ba-4237-8e44-fe869a26aa86"> + <g + transform="translate(148.712, 134.765)" + id="g12848"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-62bb846f-ed07-4ac0-aeb1-93db590b3ce6" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-10799211-d717-4f12-a5a3-c94c2a9667ce"> + <g + transform="translate(153.541, 136.259)" + id="g12852"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-a3c8f2ce-b6e4-4560-a18f-c267b9e7c980" /> + </g> + </g> + </g> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,71.729137,63.243171)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_6$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-1-2-7"> + <defs + id="id-340e0317-f822-4bec-bb3a-9e837f4583d5-4"> + <g + id="g21941"> + <symbol + overflow="visible" + id="symbol21927"> + <path + style="stroke:none" + d="" + id="path21925" /> + </symbol> + <symbol + overflow="visible" + id="symbol21931"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path21929" /> + </symbol> + <symbol + overflow="visible" + id="symbol21935"> + <path + style="stroke:none" + d="" + id="path21933" /> + </symbol> + <symbol + overflow="visible" + id="symbol21939"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="path21937" /> + </symbol> + </g> + </defs> + <g + id="id-ac82f790-61ec-4b14-a841-d6e5e1c6944e-3" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-28e507f1-d3ba-4237-8e44-fe869a26aa86-7"> + <g + transform="translate(148.712,134.765)" + id="g12848-1"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-62bb846f-ed07-4ac0-aeb1-93db590b3ce6-3" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-10799211-d717-4f12-a5a3-c94c2a9667ce-8"> + <g + transform="translate(153.541,136.259)" + id="g12852-0"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-a3c8f2ce-b6e4-4560-a18f-c267b9e7c980-9" /> + </g> + </g> + </g> + </g> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.414999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000" + id="path22814" + cx="73.60186" + cy="65.893219" + rx="3.447439" + ry="4.54286" /> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.414999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000" + id="path22816" + cx="84.445793" + cy="61.354347" + rx="5.6511369" + ry="4.5612631" /> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.414999;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;stop-color:#000000" + id="path22820" + cx="89.33313" + cy="71.678505" + rx="5.8672915" + ry="4.5743823" /> + </g> + <g + id="g1667-74-2" + transform="translate(-9.9464663,0.00300113)"> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-4-7)" + d="m 42.563016,70.061578 h 7.397615" + id="path1197-4-5" /> + <g + transform="matrix(0.33334 0 0 0.33334 41.2793 68.8546)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_6$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-30-4"> + <defs + id="id-da76a307-5e4d-4d6b-8db1-ad12b5da73b9"> + <g + id="id-5adbefde-f887-4a9a-a6ac-127ee93fc3e7"> + <symbol + overflow="visible" + id="id-95a07a23-3ffb-4f54-b79f-b7fa83a6b10a"> + <path + style="stroke:none" + d="" + id="id-de39ef98-370a-40ba-ad71-b9d1f6256df7" /> + </symbol> + <symbol + overflow="visible" + id="id-c6c45bc3-d610-44f3-823f-c4c44dbdb4db"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-e27a419a-b47b-4b72-85ce-960358625e72" /> + </symbol> + <symbol + overflow="visible" + id="id-201b086b-2109-4a98-bc72-ec23140b86bd"> + <path + style="stroke:none" + d="" + id="id-2f5c4190-47d0-43f2-adb8-ce59c50da0d0" /> + </symbol> + <symbol + overflow="visible" + id="id-b66c2986-f822-4c80-8a87-598b109dd01d"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-17f83115-dd47-473f-8834-5559281ce5e8" /> + </symbol> + </g> + </defs> + <g + id="id-d5430e4f-c0f5-445d-9768-c56d806d17ad" + transform="translate(-149.009, -130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-fba25b9a-9a09-4a73-9d71-9264658c843f"> + <g + transform="translate(148.712, 134.765)" + id="g13467"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-ca546e3a-927c-43c5-a119-5e4fe7569dbe" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-907e1f69-9470-4cf5-ab34-e25a25e280f8"> + <g + transform="translate(153.541, 136.259)" + id="g13471"> + <path + style="stroke:none" + d="m 1.046875,-2.28125 c 0,-0.5625 0.046875,-1.078125 0.3125,-1.515625 0.234375,-0.375 0.609375,-0.625 1.0625,-0.625 0.203125,0 0.484375,0.046875 0.625,0.234375 C 2.875,-4.171875 2.71875,-4.046875 2.71875,-3.84375 c 0,0.171875 0.125,0.328125 0.328125,0.328125 0.21875,0 0.34375,-0.140625 0.34375,-0.34375 0,-0.40625 -0.296875,-0.765625 -0.984375,-0.765625 -1,0 -2.03125,0.921875 -2.03125,2.421875 0,1.796875 0.84375,2.34375 1.625,2.34375 0.84375,0 1.578125,-0.65625 1.578125,-1.5625 0,-0.890625 -0.703125,-1.546875 -1.515625,-1.546875 -0.5625,0 -0.859375,0.375 -1.015625,0.6875 z M 2,-0.078125 c -0.359375,0 -0.625,-0.203125 -0.78125,-0.515625 C 1.125,-0.796875 1.0625,-1.15625 1.0625,-1.5625 c 0,-0.6875 0.40625,-1.203125 0.96875,-1.203125 0.3125,0 0.53125,0.125 0.703125,0.375 0.171875,0.265625 0.171875,0.5625 0.171875,0.96875 0,0.390625 0,0.6875 -0.1875,0.96875 -0.15625,0.234375 -0.390625,0.375 -0.71875,0.375 z m 0,0" + id="id-a5e049fa-7e86-4923-837c-559f0c508a17" /> + </g> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:0.465;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:6;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#EmptyDiamondL-3-25-4)" + d="m 42.563016,70.061578 2.683925,0.06539" + id="path1197-5-9-6" + sodipodi:nodetypes="cc" /> + </g> + <g + transform="matrix(0.33334,0,0,0.33334,41.31541,67.796366)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_3$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="0.33334" + id="g1620-3-5-9"> + <defs + id="id-7fcd93c0-5f80-40df-9485-b5e606d0fe70-4"> + <g + id="g5281"> + <symbol + overflow="visible" + id="symbol5267"> + <path + style="stroke:none" + d="" + id="path5265" /> + </symbol> + <symbol + overflow="visible" + id="symbol5271"> + <path + style="stroke:none" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path5269" /> + </symbol> + <symbol + overflow="visible" + id="symbol5275"> + <path + style="stroke:none" + d="" + id="path5273" /> + </symbol> + <symbol + overflow="visible" + id="symbol5279"> + <path + style="stroke:none" + d="m 1.90625,-2.328125 c 0.546875,0 0.9375,0.375 0.9375,1.125 0,0.859375 -0.515625,1.125 -0.90625,1.125 -0.28125,0 -0.90625,-0.078125 -1.1875,-0.5 0.328125,0 0.40625,-0.234375 0.40625,-0.390625 0,-0.21875 -0.171875,-0.375 -0.390625,-0.375 -0.1875,0 -0.390625,0.125 -0.390625,0.40625 0,0.65625 0.71875,1.078125 1.5625,1.078125 0.96875,0 1.640625,-0.65625 1.640625,-1.34375 0,-0.546875 -0.4375,-1.09375 -1.203125,-1.25 0.71875,-0.265625 0.984375,-0.78125 0.984375,-1.21875 0,-0.546875 -0.625,-0.953125 -1.40625,-0.953125 -0.765625,0 -1.359375,0.375 -1.359375,0.9375 0,0.234375 0.15625,0.359375 0.359375,0.359375 0.21875,0 0.359375,-0.15625 0.359375,-0.34375 0,-0.203125 -0.140625,-0.359375 -0.359375,-0.375 0.25,-0.296875 0.71875,-0.375 0.984375,-0.375 0.3125,0 0.75,0.15625 0.75,0.75 0,0.296875 -0.09375,0.625 -0.28125,0.828125 -0.21875,0.265625 -0.421875,0.28125 -0.765625,0.3125 -0.171875,0.015625 -0.1875,0.015625 -0.21875,0.015625 -0.015625,0 -0.078125,0.015625 -0.078125,0.09375 0,0.09375 0.0625,0.09375 0.1875,0.09375 z m 0,0" + id="path5277" /> + </symbol> + </g> + </defs> + <g + transform="translate(0.02359412,3.2552991)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_7$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="1.0" + id="g14105"> + <defs + id="id-b137b009-3a4b-4b82-81f7-b077c637af0d"> + <g + id="id-d544a572-2ec5-4862-9dec-d406cf600b8b"> + <symbol + overflow="visible" + id="id-88596d14-ec3c-419c-bc9d-6063019eedf3"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-e61318e7-f47a-47dd-9fac-ead51f3b0435" /> + </symbol> + <symbol + overflow="visible" + id="id-f44ab54a-f016-472f-b3b5-97e652bbfd86"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-54332ba6-b4cc-49aa-bea0-18799db7d422" /> + </symbol> + <symbol + overflow="visible" + id="id-91d4680b-37b1-426a-9dcf-eaa1baf39aa6"> + <path + style="stroke:none;stroke-width:0" + d="" + id="id-4914b0b6-0260-4241-95ad-39004a7d616a" /> + </symbol> + <symbol + overflow="visible" + id="id-ffdbe191-2ee9-4d56-a9c6-8bffb7cf6f44"> + <path + style="stroke:none;stroke-width:0" + d="m 3.734375,-4.203125 c 0.0625,-0.09375 0.0625,-0.109375 0.0625,-0.28125 H 1.96875 C 1.6875,-4.484375 1.609375,-4.5 1.359375,-4.515625 1,-4.546875 0.984375,-4.59375 0.96875,-4.703125 H 0.734375 l -0.25,1.484375 H 0.71875 c 0.015625,-0.109375 0.09375,-0.5625 0.203125,-0.640625 0.046875,-0.03125 0.625,-0.03125 0.71875,-0.03125 H 3.15625 c -0.21875,0.28125 -0.578125,0.71875 -0.71875,0.921875 -0.90625,1.1875 -1,2.296875 -1,2.703125 0,0.078125 0,0.40625 0.328125,0.40625 0.34375,0 0.34375,-0.3125 0.34375,-0.40625 v -0.28125 c 0,-1.34375 0.28125,-1.96875 0.578125,-2.34375 z m 0,0" + id="id-09b10cdf-2f0e-4eea-8c88-95250998a53c" /> + </symbol> + </g> + </defs> + <g + id="id-e0a35a6d-0aa7-4060-b436-0f9e2231c77f" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9a2fb48b-7a31-4fcd-8280-bdd88e132d18"> + <g + transform="translate(148.712,134.765)" + id="g14097"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-903fe605-b570-4cdb-8a09-537f79eed077" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-55280c11-2a4c-458f-9692-e82a5b10c8cd"> + <g + transform="translate(153.541,136.259)" + id="g14101"> + <path + style="stroke:none;stroke-width:0" + d="m 3.734375,-4.203125 c 0.0625,-0.09375 0.0625,-0.109375 0.0625,-0.28125 H 1.96875 C 1.6875,-4.484375 1.609375,-4.5 1.359375,-4.515625 1,-4.546875 0.984375,-4.59375 0.96875,-4.703125 H 0.734375 l -0.25,1.484375 H 0.71875 c 0.015625,-0.109375 0.09375,-0.5625 0.203125,-0.640625 0.046875,-0.03125 0.625,-0.03125 0.71875,-0.03125 H 3.15625 c -0.21875,0.28125 -0.578125,0.71875 -0.71875,0.921875 -0.90625,1.1875 -1,2.296875 -1,2.703125 0,0.078125 0,0.40625 0.328125,0.40625 0.34375,0 0.34375,-0.3125 0.34375,-0.40625 v -0.28125 c 0,-1.34375 0.28125,-1.96875 0.578125,-2.34375 z m 0,0" + id="id-bc9a5ce2-68fe-4a1c-8ee3-c262c13b6941" /> + </g> + </g> + </g> + </g> + <path + style="fill:none;stroke:#000000;stroke-width:1.24498;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-start:url(#Arrow1Sstart);marker-end:url(#Arrow1Send)" + d="M -151.60269,20.705421 H 9.3233733" + id="path16081" /> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.952825;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.515883;stop-color:#000000" + id="path18931" + cx="-146.85681" + cy="-15.606631" + rx="12.7988" + ry="40.455292" /> + <ellipse + style="fill:none;stroke:#000000;stroke-width:0.952825;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.515883;stop-color:#000000" + id="path18931-3" + cx="-116.35129" + cy="-14.799479" + rx="12.7988" + ry="40.455292" /> + <g + transform="translate(33.047713,-3.9606659)" + ns4:version="1.8.1" + ns4:texconverter="pdflatex" + ns4:pdfconverter="inkscape" + ns4:text="$v_7$" + ns4:preamble="/home/netko/.config/inkscape/extensions/textext/default_packages.tex" + ns4:scale="0.9449006740783156" + ns4:alignment="middle center" + ns4:stroke-to-path="0" + ns4:inkscapeversion="1.0.2" + ns4:jacobian_sqrt="1.0" + id="g14105-7"> + <defs + id="id-b137b009-3a4b-4b82-81f7-b077c637af0d-9"> + <g + id="g22059"> + <symbol + overflow="visible" + id="symbol22045"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path22043" /> + </symbol> + <symbol + overflow="visible" + id="symbol22049"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="path22047" /> + </symbol> + <symbol + overflow="visible" + id="symbol22053"> + <path + style="stroke:none;stroke-width:0" + d="" + id="path22051" /> + </symbol> + <symbol + overflow="visible" + id="symbol22057"> + <path + style="stroke:none;stroke-width:0" + d="m 3.734375,-4.203125 c 0.0625,-0.09375 0.0625,-0.109375 0.0625,-0.28125 H 1.96875 C 1.6875,-4.484375 1.609375,-4.5 1.359375,-4.515625 1,-4.546875 0.984375,-4.59375 0.96875,-4.703125 H 0.734375 l -0.25,1.484375 H 0.71875 c 0.015625,-0.109375 0.09375,-0.5625 0.203125,-0.640625 0.046875,-0.03125 0.625,-0.03125 0.71875,-0.03125 H 3.15625 c -0.21875,0.28125 -0.578125,0.71875 -0.71875,0.921875 -0.90625,1.1875 -1,2.296875 -1,2.703125 0,0.078125 0,0.40625 0.328125,0.40625 0.34375,0 0.34375,-0.3125 0.34375,-0.40625 v -0.28125 c 0,-1.34375 0.28125,-1.96875 0.578125,-2.34375 z m 0,0" + id="path22055" /> + </symbol> + </g> + </defs> + <g + id="id-e0a35a6d-0aa7-4060-b436-0f9e2231c77f-0" + transform="translate(-149.009,-130.359)"> + <g + style="fill:#000000;fill-opacity:1" + id="id-9a2fb48b-7a31-4fcd-8280-bdd88e132d18-2"> + <g + transform="translate(148.712,134.765)" + id="g14097-1"> + <path + style="stroke:none;stroke-width:0" + d="m 4.671875,-3.703125 c 0,-0.546875 -0.265625,-0.703125 -0.4375,-0.703125 -0.25,0 -0.5,0.265625 -0.5,0.484375 0,0.125 0.046875,0.1875 0.15625,0.296875 0.21875,0.203125 0.34375,0.453125 0.34375,0.8125 0,0.421875 -0.609375,2.703125 -1.765625,2.703125 -0.515625,0 -0.75,-0.34375 -0.75,-0.875 0,-0.546875 0.28125,-1.28125 0.578125,-2.109375 0.078125,-0.171875 0.125,-0.3125 0.125,-0.5 0,-0.4375 -0.3125,-0.8125 -0.8125,-0.8125 -0.9375,0 -1.3125,1.453125 -1.3125,1.53125 0,0.109375 0.09375,0.109375 0.109375,0.109375 0.109375,0 0.109375,-0.03125 0.15625,-0.1875 0.296875,-1 0.71875,-1.234375 1.015625,-1.234375 0.078125,0 0.25,0 0.25,0.3125 0,0.25 -0.109375,0.53125 -0.171875,0.703125 -0.4375,1.15625 -0.5625,1.609375 -0.5625,2.046875 0,1.078125 0.875,1.234375 1.328125,1.234375 1.671875,0 2.25,-3.296875 2.25,-3.8125 z m 0,0" + id="id-903fe605-b570-4cdb-8a09-537f79eed077-7" /> + </g> + </g> + <g + style="fill:#000000;fill-opacity:1" + id="id-55280c11-2a4c-458f-9692-e82a5b10c8cd-5"> + <g + transform="translate(153.541,136.259)" + id="g14101-1"> + <path + style="stroke:none;stroke-width:0" + d="m 3.734375,-4.203125 c 0.0625,-0.09375 0.0625,-0.109375 0.0625,-0.28125 H 1.96875 C 1.6875,-4.484375 1.609375,-4.5 1.359375,-4.515625 1,-4.546875 0.984375,-4.59375 0.96875,-4.703125 H 0.734375 l -0.25,1.484375 H 0.71875 c 0.015625,-0.109375 0.09375,-0.5625 0.203125,-0.640625 0.046875,-0.03125 0.625,-0.03125 0.71875,-0.03125 H 3.15625 c -0.21875,0.28125 -0.578125,0.71875 -0.71875,0.921875 -0.90625,1.1875 -1,2.296875 -1,2.703125 0,0.078125 0,0.40625 0.328125,0.40625 0.34375,0 0.34375,-0.3125 0.34375,-0.40625 v -0.28125 c 0,-1.34375 0.28125,-1.96875 0.578125,-2.34375 z m 0,0" + id="id-bc9a5ce2-68fe-4a1c-8ee3-c262c13b6941-7" /> + </g> + </g> + </g> + </g> + </g> + </g> + </g> + </g> +</svg> diff --git a/doc/optimal_layout_report/geodistrib.pdf b/doc/optimal_layout_report/geodistrib.pdf Binary files differnew file mode 100644 index 00000000..68269a09 --- /dev/null +++ b/doc/optimal_layout_report/geodistrib.pdf diff --git a/doc/optimal_layout_report/geodistrib.tex b/doc/optimal_layout_report/geodistrib.tex new file mode 100644 index 00000000..bb6f0391 --- /dev/null +++ b/doc/optimal_layout_report/geodistrib.tex @@ -0,0 +1,317 @@ +\documentclass[]{article} + +\usepackage{amsmath,amssymb} +\usepackage{amsthm} + +\usepackage{stmaryrd} + +\usepackage{graphicx,xcolor} +\usepackage{hyperref} + +\usepackage{algorithm,algpseudocode,float} + +\renewcommand\thesubsubsection{\Alph{subsubsection})} + +\newtheorem{proposition}{Proposition} + +%opening +\title{An algorithm for geo-distributed and redundant storage in Garage} +\author{Mendes Oulamara \\ \emph{mendes@deuxfleurs.fr}} +\date{} + +\begin{document} + +\maketitle + +\begin{abstract} + Garage +\end{abstract} + +\section{Introduction} + +Garage\footnote{\url{https://garagehq.deuxfleurs.fr/}} is an open-source distributed object storage service tailored for self-hosting. It was designed by the Deuxfleurs association\footnote{\url{https://deuxfleurs.fr/}} to enable small structures (associations, collectives, small companies) to share storage resources to reliably self-host their data, possibly with old and non-reliable machines. + +To achieve these reliability and availability goals, the data is broken into \emph{partitions} and every partition is replicated over 3 different machines (that we call \emph{nodes}). When the data is queried, a consensus algorithm allows to fetch it from one of the nodes. A \emph{replication factor} of 3 ensures the best guarantees in the consensus algorithm \cite{ADD RREF}, but this parameter can be different. + +Moreover, if the nodes are spread over different \emph{zones} (different houses, offices, cities\dots), we can ask the data to be replicated over nodes belonging to different zones, to improve the storage robustness against zone failure (such as power outage). To do so, we set a \emph{redundancy parameter}, that is no more than the replication factor, and we ask that any partition is replicated over this number of zones at least. + +In this work, we propose a repartition algorithm that, given the nodes specifications and the replication and redundancy parameters, computes an optimal assignation of partitions to nodes. We say that the assignation is optimal in the sense that it maximizes the size of the partitions, and hence the effective storage capacity of the system. + +Moreover, when a former assignation exists, which is not optimal anymore due to nodes or zones updates, our algorithm computes a new optimal assignation that minimizes the amount of data to be transferred during the assignation update (the \emph{transfer load}). + +We call the set of nodes cooperating to store the data a \emph{cluster}, and a description of the nodes, zones and the assignation of partitions to nodes a \emph{cluster layout} + +\subsection{Notations} + +Let $k$ be some fixed parameter value, typically 8, that we call the ``partition bits''. +Every object to be stored in the system is split into data blocks of fixed size. We compute a hash $h(\mathbf{b})$ of every such block $\mathbf{b}$, and we define the $k$ last bits of this hash to be the partition number $p(\mathbf{b})$ of the block. This label can take $P=2^k$ different values, and hence there are $P$ different partitions. We denote $\mathbf{P}$ the set of partition labels (i.e. $\mathbf{P}=\llbracket1,P\rrbracket$). + +We are given a set $\mathbf{N}$ of $N$ nodes and a set $\mathbf{Z}$ of $Z$ zones. Every node $n$ has a non-negative storage capacity $c_n\ge 0$ and belongs to a zone $z_n\in \mathbf{Z}$. We are also given a replication parameter $\rho_\mathbf{N}$ and a redundancy parameter $\rho_\mathbf{Z}$ such that $1\le \rho_\mathbf{Z} \le \rho_\mathbf{N}$ (typical values would be $\rho_N=3$ and $\rho_Z=2$). + +Our goal is to compute an assignment $\alpha = (\alpha_p^1, \ldots, \alpha_p^{\rho_\mathbf{N}})_{p\in \mathbf{P}}$ such that every partition $p$ is associated to $\rho_\mathbf{N}$ distinct nodes $\alpha_p^1, \ldots, \alpha_p^{\rho_\mathbf{N}} \in \mathbf{N}$ and these nodes belong to at least $\rho_\mathbf{Z}$ distinct zones. Among the possible assignations, we choose one that \emph{maximizes} the effective storage capacity of the cluster. If the layout contained a previous assignment $\alpha'$, we \emph{minimize} the amount of data to transfer during the layout update by making $\alpha$ as close as possible to $\alpha'$. These maximization and minimization are described more formally in the following section. + +\subsection{Optimization parameters} + +To link the effective storage capacity of the cluster to partition assignment, we make the following assumption: +\begin{equation} + \tag{H1} + \text{\emph{All partitions have the same size $s$.}} +\end{equation} +This assumption is justified by the dispersion of the hashing function, when the number of partitions is small relative to the number of stored blocks. + +Every node $n$ wille store some number $p_n$ of partitions (it is the number of partitions $p$ such that $n$ appears in the $\alpha_p$). Hence the partitions stored by $n$ (and hence all partitions by our assumption) have there size bounded by $c_n/p_n$. This remark leads us to define the optimal size that we will want to maximize: + +\begin{equation} + \label{eq:optimal} + \tag{OPT} +s^* = \min_{n \in N} \frac{c_n}{p_n}. +\end{equation} + +When the capacities of the nodes are updated (this includes adding or removing a node), we want to update the assignment as well. However, transferring the data between nodes has a cost and we would like to limit the number of changes in the assignment. We make the following assumption: +\begin{equation} + \tag{H2} + \text{\emph{Nodes updates happen rarely relatively to block operations.}} +\end{equation} +This assumption justifies that when we compute the new assignment $\alpha$, it is worth to optimize the partition size \eqref{eq:optimal} first, and then, among the possible optimal solution, to try to minimize the number of partition transfers. More formally, we minimize the distance between two assignments defined by +\begin{equation} + d(\alpha, \alpha') := \#\{ (n,p) \in \mathbf{N}\times\mathbf{P} ~|~ n\in \alpha_p \triangle \alpha'_p \} +\end{equation} +where the symmetric difference $\alpha_p \triangle \alpha'_p$ denotes the nodes appearing in one of the assignations but not in both. + +\section{Computation of an optimal assignment} + +The algorithm that we propose takes as inputs the cluster layout parameters $\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$, that we defined in the introduction, together with the former assignation $\alpha'$ (if any). The computation of the new optimal assignation $\alpha^*$ is done in three successive steps that will be detailed in the following sections. The first step computes the largest partition size $s^*$ that an assignation can achieve. The second step computes an optimal candidate assignment $\alpha$ that achieves $s^*$ and a heuristic is used in the computation to make it hopefully close to $\alpha'$. The third steps modifies $\alpha$ iteratively to reduces $d(\alpha, \alpha')$ and yields an assignation $\alpha^*$ achieving $s^*$, and minimizing $d(\cdot, \alpha')$ among such assignations. + +We will explain in the next section how to represent an assignment $\alpha$ by a flow $f$ on a weighted graph $G$ to enable the use of flow and graph algorithms. The main function of the algorithm can be written as follows. + +\subsubsection*{Algorithm} + +\begin{algorithmic}[1] + \Function{Compute Layout}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$, $\alpha'$} + \State $s^* \leftarrow$ \Call{Compute Partition Size}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$} + \State $G \leftarrow G(s^*)$ + \State $f \leftarrow$ \Call{Compute Candidate Assignment}{$G$, $\alpha'$} + \State $f^* \leftarrow$ \Call{Minimize transfer load}{$G$, $f$, $\alpha'$} + \State Build $\alpha^*$ from $f^*$ + \State \Return $\alpha^*$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} +As we will see in the next sections, the worst case complexity of this algorithm is $O(P^2 N^2)$. The minimization of transfer load is the most expensive step, and it can run with a timeout since it is only an optimization step. Without this step (or with a smart timeout), the worst cas complexity can be $O((PN)^{3/2}\log C)$ where $C$ is the total storage capacity of the cluster. + +\subsection{Determination of the partition size $s^*$} + +We will represent an assignment $\alpha$ as a flow in a specific graph $G$. We will not compute the optimal partition size $s^*$ a priori, but we will determine it by dichotomy, as the largest size $s$ such that the maximal flow achievable on $G=G(s)$ has value $\rho_\mathbf{N}P$. We will assume that the capacities are given in a small enough unit (say, Megabytes), and we will determine $s^*$ at the precision of the given unit. + +Given some candidate size value $s$, we describe the oriented weighted graph $G=(V,E)$ with vertex set $V$ arc set $E$ (see Figure \ref{fig:flowgraph}). + +The set of vertices $V$ contains the source $\mathbf{s}$, the sink $\mathbf{t}$, vertices +$\mathbf{p^+, p^-}$ for every partition $p$, vertices $\mathbf{x}_{p,z}$ for every partition $p$ and zone $z$, and vertices $\mathbf{n}$ for every node $n$. + +The set of arcs $E$ contains: +\begin{itemize} + \item ($\mathbf{s}$,$\mathbf{p}^+$, $\rho_\mathbf{Z}$) for every partition $p$; + \item ($\mathbf{s}$,$\mathbf{p}^-$, $\rho_\mathbf{N}-\rho_\mathbf{Z}$) for every partition $p$; + \item ($\mathbf{p}^+$,$\mathbf{x}_{p,z}$, 1) for every partition $p$ and zone $z$; + \item ($\mathbf{p}^-$,$\mathbf{x}_{p,z}$, $\rho_\mathbf{N}-\rho_\mathbf{Z}$) for every partition $p$ and zone $z$; + \item ($\mathbf{x}_{p,z}$,$\mathbf{n}$, 1) for every partition $p$, zone $z$ and node $n\in z$; + \item ($\mathbf{n}$, $\mathbf{t}$, $\lfloor c_n/s \rfloor$) for every node $n$. +\end{itemize} + +\begin{figure} + \centering + \includegraphics[width=\linewidth]{figures/flow_graph_param} + \caption{An example of graph $G(s)$. Arcs are oriented from left to right, and unlabeled arcs have capacity 1. In this example, nodes $n_1,n_2,n_3$ belong to zone $z_1$, and nodes $n_4,n_5$ belong to zone $z_2$.} + \label{fig:flowgraph} +\end{figure} + +In the following complexity calculations, we will use the number of vertices and edges of $G$. Remark from now that $\# V = O(PZ)$ and $\# E = O(PN)$. + +\begin{proposition} + An assignment $\alpha$ is realizable with partition size $s$ and the redundancy constraints $(\rho_\mathbf{N},\rho_\mathbf{Z})$ if and only if there exists a maximal flow function $f$ in $G$ with total flow $\rho_\mathbf{N}P$, such that the arcs ($\mathbf{x}_{p,z}$,$\mathbf{n}$, 1) used are exactly those for which $p$ is associated to $n$ in $\alpha$. +\end{proposition} +\begin{proof} + Given such flow $f$, we can reconstruct a candidate $\alpha$. In $f$, the flow passing through $\mathbf{p^+}$ and $\mathbf{p^-}$ is $\rho_\mathbf{N}$, and since the outgoing capacity of every $\mathbf{x}_{p,z}$ is 1, every partition is associated to $\rho_\mathbf{N}$ distinct nodes. The fraction $\rho_\mathbf{Z}$ of the flow passing through every $\mathbf{p^+}$ must be spread over as many distinct zones as every arc outgoing from $\mathbf{p^+}$ has capacity 1. So the reconstructed $\alpha$ verifies the redundancy constraints. For every node $n$, the flow between $\mathbf{n}$ and $\mathbf{t}$ corresponds to the number of partitions associated to $n$. By construction of $f$, this does not exceed $\lfloor c_n/s \rfloor$. We assumed that the partition size is $s$, hence this association does not exceed the storage capacity of the nodes. + + In the other direction, given an assignment $\alpha$, one can similarly check that the facts that $\alpha$ respects the redundancy constraints, and the storage capacities of the nodes, are necessary condition to construct a maximal flow function $f$. +\end{proof} + +\textbf{Implementation remark:} In the flow algorithm, while exploring the graph, we explore the neighbours of every vertex in a random order to heuristically spread the associations between nodes and partitions. + +\subsubsection*{Algorithm} +With this result mind, we can describe the first step of our algorithm. All divisions are supposed to be integer divisions. +\begin{algorithmic}[1] + \Function{Compute Partition Size}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$} + + \State Build the graph $G=G(s=1)$ + \State $ f \leftarrow$ \Call{Maximal flow}{$G$} + \If{$f.\mathrm{total flow} < \rho_\mathbf{N}P$} + + \State \Return Error: capacities too small or constraints too strong. + \EndIf + + \State $s^- \leftarrow 1$ + \State $s^+ \leftarrow 1+\frac{1}{\rho_\mathbf{N}}\sum_{n \in \mathbf{N}} c_n$ + + \While{$s^-+1 < s^+$} + \State Build the graph $G=G(s=(s^-+s^+)/2)$ + \State $ f \leftarrow$ \Call{Maximal flow}{$G$} + \If{$f.\mathrm{total flow} < \rho_\mathbf{N}P$} + \State $s^+ \leftarrow (s^- + s^+)/2$ + \Else + \State $s^- \leftarrow (s^- + s^+)/2$ + \EndIf + \EndWhile + + \State \Return $s^-$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} + +To compute the maximal flow, we use Dinic's algorithm. Its complexity on general graphs is $O(\#V^2 \#E)$, but on graphs with edge capacity bounded by a constant, it turns out to be $O(\#E^{3/2})$. The graph $G$ does not fall in this case since the capacities of the arcs incoming to $\mathbf{t}$ are far from bounded. However, the proof of this complexity function works readily for graphs where we only ask the edges \emph{not} incoming to the sink $\mathbf{t}$ to have their capacities bounded by a constant. One can find the proof of this claim in \cite[Section 2]{even1975network}. +The dichotomy adds a logarithmic factor $\log (C)$ where $C=\sum_{n \in \mathbf{N}} c_n$ is the total capacity of the cluster. The total complexity of this first function is hence +$O(\#E^{3/2}\log C ) = O\big((PN)^{3/2} \log C\big)$. + +\subsubsection*{Metrics} +We can display the discrepancy between the computed $s^*$ and the best size we could have hoped for the given total capacity, that is $C/\rho_\mathbf{N}$. + +\subsection{Computation of a candidate assignment} + +Now that we have the optimal partition size $s^*$, to compute a candidate assignment it would be enough to compute a maximal flow function $f$ on $G(s^*)$. This is what we do if there is no former assignation $\alpha'$. + +If there is some $\alpha'$, we add a step that will heuristically help to obtain a candidate $\alpha$ closer to $\alpha'$. We fist compute a flow function $\tilde{f}$ that uses only the partition-to-node associations appearing in $\alpha'$. Most likely, $\tilde{f}$ will not be a maximal flow of $G(s^*)$. In Dinic's algorithm, we can start from a non maximal flow function and then discover improving paths. This is what we do by starting from $\tilde{f}$. The hope\footnote{This is only a hope, because one can find examples where the construction of $f$ from $\tilde{f}$ produces an assignment $\alpha$ that is not as close as possible to $\alpha'$.} is that the final flow function $f$ will tend to keep the associations appearing in $\tilde{f}$. + +More formally, we construct the graph $G_{|\alpha'}$ from $G$ by removing all the arcs $(\mathbf{x}_{p,z},\mathbf{n}, 1)$ where $p$ is not associated to $n$ in $\alpha'$. We compute a maximal flow function $\tilde{f}$ in $G_{|\alpha'}$. The flow $\tilde{f}$ is also a valid (most likely non maximal) flow function on $G$. We compute a maximal flow function $f$ on $G$ by starting Dinic's algorithm on $\tilde{f}$. + +\subsubsection*{Algorithm} +\begin{algorithmic}[1] + \Function{Compute Candidate Assignment}{$G$, $\alpha'$} + \State Build the graph $G_{|\alpha'}$ + \State $ \tilde{f} \leftarrow$ \Call{Maximal flow}{$G_{|\alpha'}$} + \State $ f \leftarrow$ \Call{Maximal flow from flow}{$G$, $\tilde{f}$} + \State \Return $f$ + \EndFunction +\end{algorithmic} + +~ + +\textbf{Remark:} The function ``Maximal flow'' can be just seen as the function ``Maximal flow from flow'' called with the zero flow function as starting flow. + +\subsubsection*{Complexity} +With the considerations of the last section, we have the complexity of the Dinic's algorithm $O(\#E^{3/2}) = O((PN)^{3/2})$. + +\subsubsection*{Metrics} + +We can display the flow value of $\tilde{f}$, which is an upper bound of the distance between $\alpha$ and $\alpha'$. It might be more a Debug level display than Info. + +\subsection{Minimization of the transfer load} + +Now that we have a candidate flow function $f$, we want to modify it to make its corresponding assignation $\alpha$ as close as possible to $\alpha'$. Denote by $f'$ the maximal flow corresponding to $\alpha'$, and let $d(f, \alpha')=d(f, f'):=d(\alpha,\alpha')$\footnote{It is the number of arcs of type $(\mathbf{x}_{p,z},\mathbf{n})$ saturated in one flow and not in the other.}. +We want to build a sequence $f=f_0, f_1, f_2 \dots$ of maximal flows such that $d(f_i, \alpha')$ decreases as $i$ increases. The distance being a non-negative integer, this sequence of flow functions must be finite. We now explain how to find some improving $f_{i+1}$ from $f_i$. + +For any maximal flow $f$ in $G$, we define the oriented weighted graph $G_f=(V, E_f)$ as follows. The vertices of $G_f$ are the same as the vertices of $G$. $E_f$ contains the arc $(v_1,v_2, w)$ between vertices $v_1,v_2\in V$ with weight $w$ if and only if the arc $(v_1,v_2)$ is not saturated in $f$ (i.e. $c(v_1,v_2)-f(v_1,v_2) \ge 1$, we also consider reversed arcs). The weight $w$ is: +\begin{itemize} + \item $-1$ if $(v_1,v_2)$ is of type $(\mathbf{x}_{p,z},\mathbf{n})$ or $(\mathbf{x}_{p,z},\mathbf{n})$ and is saturated in only one of the two flows $f,f'$; + \item $+1$ if $(v_1,v_2)$ is of type $(\mathbf{x}_{p,z},\mathbf{n})$ or $(\mathbf{x}_{p,z},\mathbf{n})$ and is saturated in either both or none of the two flows $f,f'$; + \item $0$ otherwise. +\end{itemize} + +If $\gamma$ is a simple cycle of arcs in $G_f$, we define its weight $w(\gamma)$ as the sum of the weights of its arcs. We can add $+1$ to the value of $f$ on the arcs of $\gamma$, and by construction of $G_f$ and the fact that $\gamma$ is a cycle, the function that we get is still a valid flow function on $G$, it is maximal as it has the same flow value as $f$. We denote this new function $f+\gamma$. + +\begin{proposition} + Given a maximal flow $f$ and a simple cycle $\gamma$ in $G_f$, we have $d(f+\gamma, f') - d(f,f') = w(\gamma)$. +\end{proposition} +\begin{proof} + Let $X$ be the set of arcs of type $(\mathbf{x}_{p,z},\mathbf{n})$. Then we can express $d(f,f')$ as + \begin{align*} + d(f,f') & = \#\{e\in X ~|~ f(e)\neq f'(e)\} + = \sum_{e\in X} 1_{f(e)\neq f'(e)} \\ + & = \frac{1}{2}\big( \#X + \sum_{e\in X} 1_{f(e)\neq f'(e)} - 1_{f(e)= f'(e)} \big). + \end{align*} + We can express the cycle weight as + \begin{align*} + w(\gamma) & = \sum_{e\in X, e\in \gamma} - 1_{f(e)\neq f'(e)} + 1_{f(e)= f'(e)}. + \end{align*} + Remark that since we passed on unit of flow in $\gamma$ to construct $f+\gamma$, we have for any $e\in X$, $f(e)=f'(e)$ if and only if $(f+\gamma)(e) \neq f'(e)$. + Hence + \begin{align*} + w(\gamma) & = \frac{1}{2}(w(\gamma) + w(\gamma)) \\ + &= \frac{1}{2} \Big( + \sum_{e\in X, e\in \gamma} - 1_{f(e)\neq f'(e)} + 1_{f(e)= f'(e)} \\ + & \qquad + + \sum_{e\in X, e\in \gamma} 1_{(f+\gamma)(e)\neq f'(e)} + 1_{(f+\gamma)(e)= f'(e)} + \Big). + \end{align*} + Plugging this in the previous equation, we find that + $$d(f,f')+w(\gamma) = d(f+\gamma, f').$$ +\end{proof} + +This result suggests that given some flow $f_i$, we just need to find a negative cycle $\gamma$ in $G_{f_i}$ to construct $f_{i+1}$ as $f_i+\gamma$. The following proposition ensures that this greedy strategy reaches an optimal flow. + +\begin{proposition} + For any maximal flow $f$, $G_f$ contains a negative cycle if and only if there exists a maximal flow $f^*$ in $G$ such that $d(f^*, f') < d(f, f')$. +\end{proposition} +\begin{proof} + Suppose that there is such flow $f^*$. Define the oriented multigraph $M_{f,f^*}=(V,E_M)$ with the same vertex set $V$ as in $G$, and for every $v_1,v_2 \in V$, $E_M$ contains $(f^*(v_1,v_2) - f(v_1,v_2))_+$ copies of the arc $(v_1,v_2)$. For every vertex $v$, its total degree (meaning its outer degree minus its inner degree) is equal to + \begin{align*} + \deg v & = \sum_{u\in V} (f^*(v,u) - f(v,u))_+ - \sum_{u\in V} (f^*(u,v) - f(u,v))_+ \\ + & = \sum_{u\in V} f^*(v,u) - f(v,u) = \sum_{u\in V} f^*(v,u) - \sum_{u\in V} f(v,u). + \end{align*} + The last two sums are zero for any inner vertex since $f,f^*$ are flows, and they are equal on the source and sink since the two flows are both maximal and have hence the same value. Thus, $\deg v = 0$ for every vertex $v$. + + This implies that the multigraph $M_{f,f^*}$ is the union of disjoint simple cycles. $f$ can be transformed into $f^*$ by pushing a mass 1 along all these cycles in any order. Since $d(f^*, f')<d(f,f')$, there must exists one of these simple cycles $\gamma$ with $d(f+\gamma, f') < d(f, f')$. Finally, since we can push a mass in $f$ along $\gamma$, it must appear in $G_f$. Hence $\gamma$ is a cycle of $G_f$ with negative weight. +\end{proof} + +In the next section we describe the corresponding algorithm. Instead of discovering only one cycle, we are allowed to discover a set $\Gamma$ of disjoint negative cycles. + +\subsubsection*{Algorithm} +\begin{algorithmic}[1] + \Function{Minimize transfer load}{$G$, $f$, $\alpha'$} + \State Build the graph $G_f$ + \State $\Gamma \leftarrow$ \Call{Detect Negative Cycles}{$G_f$} + \While{$\Gamma \neq \emptyset$} + \ForAll{$\gamma \in \Gamma$} + \State $f \leftarrow f+\gamma$ + \EndFor + \State Update $G_f$ + \State $\Gamma \leftarrow$ \Call{Detect Negative Cycles}{$G_f$} + \EndWhile + \State \Return $f$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} +The distance $d(f,f')$ is bounded by the maximal number of differences in the associated assignment. If these assignment are totally disjoint, this distance is $2\rho_N P$. At every iteration of the While loop, the distance decreases, so there is at most $O(\rho_N P) = O(P)$ iterations. + +The detection of negative cycle is done with the Bellman-Ford algorithm, whose complexity should normally be $O(\#E\#V)$. In our case, it amounts to $O(P^2ZN)$. Multiplied by the complexity of the outer loop, it amounts to $O(P^3ZN)$ which is a lot when the number of partitions and nodes starts to be large. To avoid that, we adapt the Bellman-Ford algorithm. + +The Bellman-Ford algorithm runs $\#V$ iterations of an outer loop, and an inner loop over $E$. The idea is to compute the shortest paths from a source vertex $v$ to all other vertices. After $k$ iterations of the outer loop, the algorithm has computed all shortest path of length at most $k$. All simple paths have length at most $\#V-1$, so if there is an update in the last iteration of the loop, it means that there is a negative cycle in the graph. The observation that will enable us to improve the complexity is the following: + +\begin{proposition} + In the graph $G_f$ (and $G$), all simple paths have a length at most $4N$. +\end{proposition} +\begin{proof} + Since $f$ is a maximal flow, there is no outgoing edge from $\mathbf{s}$ in $G_f$. One can thus check than any simple path of length 4 must contain at least two node of type $\mathbf{n}$. Hence on a path, at most 4 arcs separate two successive nodes of type $\mathbf{n}$. +\end{proof} + +Thus, in the absence of negative cycles, shortest paths in $G_f$ have length at most $4N$. So we can do only $4N+1$ iterations of the outer loop in the Bellman-Ford algorithm. This makes the complexity of the detection of one set of cycle to be $O(N\#E) = O(N^2 P)$. + +With this improvement, the complexity of the whole algorithm is, in the worst case, $O(N^2P^2)$. However, since we detect several cycles at once and we start with a flow that might be close to the previous one, the number of iterations of the outer loop might be smaller in practice. + + + +\subsubsection*{Metrics} +We can display the node and zone utilization ratio, by dividing the flow passing through them divided by their outgoing capacity. In particular, we can pinpoint saturated nodes and zones (i.e. used at their full potential). + +We can display the distance to the previous assignment, and the number of partition transfers. + + +\bibliography{optimal_layout} +\bibliographystyle{ieeetr} + +\end{document} + + + diff --git a/doc/optimal_layout_report/optimal_layout.bib b/doc/optimal_layout_report/optimal_layout.bib new file mode 100644 index 00000000..9552b11d --- /dev/null +++ b/doc/optimal_layout_report/optimal_layout.bib @@ -0,0 +1,11 @@ + +@article{even1975network, + title={Network flow and testing graph connectivity}, + author={Even, Shimon and Tarjan, R Endre}, + journal={SIAM journal on computing}, + volume={4}, + number={4}, + pages={507--518}, + year={1975}, + publisher={SIAM} +} diff --git a/doc/optimal_layout_report/optimal_layout.pdf b/doc/optimal_layout_report/optimal_layout.pdf Binary files differnew file mode 100644 index 00000000..0af34161 --- /dev/null +++ b/doc/optimal_layout_report/optimal_layout.pdf diff --git a/doc/optimal_layout_report/optimal_layout.tex b/doc/optimal_layout_report/optimal_layout.tex new file mode 100644 index 00000000..005e7b50 --- /dev/null +++ b/doc/optimal_layout_report/optimal_layout.tex @@ -0,0 +1,709 @@ +\documentclass[]{article} + +\usepackage{amsmath,amssymb} +\usepackage{amsthm} + +\usepackage{graphicx,xcolor} + +\usepackage{algorithm,algpseudocode,float} + +\renewcommand\thesubsubsection{\Alph{subsubsection})} + +\newtheorem{proposition}{Proposition} + +%opening +\title{Optimal partition assignment in Garage} +\author{Mendes} + +\begin{document} + +\maketitle + +\section{Introduction} + +\subsection{Context} + +Garage is an open-source distributed storage service blablabla$\dots$ + +Every object to be stored in the system falls in a partition given by the last $k$ bits of its hash. There are $P=2^k$ partitions. Every partition will be stored on distinct nodes of the system. The goal of the assignment of partitions to nodes is to ensure (nodes and zone) redundancy and to be as efficient as possible. + +\subsection{Formal description of the problem} + +We are given a set of nodes $\mathbf{N}$ and a set of zones $\mathbf{Z}$. Every node $n$ has a non-negative storage capacity $c_n\ge 0$ and belongs to a zone $z\in \mathbf{Z}$. We are also given a number of partition $P>0$ (typically $P=256$). + +We would like to compute an assignment of nodes to partitions. We will impose some redundancy constraints to this assignment, and under these constraints, we want our system to have the largest storage capacity possible. To link storage capacity to partition assignment, we make the following assumption: +\begin{equation} + \tag{H1} + \text{\emph{All partitions have the same size $s$.}} +\end{equation} +This assumption is justified by the dispersion of the hashing function, when the number of partitions is small relative to the number of stored large objects. + +Every node $n$ wille store some number $k_n$ of partitions. Hence the partitions stored by $n$ (and hence all partitions by our assumption) have there size bounded by $c_n/k_n$. This remark leads us to define the optimal size that we will want to maximize: + +\begin{equation} + \label{eq:optimal} + \tag{OPT} +s^* = \min_{n \in N} \frac{c_n}{k_n}. +\end{equation} + +When the capacities of the nodes are updated (this includes adding or removing a node), we want to update the assignment as well. However, transferring the data between nodes has a cost and we would like to limit the number of changes in the assignment. We make the following assumption: +\begin{equation} + \tag{H2} + \text{\emph{Updates of capacity happens rarely relatively to object storing.}} +\end{equation} +This assumption justifies that when we compute the new assignment, it is worth to optimize the partition size \eqref{eq:optimal} first, and then, among the possible optimal solution, to try to minimize the number of partition transfers. + +For now, in the following, we ask the following redundancy constraint: + +\textbf{Parametric node and zone redundancy:} Given two integer parameters $1\le \rho_\mathbf{Z} \le \rho_\mathbf{N}$, we ask every partition to be stored on $\rho_\mathbf{N}$ distinct nodes, and these nodes must belong to at least $\rho_\mathbf{Z}$ distinct zones. + + +\textbf{Mode 3-strict:} every partition needs to be assignated to three nodes belonging to three different zones. + +\textbf{Mode 3:} every partition needs to be assignated to three nodes. We try to spread the three nodes over different zones as much as possible. + +\textbf{Warning:} This is a working document written incrementaly. The last version of the algorithm is the \textbf{parametric assignment} described in the next section. + + +\section{Computation of a parametric assignment} +\textbf{Attention : }We change notations in this section. + +Notations : let $P$ be the number of partitions, $N$ the number of nodes, $Z$ the number of zones. Let $\mathbf{P,N,Z}$ be the label sets of, respectively, partitions, nodes and zones. +Let $s^*$ be the largest partition size achievable with the redundancy constraints. Let $(c_n)_{n\in \mathbf{N}}$ be the storage capacity of every node. + +In this section, we propose a third specification of the problem. The user inputs two redundancy parameters $1\le \rho_\mathbf{Z} \le \rho_\mathbf{N}$. We compute an assignment $\alpha = (\alpha_p^1, \ldots, \alpha_p^{\rho_\mathbf{N}})_{p\in \mathbf{P}}$ such that every partition $p$ is associated to $\rho_\mathbf{N}$ distinct nodes $\alpha_p^1, \ldots, \alpha_p^{\rho_\mathbf{N}}$ and these nodes belong to at least $\rho_\mathbf{Z}$ distinct zones. + +If the layout contained a previous assignment $\alpha'$, we try to minimize the amount of data to transfer during the layout update by making $\alpha$ as close as possible to $\alpha'$. + +In the following subsections, we describe the successive steps of the algorithm we propose to compute $\alpha$. + +\subsubsection*{Algorithm} + +\begin{algorithmic}[1] + \Function{Compute Layout}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$, $\alpha'$} + \State $s^* \leftarrow$ \Call{Compute Partition Size}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$} + \State $G \leftarrow G(s^*)$ + \State $f \leftarrow$ \Call{Compute Candidate Assignment}{$G$, $\alpha'$} + \State $f^* \leftarrow$ \Call{Minimize transfer load}{$G$, $f$, $\alpha'$} + \State Build $\alpha^*$ from $f^*$ + \State \Return $\alpha^*$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} +As we will see in the next sections, the worst case complexity of this algorithm is $O(P^2 N^2)$. The minimization of transfer load is the most expensive step, and it can run with a timeout since it is only an optimization step. Without this step (or with a smart timeout), the worst cas complexity can be $O((PN)^{3/2}\log C)$ where $C$ is the total storage capacity of the cluster. + +\subsection{Determination of the partition size $s^*$} + +Again, we will represent an assignment $\alpha$ as a flow in a specific graph $G$. We will not compute the optimal partition size $s^*$ a priori, but we will determine it by dichotomy, as the largest size $s$ such that the maximal flow achievable on $G=G(s)$ has value $\rho_\mathbf{N}P$. We will assume that the capacities are given in a small enough unit (say, Megabytes), and we will determine $s^*$ at the precision of the given unit. + +Given some candidate size value $s$, we describe the oriented weighted graph $G=(V,E)$ with vertex set $V$ arc set $E$. + +The set of vertices $V$ contains the source $\mathbf{s}$, the sink $\mathbf{t}$, vertices +$\mathbf{p^+, p^-}$ for every partition $p$, vertices $\mathbf{x}_{p,z}$ for every partition $p$ and zone $z$, and vertices $\mathbf{n}$ for every node $n$. + +The set of arcs $E$ contains: +\begin{itemize} + \item ($\mathbf{s}$,$\mathbf{p}^+$, $\rho_\mathbf{Z}$) for every partition $p$; + \item ($\mathbf{s}$,$\mathbf{p}^-$, $\rho_\mathbf{N}-\rho_\mathbf{Z}$) for every partition $p$; + \item ($\mathbf{p}^+$,$\mathbf{x}_{p,z}$, 1) for every partition $p$ and zone $z$; + \item ($\mathbf{p}^-$,$\mathbf{x}_{p,z}$, $\rho_\mathbf{N}-\rho_\mathbf{Z}$) for every partition $p$ and zone $z$; + \item ($\mathbf{x}_{p,z}$,$\mathbf{n}$, 1) for every partition $p$, zone $z$ and node $n\in z$; + \item ($\mathbf{n}$, $\mathbf{t}$, $\lfloor c_n/s \rfloor$) for every node $n$. +\end{itemize} + +In the following complexity calculations, we will use the number of vertices and edges of $G$. Remark from now that $\# V = O(PZ)$ and $\# E = O(PN)$. + +\begin{proposition} + An assignment $\alpha$ is realizable with partition size $s$ and the redundancy constraints $(\rho_\mathbf{N},\rho_\mathbf{Z})$ if and only if there exists a maximal flow function $f$ in $G$ with total flow $\rho_\mathbf{N}P$, such that the arcs ($\mathbf{x}_{p,z}$,$\mathbf{n}$, 1) used are exactly those for which $p$ is associated to $n$ in $\alpha$. +\end{proposition} +\begin{proof} + Given such flow $f$, we can reconstruct a candidate $\alpha$. In $f$, the flow passing through $\mathbf{p^+}$ and $\mathbf{p^-}$ is $\rho_\mathbf{N}$, and since the outgoing capacity of every $\mathbf{x}_{p,z}$ is 1, every partition is associated to $\rho_\mathbf{N}$ distinct nodes. The fraction $\rho_\mathbf{Z}$ of the flow passing through every $\mathbf{p^+}$ must be spread over as many distinct zones as every arc outgoing from $\mathbf{p^+}$ has capacity 1. So the reconstructed $\alpha$ verifies the redundancy constraints. For every node $n$, the flow between $\mathbf{n}$ and $\mathbf{t}$ corresponds to the number of partitions associated to $n$. By construction of $f$, this does not exceed $\lfloor c_n/s \rfloor$. We assumed that the partition size is $s$, hence this association does not exceed the storage capacity of the nodes. + + In the other direction, given an assignment $\alpha$, one can similarly check that the facts that $\alpha$ respects the redundancy constraints, and the storage capacities of the nodes, are necessary condition to construct a maximal flow function $f$. +\end{proof} + +\textbf{Implementation remark:} In the flow algorithm, while exploring the graph, we explore the neighbours of every vertex in a random order to heuristically spread the association between nodes and partitions. + +\subsubsection*{Algorithm} +With this result mind, we can describe the first step of our algorithm. All divisions are supposed to be integer division. +\begin{algorithmic}[1] + \Function{Compute Partition Size}{$\mathbf{N}$, $\mathbf{Z}$, $\mathbf{P}$, $(c_n)_{n\in \mathbf{N}}$, $\rho_\mathbf{N}$, $\rho_\mathbf{Z}$} + + \State Build the graph $G=G(s=1)$ + \State $ f \leftarrow$ \Call{Maximal flow}{$G$} + \If{$f.\mathrm{total flow} < \rho_\mathbf{N}P$} + + \State \Return Error: capacities too small or constraints too strong. + \EndIf + + \State $s^- \leftarrow 1$ + \State $s^+ \leftarrow 1+\frac{1}{\rho_\mathbf{N}}\sum_{n \in \mathbf{N}} c_n$ + + \While{$s^-+1 < s^+$} + \State Build the graph $G=G(s=(s^-+s^+)/2)$ + \State $ f \leftarrow$ \Call{Maximal flow}{$G$} + \If{$f.\mathrm{total flow} < \rho_\mathbf{N}P$} + \State $s^+ \leftarrow (s^- + s^+)/2$ + \Else + \State $s^- \leftarrow (s^- + s^+)/2$ + \EndIf + \EndWhile + + \State \Return $s^-$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} + +To compute the maximal flow, we use Dinic's algorithm. Its complexity on general graphs is $O(\#V^2 \#E)$, but on graphs with edge capacity bounded by a constant, it turns out to be $O(\#E^{3/2})$. The graph $G$ does not fall in this case since the capacities of the arcs incoming to $\mathbf{t}$ are far from bounded. However, the proof of this complexity works readily for graph where we only ask the edges \emph{not} incoming to the sink $\mathbf{t}$ to have their capacities bounded by a constant. One can find the proof of this claim in \cite[Section 2]{even1975network}. +The dichotomy adds a logarithmic factor $\log (C)$ where $C=\sum_{n \in \mathbf{N}} c_n$ is the total capacity of the cluster. The total complexity of this first function is hence +$O(\#E^{3/2}\log C ) = O\big((PN)^{3/2} \log C\big)$. + +\subsubsection*{Metrics} +We can display the discrepancy between the computed $s^*$ and the best size we could hope for a given total capacity, that is $C/\rho_\mathbf{N}$. + +\subsection{Computation of a candidate assignment} + +Now that we have the optimal partition size $s^*$, to compute a candidate assignment, it would be enough to compute a maximal flow function $f$ on $G(s^*)$. This is what we do if there was no previous assignment $\alpha'$. + +If there was some $\alpha'$, we add a step that will heuristically help to obtain a candidate $\alpha$ closer to $\alpha'$. to do so, we fist compute a flow function $\tilde{f}$ that uses only the partition-to-node association appearing in $\alpha'$. Most likely, $\tilde{f}$ will not be a maximal flow of $G(s^*)$. In Dinic's algorithm, we can start from a non maximal flow function and then discover improving paths. This is what we do in starting from $\tilde{f}$. The hope\footnote{This is only a hope, because one can find examples where the construction of $f$ from $\tilde{f}$ produces an assignment $\alpha$ that is not as close as possible to $\alpha'$.} is that the final flow function $f$ will tend to keep the associations appearing in $\tilde{f}$. + +More formally, we construct the graph $G_{|\alpha'}$ from $G$ by removing all the arcs $(\mathbf{x}_{p,z},\mathbf{n}, 1)$ where $p$ is not associated to $n$ in $\alpha'$. We compute a maximal flow function $\tilde{f}$ in $G_{|\alpha'}$. $\tilde{f}$ is also a valid (most likely non maximal) flow function in $G$. We compute a maximal flow function $f$ on $G$ by starting Dinic's algorithm on $\tilde{f}$. + +\subsubsection*{Algorithm} +\begin{algorithmic}[1] + \Function{Compute Candidate Assignment}{$G$, $\alpha'$} + \State Build the graph $G_{|\alpha'}$ + \State $ \tilde{f} \leftarrow$ \Call{Maximal flow}{$G_{|\alpha'}$} + \State $ f \leftarrow$ \Call{Maximal flow from flow}{$G$, $\tilde{f}$} + \State \Return $f$ + \EndFunction +\end{algorithmic} + +\textbf{Remark:} The function ``Maximal flow'' can be just seen as the function ``Maximal flow from flow'' called with the zero flow function as starting flow. + +\subsubsection*{Complexity} +From the consideration of the last section, we have the complexity of the Dinic's algorithm $O(\#E^{3/2}) = O((PN)^{3/2})$. + +\subsubsection*{Metrics} + +We can display the flow value of $\tilde{f}$, which is an upper bound of the distance between $\alpha$ and $\alpha'$. It might be more a Debug level display than Info. + +\subsection{Minimization of the transfer load} + +Now that we have a candidate flow function $f$, we want to modify it to make its associated assignment as close as possible to $\alpha'$. Denote by $f'$ the maximal flow associated to $\alpha'$, and let $d(f, f')$ be distance between the associated assignments\footnote{It is the number of arcs of type $(\mathbf{x}_{p,z},\mathbf{n})$ saturated in one flow and not in the other.}. +We want to build a sequence $f=f_0, f_1, f_2 \dots$ of maximal flows such that $d(f_i, \alpha')$ decreases as $i$ increases. The distance being a non-negative integer, this sequence of flow functions must be finite. We now explain how to find some improving $f_{i+1}$ from $f_i$. + +For any maximal flow $f$ in $G$, we define the oriented weighted graph $G_f=(V, E_f)$ as follows. The vertices of $G_f$ are the same as the vertices of $G$. $E_f$ contains the arc $(v_1,v_2, w)$ between vertices $v_1,v_2\in V$ with weight $w$ if and only if the arc $(v_1,v_2)$ is not saturated in $f$ (i.e. $c(v_1,v_2)-f(v_1,v_2) \ge 1$, we also consider reversed arcs). The weight $w$ is: +\begin{itemize} + \item $-1$ if $(v_1,v_2)$ is of type $(\mathbf{x}_{p,z},\mathbf{n})$ or $(\mathbf{x}_{p,z},\mathbf{n})$ and is saturated in only one of the two flows $f,f'$; + \item $+1$ if $(v_1,v_2)$ is of type $(\mathbf{x}_{p,z},\mathbf{n})$ or $(\mathbf{x}_{p,z},\mathbf{n})$ and is saturated in either both or none of the two flows $f,f'$; + \item $0$ otherwise. +\end{itemize} + +If $\gamma$ is a simple cycle of arcs in $G_f$, we define its weight $w(\gamma)$ as the sum of the weights of its arcs. We can add $+1$ to the value of $f$ on the arcs of $\gamma$, and by construction of $G_f$ and the fact that $\gamma$ is a cycle, the function that we get is still a valid flow function on $G$, it is maximal as it has the same flow value as $f$. We denote this new function $f+\gamma$. + +\begin{proposition} + Given a maximal flow $f$ and a simple cycle $\gamma$ in $G_f$, we have $d(f+\gamma, f') - d(f,f') = w(\gamma)$. +\end{proposition} +\begin{proof} + Let $X$ be the set of arcs of type $(\mathbf{x}_{p,z},\mathbf{n})$. Then we can express $d(f,f')$ as + \begin{align*} + d(f,f') & = \#\{e\in X ~|~ f(e)\neq f'(e)\} + = \sum_{e\in X} 1_{f(e)\neq f'(e)} \\ + & = \frac{1}{2}\big( \#X + \sum_{e\in X} 1_{f(e)\neq f'(e)} - 1_{f(e)= f'(e)} \big). + \end{align*} + We can express the cycle weight as + \begin{align*} + w(\gamma) & = \sum_{e\in X, e\in \gamma} - 1_{f(e)\neq f'(e)} + 1_{f(e)= f'(e)}. + \end{align*} + Remark that since we passed on unit of flow in $\gamma$ to construct $f+\gamma$, we have for any $e\in X$, $f(e)=f'(e)$ if and only if $(f+\gamma)(e) \neq f'(e)$. + Hence + \begin{align*} + w(\gamma) & = \frac{1}{2}(w(\gamma) + w(\gamma)) \\ + &= \frac{1}{2} \Big( + \sum_{e\in X, e\in \gamma} - 1_{f(e)\neq f'(e)} + 1_{f(e)= f'(e)} \\ + & \qquad + + \sum_{e\in X, e\in \gamma} 1_{(f+\gamma)(e)\neq f'(e)} + 1_{(f+\gamma)(e)= f'(e)} + \Big). + \end{align*} + Plugging this in the previous equation, we find that + $$d(f,f')+w(\gamma) = d(f+\gamma, f').$$ +\end{proof} + +This result suggests that given some flow $f_i$, we just need to find a negative cycle $\gamma$ in $G_{f_i}$ to construct $f_{i+1}$ as $f_i+\gamma$. The following proposition ensures that this greedy strategy reaches an optimal flow. + +\begin{proposition} + For any maximal flow $f$, $G_f$ contains a negative cycle if and only if there exists a maximal flow $f^*$ in $G$ such that $d(f^*, f') < d(f, f')$. +\end{proposition} +\begin{proof} + Suppose that there is such flow $f^*$. Define the oriented multigraph $M_{f,f^*}=(V,E_M)$ with the same vertex set $V$ as in $G$, and for every $v_1,v_2 \in V$, $E_M$ contains $(f^*(v_1,v_2) - f(v_1,v_2))_+$ copies of the arc $(v_1,v_2)$. For every vertex $v$, its total degree (meaning its outer degree minus its inner degree) is equal to + \begin{align*} + \deg v & = \sum_{u\in V} (f^*(v,u) - f(v,u))_+ - \sum_{u\in V} (f^*(u,v) - f(u,v))_+ \\ + & = \sum_{u\in V} f^*(v,u) - f(v,u) = \sum_{u\in V} f^*(v,u) - \sum_{u\in V} f(v,u). + \end{align*} + The last two sums are zero for any inner vertex since $f,f^*$ are flows, and they are equal on the source and sink since the two flows are both maximal and have hence the same value. Thus, $\deg v = 0$ for every vertex $v$. + + This implies that the multigraph $M_{f,f^*}$ is the union of disjoint simple cycles. $f$ can be transformed into $f^*$ by pushing a mass 1 along all these cycles in any order. Since $d(f^*, f')<d(f,f')$, there must exists one of these simple cycles $\gamma$ with $d(f+\gamma, f') < d(f, f')$. Finally, since we can push a mass in $f$ along $\gamma$, it must appear in $G_f$. Hence $\gamma$ is a cycle of $G_f$ with negative weight. +\end{proof} + +In the next section we describe the corresponding algorithm. Instead of discovering only one cycle, we are allowed to discover a set $\Gamma$ of disjoint negative cycles. + +\subsubsection*{Algorithm} +\begin{algorithmic}[1] + \Function{Minimize transfer load}{$G$, $f$, $\alpha'$} + \State Build the graph $G_f$ + \State $\Gamma \leftarrow$ \Call{Detect Negative Cycles}{$G_f$} + \While{$\Gamma \neq \emptyset$} + \ForAll{$\gamma \in \Gamma$} + \State $f \leftarrow f+\gamma$ + \EndFor + \State Update $G_f$ + \State $\Gamma \leftarrow$ \Call{Detect Negative Cycles}{$G_f$} + \EndWhile + \State \Return $f$ + \EndFunction +\end{algorithmic} + +\subsubsection*{Complexity} +The distance $d(f,f')$ is bounded by the maximal number of differences in the associated assignment. If these assignment are totally disjoint, this distance is $2\rho_N P$. At every iteration of the While loop, the distance decreases, so there is at most $O(\rho_N P) = O(P)$ iterations. + +The detection of negative cycle is done with the Bellman-Ford algorithm, whose complexity should normally be $O(\#E\#V)$. In our case, it amounts to $O(P^2ZN)$. Multiplied by the complexity of the outer loop, it amounts to $O(P^3ZN)$ which is a lot when the number of partitions and nodes starts to be large. To avoid that, we adapt the Bellman-Ford algorithm. + +The Bellman-Ford algorithm runs $\#V$ iterations of an outer loop, and an inner loop over $E$. The idea is to compute the shortest paths from a source vertex $v$ to all other vertices. After $k$ iterations of the outer loop, the algorithm has computed all shortest path of length at most $k$. All simple paths have length at most $\#V-1$, so if there is an update in the last iteration of the loop, it means that there is a negative cycle in the graph. The observation that will enable us to improve the complexity is the following: + +\begin{proposition} + In the graph $G_f$ (and $G$), all simple paths have a length at most $4N$. +\end{proposition} +\begin{proof} + Since $f$ is a maximal flow, there is no outgoing edge from $\mathbf{s}$ in $G_f$. One can thus check than any simple path of length 4 must contain at least two node of type $\mathbf{n}$. Hence on a path, at most 4 arcs separate two successive nodes of type $\mathbf{n}$. +\end{proof} + +Thus, in the absence of negative cycles, shortest paths in $G_f$ have length at most $4N$. So we can do only $4N+1$ iterations of the outer loop in Bellman-Ford algorithm. This makes the complexity of the detection of one set of cycle to be $O(N\#E) = O(N^2 P)$. + +With this improvement, the complexity of the whole algorithm is, in the worst case, $O(N^2P^2)$. However, since we detect several cycles at once and we start with a flow that might be close to the previous one, the number of iterations of the outer loop might be smaller in practice. + + + +\subsubsection*{Metrics} +We can display the node and zone utilization ratio, by dividing the flow passing through them divided by their outgoing capacity. In particular, we can pinpoint saturated nodes and zones (i.e. used at their full potential). + +We can display the distance to the previous assignment, and the number of partition transfers. + + + + + +\section{Properties of an optimal 3-strict assignment} + +\subsection{Optimal assignment} +\label{sec:opt_assign} + +For every zone $z\in Z$, define the zone capacity $c_z = \sum_{v, z_v=z} c_v$ and define $C = \sum_v c_v = \sum_z c_z$. + +One can check that the best we could be doing to maximize $s^*$ would be to use the nodes proportionally to their capacity. This would yield $s^*=C/(3N)$. This is not possible because of (i) redundancy constraints and (ii) integer rounding but it gives and upper bound. + +\subsubsection*{Optimal utilization} + +We call an \emph{utilization} a collection of non-negative integers $(n_v)_{v\in V}$ such that $\sum_v n_v = 3N$ and for every zone $z$, $\sum_{v\in z} n_v \le N$. We call such utilization \emph{optimal} if it maximizes $s^*$. + +We start by computing a node sub-utilization $(\hat{n}_v)_{v\in V}$ such that for every zone $z$, $\sum_{v\in z} \hat{n}_v \le N$ and we show that there is an optimal utilization respecting the constraints and such that $\hat{n}_v \le n_v$ for every node. + +Assume that there is a zone $z_0$ such that $c_{z_0}/C \ge 1/3$. Then for any $v\in z_0$, we define +$$\hat{n}_v = \left\lfloor\frac{c_v}{c_{z_0}}N\right\rfloor.$$ +This choice ensures for any such $v$ that +$$ +\frac{c_v}{\hat{n}_v} \ge \frac{c_{z_0}}{N} \ge \frac{C}{3N} +$$ +which is the universal upper bound on $s^*$. Hence any optimal utilization $(n_v)$ can be modified to another optimal utilization such that $n_v\ge \hat{n}_v$ + +Because $z_0$ cannot store more than $N$ partition occurences, in any assignment, at least $2N$ partitions must be assignated to the zones $Z\setminus\{z_0\}$. Let $C_0 = C-c_{z_0}$. Suppose that there exists a zone $z_1\neq z_0$ such that $c_{z_1}/C_0 \ge 1/2$. Then, with the same argument as for $z_0$, we can define +$$\hat{n}_v = \left\lfloor\frac{c_v}{c_{z_1}}N\right\rfloor$$ +for every $v\in z_1$. + +Now we can assign the remaining partitions. Let $(\hat{N}, \hat{C})$ to be +\begin{itemize} + \item $(3N,C)$ if we did not find any $z_0$; + \item $(2N,C-c_{z_0})$ if there was a $z_0$ but no $z_1$; + \item $(N,C-c_{z_0}-c_{z_1})$ if there was a $z_0$ and a $z_1$. +\end{itemize} +Then at least $\hat{N}$ partitions must be spread among the remaining zones. Hence $s^*$ is upper bounded by $\hat{C}/\hat{N}$ and without loss of generality, we can define, for every node that is not in $z_0$ nor $z_1$, +$$\hat{n}_v = \left\lfloor\frac{c_v}{\hat{C}}\hat{N}\right\rfloor.$$ + +We constructed a sub-utilization $\hat{n}_v$. Now notice that $3N-\sum_v \hat{n}_v \le \# V$ where $\# V$ denotes the number of nodes. We can iteratively pick a node $v^*$ such that +\begin{itemize} + \item $\sum_{v\in z_{v^*}} \hat{n}_v < N$ where $z_{v^*}$ is the zone of $v^*$; + \item $v^*$ maximizes the quantity $c_v/(\hat{n}_v+1)$ among the vertices satisfying the first condition (i.e. not in a saturated zone). +\end{itemize} +We iterate these instructions until $\sum_v \hat{n}_v= 3N$, and at this stage we define $(n_v) = (\hat{n}_v)$. It is easy to prove by induction that at every step, there is an optimal utilization that is pointwise larger than $\hat{n}_v$, and in particular, that $(n_v)$ is optimal. + +\subsubsection*{Existence of an optimal assignment} + +As for now, the \emph{optimal utilization} that we obtained is just a vector of numbers and it is not clear that it can be realized as the utilization of some concrete assignment. Here is a way to get a concrete assignment. + +Define $3N$ tokens $t_1,\ldots, t_{3N}\in V$ as follows: +\begin{itemize} + \item Enumerate the zones $z$ of $Z$ in any order; + \item enumerate the nodes $v$ of $z$ in any order; + \item repeat $n_v$ times the token $v$. +\end{itemize} +Then for $1\le i \le N$, define the triplet $T_i$ to be +$(t_i, t_{i+N}, t_{i+2N})$. Since the same nodes of a zone appear contiguously, the three nodes of a triplet must belong to three distinct zones. + +However simple, this solution to go from an utilization to an assignment has the drawback of not spreading the triplets: a node will tend to be associated to the same two other nodes for many partitions. Hence, during data transfer, it will tend to use only two link, instead of spreading the bandwith use over many other links to other nodes. To achieve this goal, we will reframe the search of an assignment as a flow problem. and in the flow algorithm, we will introduce randomness in the order of exploration. This will be sufficient to obtain a good dispersion of the triplets. + +\begin{figure} + \centering + \includegraphics[width=0.9\linewidth]{figures/naive} + \caption{On the left, the creation of a concrete assignment with the naive approach of repeating tokens. On the right, the zones containing the nodes.} +\end{figure} + +\subsubsection*{Assignment as a maximum flow problem} + +We describe the flow problem via its graph $(X,E)$ where $X$ is a set of vertices, and $E$ are directed weighted edges between the vertices. For every zone $z$, define $n_z=\sum_{v\in z} n_v$. + +The set of vertices $X$ contains the source $\mathbf{s}$ and the sink $\mathbf{t}$; a vertex $\mathbf{x}_z$ for every zone $z\in Z$, and a vertex $\mathbf{y}_i$ for every partition index $1\le i\le N$. + +The set of edges $E$ contains +\begin{itemize} + \item the edge $(\mathbf{s}, \mathbf{x}_z, n_z)$ for every zone $z\in Z$; + \item the edge $(\mathbf{x}_z, \mathbf{y}_i, 1)$ for every zone $z\in Z$ and partition $1\le i\le N$; + \item the edge $(\mathbf{y}_i, \mathbf{t}, 3)$ for every partition $1\le i\le N$. +\end{itemize} + +\begin{figure}[b] + \centering + \includegraphics[width=0.6\linewidth]{figures/flow} + \caption{Flow problem to compute and optimal assignment.} +\end{figure} + +We first show the equivalence between this problem and and the construction of an assignment. Given some optimal assignment $(n_v)$, define the flow $f:E\to \mathbb{N}$ that saturates every edge from $\mathbf{s}$ or to $\mathbf{t}$, takes value $1$ on the edge between $\mathbf{x}_z$ and $\mathbf{y}_i$ if partition $i$ is stored in some node of the zone $z$, and $0$ otherwise. One can easily check that $f$ thus defined is indeed a flow and is maximum. + +Reciprocally, by the existence of maximum flows constructed from optimal assignments, any maximum flow must saturate the edges linked to the source or the sink. It can only take value 0 or 1 on the other edge, and every partition vertex is associated to exactly three distinct zone vertices. Every zone is associated to exactly $n_z$ partitions. + +A maximum flow can be constructed using, for instance, Dinic's algorithm. This algorithm works by discovering augmenting path to iteratively increase the flow. During the exploration of the graph to find augmenting path, we can shuffle the order of enumeration of the neighbours to spread the associations between zones and partitions. + +Once we have such association, we can randomly distribute the $n_z$ edges picked for every zone $z$ to its nodes $v\in z$ such that every such $v$ gets $n_z$ edges. This defines an optimal assignment of partitions to nodes. + + +\subsection{Minimal transfer} + +Assume that there was a previous assignment $(T'_i)_{1\le i\le N}$ corresponding to utilizations $(n'_v)_{v\in V}$. We would like the new computed assignment $(T_i)_{1\le i\le N}$ from some $(n_v)_{v\in V}$ to minimize the number of partitions that need to be transferred. We can imagine two different objectives corresponding to different hypotheses: +\begin{equation} + \tag{H3A} + \label{hyp:A} + \text{\emph{Transfers between different zones cost much more than inside a zone.}} +\end{equation} +\begin{equation} + \tag{H3B} + \label{hyp:B} + \text{\emph{Changing zone is not the largest cost when transferring a partition.}} +\end{equation} + +In case $A$, our goal will be to minimize the number of changes of zone in the assignment of partitions to zone. More formally, we will maximize the quantity +$$ +Q_Z := +\sum_{1\le i\le N} +\#\{z\in Z ~|~ z\cap T_i \neq \emptyset, z\cap T'_i \neq \emptyset \} +.$$ + +In case $B$, our goal will be to minimize the number of changes of nodes in the assignment of partitions to nodes. We will maximize the quantity +$$ +Q_V := +\sum_{1\le i\le N} \#(T_i \cap T'_i). +$$ + +It is tempting to hope that there is a way to maximize both quantity, that having the least discrepancy in terms of nodes will lead to the least discrepancy in terms of zones. But this is actually wrong! We propose the following counter-example to convince the reader: + +We consider eight nodes $a, a', b, c, d, d', e, e'$ belonging to five different zones $\{a,a'\}, \{b\}, \{c\}, \{d,d'\}, \{e, e'\}$. We take three partitions ($N=3$), that are originally assigned with some utilization $(n'_v)_{v\in V}$ as follows: +$$ +T'_1=(a,b,c) \qquad +T'_2=(a',b,d) \qquad +T'_3=(b,c,e). +$$ +This assignment, with updated utilizations $(n_v)_{v\in V}$ minimizes the number of zone changes: +$$ +T_1=(d,b,c) \qquad +T_2=(a,b,d) \qquad +T_3=(b,c,e'). +$$ +This one, with the same utilization, minimizes the number of node changes: +$$ +T_1=(a,b,c) \qquad +T_2=(e',b,d) \qquad +T_3=(b,c,d'). +$$ +One can check that in this case, it is impossible to minimize both the number of zone and node changes. + +Because of the redundancy constraint, we cannot use a greedy algorithm to just replace nodes in the triplets to try to get the new utilization rate: this could lead to blocking situation where there is still a hole to fill in a triplet but no available node satisfies the zone separation constraint. To circumvent this issue, we propose an algorithm based on finding cycles in a graph encoding of the assignment. As in section \ref{sec:opt_assign}, we can explore the neigbours in a random order in the graph algorithms, to spread the triplets distribution. + + +\subsubsection{Minimizing the zone discrepancy} + + +First, notice that, given an assignment of partitions to \emph{zones}, it is easy to deduce an assignment to \emph{nodes} that minimizes the number of transfers for this zone assignment: For every zone $z$ and every node $v\in z$, pick in any way a set $P_v$ of partitions that where assigned to $v$ in $T'$, to $z_v$ in $T$, with the cardinality of $P_v$ smaller than $n_v$. Once all these sets are chosen, complement the assignment to reach the right utilization for every node. If $\#P_v > n_v$, it means that all the partitions that could stay in $v$ (i.e. that were already in $v$ and are still assigned to its zone) do stay in $v$. If $\#P_v = n_v$, then $n_v$ partitions stay in $v$, which is the number of partitions that need to be in $v$ in the end. In both cases, we could not hope for better given the partition to zone assignment. + +Our goal now is to find a assignment of partitions to zones that minimizes the number of zone transfers. To do so we are going to represent an assignment as a graph. + +Let $G_T=(X,E_T)$ be the directed weighted graph with vertices $(\mathbf{x}_i)_{1\le i\le N}$ and $(\mathbf{y}_z)_{z\in Z}$. For any $1\le i\le N$ and $z\in Z$, $E_T$ contains the arc: +\begin{itemize} + \item $(\mathbf{x}_i, \mathbf{y}_z, +1)$, if $z$ appears in $T_i'$ and $T_i$; + \item $(\mathbf{x}_i, \mathbf{y}_z, -1)$, if $z$ appears in $T_i$ but not in $T'_i$; + \item $(\mathbf{y}_z, \mathbf{x}_i, -1)$, if $z$ appears in $T'_i$ but not in $T_i$; + \item $(\mathbf{y}_z, \mathbf{x}_i, +1)$, if $z$ does not appear in $T'_i$ nor in $T_i$. +\end{itemize} +In other words, the orientation of the arc encodes whether partition $i$ is stored in zone $z$ in the assignment $T$ and the weight $\pm 1$ encodes whether this corresponds to what happens in the assignment $T'$. + +\begin{figure}[t] + \centering + \begin{minipage}{.40\linewidth} + \centering + \includegraphics[width=.8\linewidth]{figures/mini_zone} + \end{minipage} + \begin{minipage}{.55\linewidth} + \centering + \includegraphics[width=.8\linewidth]{figures/mini_node} + \end{minipage} + \caption{On the left: the graph $G_T$ encoding an assignment to minimize the zone discrepancy. On the right: the graph $G_T$ encoding an assignment to minimize the node discrepancy.} +\end{figure} + + +Notice that at every partition, there are three outgoing arcs, and at every zone, there are $n_z$ incoming arcs. Moreover, if $w(e)$ is the weight of an arc $e$, define the weight of $G_T$ by +\begin{align*} +w(G_T) := \sum_{e\in E} w(e) &= \#Z \times N - 4 \sum_{1\le i\le N} \#\{z\in Z ~|~ z\cap T_i = \emptyset, z\cap T'_i \neq \emptyset\} \\ +&=\#Z \times N - 4 \sum_{1\le i\le N} 3- \#\{z\in Z ~|~ z\cap T_i \neq \emptyset, z\cap T'_i \neq \emptyset\} \\ +&= (\#Z-12)N + 4 Q_Z. +\end{align*} +Hence maximizing $Q_Z$ is equivalent to maximizing $w(G_T)$. + +Assume that their exist some assignment $T^*$ with the same utilization $(n_v)_{v\in V}$. Define $G_{T^*}$ similarly and consider the set $E_\mathrm{Diff} = E_T \setminus E_{T^*}$ of arcs that appear only in $G_T$. Since all vertices have the same number of incoming arcs in $G_T$ and $G_{T^*}$, the vertices of the graph $(X, E_\mathrm{Diff})$ must all have the same number number of incoming and outgoing arrows. So $E_\mathrm{Diff}$ can be expressed as a union of disjoint cycles. Moreover, the edges of $E_\mathrm{Diff}$ must appear in $E_{T^*}$ with reversed orientation and opposite weight. Hence, we have +$$ + w(G_T) - w(G_{T^*}) = 2 \sum_{e\in E_\mathrm{Diff}} w(e). +$$ +Hence, if $T$ is not optimal, there exists some $T^*$ with $w(G_T) < w(G_{T^*})$, and by the considerations above, there must exist a cycle in $E_\mathrm{Diff}$, and hence in $G_T$, with negative weight. If we reverse the edges and weights along this cycle, we obtain some graph. Since we did not change the incoming degree of any vertex, this is the graph encoding of some valid assignment $T^+$ such that $w(G_{T^+}) > w(G_T)$. We can iterate this operation until there is no other assignment $T^*$ with larger weight, that is until we obtain an optimal assignment. + + + +\subsubsection{Minimizing the node discrepancy} + +We will follow an approach similar to the one where we minimize the zone discrepancy. Here we will directly obtain a node assignment from a graph encoding. + +Let $G_T=(X,E_T)$ be the directed weighted graph with vertices $(\mathbf{x}_i)_{1\le i\le N}$, $(\mathbf{y}_{z,i})_{z\in Z, 1\le i\le N}$ and $(\mathbf{u}_v)_{v\in V}$. For any $1\le i\le N$ and $z\in Z$, $E_T$ contains the arc: +\begin{itemize} + \item $(\mathbf{x}_i, \mathbf{y}_{z,i}, 0)$, if $z$ appears in $T_i$; + \item $(\mathbf{y}_{z,i}, \mathbf{x}_i, 0)$, if $z$ does not appear in $T_i$. +\end{itemize} +For any $1\le i\le N$ and $v\in V$, $E_T$ contains the arc: +\begin{itemize} + \item $(\mathbf{y}_{z_v,i}, \mathbf{u}_v, +1)$, if $v$ appears in $T_i'$ and $T_i$; + \item $(\mathbf{y}_{z_v,i}, \mathbf{u}_v, -1)$, if $v$ appears in $T_i$ but not in $T'_i$; + \item $(\mathbf{u}_v, \mathbf{y}_{z_v,i}, -1)$, if $v$ appears in $T'_i$ but not in $T_i$; + \item $(\mathbf{u}_v, \mathbf{y}_{z_v,i}, +1)$, if $v$ does not appear in $T'_i$ nor in $T_i$. +\end{itemize} +Every vertex $\mathbb{x}_i$ has outgoing degree 3, every vertex $\mathbf{y}_{z,v}$ has outgoing degree 1, and every vertex $\mathbf{u}_v$ has incoming degree $n_v$. +Remark that any graph respecting these degree constraints is the encoding of a valid assignment with utilizations $(n_v)_{v\in V}$, in particular no partition is stored in two nodes of the same zone. + +We define $w(G_T)$ similarly: +\begin{align*} + w(G_T) := \sum_{e\in E_T} w(e) &= \#V \times N - 4\sum_{1\le i\le N} 3-\#(T_i\cap T'_i) \\ + &= (\#V-12)N + 4Q_V. +\end{align*} + +Exactly like in the previous section, the existence of an assignment with larger weight implies the existence of a negatively weighted cycle in $G_T$. Reversing this cycle gives us the encoding of a valid assignment with a larger weight. Iterating this operation yields an optimal assignment. + + +\subsubsection{Linear combination of both criteria} + +In the graph $G_T$ defined in the previous section, instead of having weights $0$ and $\pm 1$, we could be having weights $\pm\alpha$ between $\mathbf{x}$ and $\mathbf{y}$ vertices, and weights $\pm\beta$ between $\mathbf{y}$ and $\mathbf{u}$ vertices, for some $\alpha,\beta>0$ (we have positive weight if the assignment corresponds to $T'$ and negative otherwise). Then +\begin{align*} + w(G_T) &= \sum_{e\in E_T} w(e) = + \alpha \big( (\#Z-12)N + 4 Q_Z\big) + + \beta \big( (\#V-12)N + 4 Q_V\big) \\ + &= \mathrm{const}+ 4(\alpha Q_Z + \beta Q_V). +\end{align*} +So maximizing the weight of such graph encoding would be equivalent to maximizing a linear combination of $Q_Z$ and $Q_V$. + + +\subsection{Algorithm} +We give a high level description of the algorithm to compute an optimal 3-strict assignment. The operations appearing at lines 1,2,4 are respectively described by Algorithms \ref{alg:util},\ref{alg:opt} and \ref{alg:mini}. + + + +\begin{algorithm}[H] + \caption{Optimal 3-strict assignment} + \label{alg:total} + \begin{algorithmic}[1] + \Function{Optimal 3-strict assignment}{$N$, $(c_v)_{v\in V}$, $T'$} + \State $(n_v)_{v\in V} \leftarrow$ \Call{Compute optimal utilization}{$N$, $(c_v)_{v\in V}$} + \State $(T_i)_{1\le i\le N} \leftarrow$ \Call{Compute candidate assignment}{$N$, $(n_v)_{v\in V}$} + \If {there was a previous assignment $T'$} + \State $T \leftarrow$ \Call{Minimization of transfers}{$(T_i)_{1\le i\le N}$, $(T'_i)_{1\le i\le N}$} + \EndIf + \State \Return $T$. + \EndFunction + \end{algorithmic} +\end{algorithm} + +We give some considerations of worst case complexity for these algorithms. In the following, we assume $N>\#V>\#Z$. The complexity of Algorithm \ref{alg:total} is $O(N^3\# Z)$ if we assume \eqref{hyp:A} and $O(N^3 \#Z \#V)$ if we assume \eqref{hyp:B}. + +Algorithm \ref{alg:util} can be implemented with complexity $O(\#V^2)$. The complexity of the function call at line \ref{lin:subutil} is $O(\#V)$. The difference between the sum of the subutilizations and $3N$ is at most the sum of the rounding errors when computing the $\hat{n}_v$. Hence it is bounded by $\#V$ and the loop at line \ref{lin:loopsub} is iterated at most $\#V$ times. Finding the minimizing $v$ at line \ref{lin:findmin} takes $O(\#V)$ operations (naively, we could also use a heap). + +Algorithm \ref{alg:opt} can be implemented with complexity $O(N^3\times \#Z)$. The flow graph has $O(N+\#Z)$ vertices and $O(N\times \#Z)$ edges. Dinic's algorithm has complexity $O(\#\mathrm{Vertices}^2\#\mathrm{Edges})$ hence in our case it is $O(N^3\times \#Z)$. + +Algorithm \ref{alg:mini} can be implented with complexity $O(N^3\# Z)$ under \eqref{hyp:A} and $O(N^3 \#Z \#V)$ under \eqref{hyp:B}. +The graph $G_T$ has $O(N)$ vertices and $O(N\times \#Z)$ edges under assumption \eqref{hyp:A} and respectively $O(N\times \#Z)$ vertices and $O(N\times \#V)$ edges under assumption \eqref{hyp:B}. The loop at line \ref{lin:repeat} is iterated at most $N$ times since the distance between $T$ and $T'$ decreases at every iteration. Bellman-Ford algorithm has complexity $O(\#\mathrm{Vertices}\#\mathrm{Edges})$, which in our case amounts to $O(N^2\# Z)$ under \eqref{hyp:A} and $O(N^2 \#Z \#V)$ under \eqref{hyp:B}. + +\begin{algorithm} + \caption{Computation of the optimal utilization} + \label{alg:util} + \begin{algorithmic}[1] +\Function{Compute optimal utilization}{$N$, $(c_v)_{v\in V}$} + \State $(\hat{n}_v)_{v\in V} \leftarrow $ \Call{Compute subutilization}{$N$, $(c_v)_{v\in V}$} \label{lin:subutil} + \While{$\sum_{v\in V} \hat{n}_v < 3N$} \label{lin:loopsub} + \State Pick $v\in V$ minimizing $\frac{c_v}{\hat{n}_v+1}$ and such that + $\sum_{v'\in z_v} \hat{n}_{v'} < N$ \label{lin:findmin} + \State $\hat{n}_v \leftarrow \hat{n}_v+1$ + \EndWhile + \State \Return $(\hat{n}_v)_{v\in V}$ +\EndFunction +\State + +\Function{Compute subutilization}{$N$, $(c_v)_{v\in V}$} + \State $R \leftarrow 3$ +\For{$v\in V$} +\State $\hat{n}_v \leftarrow \mathrm{unset}$ +\EndFor +\For{$z\in Z$} +\State $c_z \leftarrow \sum_{v\in z} c_v$ +\EndFor +\State $C \leftarrow \sum_{z\in Z} c_z$ +\While{$\exists z \in Z$ such that $R\times c_{z} > C$} +\For{$v\in z$} +\State $\hat{n}_v \leftarrow \left\lfloor \frac{c_v}{c_z} N \right\rfloor$ +\EndFor +\State $C \leftarrow C-c_z$ +\State $R\leftarrow R-1$ +\EndWhile +\For{$v\in V$} +\If{$\hat{n}_v = \mathrm{unset}$} +\State $\hat{n}_v \leftarrow \left\lfloor \frac{Rc_v}{C} N \right\rfloor$ +\EndIf +\EndFor +\State \Return $(\hat{n}_v)_{v\in V}$ +\EndFunction + \end{algorithmic} +\end{algorithm} + +\begin{algorithm} + \caption{Computation of a candidate assignment} + \label{alg:opt} + \begin{algorithmic}[1] + \Function{Compute candidate assignment}{$N$, $(n_v)_{v\in V}$} + \State Compute the flow graph $G$ + \State Compute the maximal flow $f$ using Dinic's algorithm with randomized neighbours enumeration + \State Construct the assignment $(T_i)_{1\le i\le N}$ from $f$ + \State \Return $(T_i)_{1\le i\le N}$ + \EndFunction + \end{algorithmic} +\end{algorithm} + + +\begin{algorithm} + \caption{Minimization of the number of transfers} + \label{alg:mini} + \begin{algorithmic}[1] + \Function{Minimization of transfers}{$(T_i)_{1\le i\le N}$, $(T'_i)_{1\le i\le N}$} + \State Construct the graph encoding $G_T$ + \Repeat \label{lin:repeat} + \State Find a negative cycle $\gamma$ using Bellman-Ford algorithm on $G_T$ + \State Reverse the orientations and weights of edges in $\gamma$ + \Until{no negative cycle is found} + \State Update $(T_i)_{1\le i\le N}$ from $G_T$ + \State \Return $(T_i)_{1\le i\le N}$ + \EndFunction + \end{algorithmic} +\end{algorithm} + +\newpage + +\section{Computation of a 3-non-strict assignment} + +\subsection{Choices of optimality} + +In this mode, we primarily want to store every partition on three nodes, and only secondarily try to spread the nodes among different zone. So we make the choice of not taking the zone repartition in the criterion of optimality. + +We try to maximize $s^*$ defined in \eqref{eq:optimal}. So we can compute the optimal utilizations $(n_v)_{v\in V}$ with the only constraint that $n_v \le N$ for every node $v$. As in the previous section, we start with a sub-utilization proportional to $c_v$ (and capped at $N$), and we iteratively increase the $\hat{n}_v$ that is less than $N$ and maximizes the quantity $c_v/(\hat{n}_v+1)$, until the total sum is $3N$. + +\subsection{Computation of a candidate assignment} + +To compute a candidate assignment (that does not optimize zone spreading nor distance to a previous assignment yet), we can use the folowing flow problem. + +Define the oriented weighted graph $(X,E)$. The set of vertices $X$ contains the source $\mathbf{s}$, the sink $\mathbf{t}$, vertices +$\mathbf{x}_p, \mathbf{u}^+_p, \mathbf{u}^-_p$ for every partition $p$, vertices $\mathbf{y}_{p,z}$ for every partition $p$ and zone $z$, and vertices $\mathbf{z}_v$ for every node $v$. + +The set of edges is composed of the following arcs: +\begin{itemize} + \item ($\mathbf{s}$,$\mathbf{x}_p$, 3) for every partition $p$; + \item ($\mathbf{x}_p$,$\mathbf{u}^+_p$, 3) for every partition $p$; + \item ($\mathbf{x}_p$,$\mathbf{u}^-_p$, 2) for every partition $p$; + \item ($\mathbf{u}^+_p$,$\mathbf{y}_{p,z}$, 1) for every partition $p$ and zone $z$; + \item ($\mathbf{u}^-_p$,$\mathbf{y}_{p,z}$, 2) for every partition $p$ and zone $z$; + \item ($\mathbf{y}_{p,z}$,$\mathbf{z}_v$, 1) for every partition $p$, zone $z$ and node $v\in z$; + \item ($\mathbf{z}_v$, $\mathbf{t}$, $n_v$) for every node $v$; +\end{itemize} + +One can check that any maximal flow in this graph corresponds to an assignment of partitions to nodes. In such a flow, all the arcs from $\mathbf{s}$ and to $\mathbf{t}$ are saturated. The arc from $\mathbf{y}_{p,z}$ to $\mathbf{z}_v$ is saturated if and only if $p$ is associated to~$v$. +Finally the flow from $\mathbf{x}_p$ to $\mathbf{y}_{p,z}$ can go either through $\mathbf{u}^+_p$ or $\mathbf{u}^-_p$. + + + +\subsection{Maximal spread and minimal transfers} +Notice that if the arc $\mathbf{u}_p^+\mathbf{y}_{p,z}$ is not saturated but there is some flow in $\mathbf{u}_p^-\mathbf{y}_{p,z}$, then it is possible to transfer a unit of flow from the path $\mathbf{x}_p\mathbf{u}_p^-\mathbf{y}_{p,z}$ to the path $\mathbf{x}_p\mathbf{u}_p^+\mathbf{y}_{p,z}$. So we can always find an equivalent maximal flow $f^*$ that uses the path through $\mathbf{u}_p^-$ only if the path through $\mathbf{u}_p^+$ is saturated. + +We will use this fact to consider the amount of flow going through the vertices $\mathbf{u}^+$ as a measure of how well the partitions are spread over nodes belonging to different zones. If the partition $p$ is associated to 3 different zones, then a flow of 3 will cross $\mathbf{u}_p^+$ in $f^*$ (i.e. a flow of 0 will cross $\mathbf{u}_p^+$). If $p$ is associated to two zones, a flow of $2$ will cross $\mathbf{u}_p^+$. If $p$ is associated to a single zone, a flow of $1$ will cross $\mathbf{u}_p^+$. + +Let $N_1, N_2, N_3$ be the number of partitions associated to respectively 1,2 and 3 distinct zones. We will optimize a linear combination of these variables using the discovery of positively weighted circuits in a graph. + +At the same step, we will also optimize the distance to a previous assignment $T'$. Let $\alpha> \beta> \gamma \ge 0$ be three parameters. + +Given the flow $f$, let $G_f=(X',E_f)$ be the multi-graph where $X' = X\setminus\{\mathbf{s},\mathbf{t}\}$. The set $E_f$ is composed of the arcs: +\begin{itemize} +\item As many arcs from $(\mathbf{x}_p, \mathbf{u}^+_p,\alpha), (\mathbf{x}_p, \mathbf{u}^+_p,\beta), (\mathbf{x}_p, \mathbf{u}^+_p,\gamma)$ (selected in this order) as there is flow crossing $\mathbf{u}^+_p$ in $f$; +\item As many arcs from $(\mathbf{u}^+_p, \mathbf{x}_p,-\gamma), (\mathbf{u}^+_p, \mathbf{x}_p,-\beta), (\mathbf{u}^+_p, \mathbf{x}_p,-\alpha)$ (selected in this order) as there is flow crossing $\mathbf{u}^-_p$ in $f$; +\item As many copies of $(\mathbf{x}_p, \mathbf{u}^-_p,0)$ as there is flow through $\mathbf{u}^-_p$; +\item As many copies of $(\mathbf{u}^-_p,\mathbf{x}_p,0)$ so that the number of arcs between these two vertices is 2; +\item $(\mathbf{u}^+_p,\mathbf{y}_{p,z}, 0)$ if the flow between these vertices is 1, and the opposite arc otherwise; +\item as many copies of $(\mathbf{u}^-_p,\mathbf{y}_{p,z}, 0)$ as the flow between these vertices, and as many copies of the opposite arc as 2~$-$~the flow; +\item $(\mathbf{y}_{p,z},\mathbf{z}_v, \pm1)$ if it is saturated in $f$, with $+1$ if $v\in T'_p$ and $-1$ otherwise; +\item $(\mathbf{z}_v,\mathbf{y}_{p,z}, \pm1)$ if it is not saturated in $f$, with $+1$ if $v\notin T'_p$ and $-1$ otherwise. +\end{itemize} +To summarize, arcs are oriented left to right if they correspond to a presence of flow in $f$, and right to left if they correspond to an absence of flow. They are positively weighted if we want them to stay at their current state, and negatively if we want them to switch. Let us compute the weight of such graph. + +\begin{multline*} + w(G_f) = \sum_{e\in E_f} w(e_f) \\ + = + (\alpha - \beta -\gamma) N_1 + (\alpha +\beta - \gamma) N_2 + (\alpha+\beta+\gamma) N_3 + \\ + + \#V\times N - 4 \sum_p 3-\#(T_p\cap T'_p) \\ + =(\#V-12+\alpha-\beta-\gamma)\times N + 4Q_V + 2\beta N_2 + 2(\beta+\gamma) N_3 \\ +\end{multline*} + +As for the mode 3-strict, one can check that the difference of two such graphs corresponding to the same $(n_v)$ is always eulerian. Hence we can navigate in this class with the same greedy algorithm that discovers positive cycles and flips them. + +The function that we optimize is +$$ +2Q_V + \beta N_2 + (\beta+\gamma) N_3. +$$ +The choice of parameters $\beta$ and $\gamma$ should be lead by the following question: For $\beta$, where to put the tradeoff between zone dispersion and distance to the previous configuration? For $\gamma$, do we prefer to have more partitions spread between 2 zones, or have less between at least 2 zones but more between 3 zones. + +The quantity $Q_V$ varies between $0$ and $3N$, it should be of order $N$. The quantity $N_2+N_3$ should also be of order $N$ (it is exactly $N$ in the strict mode). So the two terms of the function are comparable. + + +\bibliography{optimal_layout} +\bibliographystyle{ieeetr} + +\end{document} + + + diff --git a/nix/compile.nix b/nix/compile.nix index c2f557da..efd88bbf 100644 --- a/nix/compile.nix +++ b/nix/compile.nix @@ -189,7 +189,7 @@ let rootFeatures = if features != null then features else - ([ "garage/bundled-libs" "garage/sled" "garage/k2v" ] ++ (if release then [ + ([ "garage/bundled-libs" "garage/sled" "garage/lmdb" "garage/k2v" ] ++ (if release then [ "garage/consul-discovery" "garage/kubernetes-discovery" "garage/metrics" diff --git a/script/dev-bucket.sh b/script/dev-bucket.sh index 9bcf5bda..708c2c43 100755 --- a/script/dev-bucket.sh +++ b/script/dev-bucket.sh @@ -9,11 +9,22 @@ GARAGE_RELEASE="${REPO_FOLDER}/target/release/" NIX_RELEASE="${REPO_FOLDER}/result/bin/" PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" -garage -c /tmp/config.1.toml bucket create eprouvette -KEY_INFO=$(garage -c /tmp/config.1.toml key new --name opérateur) +if [ -z "$GARAGE_BIN" ]; then + GARAGE_BIN=$(which garage || exit 1) + echo -en "Found garage at: ${GARAGE_BIN}\n" +else + echo -en "Using garage binary at: ${GARAGE_BIN}\n" +fi + +$GARAGE_BIN -c /tmp/config.1.toml bucket create eprouvette +if [ "$GARAGE_08" = "1" ]; then + KEY_INFO=$($GARAGE_BIN -c /tmp/config.1.toml key new --name opérateur) +else + KEY_INFO=$($GARAGE_BIN -c /tmp/config.1.toml key create opérateur) +fi ACCESS_KEY=`echo $KEY_INFO|grep -Po 'GK[a-f0-9]+'` SECRET_KEY=`echo $KEY_INFO|grep -Po 'Secret key: [a-f0-9]+'|grep -Po '[a-f0-9]+$'` -garage -c /tmp/config.1.toml bucket allow eprouvette --read --write --owner --key $ACCESS_KEY +$GARAGE_BIN -c /tmp/config.1.toml bucket allow eprouvette --read --write --owner --key $ACCESS_KEY echo "$ACCESS_KEY $SECRET_KEY" > /tmp/garage.s3 echo "Bucket s3://eprouvette created. Credentials stored in /tmp/garage.s3." diff --git a/script/dev-cluster.sh b/script/dev-cluster.sh index c7fbe08d..6b39255a 100755 --- a/script/dev-cluster.sh +++ b/script/dev-cluster.sh @@ -11,11 +11,16 @@ PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" FANCYCOLORS=("41m" "42m" "44m" "45m" "100m" "104m") export RUST_BACKTRACE=1 -export RUST_LOG=garage=info,garage_api=debug,netapp=trace +export RUST_LOG=garage=info,garage_api=debug MAIN_LABEL="\e[${FANCYCOLORS[0]}[main]\e[49m" -WHICH_GARAGE=$(which garage || exit 1) -echo -en "${MAIN_LABEL} Found garage at: ${WHICH_GARAGE}\n" +if [ -z "$GARAGE_BIN" ]; then + GARAGE_BIN=$(which garage || exit 1) + echo -en "${MAIN_LABEL} Found garage at: ${GARAGE_BIN}\n" +else + echo -en "${MAIN_LABEL} Using garage binary at: ${GARAGE_BIN}\n" +fi +$GARAGE_BIN --version NETWORK_SECRET="$(openssl rand -hex 32)" @@ -28,6 +33,7 @@ LABEL="\e[${FANCYCOLORS[$count]}[$count]\e[49m" cat > $CONF_PATH <<EOF block_size = 1048576 # objects are split in blocks of maximum this number of bytes metadata_dir = "/tmp/garage-meta-$count" +db_engine = "lmdb" data_dir = "/tmp/garage-data-$count" rpc_bind_addr = "0.0.0.0:$((3900+$count))" # the port other Garage nodes will use to talk to this node rpc_public_addr = "127.0.0.1:$((3900+$count))" @@ -51,7 +57,7 @@ EOF echo -en "$LABEL configuration written to $CONF_PATH\n" -(garage -c /tmp/config.$count.toml server 2>&1|while read r; do echo -en "$LABEL $r\n"; done) & +($GARAGE_BIN -c /tmp/config.$count.toml server 2>&1|while read r; do echo -en "$LABEL $r\n"; done) & done # >>>>>>>>>>>>>>>> END FOR LOOP ON NODES @@ -73,14 +79,14 @@ fi sleep 3 # Establish connections between nodes for count in $(seq 1 3); do - NODE=$(garage -c /tmp/config.$count.toml node id -q) + NODE=$($GARAGE_BIN -c /tmp/config.$count.toml node id -q) for count2 in $(seq 1 3); do - garage -c /tmp/config.$count2.toml node connect $NODE + $GARAGE_BIN -c /tmp/config.$count2.toml node connect $NODE done done RETRY=120 -until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do +until $GARAGE_BIN -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do (( RETRY-- )) if (( RETRY <= 0 )); then echo -en "${MAIN_LABEL} Garage did not start" diff --git a/script/dev-configure.sh b/script/dev-configure.sh index f0a7843d..0649cdbe 100755 --- a/script/dev-configure.sh +++ b/script/dev-configure.sh @@ -9,9 +9,17 @@ GARAGE_RELEASE="${REPO_FOLDER}/target/release/" NIX_RELEASE="${REPO_FOLDER}/result/bin/" PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" +if [ -z "$GARAGE_BIN" ]; then + GARAGE_BIN=$(which garage || exit 1) + echo -en "Found garage at: ${GARAGE_BIN}\n" +else + echo -en "Using garage binary at: ${GARAGE_BIN}\n" +fi +$GARAGE_BIN --version + sleep 5 RETRY=120 -until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do +until $GARAGE_BIN -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do (( RETRY-- )) if (( RETRY <= 0 )); then echo "garage did not start in time, failing." @@ -21,11 +29,20 @@ until garage -c /tmp/config.1.toml status 2>&1|grep -q HEALTHY ; do sleep 1 done -garage -c /tmp/config.1.toml status \ - | grep 'NO ROLE' \ - | grep -Po '^[0-9a-f]+' \ - | while read id; do - garage -c /tmp/config.1.toml layout assign $id -z dc1 -c 1 - done +if [ "$GARAGE_08" = "1" ]; then + $GARAGE_BIN -c /tmp/config.1.toml status \ + | grep 'NO ROLE' \ + | grep -Po '^[0-9a-f]+' \ + | while read id; do + $GARAGE_BIN -c /tmp/config.1.toml layout assign $id -z dc1 -c 1 + done +else + $GARAGE_BIN -c /tmp/config.1.toml status \ + | grep 'NO ROLE' \ + | grep -Po '^[0-9a-f]+' \ + | while read id; do + $GARAGE_BIN -c /tmp/config.1.toml layout assign $id -z dc1 -c 1G + done +fi -garage -c /tmp/config.1.toml layout apply --version 1 +$GARAGE_BIN -c /tmp/config.1.toml layout apply --version 1 diff --git a/script/test-renumbering.sh b/script/test-renumbering.sh new file mode 100644 index 00000000..0b1bd320 --- /dev/null +++ b/script/test-renumbering.sh @@ -0,0 +1,138 @@ +#!/usr/bin/env bash + +: ' + This script tests part renumbering on an S3 remote (here configured for Minio). + + On Minio: + + The results confirm that if I upload parts with number 1, 4, 5 and 6, + they are renumbered to 1, 2, 3 and 4 after CompleteMultipartUpload. + Thus, specifying partNumber=4 on a GetObject/HeadObject should return + information on the part I originally uploaded with part number + + On S3: not tested + + Sample output (on Minio): + + f07e1404cc527d494242824ded3a616b part1 + 78974cd4d0f622eb3426ea7cd22f5a1c part4 + f9cc379f8baa61645558d9ba7e6351fa part5 + 1bd2383eebbac1f8e7143575ba5b1f4a part6 + Upload ID: 6838b813-d0ca-400b-9d28-ec8b2b5cd004 + PART 1 ETag: "f07e1404cc527d494242824ded3a616b" + PART 4 ETag: "78974cd4d0f622eb3426ea7cd22f5a1c" + PART 5 ETag: "f9cc379f8baa61645558d9ba7e6351fa" + PART 6 ETag: "1bd2383eebbac1f8e7143575ba5b1f4a" + ======================================== LIST ==== + { + "Parts": [ + { + "PartNumber": 1, + "LastModified": "2023-04-25T10:21:54.350000+00:00", + "ETag": "\"f07e1404cc527d494242824ded3a616b\"", + "Size": 20971520 + }, + { + "PartNumber": 4, + "LastModified": "2023-04-25T10:21:54.350000+00:00", + "ETag": "\"78974cd4d0f622eb3426ea7cd22f5a1c\"", + "Size": 20971520 + }, + { + "PartNumber": 5, + "LastModified": "2023-04-25T10:21:54.350000+00:00", + "ETag": "\"f9cc379f8baa61645558d9ba7e6351fa\"", + "Size": 20971520 + }, + { + "PartNumber": 6, + "LastModified": "2023-04-25T10:21:54.350000+00:00", + "ETag": "\"1bd2383eebbac1f8e7143575ba5b1f4a\"", + "Size": 20971520 + } + ], + "ChecksumAlgorithm": "", + "Initiator": { + "ID": "02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4", + "DisplayName": "02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4" + }, + "Owner": { + "DisplayName": "02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4", + "ID": "02d6176db174dc93cb1b899f7c6078f08654445fe8cf1b6ce98d8855f66bdbf4" + }, + "StorageClass": "STANDARD" + } + ======================================== COMPLETE ==== + { + "Location": "http://localhost:9000/test/upload", + "Bucket": "test", + "Key": "upload", + "ETag": "\"8e817c8ccd442f9a79c77b58fe808c43-4\"" + } + ======================================== LIST ==== + + An error occurred (NoSuchUpload) when calling the ListParts operation: The specified multipart upload does not exist. The upload ID may be invalid, or the upload may have been aborted or completed. + ======================================== GET PART 4 ==== + { + "AcceptRanges": "bytes", + "LastModified": "2023-04-25T10:21:59+00:00", + "ContentLength": 20971520, + "ETag": "\"8e817c8ccd442f9a79c77b58fe808c43-4\"", + "ContentRange": "bytes 62914560-83886079/83886080", + "ContentType": "binary/octet-stream", + "Metadata": {}, + "PartsCount": 4 + } + 1bd2383eebbac1f8e7143575ba5b1f4a get-part4 + + + Conclusions: + + - Parts are indeed renumbered with consecutive numbers + - ListParts only applies to multipart uploads in progress, + it cannot be used once the multipart upload has been completed +' + +export AWS_ACCESS_KEY_ID=1D8Pk2k4oQSoh1BU +export AWS_SECRET_ACCESS_KEY=4B46SR8U7FUgY0raB8Zuxg1NLyLTvbNV + +function aws { command aws --endpoint-url http://localhost:9000 $@ ; } + +aws --version + +aws s3 mb s3://test + +for NUM in 1 4 5 6; do + dd if=/dev/urandom of=part$NUM bs=1M count=10 +done +md5sum part* + +UPLOAD=$(aws s3api create-multipart-upload --bucket test --key 'upload' | jq -r ".UploadId") +echo "Upload ID: $UPLOAD" + +PARTS="" + +for NUM in 1 4 5 6; do + ETAG=$(aws s3api upload-part --bucket test --key 'upload' --part-number $NUM \ + --body "part$NUM" --upload-id "$UPLOAD" | jq -r ".ETag") + echo "PART $NUM ETag: $ETAG" + if [ -n "$PARTS" ]; then + PARTS="$PARTS," + fi + PARTS="$PARTS {\"ETag\":$ETAG,\"PartNumber\":$NUM}" +done + +echo "======================================== LIST ====" +aws s3api list-parts --bucket test --key upload --upload-id "$UPLOAD" | jq + +echo "======================================== COMPLETE ====" +echo "{\"Parts\":[$PARTS]}" > mpu +aws s3api complete-multipart-upload --multipart-upload file://mpu \ + --bucket test --key 'upload' --upload-id "$UPLOAD" + +echo "======================================== LIST ====" +aws s3api list-parts --bucket test --key upload --upload-id "$UPLOAD" | jq + +echo "======================================== GET PART 4 ====" +aws s3api get-object --bucket test --key upload --part-number 4 get-part4 +md5sum get-part4 diff --git a/script/test-skip-part.sh b/script/test-skip-part.sh new file mode 100644 index 00000000..20ae017d --- /dev/null +++ b/script/test-skip-part.sh @@ -0,0 +1,103 @@ +#!/usr/bin/env bash + +: ' + This script tests whether uploaded parts can be skipped in a + CompleteMultipartUpoad + + On Minio: yes, parts can be skipped + + On S3: not tested + + Sample output (on Minio): + + f23911bcd1230f5ebe8887cbf5bc396e part1 + a2657143167eaf647c40473e78a091dc part4 + 72f72c02c5163bc81024b28ac818c5e0 part5 + e29cf500d20498218904b8df8806caa2 part6 + Upload ID: e8fe7b83-9800-46fb-ae90-9d7ccd42fe76 + PART 1 ETag: "f23911bcd1230f5ebe8887cbf5bc396e" + PART 4 ETag: "a2657143167eaf647c40473e78a091dc" + PART 5 ETag: "72f72c02c5163bc81024b28ac818c5e0" + PART 6 ETag: "e29cf500d20498218904b8df8806caa2" + ======================================== COMPLETE ==== + { + "Location": "http://localhost:9000/test/upload", + "Bucket": "test", + "Key": "upload", + "ETag": "\"48246e44d4b38bdc2f3c10ee25b1af17-3\"" + } + ======================================== GET FULL ==== + { + "AcceptRanges": "bytes", + "LastModified": "2023-04-25T10:54:35+00:00", + "ContentLength": 31457280, + "ETag": "\"48246e44d4b38bdc2f3c10ee25b1af17-3\"", + "ContentType": "binary/octet-stream", + "Metadata": {} + } + 97fb904da7ad310699a6afab0eb6e061 get-full + 97fb904da7ad310699a6afab0eb6e061 - + ======================================== GET PART 3 ==== + { + "AcceptRanges": "bytes", + "LastModified": "2023-04-25T10:54:35+00:00", + "ContentLength": 10485760, + "ETag": "\"48246e44d4b38bdc2f3c10ee25b1af17-3\"", + "ContentRange": "bytes 20971520-31457279/31457280", + "ContentType": "binary/octet-stream", + "Metadata": {}, + "PartsCount": 3 + } + e29cf500d20498218904b8df8806caa2 get-part3 + + Conclusions: + + - Skipping a part in a CompleteMultipartUpoad call is OK + - The part is simply not included in the stored object + - Sequential part renumbering counts only non-skipped parts +' + +export AWS_ACCESS_KEY_ID=1D8Pk2k4oQSoh1BU +export AWS_SECRET_ACCESS_KEY=4B46SR8U7FUgY0raB8Zuxg1NLyLTvbNV + +function aws { command aws --endpoint-url http://localhost:9000 $@ ; } + +aws --version + +aws s3 mb s3://test + +for NUM in 1 4 5 6; do + dd if=/dev/urandom of=part$NUM bs=1M count=10 +done +md5sum part* + +UPLOAD=$(aws s3api create-multipart-upload --bucket test --key 'upload' | jq -r ".UploadId") +echo "Upload ID: $UPLOAD" + +PARTS="" + +for NUM in 1 4 5 6; do + ETAG=$(aws s3api upload-part --bucket test --key 'upload' --part-number $NUM \ + --body "part$NUM" --upload-id "$UPLOAD" | jq -r ".ETag") + echo "PART $NUM ETag: $ETAG" + if [ "$NUM" != "5" ]; then + if [ -n "$PARTS" ]; then + PARTS="$PARTS," + fi + PARTS="$PARTS {\"ETag\":$ETAG,\"PartNumber\":$NUM}" + fi +done + +echo "======================================== COMPLETE ====" +echo "{\"Parts\":[$PARTS]}" > mpu +aws s3api complete-multipart-upload --multipart-upload file://mpu \ + --bucket test --key 'upload' --upload-id "$UPLOAD" + +echo "======================================== GET FULL ====" +aws s3api get-object --bucket test --key upload get-full +md5sum get-full +cat part1 part4 part6 | md5sum + +echo "======================================== GET PART 3 ====" +aws s3api get-object --bucket test --key upload --part-number 3 get-part3 +md5sum get-part3 diff --git a/script/test-smoke.sh b/script/test-smoke.sh index eababf38..6965c0f3 100755 --- a/script/test-smoke.sh +++ b/script/test-smoke.sh @@ -31,6 +31,11 @@ dd if=/dev/urandom of=/tmp/garage.1.rnd bs=1k count=2 # No multipart, inline sto dd if=/dev/urandom of=/tmp/garage.2.rnd bs=1M count=5 # No multipart but file will be chunked dd if=/dev/urandom of=/tmp/garage.3.rnd bs=1M count=10 # by default, AWS starts using multipart at 8MB +dd if=/dev/urandom of=/tmp/garage.part1.rnd bs=1M count=5 +dd if=/dev/urandom of=/tmp/garage.part2.rnd bs=1M count=5 +dd if=/dev/urandom of=/tmp/garage.part3.rnd bs=1M count=5 +dd if=/dev/urandom of=/tmp/garage.part4.rnd bs=1M count=5 + # data of lower entropy, to test compression dd if=/dev/urandom bs=1k count=2 | base64 -w0 > /tmp/garage.1.b64 dd if=/dev/urandom bs=1M count=5 | base64 -w0 > /tmp/garage.2.b64 @@ -40,7 +45,7 @@ echo "🧪 S3 API testing..." # AWS if [ -z "$SKIP_AWS" ]; then - echo "🛠️ Testing with awscli" + echo "🛠️ Testing with awscli (aws s3)" source ${SCRIPT_FOLDER}/dev-env-aws.sh aws s3 ls for idx in {1..3}.{rnd,b64}; do @@ -51,8 +56,36 @@ if [ -z "$SKIP_AWS" ]; then rm /tmp/garage.$idx.dl aws s3 rm "s3://eprouvette/&+-é\"/garage.$idx.aws" done + + echo "🛠️ Testing multipart uploads with awscli (aws s3api)" + UPLOAD=$(aws s3api create-multipart-upload --bucket eprouvette --key 'upload' | jq -r ".UploadId") + echo "Upload ID: $UPLOAD" + ETAG3=$(aws s3api upload-part --bucket eprouvette --key 'upload' \ + --part-number 3 --body "/tmp/garage.part1.rnd" --upload-id "$UPLOAD" \ + | jq -r ".ETag") + ETAG2=$(aws s3api upload-part --bucket eprouvette --key 'upload' \ + --part-number 2 --body "/tmp/garage.part2.rnd" --upload-id "$UPLOAD" \ + | jq -r ".ETag") + ETAG3=$(aws s3api upload-part --bucket eprouvette --key 'upload' \ + --part-number 3 --body "/tmp/garage.part3.rnd" --upload-id "$UPLOAD" \ + | jq -r ".ETag") + ETAG6=$(aws s3api upload-part --bucket eprouvette --key 'upload' \ + --part-number 6 --body "/tmp/garage.part4.rnd" --upload-id "$UPLOAD" \ + | jq -r ".ETag") + MPU="{\"Parts\":[{\"PartNumber\":2,\"ETag\":$ETAG2}, {\"PartNumber\":3,\"ETag\":$ETAG3}, {\"PartNumber\":6,\"ETag\":$ETAG6}]}" + echo $MPU > /tmp/garage.mpu.json + aws s3api complete-multipart-upload --multipart-upload file:///tmp/garage.mpu.json \ + --bucket eprouvette --key 'upload' --upload-id "$UPLOAD" + aws s3api get-object --bucket eprouvette --key upload /tmp/garage.mpu.get + if [ "$(md5sum /tmp/garage.mpu.get | cut -d ' ' -f 1)" != "$(cat /tmp/garage.part{2,3,4}.rnd | md5sum | cut -d ' ' -f 1)" ]; then + echo "Invalid multipart upload" + exit 1 + fi fi +echo "OK!!" +exit 0 + # S3CMD if [ -z "$SKIP_S3CMD" ]; then echo "🛠️ Testing with s3cmd" @@ -141,6 +174,7 @@ rm eprouvette/winscp EOF fi +rm /tmp/garage.part{1..4}.rnd rm /tmp/garage.{1..3}.{rnd,b64} echo "🏁 Teardown" diff --git a/script/test-upgrade.sh b/script/test-upgrade.sh new file mode 100755 index 00000000..dc25e7c6 --- /dev/null +++ b/script/test-upgrade.sh @@ -0,0 +1,75 @@ +#!/usr/bin/env bash + +set -ex + +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 +SCRIPT_FOLDER="`dirname \"$0\"`" +REPO_FOLDER="${SCRIPT_FOLDER}/../" +GARAGE_DEBUG="${REPO_FOLDER}/target/debug/" +GARAGE_RELEASE="${REPO_FOLDER}/target/release/" +NIX_RELEASE="${REPO_FOLDER}/result/bin/:${REPO_FOLDER}/result-bin/bin/" +PATH="${GARAGE_DEBUG}:${GARAGE_RELEASE}:${NIX_RELEASE}:$PATH" + +OLD_VERSION="$1" +ARCH="$2" + + +echo "Downloading old garage binary..." +curl https://garagehq.deuxfleurs.fr/_releases/$OLD_VERSION/$ARCH/garage > /tmp/old_garage +chmod +x /tmp/old_garage + +echo "============= insert data into old version cluster =================" + +export GARAGE_BIN=/tmp/old_garage +if echo $OLD_VERSION | grep 'v0\.8\.'; then + echo "Detected Garage v0.8.x" + export GARAGE_08=1 +fi + +echo "⏳ Setup cluster using old version" +$GARAGE_BIN --version +${SCRIPT_FOLDER}/dev-clean.sh +${SCRIPT_FOLDER}/dev-cluster.sh > /tmp/garage.log 2>&1 & +sleep 6 +${SCRIPT_FOLDER}/dev-configure.sh +${SCRIPT_FOLDER}/dev-bucket.sh + +echo "🛠️ Inserting data in old cluster" +source ${SCRIPT_FOLDER}/dev-env-rclone.sh +rclone copy "${SCRIPT_FOLDER}/../.git/" garage:eprouvette/test_dotgit --stats=1s --stats-log-level=NOTICE --stats-one-line + +echo "🏁 Stopping old cluster" +killall -INT old_garage +sleep 2 +killall -9 old_garage || true + +echo "🏁 Removing old garage version" +rm -rv $GARAGE_BIN +export -n GARAGE_BIN +export -n GARAGE_08 + +echo "================ read data from new cluster ===================" + +echo "⏳ Setup cluster using new version" +pwd +ls +export GARAGE_BIN=$(which garage) +$GARAGE_BIN --version +${SCRIPT_FOLDER}/dev-cluster.sh >> /tmp/garage.log 2>&1 & +sleep 3 + +echo "🛠️ Retrieving data from old cluster" +rclone copy garage:eprouvette/test_dotgit /tmp/test_dotgit --stats=1s --stats-log-level=NOTICE --stats-one-line --fast-list + +if ! diff <(find "${SCRIPT_FOLDER}/../.git" -type f | xargs md5sum | cut -d ' ' -f 1 | sort) <(find /tmp/test_dotgit -type f | xargs md5sum | cut -d ' ' -f 1 | sort); then + echo "TEST FAILURE: directories are different" + exit 1 +fi +rm -r /tmp/test_dotgit + +echo "🏁 Teardown" +rm -rf /tmp/garage-{data,meta}-* +rm -rf /tmp/config.*.toml + +echo "✅ Success" diff --git a/src/api/admin/api_server.rs b/src/api/admin/api_server.rs index 6f1e44e5..4779f924 100644 --- a/src/api/admin/api_server.rs +++ b/src/api/admin/api_server.rs @@ -25,7 +25,8 @@ use crate::admin::bucket::*; use crate::admin::cluster::*; use crate::admin::error::*; use crate::admin::key::*; -use crate::admin::router::{Authorization, Endpoint}; +use crate::admin::router_v0; +use crate::admin::router_v1::{Authorization, Endpoint}; use crate::helpers::host_to_bucket; pub struct AdminApiServer { @@ -229,7 +230,12 @@ impl ApiHandler for AdminApiServer { type Error = Error; fn parse_endpoint(&self, req: &Request<Body>) -> Result<Endpoint, Error> { - Endpoint::from_request(req) + if req.uri().path().starts_with("/v0/") { + let endpoint_v0 = router_v0::Endpoint::from_request(req)?; + Endpoint::from_v0(endpoint_v0) + } else { + Endpoint::from_request(req) + } } async fn handle( @@ -276,8 +282,13 @@ impl ApiHandler for AdminApiServer { Endpoint::RevertClusterLayout => handle_revert_cluster_layout(&self.garage, req).await, // Keys Endpoint::ListKeys => handle_list_keys(&self.garage).await, - Endpoint::GetKeyInfo { id, search } => { - handle_get_key_info(&self.garage, id, search).await + Endpoint::GetKeyInfo { + id, + search, + show_secret_key, + } => { + let show_secret_key = show_secret_key.map(|x| x == "true").unwrap_or(false); + handle_get_key_info(&self.garage, id, search, show_secret_key).await } Endpoint::CreateKey => handle_create_key(&self.garage, req).await, Endpoint::ImportKey => handle_import_key(&self.garage, req).await, diff --git a/src/api/admin/bucket.rs b/src/api/admin/bucket.rs index f0a4a9e7..17f46c30 100644 --- a/src/api/admin/bucket.rs +++ b/src/api/admin/bucket.rs @@ -14,6 +14,7 @@ use garage_model::bucket_alias_table::*; use garage_model::bucket_table::*; use garage_model::garage::Garage; use garage_model::permission::*; +use garage_model::s3::mpu_table; use garage_model::s3::object_table::*; use crate::admin::error::*; @@ -124,6 +125,14 @@ async fn bucket_info_results( .map(|x| x.filtered_values(&garage.system.ring.borrow())) .unwrap_or_default(); + let mpu_counters = garage + .mpu_counter_table + .table + .get(&bucket_id, &EmptyKey) + .await? + .map(|x| x.filtered_values(&garage.system.ring.borrow())) + .unwrap_or_default(); + let mut relevant_keys = HashMap::new(); for (k, _) in bucket .state @@ -208,12 +217,12 @@ async fn bucket_info_results( } }) .collect::<Vec<_>>(), - objects: counters.get(OBJECTS).cloned().unwrap_or_default(), - bytes: counters.get(BYTES).cloned().unwrap_or_default(), - unfinished_uploads: counters - .get(UNFINISHED_UPLOADS) - .cloned() - .unwrap_or_default(), + objects: *counters.get(OBJECTS).unwrap_or(&0), + bytes: *counters.get(BYTES).unwrap_or(&0), + unfinished_uploads: *counters.get(UNFINISHED_UPLOADS).unwrap_or(&0), + unfinished_multipart_uploads: *mpu_counters.get(mpu_table::UPLOADS).unwrap_or(&0), + unfinished_multipart_upload_parts: *mpu_counters.get(mpu_table::PARTS).unwrap_or(&0), + unfinished_multipart_upload_bytes: *mpu_counters.get(mpu_table::BYTES).unwrap_or(&0), quotas: ApiBucketQuotas { max_size: quotas.max_size, max_objects: quotas.max_objects, @@ -235,6 +244,9 @@ struct GetBucketInfoResult { objects: i64, bytes: i64, unfinished_uploads: i64, + unfinished_multipart_uploads: i64, + unfinished_multipart_upload_parts: i64, + unfinished_multipart_upload_bytes: i64, quotas: ApiBucketQuotas, } diff --git a/src/api/admin/cluster.rs b/src/api/admin/cluster.rs index 98bf2b5a..c8107b82 100644 --- a/src/api/admin/cluster.rs +++ b/src/api/admin/cluster.rs @@ -1,14 +1,13 @@ -use std::collections::HashMap; use std::net::SocketAddr; use std::sync::Arc; -use hyper::{Body, Request, Response, StatusCode}; +use hyper::{Body, Request, Response}; use serde::{Deserialize, Serialize}; use garage_util::crdt::*; use garage_util::data::*; -use garage_rpc::layout::*; +use garage_rpc::layout; use garage_model::garage::Garage; @@ -26,26 +25,37 @@ pub async fn handle_get_cluster_status(garage: &Arc<Garage>) -> Result<Response< .system .get_known_nodes() .into_iter() - .map(|i| { - ( - hex::encode(i.id), - KnownNodeResp { - addr: i.addr, - is_up: i.is_up, - last_seen_secs_ago: i.last_seen_secs_ago, - hostname: i.status.hostname, - }, - ) + .map(|i| KnownNodeResp { + id: hex::encode(i.id), + addr: i.addr, + is_up: i.is_up, + last_seen_secs_ago: i.last_seen_secs_ago, + hostname: i.status.hostname, }) .collect(), - layout: get_cluster_layout(garage), + layout: format_cluster_layout(&garage.system.get_cluster_layout()), }; Ok(json_ok_response(&res)?) } pub async fn handle_get_cluster_health(garage: &Arc<Garage>) -> Result<Response<Body>, Error> { + use garage_rpc::system::ClusterHealthStatus; let health = garage.system.health(); + let health = ClusterHealth { + status: match health.status { + ClusterHealthStatus::Healthy => "healthy", + ClusterHealthStatus::Degraded => "degraded", + ClusterHealthStatus::Unavailable => "unavailable", + }, + known_nodes: health.known_nodes, + connected_nodes: health.connected_nodes, + storage_nodes: health.storage_nodes, + storage_nodes_ok: health.storage_nodes_ok, + partitions: health.partitions, + partitions_quorum: health.partitions_quorum, + partitions_all_ok: health.partitions_all_ok, + }; Ok(json_ok_response(&health)?) } @@ -74,33 +84,68 @@ pub async fn handle_connect_cluster_nodes( } pub async fn handle_get_cluster_layout(garage: &Arc<Garage>) -> Result<Response<Body>, Error> { - let res = get_cluster_layout(garage); + let res = format_cluster_layout(&garage.system.get_cluster_layout()); Ok(json_ok_response(&res)?) } -fn get_cluster_layout(garage: &Arc<Garage>) -> GetClusterLayoutResponse { - let layout = garage.system.get_cluster_layout(); +fn format_cluster_layout(layout: &layout::ClusterLayout) -> GetClusterLayoutResponse { + let roles = layout + .roles + .items() + .iter() + .filter_map(|(k, _, v)| v.0.clone().map(|x| (k, x))) + .map(|(k, v)| NodeRoleResp { + id: hex::encode(k), + zone: v.zone.clone(), + capacity: v.capacity, + tags: v.tags.clone(), + }) + .collect::<Vec<_>>(); + + let staged_role_changes = layout + .staging_roles + .items() + .iter() + .filter(|(k, _, v)| layout.roles.get(k) != Some(v)) + .map(|(k, _, v)| match &v.0 { + None => NodeRoleChange { + id: hex::encode(k), + action: NodeRoleChangeEnum::Remove { remove: true }, + }, + Some(r) => NodeRoleChange { + id: hex::encode(k), + action: NodeRoleChangeEnum::Update { + zone: r.zone.clone(), + capacity: r.capacity, + tags: r.tags.clone(), + }, + }, + }) + .collect::<Vec<_>>(); GetClusterLayoutResponse { version: layout.version, - roles: layout - .roles - .items() - .iter() - .filter(|(_, _, v)| v.0.is_some()) - .map(|(k, _, v)| (hex::encode(k), v.0.clone())) - .collect(), - staged_role_changes: layout - .staging - .items() - .iter() - .filter(|(k, _, v)| layout.roles.get(k) != Some(v)) - .map(|(k, _, v)| (hex::encode(k), v.0.clone())) - .collect(), + roles, + staged_role_changes, } } +// ---- + +#[derive(Debug, Clone, Copy, Serialize)] +#[serde(rename_all = "camelCase")] +pub struct ClusterHealth { + status: &'static str, + known_nodes: usize, + connected_nodes: usize, + storage_nodes: usize, + storage_nodes_ok: usize, + partitions: usize, + partitions_quorum: usize, + partitions_all_ok: usize, +} + #[derive(Serialize)] #[serde(rename_all = "camelCase")] struct GetClusterStatusResponse { @@ -109,11 +154,19 @@ struct GetClusterStatusResponse { garage_features: Option<&'static [&'static str]>, rust_version: &'static str, db_engine: String, - known_nodes: HashMap<String, KnownNodeResp>, + known_nodes: Vec<KnownNodeResp>, + layout: GetClusterLayoutResponse, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct ApplyClusterLayoutResponse { + message: Vec<String>, layout: GetClusterLayoutResponse, } #[derive(Serialize)] +#[serde(rename_all = "camelCase")] struct ConnectClusterNodesResponse { success: bool, error: Option<String>, @@ -123,18 +176,31 @@ struct ConnectClusterNodesResponse { #[serde(rename_all = "camelCase")] struct GetClusterLayoutResponse { version: u64, - roles: HashMap<String, Option<NodeRole>>, - staged_role_changes: HashMap<String, Option<NodeRole>>, + roles: Vec<NodeRoleResp>, + staged_role_changes: Vec<NodeRoleChange>, } #[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct NodeRoleResp { + id: String, + zone: String, + capacity: Option<u64>, + tags: Vec<String>, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] struct KnownNodeResp { + id: String, addr: SocketAddr, is_up: bool, last_seen_secs_ago: Option<u64>, hostname: String, } +// ---- update functions ---- + pub async fn handle_update_cluster_layout( garage: &Arc<Garage>, req: Request<Body>, @@ -144,22 +210,35 @@ pub async fn handle_update_cluster_layout( let mut layout = garage.system.get_cluster_layout(); let mut roles = layout.roles.clone(); - roles.merge(&layout.staging); + roles.merge(&layout.staging_roles); - for (node, role) in updates { - let node = hex::decode(node).ok_or_bad_request("Invalid node identifier")?; + for change in updates { + let node = hex::decode(&change.id).ok_or_bad_request("Invalid node identifier")?; let node = Uuid::try_from(&node).ok_or_bad_request("Invalid node identifier")?; + let new_role = match change.action { + NodeRoleChangeEnum::Remove { remove: true } => None, + NodeRoleChangeEnum::Update { + zone, + capacity, + tags, + } => Some(layout::NodeRole { + zone, + capacity, + tags, + }), + _ => return Err(Error::bad_request("Invalid layout change")), + }; + layout - .staging - .merge(&roles.update_mutator(node, NodeRoleV(role))); + .staging_roles + .merge(&roles.update_mutator(node, layout::NodeRoleV(new_role))); } garage.system.update_cluster_layout(&layout).await?; - Ok(Response::builder() - .status(StatusCode::NO_CONTENT) - .body(Body::empty())?) + let res = format_cluster_layout(&layout); + Ok(json_ok_response(&res)?) } pub async fn handle_apply_cluster_layout( @@ -169,12 +248,15 @@ pub async fn handle_apply_cluster_layout( let param = parse_json_body::<ApplyRevertLayoutRequest>(req).await?; let layout = garage.system.get_cluster_layout(); - let layout = layout.apply_staged_changes(Some(param.version))?; + let (layout, msg) = layout.apply_staged_changes(Some(param.version))?; + garage.system.update_cluster_layout(&layout).await?; - Ok(Response::builder() - .status(StatusCode::NO_CONTENT) - .body(Body::empty())?) + let res = ApplyClusterLayoutResponse { + message: msg, + layout: format_cluster_layout(&layout), + }; + Ok(json_ok_response(&res)?) } pub async fn handle_revert_cluster_layout( @@ -187,14 +269,39 @@ pub async fn handle_revert_cluster_layout( let layout = layout.revert_staged_changes(Some(param.version))?; garage.system.update_cluster_layout(&layout).await?; - Ok(Response::builder() - .status(StatusCode::NO_CONTENT) - .body(Body::empty())?) + let res = format_cluster_layout(&layout); + Ok(json_ok_response(&res)?) } -type UpdateClusterLayoutRequest = HashMap<String, Option<NodeRole>>; +// ---- + +type UpdateClusterLayoutRequest = Vec<NodeRoleChange>; #[derive(Deserialize)] +#[serde(rename_all = "camelCase")] struct ApplyRevertLayoutRequest { version: u64, } + +// ---- + +#[derive(Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +struct NodeRoleChange { + id: String, + #[serde(flatten)] + action: NodeRoleChangeEnum, +} + +#[derive(Serialize, Deserialize)] +#[serde(untagged)] +enum NodeRoleChangeEnum { + #[serde(rename_all = "camelCase")] + Remove { remove: bool }, + #[serde(rename_all = "camelCase")] + Update { + zone: String, + capacity: Option<u64>, + tags: Vec<String>, + }, +} diff --git a/src/api/admin/key.rs b/src/api/admin/key.rs index d74ca361..8d1c6890 100644 --- a/src/api/admin/key.rs +++ b/src/api/admin/key.rs @@ -10,7 +10,7 @@ use garage_model::garage::Garage; use garage_model::key_table::*; use crate::admin::error::*; -use crate::helpers::{json_ok_response, parse_json_body}; +use crate::helpers::{is_default, json_ok_response, parse_json_body}; pub async fn handle_list_keys(garage: &Arc<Garage>) -> Result<Response<Body>, Error> { let res = garage @@ -34,6 +34,7 @@ pub async fn handle_list_keys(garage: &Arc<Garage>) -> Result<Response<Body>, Er } #[derive(Serialize)] +#[serde(rename_all = "camelCase")] struct ListKeyResultItem { id: String, name: String, @@ -43,6 +44,7 @@ pub async fn handle_get_key_info( garage: &Arc<Garage>, id: Option<String>, search: Option<String>, + show_secret_key: bool, ) -> Result<Response<Body>, Error> { let key = if let Some(id) = id { garage.key_helper().get_existing_key(&id).await? @@ -55,7 +57,7 @@ pub async fn handle_get_key_info( unreachable!(); }; - key_info_results(garage, key).await + key_info_results(garage, key, show_secret_key).await } pub async fn handle_create_key( @@ -64,15 +66,16 @@ pub async fn handle_create_key( ) -> Result<Response<Body>, Error> { let req = parse_json_body::<CreateKeyRequest>(req).await?; - let key = Key::new(&req.name); + let key = Key::new(req.name.as_deref().unwrap_or("Unnamed key")); garage.key_table.insert(&key).await?; - key_info_results(garage, key).await + key_info_results(garage, key, true).await } #[derive(Deserialize)] +#[serde(rename_all = "camelCase")] struct CreateKeyRequest { - name: String, + name: Option<String>, } pub async fn handle_import_key( @@ -86,10 +89,15 @@ pub async fn handle_import_key( return Err(Error::KeyAlreadyExists(req.access_key_id.to_string())); } - let imported_key = Key::import(&req.access_key_id, &req.secret_access_key, &req.name); + let imported_key = Key::import( + &req.access_key_id, + &req.secret_access_key, + req.name.as_deref().unwrap_or("Imported key"), + ) + .ok_or_bad_request("Invalid key format")?; garage.key_table.insert(&imported_key).await?; - key_info_results(garage, imported_key).await + key_info_results(garage, imported_key, false).await } #[derive(Deserialize)] @@ -97,7 +105,7 @@ pub async fn handle_import_key( struct ImportKeyRequest { access_key_id: String, secret_access_key: String, - name: String, + name: Option<String>, } pub async fn handle_update_key( @@ -127,10 +135,11 @@ pub async fn handle_update_key( garage.key_table.insert(&key).await?; - key_info_results(garage, key).await + key_info_results(garage, key, false).await } #[derive(Deserialize)] +#[serde(rename_all = "camelCase")] struct UpdateKeyRequest { name: Option<String>, allow: Option<KeyPerm>, @@ -149,7 +158,11 @@ pub async fn handle_delete_key(garage: &Arc<Garage>, id: String) -> Result<Respo .body(Body::empty())?) } -async fn key_info_results(garage: &Arc<Garage>, key: Key) -> Result<Response<Body>, Error> { +async fn key_info_results( + garage: &Arc<Garage>, + key: Key, + show_secret: bool, +) -> Result<Response<Body>, Error> { let mut relevant_buckets = HashMap::new(); let key_state = key.state.as_option().unwrap(); @@ -178,7 +191,11 @@ async fn key_info_results(garage: &Arc<Garage>, key: Key) -> Result<Response<Bod let res = GetKeyInfoResult { name: key_state.name.get().clone(), access_key_id: key.key_id.clone(), - secret_access_key: key_state.secret_key.clone(), + secret_access_key: if show_secret { + Some(key_state.secret_key.clone()) + } else { + None + }, permissions: KeyPerm { create_bucket: *key_state.allow_create_bucket.get(), }, @@ -224,7 +241,8 @@ async fn key_info_results(garage: &Arc<Garage>, key: Key) -> Result<Response<Bod struct GetKeyInfoResult { name: String, access_key_id: String, - secret_access_key: String, + #[serde(skip_serializing_if = "is_default")] + secret_access_key: Option<String>, permissions: KeyPerm, buckets: Vec<KeyInfoBucketResult>, } @@ -246,6 +264,7 @@ struct KeyInfoBucketResult { } #[derive(Serialize, Deserialize, Default)] +#[serde(rename_all = "camelCase")] pub(crate) struct ApiBucketKeyPerm { #[serde(default)] pub(crate) read: bool, diff --git a/src/api/admin/mod.rs b/src/api/admin/mod.rs index c4857c10..43a8c59c 100644 --- a/src/api/admin/mod.rs +++ b/src/api/admin/mod.rs @@ -1,6 +1,7 @@ pub mod api_server; mod error; -mod router; +mod router_v0; +mod router_v1; mod bucket; mod cluster; diff --git a/src/api/admin/router.rs b/src/api/admin/router_v0.rs index 0225f18b..68676445 100644 --- a/src/api/admin/router.rs +++ b/src/api/admin/router_v0.rs @@ -5,12 +5,6 @@ use hyper::{Method, Request}; use crate::admin::error::*; use crate::router_macros::*; -pub enum Authorization { - None, - MetricsToken, - AdminToken, -} - router_match! {@func /// List of all Admin API endpoints. @@ -134,15 +128,6 @@ impl Endpoint { Ok(res) } - /// Get the kind of authorization which is required to perform the operation. - pub fn authorization_type(&self) -> Authorization { - match self { - Self::Health => Authorization::None, - Self::CheckDomain => Authorization::None, - Self::Metrics => Authorization::MetricsToken, - _ => Authorization::AdminToken, - } - } } generateQueryParameters! { diff --git a/src/api/admin/router_v1.rs b/src/api/admin/router_v1.rs new file mode 100644 index 00000000..cc5ff2ec --- /dev/null +++ b/src/api/admin/router_v1.rs @@ -0,0 +1,235 @@ +use std::borrow::Cow; + +use hyper::{Method, Request}; + +use crate::admin::error::*; +use crate::admin::router_v0; +use crate::router_macros::*; + +pub enum Authorization { + None, + MetricsToken, + AdminToken, +} + +router_match! {@func + +/// List of all Admin API endpoints. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Endpoint { + Options, + CheckDomain, + Health, + Metrics, + GetClusterStatus, + GetClusterHealth, + ConnectClusterNodes, + // Layout + GetClusterLayout, + UpdateClusterLayout, + ApplyClusterLayout, + RevertClusterLayout, + // Keys + ListKeys, + CreateKey, + ImportKey, + GetKeyInfo { + id: Option<String>, + search: Option<String>, + show_secret_key: Option<String>, + }, + DeleteKey { + id: String, + }, + UpdateKey { + id: String, + }, + // Buckets + ListBuckets, + CreateBucket, + GetBucketInfo { + id: Option<String>, + global_alias: Option<String>, + }, + DeleteBucket { + id: String, + }, + UpdateBucket { + id: String, + }, + // Bucket-Key Permissions + BucketAllowKey, + BucketDenyKey, + // Bucket aliases + GlobalAliasBucket { + id: String, + alias: String, + }, + GlobalUnaliasBucket { + id: String, + alias: String, + }, + LocalAliasBucket { + id: String, + access_key_id: String, + alias: String, + }, + LocalUnaliasBucket { + id: String, + access_key_id: String, + alias: String, + }, +}} + +impl Endpoint { + /// Determine which S3 endpoint a request is for using the request, and a bucket which was + /// possibly extracted from the Host header. + /// Returns Self plus bucket name, if endpoint is not Endpoint::ListBuckets + pub fn from_request<T>(req: &Request<T>) -> Result<Self, Error> { + let uri = req.uri(); + let path = uri.path(); + let query = uri.query(); + + let mut query = QueryParameters::from_query(query.unwrap_or_default())?; + + let res = router_match!(@gen_path_parser (req.method(), path, query) [ + OPTIONS _ => Options, + GET "/check" => CheckDomain, + GET "/health" => Health, + GET "/metrics" => Metrics, + GET "/v1/status" => GetClusterStatus, + GET "/v1/health" => GetClusterHealth, + POST "/v1/connect" => ConnectClusterNodes, + // Layout endpoints + GET "/v1/layout" => GetClusterLayout, + POST "/v1/layout" => UpdateClusterLayout, + POST "/v1/layout/apply" => ApplyClusterLayout, + POST "/v1/layout/revert" => RevertClusterLayout, + // API key endpoints + GET "/v1/key" if id => GetKeyInfo (query_opt::id, query_opt::search, query_opt::show_secret_key), + GET "/v1/key" if search => GetKeyInfo (query_opt::id, query_opt::search, query_opt::show_secret_key), + POST "/v1/key" if id => UpdateKey (query::id), + POST "/v1/key" => CreateKey, + POST "/v1/key/import" => ImportKey, + DELETE "/v1/key" if id => DeleteKey (query::id), + GET "/v1/key" => ListKeys, + // Bucket endpoints + GET "/v1/bucket" if id => GetBucketInfo (query_opt::id, query_opt::global_alias), + GET "/v1/bucket" if global_alias => GetBucketInfo (query_opt::id, query_opt::global_alias), + GET "/v1/bucket" => ListBuckets, + POST "/v1/bucket" => CreateBucket, + DELETE "/v1/bucket" if id => DeleteBucket (query::id), + PUT "/v1/bucket" if id => UpdateBucket (query::id), + // Bucket-key permissions + POST "/v1/bucket/allow" => BucketAllowKey, + POST "/v1/bucket/deny" => BucketDenyKey, + // Bucket aliases + PUT "/v1/bucket/alias/global" => GlobalAliasBucket (query::id, query::alias), + DELETE "/v1/bucket/alias/global" => GlobalUnaliasBucket (query::id, query::alias), + PUT "/v1/bucket/alias/local" => LocalAliasBucket (query::id, query::access_key_id, query::alias), + DELETE "/v1/bucket/alias/local" => LocalUnaliasBucket (query::id, query::access_key_id, query::alias), + ]); + + if let Some(message) = query.nonempty_message() { + debug!("Unused query parameter: {}", message) + } + + Ok(res) + } + /// Some endpoints work exactly the same in their v1/ version as they did in their v0/ version. + /// For these endpoints, we can convert a v0/ call to its equivalent as if it was made using + /// its v1/ URL. + pub fn from_v0(v0_endpoint: router_v0::Endpoint) -> Result<Self, Error> { + match v0_endpoint { + // Cluster endpoints + router_v0::Endpoint::ConnectClusterNodes => Ok(Self::ConnectClusterNodes), + // - GetClusterStatus: response format changed + // - GetClusterHealth: response format changed + + // Layout endpoints + router_v0::Endpoint::RevertClusterLayout => Ok(Self::RevertClusterLayout), + // - GetClusterLayout: response format changed + // - UpdateClusterLayout: query format changed + // - ApplyCusterLayout: response format changed + + // Key endpoints + router_v0::Endpoint::ListKeys => Ok(Self::ListKeys), + router_v0::Endpoint::CreateKey => Ok(Self::CreateKey), + router_v0::Endpoint::GetKeyInfo { id, search } => Ok(Self::GetKeyInfo { + id, + search, + show_secret_key: Some("true".into()), + }), + router_v0::Endpoint::DeleteKey { id } => Ok(Self::DeleteKey { id }), + // - UpdateKey: response format changed (secret key no longer returned) + + // Bucket endpoints + router_v0::Endpoint::GetBucketInfo { id, global_alias } => { + Ok(Self::GetBucketInfo { id, global_alias }) + } + router_v0::Endpoint::ListBuckets => Ok(Self::ListBuckets), + router_v0::Endpoint::CreateBucket => Ok(Self::CreateBucket), + router_v0::Endpoint::DeleteBucket { id } => Ok(Self::DeleteBucket { id }), + router_v0::Endpoint::UpdateBucket { id } => Ok(Self::UpdateBucket { id }), + + // Bucket-key permissions + router_v0::Endpoint::BucketAllowKey => Ok(Self::BucketAllowKey), + router_v0::Endpoint::BucketDenyKey => Ok(Self::BucketDenyKey), + + // Bucket alias endpoints + router_v0::Endpoint::GlobalAliasBucket { id, alias } => { + Ok(Self::GlobalAliasBucket { id, alias }) + } + router_v0::Endpoint::GlobalUnaliasBucket { id, alias } => { + Ok(Self::GlobalUnaliasBucket { id, alias }) + } + router_v0::Endpoint::LocalAliasBucket { + id, + access_key_id, + alias, + } => Ok(Self::LocalAliasBucket { + id, + access_key_id, + alias, + }), + router_v0::Endpoint::LocalUnaliasBucket { + id, + access_key_id, + alias, + } => Ok(Self::LocalUnaliasBucket { + id, + access_key_id, + alias, + }), + + // For endpoints that have different body content syntax, issue + // deprecation warning + _ => Err(Error::bad_request(format!( + "v0/ endpoint is no longer supported: {}", + v0_endpoint.name() + ))), + } + } + /// Get the kind of authorization which is required to perform the operation. + pub fn authorization_type(&self) -> Authorization { + match self { + Self::Health => Authorization::None, + Self::CheckDomain => Authorization::None, + Self::Metrics => Authorization::MetricsToken, + _ => Authorization::AdminToken, + } + } +} + +generateQueryParameters! { + keywords: [], + fields: [ + "format" => format, + "id" => id, + "search" => search, + "globalAlias" => global_alias, + "alias" => alias, + "accessKeyId" => access_key_id, + "showSecretKey" => show_secret_key + ] +} diff --git a/src/api/helpers.rs b/src/api/helpers.rs index 642dbc42..1d55ebd5 100644 --- a/src/api/helpers.rs +++ b/src/api/helpers.rs @@ -152,6 +152,10 @@ pub fn json_ok_response<T: Serialize>(res: &T) -> Result<Response<Body>, Error> .body(Body::from(resp_json))?) } +pub fn is_default<T: Default + PartialEq>(v: &T) -> bool { + *v == T::default() +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/api/router_macros.rs b/src/api/router_macros.rs index 07b5570c..cfecbc92 100644 --- a/src/api/router_macros.rs +++ b/src/api/router_macros.rs @@ -26,6 +26,7 @@ macro_rules! router_match { $($meth:ident $path:pat $(if $required:ident)? => $api:ident $(($($conv:ident :: $param:ident),*))?,)* ]) => {{ { + #[allow(unused_parens)] match ($method, $reqpath) { $( (&Method::$meth, $path) if true $(&& $query.$required.is_some())? => Endpoint::$api { @@ -128,12 +129,6 @@ macro_rules! router_match { } } }; - (@if ($($cond:tt)+) then ($($then:tt)*) else ($($else:tt)*)) => { - $($then)* - }; - (@if () then ($($then:tt)*) else ($($else:tt)*)) => { - $($else)* - }; } /// This macro is used to generate part of the code in this module. It must be called only one, and diff --git a/src/api/s3/api_server.rs b/src/api/s3/api_server.rs index ecfb48b6..d675ab61 100644 --- a/src/api/s3/api_server.rs +++ b/src/api/s3/api_server.rs @@ -26,7 +26,9 @@ use crate::s3::copy::*; use crate::s3::cors::*; use crate::s3::delete::*; use crate::s3::get::*; +use crate::s3::lifecycle::*; use crate::s3::list::*; +use crate::s3::multipart::*; use crate::s3::post_object::handle_post_object; use crate::s3::put::*; use crate::s3::router::Endpoint; @@ -256,7 +258,7 @@ impl ApiHandler for S3ApiServer { bucket_name, bucket_id, delimiter: delimiter.map(|d| d.to_string()), - page_size: max_keys.map(|p| p.clamp(1, 1000)).unwrap_or(1000), + page_size: max_keys.unwrap_or(1000).clamp(1, 1000), prefix: prefix.unwrap_or_default(), urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false), }, @@ -286,7 +288,7 @@ impl ApiHandler for S3ApiServer { bucket_name, bucket_id, delimiter: delimiter.map(|d| d.to_string()), - page_size: max_keys.map(|p| p.clamp(1, 1000)).unwrap_or(1000), + page_size: max_keys.unwrap_or(1000).clamp(1, 1000), urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false), prefix: prefix.unwrap_or_default(), }, @@ -319,7 +321,7 @@ impl ApiHandler for S3ApiServer { bucket_name, bucket_id, delimiter: delimiter.map(|d| d.to_string()), - page_size: max_uploads.map(|p| p.clamp(1, 1000)).unwrap_or(1000), + page_size: max_uploads.unwrap_or(1000).clamp(1, 1000), prefix: prefix.unwrap_or_default(), urlencode_resp: encoding_type.map(|e| e == "url").unwrap_or(false), }, @@ -343,7 +345,7 @@ impl ApiHandler for S3ApiServer { key, upload_id, part_number_marker: part_number_marker.map(|p| p.clamp(1, 10000)), - max_parts: max_parts.map(|p| p.clamp(1, 1000)).unwrap_or(1000), + max_parts: max_parts.unwrap_or(1000).clamp(1, 1000), }, ) .await @@ -353,14 +355,21 @@ impl ApiHandler for S3ApiServer { } Endpoint::GetBucketWebsite {} => handle_get_website(&bucket).await, Endpoint::PutBucketWebsite {} => { - handle_put_website(garage, bucket_id, req, content_sha256).await + handle_put_website(garage, bucket.clone(), req, content_sha256).await } - Endpoint::DeleteBucketWebsite {} => handle_delete_website(garage, bucket_id).await, + Endpoint::DeleteBucketWebsite {} => handle_delete_website(garage, bucket.clone()).await, Endpoint::GetBucketCors {} => handle_get_cors(&bucket).await, Endpoint::PutBucketCors {} => { - handle_put_cors(garage, bucket_id, req, content_sha256).await + handle_put_cors(garage, bucket.clone(), req, content_sha256).await + } + Endpoint::DeleteBucketCors {} => handle_delete_cors(garage, bucket.clone()).await, + Endpoint::GetBucketLifecycleConfiguration {} => handle_get_lifecycle(&bucket).await, + Endpoint::PutBucketLifecycleConfiguration {} => { + handle_put_lifecycle(garage, bucket.clone(), req, content_sha256).await + } + Endpoint::DeleteBucketLifecycle {} => { + handle_delete_lifecycle(garage, bucket.clone()).await } - Endpoint::DeleteBucketCors {} => handle_delete_cors(garage, bucket_id).await, endpoint => Err(Error::NotImplemented(endpoint.name().to_owned())), }; diff --git a/src/api/s3/copy.rs b/src/api/s3/copy.rs index 7eb6459d..68b4f0c9 100644 --- a/src/api/s3/copy.rs +++ b/src/api/s3/copy.rs @@ -2,7 +2,7 @@ use std::pin::Pin; use std::sync::Arc; use std::time::{Duration, SystemTime, UNIX_EPOCH}; -use futures::{stream, stream::Stream, StreamExt, TryFutureExt}; +use futures::{stream, stream::Stream, StreamExt}; use md5::{Digest as Md5Digest, Md5}; use bytes::Bytes; @@ -18,12 +18,14 @@ use garage_util::time::*; use garage_model::garage::Garage; use garage_model::key_table::Key; use garage_model::s3::block_ref_table::*; +use garage_model::s3::mpu_table::*; use garage_model::s3::object_table::*; use garage_model::s3::version_table::*; use crate::helpers::parse_bucket_key; use crate::s3::error::*; -use crate::s3::put::{decode_upload_id, get_headers}; +use crate::s3::multipart; +use crate::s3::put::get_headers; use crate::s3::xml::{self as s3_xml, xmlns_tag}; pub async fn handle_copy( @@ -92,7 +94,10 @@ pub async fn handle_copy( let tmp_dest_object_version = ObjectVersion { uuid: new_uuid, timestamp: new_timestamp, - state: ObjectVersionState::Uploading(new_meta.headers.clone()), + state: ObjectVersionState::Uploading { + headers: new_meta.headers.clone(), + multipart: false, + }, }; let tmp_dest_object = Object::new( dest_bucket_id, @@ -105,8 +110,14 @@ pub async fn handle_copy( // this means that the BlockRef entries linked to this version cannot be // marked as deleted (they are marked as deleted only if the Version // doesn't exist or is marked as deleted). - let mut dest_version = - Version::new(new_uuid, dest_bucket_id, dest_key.to_string(), false); + let mut dest_version = Version::new( + new_uuid, + VersionBacklink::Object { + bucket_id: dest_bucket_id, + key: dest_key.to_string(), + }, + false, + ); garage.version_table.insert(&dest_version).await?; // Fill in block list for version and insert block refs @@ -179,17 +190,13 @@ pub async fn handle_upload_part_copy( ) -> Result<Response<Body>, Error> { let copy_precondition = CopyPreconditionHeaders::parse(req)?; - let dest_version_uuid = decode_upload_id(upload_id)?; + let dest_upload_id = multipart::decode_upload_id(upload_id)?; let dest_key = dest_key.to_string(); - let (source_object, dest_object) = futures::try_join!( + let (source_object, (_, _, mut dest_mpu)) = futures::try_join!( get_copy_source(&garage, api_key, req), - garage - .object_table - .get(&dest_bucket_id, &dest_key) - .map_err(Error::from), + multipart::get_upload(&garage, &dest_bucket_id, &dest_key, &dest_upload_id) )?; - let dest_object = dest_object.ok_or(Error::NoSuchKey)?; let (source_object_version, source_version_data, source_version_meta) = extract_source_info(&source_object)?; @@ -217,15 +224,6 @@ pub async fn handle_upload_part_copy( }, }; - // Check destination version is indeed in uploading state - if !dest_object - .versions() - .iter() - .any(|v| v.uuid == dest_version_uuid && v.is_uploading()) - { - return Err(Error::NoSuchUpload); - } - // Check source version is not inlined match source_version_data { ObjectVersionData::DeleteMarker => unreachable!(), @@ -242,23 +240,11 @@ pub async fn handle_upload_part_copy( // Fetch source versin with its block list, // and destination version to check part hasn't yet been uploaded - let (source_version, dest_version) = futures::try_join!( - garage - .version_table - .get(&source_object_version.uuid, &EmptyKey), - garage.version_table.get(&dest_version_uuid, &EmptyKey), - )?; - let source_version = source_version.ok_or(Error::NoSuchKey)?; - - // Check this part number hasn't yet been uploaded - if let Some(dv) = dest_version { - if dv.has_part_number(part_number) { - return Err(Error::bad_request(format!( - "Part number {} has already been uploaded", - part_number - ))); - } - } + let source_version = garage + .version_table + .get(&source_object_version.uuid, &EmptyKey) + .await? + .ok_or(Error::NoSuchKey)?; // We want to reuse blocks from the source version as much as possible. // However, we still need to get the data from these blocks @@ -299,6 +285,33 @@ pub async fn handle_upload_part_copy( current_offset = block_end; } + // Calculate the identity of destination part: timestamp, version id + let dest_version_id = gen_uuid(); + let dest_mpu_part_key = MpuPartKey { + part_number, + timestamp: dest_mpu.next_timestamp(part_number), + }; + + // Create the uploaded part + dest_mpu.parts.clear(); + dest_mpu.parts.put( + dest_mpu_part_key, + MpuPart { + version: dest_version_id, + etag: None, + size: None, + }, + ); + garage.mpu_table.insert(&dest_mpu).await?; + + let mut dest_version = Version::new( + dest_version_id, + VersionBacklink::MultipartUpload { + upload_id: dest_upload_id, + }, + false, + ); + // Now, actually copy the blocks let mut md5hasher = Md5::new(); @@ -348,8 +361,8 @@ pub async fn handle_upload_part_copy( let must_upload = existing_block_hash.is_none(); let final_hash = existing_block_hash.unwrap_or_else(|| blake2sum(&data[..])); - let mut version = Version::new(dest_version_uuid, dest_bucket_id, dest_key.clone(), false); - version.blocks.put( + dest_version.blocks.clear(); + dest_version.blocks.put( VersionBlockKey { part_number, offset: current_offset, @@ -363,7 +376,7 @@ pub async fn handle_upload_part_copy( let block_ref = BlockRef { block: final_hash, - version: dest_version_uuid, + version: dest_version_id, deleted: false.into(), }; @@ -378,23 +391,33 @@ pub async fn handle_upload_part_copy( Ok(()) } }, - // Thing 2: we need to insert the block in the version - garage.version_table.insert(&version), - // Thing 3: we need to add a block reference - garage.block_ref_table.insert(&block_ref), + async { + // Thing 2: we need to insert the block in the version + garage.version_table.insert(&dest_version).await?; + // Thing 3: we need to add a block reference + garage.block_ref_table.insert(&block_ref).await + }, // Thing 4: we need to prefetch the next block defragmenter.next(), )?; - next_block = res.3; + next_block = res.2; } + assert_eq!(current_offset, source_range.length); + let data_md5sum = md5hasher.finalize(); let etag = hex::encode(data_md5sum); // Put the part's ETag in the Versiontable - let mut version = Version::new(dest_version_uuid, dest_bucket_id, dest_key.clone(), false); - version.parts_etags.put(part_number, etag.clone()); - garage.version_table.insert(&version).await?; + dest_mpu.parts.put( + dest_mpu_part_key, + MpuPart { + version: dest_version_id, + etag: Some(etag.clone()), + size: Some(current_offset), + }, + ); + garage.mpu_table.insert(&dest_mpu).await?; // LGTM let resp_xml = s3_xml::to_xml_with_header(&CopyPartResult { diff --git a/src/api/s3/cors.rs b/src/api/s3/cors.rs index c7273464..49097ad1 100644 --- a/src/api/s3/cors.rs +++ b/src/api/s3/cors.rs @@ -44,14 +44,11 @@ pub async fn handle_get_cors(bucket: &Bucket) -> Result<Response<Body>, Error> { pub async fn handle_delete_cors( garage: Arc<Garage>, - bucket_id: Uuid, + mut bucket: Bucket, ) -> Result<Response<Body>, Error> { - let mut bucket = garage - .bucket_helper() - .get_existing_bucket(bucket_id) - .await?; - - let param = bucket.params_mut().unwrap(); + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; param.cors_config.update(None); garage.bucket_table.insert(&bucket).await?; @@ -63,7 +60,7 @@ pub async fn handle_delete_cors( pub async fn handle_put_cors( garage: Arc<Garage>, - bucket_id: Uuid, + mut bucket: Bucket, req: Request<Body>, content_sha256: Option<Hash>, ) -> Result<Response<Body>, Error> { @@ -73,12 +70,9 @@ pub async fn handle_put_cors( verify_signed_content(content_sha256, &body[..])?; } - let mut bucket = garage - .bucket_helper() - .get_existing_bucket(bucket_id) - .await?; - - let param = bucket.params_mut().unwrap(); + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; let conf: CorsConfiguration = from_reader(&body as &[u8])?; conf.validate()?; diff --git a/src/api/s3/get.rs b/src/api/s3/get.rs index cde7b461..5e682726 100644 --- a/src/api/s3/get.rs +++ b/src/api/s3/get.rs @@ -149,7 +149,6 @@ pub async fn handle_head( let (part_offset, part_end) = calculate_part_bounds(&version, pn).ok_or(Error::InvalidPart)?; - let n_parts = version.parts_etags.items().len(); Ok(object_headers(object_version, version_meta) .header(CONTENT_LENGTH, format!("{}", part_end - part_offset)) @@ -162,7 +161,7 @@ pub async fn handle_head( version_meta.size ), ) - .header(X_AMZ_MP_PARTS_COUNT, format!("{}", n_parts)) + .header(X_AMZ_MP_PARTS_COUNT, format!("{}", version.n_parts()?)) .status(StatusCode::PARTIAL_CONTENT) .body(Body::empty())?) } @@ -376,7 +375,6 @@ async fn handle_get_part( let (begin, end) = calculate_part_bounds(&version, part_number).ok_or(Error::InvalidPart)?; - let n_parts = version.parts_etags.items().len(); let body = body_from_blocks_range(garage, version.blocks.items(), begin, end); @@ -386,7 +384,7 @@ async fn handle_get_part( CONTENT_RANGE, format!("bytes {}-{}/{}", begin, end - 1, version_meta.size), ) - .header(X_AMZ_MP_PARTS_COUNT, format!("{}", n_parts)) + .header(X_AMZ_MP_PARTS_COUNT, format!("{}", version.n_parts()?)) .body(body)?) } _ => unreachable!(), diff --git a/src/api/s3/lifecycle.rs b/src/api/s3/lifecycle.rs new file mode 100644 index 00000000..1e7d6755 --- /dev/null +++ b/src/api/s3/lifecycle.rs @@ -0,0 +1,401 @@ +use quick_xml::de::from_reader; +use std::sync::Arc; + +use hyper::{Body, Request, Response, StatusCode}; + +use serde::{Deserialize, Serialize}; + +use crate::s3::error::*; +use crate::s3::xml::{to_xml_with_header, xmlns_tag, IntValue, Value}; +use crate::signature::verify_signed_content; + +use garage_model::bucket_table::{ + parse_lifecycle_date, Bucket, LifecycleExpiration as GarageLifecycleExpiration, + LifecycleFilter as GarageLifecycleFilter, LifecycleRule as GarageLifecycleRule, +}; +use garage_model::garage::Garage; +use garage_util::data::*; + +pub async fn handle_get_lifecycle(bucket: &Bucket) -> Result<Response<Body>, Error> { + let param = bucket + .params() + .ok_or_internal_error("Bucket should not be deleted at this point")?; + + if let Some(lifecycle) = param.lifecycle_config.get() { + let wc = LifecycleConfiguration::from_garage_lifecycle_config(lifecycle); + let xml = to_xml_with_header(&wc)?; + Ok(Response::builder() + .status(StatusCode::OK) + .header(http::header::CONTENT_TYPE, "application/xml") + .body(Body::from(xml))?) + } else { + Ok(Response::builder() + .status(StatusCode::NO_CONTENT) + .body(Body::empty())?) + } +} + +pub async fn handle_delete_lifecycle( + garage: Arc<Garage>, + mut bucket: Bucket, +) -> Result<Response<Body>, Error> { + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; + + param.lifecycle_config.update(None); + garage.bucket_table.insert(&bucket).await?; + + Ok(Response::builder() + .status(StatusCode::NO_CONTENT) + .body(Body::empty())?) +} + +pub async fn handle_put_lifecycle( + garage: Arc<Garage>, + mut bucket: Bucket, + req: Request<Body>, + content_sha256: Option<Hash>, +) -> Result<Response<Body>, Error> { + let body = hyper::body::to_bytes(req.into_body()).await?; + + if let Some(content_sha256) = content_sha256 { + verify_signed_content(content_sha256, &body[..])?; + } + + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; + + let conf: LifecycleConfiguration = from_reader(&body as &[u8])?; + let config = conf + .validate_into_garage_lifecycle_config() + .ok_or_bad_request("Invalid lifecycle configuration")?; + + param.lifecycle_config.update(Some(config)); + garage.bucket_table.insert(&bucket).await?; + + Ok(Response::builder() + .status(StatusCode::OK) + .body(Body::empty())?) +} + +// ---- SERIALIZATION AND DESERIALIZATION TO/FROM S3 XML ---- + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct LifecycleConfiguration { + #[serde(serialize_with = "xmlns_tag", skip_deserializing)] + pub xmlns: (), + #[serde(rename = "Rule")] + pub lifecycle_rules: Vec<LifecycleRule>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct LifecycleRule { + #[serde(rename = "ID")] + pub id: Option<Value>, + #[serde(rename = "Status")] + pub status: Value, + #[serde(rename = "Filter", default)] + pub filter: Option<Filter>, + #[serde(rename = "Expiration", default)] + pub expiration: Option<Expiration>, + #[serde(rename = "AbortIncompleteMultipartUpload", default)] + pub abort_incomplete_mpu: Option<AbortIncompleteMpu>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Default)] +pub struct Filter { + #[serde(rename = "And")] + pub and: Option<Box<Filter>>, + #[serde(rename = "Prefix")] + pub prefix: Option<Value>, + #[serde(rename = "ObjectSizeGreaterThan")] + pub size_gt: Option<IntValue>, + #[serde(rename = "ObjectSizeLessThan")] + pub size_lt: Option<IntValue>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct Expiration { + #[serde(rename = "Days")] + pub days: Option<IntValue>, + #[serde(rename = "Date")] + pub at_date: Option<Value>, +} + +#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] +pub struct AbortIncompleteMpu { + #[serde(rename = "DaysAfterInitiation")] + pub days: IntValue, +} + +impl LifecycleConfiguration { + pub fn validate_into_garage_lifecycle_config( + self, + ) -> Result<Vec<GarageLifecycleRule>, &'static str> { + let mut ret = vec![]; + for rule in self.lifecycle_rules { + ret.push(rule.validate_into_garage_lifecycle_rule()?); + } + Ok(ret) + } + + pub fn from_garage_lifecycle_config(config: &[GarageLifecycleRule]) -> Self { + Self { + xmlns: (), + lifecycle_rules: config + .iter() + .map(LifecycleRule::from_garage_lifecycle_rule) + .collect(), + } + } +} + +impl LifecycleRule { + pub fn validate_into_garage_lifecycle_rule(self) -> Result<GarageLifecycleRule, &'static str> { + let enabled = match self.status.0.as_str() { + "Enabled" => true, + "Disabled" => false, + _ => return Err("invalid value for <Status>"), + }; + + let filter = self + .filter + .map(Filter::validate_into_garage_lifecycle_filter) + .transpose()? + .unwrap_or_default(); + + let abort_incomplete_mpu_days = self.abort_incomplete_mpu.map(|x| x.days.0 as usize); + + let expiration = self + .expiration + .map(Expiration::validate_into_garage_lifecycle_expiration) + .transpose()?; + + Ok(GarageLifecycleRule { + id: self.id.map(|x| x.0), + enabled, + filter, + abort_incomplete_mpu_days, + expiration, + }) + } + + pub fn from_garage_lifecycle_rule(rule: &GarageLifecycleRule) -> Self { + Self { + id: rule.id.as_deref().map(Value::from), + status: if rule.enabled { + Value::from("Enabled") + } else { + Value::from("Disabled") + }, + filter: Filter::from_garage_lifecycle_filter(&rule.filter), + abort_incomplete_mpu: rule + .abort_incomplete_mpu_days + .map(|days| AbortIncompleteMpu { + days: IntValue(days as i64), + }), + expiration: rule + .expiration + .as_ref() + .map(Expiration::from_garage_lifecycle_expiration), + } + } +} + +impl Filter { + pub fn count(&self) -> i32 { + fn count<T>(x: &Option<T>) -> i32 { + x.as_ref().map(|_| 1).unwrap_or(0) + } + count(&self.prefix) + count(&self.size_gt) + count(&self.size_lt) + } + + pub fn validate_into_garage_lifecycle_filter( + self, + ) -> Result<GarageLifecycleFilter, &'static str> { + if self.count() > 0 && self.and.is_some() { + Err("Filter tag cannot contain both <And> and another condition") + } else if let Some(and) = self.and { + if and.and.is_some() { + return Err("Nested <And> tags"); + } + Ok(and.internal_into_garage_lifecycle_filter()) + } else if self.count() > 1 { + Err("Multiple Filter conditions must be wrapped in an <And> tag") + } else { + Ok(self.internal_into_garage_lifecycle_filter()) + } + } + + fn internal_into_garage_lifecycle_filter(self) -> GarageLifecycleFilter { + GarageLifecycleFilter { + prefix: self.prefix.map(|x| x.0), + size_gt: self.size_gt.map(|x| x.0 as u64), + size_lt: self.size_lt.map(|x| x.0 as u64), + } + } + + pub fn from_garage_lifecycle_filter(rule: &GarageLifecycleFilter) -> Option<Self> { + let filter = Filter { + and: None, + prefix: rule.prefix.as_deref().map(Value::from), + size_gt: rule.size_gt.map(|x| IntValue(x as i64)), + size_lt: rule.size_lt.map(|x| IntValue(x as i64)), + }; + match filter.count() { + 0 => None, + 1 => Some(filter), + _ => Some(Filter { + and: Some(Box::new(filter)), + ..Default::default() + }), + } + } +} + +impl Expiration { + pub fn validate_into_garage_lifecycle_expiration( + self, + ) -> Result<GarageLifecycleExpiration, &'static str> { + match (self.days, self.at_date) { + (Some(_), Some(_)) => Err("cannot have both <Days> and <Date> in <Expiration>"), + (None, None) => Err("<Expiration> must contain either <Days> or <Date>"), + (Some(days), None) => Ok(GarageLifecycleExpiration::AfterDays(days.0 as usize)), + (None, Some(date)) => { + parse_lifecycle_date(&date.0)?; + Ok(GarageLifecycleExpiration::AtDate(date.0)) + } + } + } + + pub fn from_garage_lifecycle_expiration(exp: &GarageLifecycleExpiration) -> Self { + match exp { + GarageLifecycleExpiration::AfterDays(days) => Expiration { + days: Some(IntValue(*days as i64)), + at_date: None, + }, + GarageLifecycleExpiration::AtDate(date) => Expiration { + days: None, + at_date: Some(Value(date.to_string())), + }, + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + use quick_xml::de::from_str; + + #[test] + fn test_deserialize_lifecycle_config() -> Result<(), Error> { + let message = r#"<?xml version="1.0" encoding="UTF-8"?> +<LifecycleConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> + <Rule> + <ID>id1</ID> + <Status>Enabled</Status> + <Filter> + <Prefix>documents/</Prefix> + </Filter> + <AbortIncompleteMultipartUpload> + <DaysAfterInitiation>7</DaysAfterInitiation> + </AbortIncompleteMultipartUpload> + </Rule> + <Rule> + <ID>id2</ID> + <Status>Enabled</Status> + <Filter> + <And> + <Prefix>logs/</Prefix> + <ObjectSizeGreaterThan>1000000</ObjectSizeGreaterThan> + </And> + </Filter> + <Expiration> + <Days>365</Days> + </Expiration> + </Rule> +</LifecycleConfiguration>"#; + let conf: LifecycleConfiguration = from_str(message).unwrap(); + let ref_value = LifecycleConfiguration { + xmlns: (), + lifecycle_rules: vec![ + LifecycleRule { + id: Some("id1".into()), + status: "Enabled".into(), + filter: Some(Filter { + prefix: Some("documents/".into()), + ..Default::default() + }), + expiration: None, + abort_incomplete_mpu: Some(AbortIncompleteMpu { days: IntValue(7) }), + }, + LifecycleRule { + id: Some("id2".into()), + status: "Enabled".into(), + filter: Some(Filter { + and: Some(Box::new(Filter { + prefix: Some("logs/".into()), + size_gt: Some(IntValue(1000000)), + ..Default::default() + })), + ..Default::default() + }), + expiration: Some(Expiration { + days: Some(IntValue(365)), + at_date: None, + }), + abort_incomplete_mpu: None, + }, + ], + }; + assert_eq! { + ref_value, + conf + }; + + let message2 = to_xml_with_header(&ref_value)?; + + let cleanup = |c: &str| c.replace(char::is_whitespace, ""); + assert_eq!(cleanup(message), cleanup(&message2)); + + // Check validation + let validated = ref_value + .validate_into_garage_lifecycle_config() + .ok_or_bad_request("invalid xml config")?; + + let ref_config = vec![ + GarageLifecycleRule { + id: Some("id1".into()), + enabled: true, + filter: GarageLifecycleFilter { + prefix: Some("documents/".into()), + ..Default::default() + }, + expiration: None, + abort_incomplete_mpu_days: Some(7), + }, + GarageLifecycleRule { + id: Some("id2".into()), + enabled: true, + filter: GarageLifecycleFilter { + prefix: Some("logs/".into()), + size_gt: Some(1000000), + ..Default::default() + }, + expiration: Some(GarageLifecycleExpiration::AfterDays(365)), + abort_incomplete_mpu_days: None, + }, + ]; + assert_eq!(validated, ref_config); + + let message3 = to_xml_with_header(&LifecycleConfiguration::from_garage_lifecycle_config( + &validated, + ))?; + assert_eq!(cleanup(message), cleanup(&message3)); + + Ok(()) + } +} diff --git a/src/api/s3/list.rs b/src/api/s3/list.rs index 5cb0d65a..33d62518 100644 --- a/src/api/s3/list.rs +++ b/src/api/s3/list.rs @@ -1,4 +1,3 @@ -use std::cmp::Ordering; use std::collections::{BTreeMap, BTreeSet}; use std::iter::{Iterator, Peekable}; use std::sync::Arc; @@ -11,15 +10,15 @@ use garage_util::error::Error as GarageError; use garage_util::time::*; use garage_model::garage::Garage; +use garage_model::s3::mpu_table::*; use garage_model::s3::object_table::*; -use garage_model::s3::version_table::Version; -use garage_table::{EmptyKey, EnumerationOrder}; +use garage_table::EnumerationOrder; use crate::encoding::*; use crate::helpers::key_after_prefix; use crate::s3::error::*; -use crate::s3::put as s3_put; +use crate::s3::multipart as s3_multipart; use crate::s3::xml as s3_xml; const DUMMY_NAME: &str = "Dummy Key"; @@ -176,7 +175,9 @@ pub async fn handle_list_multipart_upload( t.get_range( &bucket, key, - Some(ObjectFilter::IsUploading), + Some(ObjectFilter::IsUploading { + check_multipart: Some(true), + }), count, EnumerationOrder::Forward, ) @@ -272,24 +273,26 @@ pub async fn handle_list_parts( ) -> Result<Response<Body>, Error> { debug!("ListParts {:?}", query); - let upload_id = s3_put::decode_upload_id(&query.upload_id)?; + let upload_id = s3_multipart::decode_upload_id(&query.upload_id)?; - let (object, version) = futures::try_join!( - garage.object_table.get(&query.bucket_id, &query.key), - garage.version_table.get(&upload_id, &EmptyKey), - )?; + let (_, _, mpu) = + s3_multipart::get_upload(&garage, &query.bucket_id, &query.key, &upload_id).await?; - let (info, next) = fetch_part_info(query, object, version, upload_id)?; + let (info, next) = fetch_part_info(query, &mpu)?; let result = s3_xml::ListPartsResult { xmlns: (), + + // Query parameters bucket: s3_xml::Value(query.bucket_name.to_string()), key: s3_xml::Value(query.key.to_string()), upload_id: s3_xml::Value(query.upload_id.to_string()), part_number_marker: query.part_number_marker.map(|e| s3_xml::IntValue(e as i64)), - next_part_number_marker: next.map(|e| s3_xml::IntValue(e as i64)), max_parts: s3_xml::IntValue(query.max_parts as i64), - is_truncated: s3_xml::Value(next.map(|_| "true").unwrap_or("false").to_string()), + + // Result values + next_part_number_marker: next.map(|e| s3_xml::IntValue(e as i64)), + is_truncated: s3_xml::Value(format!("{}", next.is_some())), parts: info .iter() .map(|part| s3_xml::PartItem { @@ -299,6 +302,8 @@ pub async fn handle_list_parts( size: s3_xml::IntValue(part.size as i64), }) .collect(), + + // Dummy result values (unsupported features) initiator: s3_xml::Initiator { display_name: s3_xml::Value(DUMMY_NAME.to_string()), id: s3_xml::Value(DUMMY_KEY.to_string()), @@ -335,8 +340,8 @@ struct UploadInfo { } #[derive(Debug, PartialEq)] -struct PartInfo { - etag: String, +struct PartInfo<'a> { + etag: &'a str, timestamp: u64, part_number: u64, size: u64, @@ -456,107 +461,51 @@ where } } -fn fetch_part_info( +fn fetch_part_info<'a>( query: &ListPartsQuery, - object: Option<Object>, - version: Option<Version>, - upload_id: Uuid, -) -> Result<(Vec<PartInfo>, Option<u64>), Error> { - // Check results - let object = object.ok_or(Error::NoSuchKey)?; - - let obj_version = object - .versions() - .iter() - .find(|v| v.uuid == upload_id && v.is_uploading()) - .ok_or(Error::NoSuchUpload)?; - - let version = version.ok_or(Error::NoSuchKey)?; - - // Cut the beginning of our 2 vectors if required - let (etags, blocks) = match &query.part_number_marker { - Some(marker) => { - let next = marker + 1; - - let part_idx = into_ok_or_err( - version - .parts_etags - .items() - .binary_search_by(|(part_num, _)| part_num.cmp(&next)), - ); - let parts = &version.parts_etags.items()[part_idx..]; - - let block_idx = into_ok_or_err( - version - .blocks - .items() - .binary_search_by(|(vkey, _)| vkey.part_number.cmp(&next)), - ); - let blocks = &version.blocks.items()[block_idx..]; - - (parts, blocks) - } - None => (version.parts_etags.items(), version.blocks.items()), - }; - - // Use the block vector to compute a (part_number, size) vector - let mut size = Vec::<(u64, u64)>::new(); - blocks.iter().for_each(|(key, val)| { - let mut new_size = val.size; - match size.pop() { - Some((part_number, size)) if part_number == key.part_number => new_size += size, - Some(v) => size.push(v), - None => (), - } - size.push((key.part_number, new_size)) - }); - - // Merge the etag vector and size vector to build a PartInfo vector - let max_parts = query.max_parts as usize; - let (mut etag_iter, mut size_iter) = (etags.iter().peekable(), size.iter().peekable()); - - let mut info = Vec::<PartInfo>::with_capacity(max_parts); - - while info.len() < max_parts { - match (etag_iter.peek(), size_iter.peek()) { - (Some((ep, etag)), Some((sp, size))) => match ep.cmp(sp) { - Ordering::Less => { - debug!("ETag information ignored due to missing corresponding block information. Query: {:?}", query); - etag_iter.next(); - } - Ordering::Equal => { - info.push(PartInfo { - etag: etag.to_string(), - timestamp: obj_version.timestamp, - part_number: *ep, - size: *size, - }); - etag_iter.next(); - size_iter.next(); + mpu: &'a MultipartUpload, +) -> Result<(Vec<PartInfo<'a>>, Option<u64>), Error> { + assert!((1..=1000).contains(&query.max_parts)); // see s3/api_server.rs + + // Parse multipart upload part list, removing parts not yet finished + // and failed part uploads that were overwritten + let mut parts: Vec<PartInfo<'a>> = Vec::with_capacity(mpu.parts.items().len()); + for (pk, p) in mpu.parts.items().iter() { + if let (Some(etag), Some(size)) = (&p.etag, p.size) { + let part_info = PartInfo { + part_number: pk.part_number, + timestamp: pk.timestamp, + etag, + size, + }; + match parts.last_mut() { + Some(lastpart) if lastpart.part_number == pk.part_number => { + *lastpart = part_info; } - Ordering::Greater => { - debug!("Block information ignored due to missing corresponding ETag information. Query: {:?}", query); - size_iter.next(); + _ => { + parts.push(part_info); } - }, - (None, None) => return Ok((info, None)), - _ => { - debug!( - "Additional block or ETag information ignored. Query: {:?}", - query - ); - return Ok((info, None)); } } } - match info.last() { - Some(part_info) => { - let pagination = Some(part_info.part_number); - Ok((info, pagination)) - } - None => Ok((info, None)), + // Cut the beginning if we have a marker + if let Some(marker) = &query.part_number_marker { + let next = marker + 1; + let part_idx = parts + .binary_search_by(|part| part.part_number.cmp(&next)) + .unwrap_or_else(|x| x); + parts = parts.split_off(part_idx); + } + + // Cut the end if we have too many parts + if parts.len() > query.max_parts as usize { + parts.truncate(query.max_parts as usize); + let pagination = Some(parts.last().unwrap().part_number); + return Ok((parts, pagination)); } + + Ok((parts, None)) } /* @@ -651,7 +600,7 @@ impl ListMultipartUploadsQuery { }), uuid => Ok(RangeBegin::AfterUpload { key: key_marker.to_string(), - upload: s3_put::decode_upload_id(uuid)?, + upload: s3_multipart::decode_upload_id(uuid)?, }), }, @@ -843,7 +792,7 @@ impl ExtractAccumulator for UploadAccumulator { let mut uploads_for_key = object .versions() .iter() - .filter(|x| x.is_uploading()) + .filter(|x| x.is_uploading(Some(true))) .collect::<Vec<&ObjectVersion>>(); // S3 logic requires lexicographically sorted upload ids. @@ -918,14 +867,6 @@ impl ExtractAccumulator for UploadAccumulator { * Utility functions */ -/// This is a stub for Result::into_ok_or_err that is not yet in Rust stable -fn into_ok_or_err<T>(r: Result<T, T>) -> T { - match r { - Ok(r) => r, - Err(r) => r, - } -} - /// Returns the common prefix of the object given the query prefix and delimiter fn common_prefix<'a>(object: &'a Object, query: &ListQueryCommon) -> Option<&'a str> { match &query.delimiter { @@ -951,7 +892,6 @@ fn uriencode_maybe(s: &str, yes: bool) -> s3_xml::Value { #[cfg(test)] mod tests { use super::*; - use garage_model::s3::version_table::*; use garage_util::*; use std::iter::FromIterator; @@ -991,10 +931,13 @@ mod tests { ObjectVersion { uuid: Uuid::from(uuid), timestamp: TS, - state: ObjectVersionState::Uploading(ObjectVersionHeaders { - content_type: "text/plain".to_string(), - other: BTreeMap::<String, String>::new(), - }), + state: ObjectVersionState::Uploading { + multipart: true, + headers: ObjectVersionHeaders { + content_type: "text/plain".to_string(), + other: BTreeMap::<String, String>::new(), + }, + }, } } @@ -1169,83 +1112,77 @@ mod tests { Ok(()) } - fn version() -> Version { + fn mpu() -> MultipartUpload { let uuid = Uuid::from([0x08; 32]); - let blocks = vec![ + let parts = vec![ ( - VersionBlockKey { + MpuPartKey { part_number: 1, - offset: 1, + timestamp: TS, }, - VersionBlock { - hash: uuid, - size: 3, + MpuPart { + version: uuid, + size: Some(3), + etag: Some("etag1".into()), }, ), ( - VersionBlockKey { - part_number: 1, - offset: 2, + MpuPartKey { + part_number: 2, + timestamp: TS, }, - VersionBlock { - hash: uuid, - size: 2, + MpuPart { + version: uuid, + size: None, + etag: None, }, ), ( - VersionBlockKey { - part_number: 2, - offset: 1, + MpuPartKey { + part_number: 3, + timestamp: TS, }, - VersionBlock { - hash: uuid, - size: 8, + MpuPart { + version: uuid, + size: Some(10), + etag: Some("etag2".into()), }, ), ( - VersionBlockKey { + MpuPartKey { part_number: 5, - offset: 1, + timestamp: TS, }, - VersionBlock { - hash: uuid, - size: 7, + MpuPart { + version: uuid, + size: Some(7), + etag: Some("etag3".into()), }, ), ( - VersionBlockKey { + MpuPartKey { part_number: 8, - offset: 1, + timestamp: TS, }, - VersionBlock { - hash: uuid, - size: 5, + MpuPart { + version: uuid, + size: Some(5), + etag: Some("etag4".into()), }, ), ]; - let etags = vec![ - (1, "etag1".to_string()), - (3, "etag2".to_string()), - (5, "etag3".to_string()), - (8, "etag4".to_string()), - (9, "etag5".to_string()), - ]; - Version { - bucket_id: uuid, - key: "a".to_string(), - uuid, + MultipartUpload { + upload_id: uuid, + timestamp: TS, deleted: false.into(), - blocks: crdt::Map::<VersionBlockKey, VersionBlock>::from_iter(blocks), - parts_etags: crdt::Map::<u64, String>::from_iter(etags), + parts: crdt::Map::<MpuPartKey, MpuPart>::from_iter(parts), + bucket_id: uuid, + key: "a".into(), } } - fn obj() -> Object { - Object::new(bucket(), "d".to_string(), vec![objup_version([0x08; 32])]) - } - #[test] fn test_fetch_part_info() -> Result<(), Error> { let uuid = Uuid::from([0x08; 32]); @@ -1258,82 +1195,85 @@ mod tests { max_parts: 2, }; - assert!( - fetch_part_info(&query, None, None, uuid).is_err(), - "No object and version should fail" - ); - assert!( - fetch_part_info(&query, Some(obj()), None, uuid).is_err(), - "No version should faild" - ); - assert!( - fetch_part_info(&query, None, Some(version()), uuid).is_err(), - "No object should fail" - ); + let mpu = mpu(); // Start from the beginning but with limited size to trigger pagination - let (info, pagination) = fetch_part_info(&query, Some(obj()), Some(version()), uuid)?; - assert_eq!(pagination.unwrap(), 5); + let (info, pagination) = fetch_part_info(&query, &mpu)?; + assert_eq!(pagination.unwrap(), 3); assert_eq!( info, vec![ PartInfo { - etag: "etag1".to_string(), + etag: "etag1", timestamp: TS, part_number: 1, - size: 5 + size: 3 }, PartInfo { - etag: "etag3".to_string(), + etag: "etag2", timestamp: TS, - part_number: 5, - size: 7 + part_number: 3, + size: 10 }, ] ); // Use previous pagination to make a new request query.part_number_marker = Some(pagination.unwrap()); - let (info, pagination) = fetch_part_info(&query, Some(obj()), Some(version()), uuid)?; + let (info, pagination) = fetch_part_info(&query, &mpu)?; assert!(pagination.is_none()); assert_eq!( info, - vec![PartInfo { - etag: "etag4".to_string(), - timestamp: TS, - part_number: 8, - size: 5 - },] + vec![ + PartInfo { + etag: "etag3", + timestamp: TS, + part_number: 5, + size: 7 + }, + PartInfo { + etag: "etag4", + timestamp: TS, + part_number: 8, + size: 5 + }, + ] ); // Trying to access a part that is way larger than registered ones query.part_number_marker = Some(9999); - let (info, pagination) = fetch_part_info(&query, Some(obj()), Some(version()), uuid)?; + let (info, pagination) = fetch_part_info(&query, &mpu)?; assert!(pagination.is_none()); assert_eq!(info, vec![]); // Try without any limitation query.max_parts = 1000; query.part_number_marker = None; - let (info, pagination) = fetch_part_info(&query, Some(obj()), Some(version()), uuid)?; + let (info, pagination) = fetch_part_info(&query, &mpu)?; assert!(pagination.is_none()); assert_eq!( info, vec![ PartInfo { - etag: "etag1".to_string(), + etag: "etag1", timestamp: TS, part_number: 1, - size: 5 + size: 3 + }, + PartInfo { + etag: "etag2", + timestamp: TS, + part_number: 3, + size: 10 }, PartInfo { - etag: "etag3".to_string(), + etag: "etag3", timestamp: TS, part_number: 5, size: 7 }, PartInfo { - etag: "etag4".to_string(), + etag: "etag4", timestamp: TS, part_number: 8, size: 5 diff --git a/src/api/s3/mod.rs b/src/api/s3/mod.rs index 7b56d4d8..cbdb94ab 100644 --- a/src/api/s3/mod.rs +++ b/src/api/s3/mod.rs @@ -6,7 +6,9 @@ mod copy; pub mod cors; mod delete; pub mod get; +mod lifecycle; mod list; +mod multipart; mod post_object; mod put; mod website; diff --git a/src/api/s3/multipart.rs b/src/api/s3/multipart.rs new file mode 100644 index 00000000..52ea8e78 --- /dev/null +++ b/src/api/s3/multipart.rs @@ -0,0 +1,465 @@ +use std::collections::HashMap; +use std::sync::Arc; + +use futures::prelude::*; +use hyper::body::Body; +use hyper::{Request, Response}; +use md5::{Digest as Md5Digest, Md5}; + +use garage_table::*; +use garage_util::async_hash::*; +use garage_util::data::*; +use garage_util::time::*; + +use garage_model::bucket_table::Bucket; +use garage_model::garage::Garage; +use garage_model::s3::block_ref_table::*; +use garage_model::s3::mpu_table::*; +use garage_model::s3::object_table::*; +use garage_model::s3::version_table::*; + +use crate::s3::error::*; +use crate::s3::put::*; +use crate::s3::xml as s3_xml; +use crate::signature::verify_signed_content; + +// ---- + +pub async fn handle_create_multipart_upload( + garage: Arc<Garage>, + req: &Request<Body>, + bucket_name: &str, + bucket_id: Uuid, + key: &str, +) -> Result<Response<Body>, Error> { + let upload_id = gen_uuid(); + let timestamp = now_msec(); + let headers = get_headers(req.headers())?; + + // Create object in object table + let object_version = ObjectVersion { + uuid: upload_id, + timestamp, + state: ObjectVersionState::Uploading { + multipart: true, + headers, + }, + }; + let object = Object::new(bucket_id, key.to_string(), vec![object_version]); + garage.object_table.insert(&object).await?; + + // Create multipart upload in mpu table + // This multipart upload will hold references to uploaded parts + // (which are entries in the Version table) + let mpu = MultipartUpload::new(upload_id, timestamp, bucket_id, key.into(), false); + garage.mpu_table.insert(&mpu).await?; + + // Send success response + let result = s3_xml::InitiateMultipartUploadResult { + xmlns: (), + bucket: s3_xml::Value(bucket_name.to_string()), + key: s3_xml::Value(key.to_string()), + upload_id: s3_xml::Value(hex::encode(upload_id)), + }; + let xml = s3_xml::to_xml_with_header(&result)?; + + Ok(Response::new(Body::from(xml.into_bytes()))) +} + +pub async fn handle_put_part( + garage: Arc<Garage>, + req: Request<Body>, + bucket_id: Uuid, + key: &str, + part_number: u64, + upload_id: &str, + content_sha256: Option<Hash>, +) -> Result<Response<Body>, Error> { + let upload_id = decode_upload_id(upload_id)?; + + let content_md5 = match req.headers().get("content-md5") { + Some(x) => Some(x.to_str()?.to_string()), + None => None, + }; + + // Read first chuck, and at the same time try to get object to see if it exists + let key = key.to_string(); + + let body = req.into_body().map_err(Error::from); + let mut chunker = StreamChunker::new(body, garage.config.block_size); + + let ((_, _, mut mpu), first_block) = futures::try_join!( + get_upload(&garage, &bucket_id, &key, &upload_id), + chunker.next(), + )?; + + // Check object is valid and part can be accepted + let first_block = first_block.ok_or_bad_request("Empty body")?; + + // Calculate part identity: timestamp, version id + let version_uuid = gen_uuid(); + let mpu_part_key = MpuPartKey { + part_number, + timestamp: mpu.next_timestamp(part_number), + }; + + // The following consists in many steps that can each fail. + // Keep track that some cleanup will be needed if things fail + // before everything is finished (cleanup is done using the Drop trait). + let mut interrupted_cleanup = InterruptedCleanup(Some(InterruptedCleanupInner { + garage: garage.clone(), + upload_id, + version_uuid, + })); + + // Create version and link version from MPU + mpu.parts.clear(); + mpu.parts.put( + mpu_part_key, + MpuPart { + version: version_uuid, + etag: None, + size: None, + }, + ); + garage.mpu_table.insert(&mpu).await?; + + let version = Version::new( + version_uuid, + VersionBacklink::MultipartUpload { upload_id }, + false, + ); + garage.version_table.insert(&version).await?; + + // Copy data to version + let first_block_hash = async_blake2sum(first_block.clone()).await; + + let (total_size, data_md5sum, data_sha256sum) = read_and_put_blocks( + &garage, + &version, + part_number, + first_block, + first_block_hash, + &mut chunker, + ) + .await?; + + // Verify that checksums map + ensure_checksum_matches( + data_md5sum.as_slice(), + data_sha256sum, + content_md5.as_deref(), + content_sha256, + )?; + + // Store part etag in version + let data_md5sum_hex = hex::encode(data_md5sum); + mpu.parts.put( + mpu_part_key, + MpuPart { + version: version_uuid, + etag: Some(data_md5sum_hex.clone()), + size: Some(total_size), + }, + ); + garage.mpu_table.insert(&mpu).await?; + + // We were not interrupted, everything went fine. + // We won't have to clean up on drop. + interrupted_cleanup.cancel(); + + let response = Response::builder() + .header("ETag", format!("\"{}\"", data_md5sum_hex)) + .body(Body::empty()) + .unwrap(); + Ok(response) +} + +struct InterruptedCleanup(Option<InterruptedCleanupInner>); +struct InterruptedCleanupInner { + garage: Arc<Garage>, + upload_id: Uuid, + version_uuid: Uuid, +} + +impl InterruptedCleanup { + fn cancel(&mut self) { + drop(self.0.take()); + } +} +impl Drop for InterruptedCleanup { + fn drop(&mut self) { + if let Some(info) = self.0.take() { + tokio::spawn(async move { + let version = Version::new( + info.version_uuid, + VersionBacklink::MultipartUpload { + upload_id: info.upload_id, + }, + true, + ); + if let Err(e) = info.garage.version_table.insert(&version).await { + warn!("Cannot cleanup after aborted UploadPart: {}", e); + } + }); + } + } +} + +pub async fn handle_complete_multipart_upload( + garage: Arc<Garage>, + req: Request<Body>, + bucket_name: &str, + bucket: &Bucket, + key: &str, + upload_id: &str, + content_sha256: Option<Hash>, +) -> Result<Response<Body>, Error> { + let body = hyper::body::to_bytes(req.into_body()).await?; + + if let Some(content_sha256) = content_sha256 { + verify_signed_content(content_sha256, &body[..])?; + } + + let body_xml = roxmltree::Document::parse(std::str::from_utf8(&body)?)?; + let body_list_of_parts = parse_complete_multipart_upload_body(&body_xml) + .ok_or_bad_request("Invalid CompleteMultipartUpload XML")?; + debug!( + "CompleteMultipartUpload list of parts: {:?}", + body_list_of_parts + ); + + let upload_id = decode_upload_id(upload_id)?; + + // Get object and multipart upload + let key = key.to_string(); + let (_, mut object_version, mpu) = get_upload(&garage, &bucket.id, &key, &upload_id).await?; + + if mpu.parts.is_empty() { + return Err(Error::bad_request("No data was uploaded")); + } + + let headers = match object_version.state { + ObjectVersionState::Uploading { headers, .. } => headers, + _ => unreachable!(), + }; + + // Check that part numbers are an increasing sequence. + // (it doesn't need to start at 1 nor to be a continuous sequence, + // see discussion in #192) + if body_list_of_parts.is_empty() { + return Err(Error::EntityTooSmall); + } + if !body_list_of_parts + .iter() + .zip(body_list_of_parts.iter().skip(1)) + .all(|(p1, p2)| p1.part_number < p2.part_number) + { + return Err(Error::InvalidPartOrder); + } + + // Check that the list of parts they gave us corresponds to parts we have here + debug!("Parts stored in multipart upload: {:?}", mpu.parts.items()); + let mut have_parts = HashMap::new(); + for (pk, pv) in mpu.parts.items().iter() { + have_parts.insert(pk.part_number, pv); + } + let mut parts = vec![]; + for req_part in body_list_of_parts.iter() { + match have_parts.get(&req_part.part_number) { + Some(part) if part.etag.as_ref() == Some(&req_part.etag) && part.size.is_some() => { + parts.push(*part) + } + _ => return Err(Error::InvalidPart), + } + } + + let grg = &garage; + let parts_versions = futures::future::try_join_all(parts.iter().map(|p| async move { + grg.version_table + .get(&p.version, &EmptyKey) + .await? + .ok_or_internal_error("Part version missing from version table") + })) + .await?; + + // Create final version and block refs + let mut final_version = Version::new( + upload_id, + VersionBacklink::Object { + bucket_id: bucket.id, + key: key.to_string(), + }, + false, + ); + for (part_number, part_version) in parts_versions.iter().enumerate() { + if part_version.deleted.get() { + return Err(Error::InvalidPart); + } + for (vbk, vb) in part_version.blocks.items().iter() { + final_version.blocks.put( + VersionBlockKey { + part_number: (part_number + 1) as u64, + offset: vbk.offset, + }, + *vb, + ); + } + } + garage.version_table.insert(&final_version).await?; + + let block_refs = final_version.blocks.items().iter().map(|(_, b)| BlockRef { + block: b.hash, + version: upload_id, + deleted: false.into(), + }); + garage.block_ref_table.insert_many(block_refs).await?; + + // Calculate etag of final object + // To understand how etags are calculated, read more here: + // https://teppen.io/2018/06/23/aws_s3_etags/ + let mut etag_md5_hasher = Md5::new(); + for part in parts.iter() { + etag_md5_hasher.update(part.etag.as_ref().unwrap().as_bytes()); + } + let etag = format!( + "{}-{}", + hex::encode(etag_md5_hasher.finalize()), + parts.len() + ); + + // Calculate total size of final object + let total_size = parts.iter().map(|x| x.size.unwrap()).sum(); + + if let Err(e) = check_quotas(&garage, bucket, &key, total_size).await { + object_version.state = ObjectVersionState::Aborted; + let final_object = Object::new(bucket.id, key.clone(), vec![object_version]); + garage.object_table.insert(&final_object).await?; + + return Err(e); + } + + // Write final object version + object_version.state = ObjectVersionState::Complete(ObjectVersionData::FirstBlock( + ObjectVersionMeta { + headers, + size: total_size, + etag: etag.clone(), + }, + final_version.blocks.items()[0].1.hash, + )); + + let final_object = Object::new(bucket.id, key.clone(), vec![object_version]); + garage.object_table.insert(&final_object).await?; + + // Send response saying ok we're done + let result = s3_xml::CompleteMultipartUploadResult { + xmlns: (), + location: None, + bucket: s3_xml::Value(bucket_name.to_string()), + key: s3_xml::Value(key), + etag: s3_xml::Value(format!("\"{}\"", etag)), + }; + let xml = s3_xml::to_xml_with_header(&result)?; + + Ok(Response::new(Body::from(xml.into_bytes()))) +} + +pub async fn handle_abort_multipart_upload( + garage: Arc<Garage>, + bucket_id: Uuid, + key: &str, + upload_id: &str, +) -> Result<Response<Body>, Error> { + let upload_id = decode_upload_id(upload_id)?; + + let (_, mut object_version, _) = + get_upload(&garage, &bucket_id, &key.to_string(), &upload_id).await?; + + object_version.state = ObjectVersionState::Aborted; + let final_object = Object::new(bucket_id, key.to_string(), vec![object_version]); + garage.object_table.insert(&final_object).await?; + + Ok(Response::new(Body::from(vec![]))) +} + +// ======== helpers ============ + +#[allow(clippy::ptr_arg)] +pub(crate) async fn get_upload( + garage: &Garage, + bucket_id: &Uuid, + key: &String, + upload_id: &Uuid, +) -> Result<(Object, ObjectVersion, MultipartUpload), Error> { + let (object, mpu) = futures::try_join!( + garage.object_table.get(bucket_id, key).map_err(Error::from), + garage + .mpu_table + .get(upload_id, &EmptyKey) + .map_err(Error::from), + )?; + + let object = object.ok_or(Error::NoSuchUpload)?; + let mpu = mpu.ok_or(Error::NoSuchUpload)?; + + let object_version = object + .versions() + .iter() + .find(|v| v.uuid == *upload_id && v.is_uploading(Some(true))) + .ok_or(Error::NoSuchUpload)? + .clone(); + + Ok((object, object_version, mpu)) +} + +pub fn decode_upload_id(id: &str) -> Result<Uuid, Error> { + let id_bin = hex::decode(id).map_err(|_| Error::NoSuchUpload)?; + if id_bin.len() != 32 { + return Err(Error::NoSuchUpload); + } + let mut uuid = [0u8; 32]; + uuid.copy_from_slice(&id_bin[..]); + Ok(Uuid::from(uuid)) +} + +#[derive(Debug)] +struct CompleteMultipartUploadPart { + etag: String, + part_number: u64, +} + +fn parse_complete_multipart_upload_body( + xml: &roxmltree::Document, +) -> Option<Vec<CompleteMultipartUploadPart>> { + let mut parts = vec![]; + + let root = xml.root(); + let cmu = root.first_child()?; + if !cmu.has_tag_name("CompleteMultipartUpload") { + return None; + } + + for item in cmu.children() { + // Only parse <Part> nodes + if !item.is_element() { + continue; + } + + if item.has_tag_name("Part") { + let etag = item.children().find(|e| e.has_tag_name("ETag"))?.text()?; + let part_number = item + .children() + .find(|e| e.has_tag_name("PartNumber"))? + .text()?; + parts.push(CompleteMultipartUploadPart { + etag: etag.trim_matches('"').to_string(), + part_number: part_number.parse().ok()?, + }); + } else { + return None; + } + } + + Some(parts) +} diff --git a/src/api/s3/put.rs b/src/api/s3/put.rs index 350ab884..c7ac5030 100644 --- a/src/api/s3/put.rs +++ b/src/api/s3/put.rs @@ -1,4 +1,4 @@ -use std::collections::{BTreeMap, BTreeSet, HashMap}; +use std::collections::{BTreeMap, HashMap}; use std::sync::Arc; use base64::prelude::*; @@ -30,8 +30,6 @@ use garage_model::s3::object_table::*; use garage_model::s3::version_table::*; use crate::s3::error::*; -use crate::s3::xml as s3_xml; -use crate::signature::verify_signed_content; pub async fn handle_put( garage: Arc<Garage>, @@ -123,20 +121,23 @@ pub(crate) async fn save_stream<S: Stream<Item = Result<Bytes, Error>> + Unpin>( // The following consists in many steps that can each fail. // Keep track that some cleanup will be needed if things fail // before everything is finished (cleanup is done using the Drop trait). - let mut interrupted_cleanup = InterruptedCleanup(Some(( - garage.clone(), - bucket.id, - key.into(), + let mut interrupted_cleanup = InterruptedCleanup(Some(InterruptedCleanupInner { + garage: garage.clone(), + bucket_id: bucket.id, + key: key.into(), version_uuid, version_timestamp, - ))); + })); // Write version identifier in object table so that we have a trace // that we are uploading something let mut object_version = ObjectVersion { uuid: version_uuid, timestamp: version_timestamp, - state: ObjectVersionState::Uploading(headers.clone()), + state: ObjectVersionState::Uploading { + headers: headers.clone(), + multipart: false, + }, }; let object = Object::new(bucket.id, key.into(), vec![object_version.clone()]); garage.object_table.insert(&object).await?; @@ -145,7 +146,14 @@ pub(crate) async fn save_stream<S: Stream<Item = Result<Bytes, Error>> + Unpin>( // Write this entry now, even with empty block list, // to prevent block_ref entries from being deleted (they can be deleted // if the reference a version that isn't found in the version table) - let version = Version::new(version_uuid, bucket.id, key.into(), false); + let version = Version::new( + version_uuid, + VersionBacklink::Object { + bucket_id: bucket.id, + key: key.into(), + }, + false, + ); garage.version_table.insert(&version).await?; // Transfer data and verify checksum @@ -192,7 +200,7 @@ pub(crate) async fn save_stream<S: Stream<Item = Result<Bytes, Error>> + Unpin>( /// Validate MD5 sum against content-md5 header /// and sha256sum against signed content-sha256 -fn ensure_checksum_matches( +pub(crate) fn ensure_checksum_matches( data_md5sum: &[u8], data_sha256sum: garage_util::data::FixedBytes32, content_md5: Option<&str>, @@ -218,7 +226,7 @@ fn ensure_checksum_matches( } /// Check that inserting this object with this size doesn't exceed bucket quotas -async fn check_quotas( +pub(crate) async fn check_quotas( garage: &Arc<Garage>, bucket: &Bucket, key: &str, @@ -275,7 +283,7 @@ async fn check_quotas( Ok(()) } -async fn read_and_put_blocks<S: Stream<Item = Result<Bytes, Error>> + Unpin>( +pub(crate) async fn read_and_put_blocks<S: Stream<Item = Result<Bytes, Error>> + Unpin>( garage: &Garage, version: &Version, part_number: u64, @@ -381,7 +389,7 @@ async fn put_block_meta( Ok(()) } -struct StreamChunker<S: Stream<Item = Result<Bytes, Error>>> { +pub(crate) struct StreamChunker<S: Stream<Item = Result<Bytes, Error>>> { stream: S, read_all: bool, block_size: usize, @@ -389,7 +397,7 @@ struct StreamChunker<S: Stream<Item = Result<Bytes, Error>>> { } impl<S: Stream<Item = Result<Bytes, Error>> + Unpin> StreamChunker<S> { - fn new(stream: S, block_size: usize) -> Self { + pub(crate) fn new(stream: S, block_size: usize) -> Self { Self { stream, read_all: false, @@ -398,7 +406,7 @@ impl<S: Stream<Item = Result<Bytes, Error>> + Unpin> StreamChunker<S> { } } - async fn next(&mut self) -> Result<Option<Bytes>, Error> { + pub(crate) async fn next(&mut self) -> Result<Option<Bytes>, Error> { while !self.read_all && self.buf.len() < self.block_size { if let Some(block) = self.stream.next().await { let bytes = block?; @@ -425,7 +433,14 @@ pub fn put_response(version_uuid: Uuid, md5sum_hex: String) -> Response<Body> { .unwrap() } -struct InterruptedCleanup(Option<(Arc<Garage>, Uuid, String, Uuid, u64)>); +struct InterruptedCleanup(Option<InterruptedCleanupInner>); +struct InterruptedCleanupInner { + garage: Arc<Garage>, + bucket_id: Uuid, + key: String, + version_uuid: Uuid, + version_timestamp: u64, +} impl InterruptedCleanup { fn cancel(&mut self) { @@ -434,15 +449,15 @@ impl InterruptedCleanup { } impl Drop for InterruptedCleanup { fn drop(&mut self) { - if let Some((garage, bucket_id, key, version_uuid, version_ts)) = self.0.take() { + if let Some(info) = self.0.take() { tokio::spawn(async move { let object_version = ObjectVersion { - uuid: version_uuid, - timestamp: version_ts, + uuid: info.version_uuid, + timestamp: info.version_timestamp, state: ObjectVersionState::Aborted, }; - let object = Object::new(bucket_id, key, vec![object_version]); - if let Err(e) = garage.object_table.insert(&object).await { + let object = Object::new(info.bucket_id, info.key, vec![object_version]); + if let Err(e) = info.garage.object_table.insert(&object).await { warn!("Cannot cleanup after aborted PutObject: {}", e); } }); @@ -450,326 +465,9 @@ impl Drop for InterruptedCleanup { } } -// ---- - -pub async fn handle_create_multipart_upload( - garage: Arc<Garage>, - req: &Request<Body>, - bucket_name: &str, - bucket_id: Uuid, - key: &str, -) -> Result<Response<Body>, Error> { - let version_uuid = gen_uuid(); - let headers = get_headers(req.headers())?; - - // Create object in object table - let object_version = ObjectVersion { - uuid: version_uuid, - timestamp: now_msec(), - state: ObjectVersionState::Uploading(headers), - }; - let object = Object::new(bucket_id, key.to_string(), vec![object_version]); - garage.object_table.insert(&object).await?; - - // Insert empty version so that block_ref entries refer to something - // (they are inserted concurrently with blocks in the version table, so - // there is the possibility that they are inserted before the version table - // is created, in which case it is allowed to delete them, e.g. in repair_*) - let version = Version::new(version_uuid, bucket_id, key.into(), false); - garage.version_table.insert(&version).await?; - - // Send success response - let result = s3_xml::InitiateMultipartUploadResult { - xmlns: (), - bucket: s3_xml::Value(bucket_name.to_string()), - key: s3_xml::Value(key.to_string()), - upload_id: s3_xml::Value(hex::encode(version_uuid)), - }; - let xml = s3_xml::to_xml_with_header(&result)?; - - Ok(Response::new(Body::from(xml.into_bytes()))) -} - -pub async fn handle_put_part( - garage: Arc<Garage>, - req: Request<Body>, - bucket_id: Uuid, - key: &str, - part_number: u64, - upload_id: &str, - content_sha256: Option<Hash>, -) -> Result<Response<Body>, Error> { - let version_uuid = decode_upload_id(upload_id)?; - - let content_md5 = match req.headers().get("content-md5") { - Some(x) => Some(x.to_str()?.to_string()), - None => None, - }; - - // Read first chuck, and at the same time try to get object to see if it exists - let key = key.to_string(); - - let body = req.into_body().map_err(Error::from); - let mut chunker = StreamChunker::new(body, garage.config.block_size); - - let (object, version, first_block) = futures::try_join!( - garage - .object_table - .get(&bucket_id, &key) - .map_err(Error::from), - garage - .version_table - .get(&version_uuid, &EmptyKey) - .map_err(Error::from), - chunker.next(), - )?; - - // Check object is valid and multipart block can be accepted - let first_block = first_block.ok_or_bad_request("Empty body")?; - let object = object.ok_or_bad_request("Object not found")?; +// ============ helpers ============ - if !object - .versions() - .iter() - .any(|v| v.uuid == version_uuid && v.is_uploading()) - { - return Err(Error::NoSuchUpload); - } - - // Check part hasn't already been uploaded - if let Some(v) = version { - if v.has_part_number(part_number) { - return Err(Error::bad_request(format!( - "Part number {} has already been uploaded", - part_number - ))); - } - } - - // Copy block to store - let version = Version::new(version_uuid, bucket_id, key, false); - - let first_block_hash = async_blake2sum(first_block.clone()).await; - - let (_, data_md5sum, data_sha256sum) = read_and_put_blocks( - &garage, - &version, - part_number, - first_block, - first_block_hash, - &mut chunker, - ) - .await?; - - // Verify that checksums map - ensure_checksum_matches( - data_md5sum.as_slice(), - data_sha256sum, - content_md5.as_deref(), - content_sha256, - )?; - - // Store part etag in version - let data_md5sum_hex = hex::encode(data_md5sum); - let mut version = version; - version - .parts_etags - .put(part_number, data_md5sum_hex.clone()); - garage.version_table.insert(&version).await?; - - let response = Response::builder() - .header("ETag", format!("\"{}\"", data_md5sum_hex)) - .body(Body::empty()) - .unwrap(); - Ok(response) -} - -pub async fn handle_complete_multipart_upload( - garage: Arc<Garage>, - req: Request<Body>, - bucket_name: &str, - bucket: &Bucket, - key: &str, - upload_id: &str, - content_sha256: Option<Hash>, -) -> Result<Response<Body>, Error> { - let body = hyper::body::to_bytes(req.into_body()).await?; - - if let Some(content_sha256) = content_sha256 { - verify_signed_content(content_sha256, &body[..])?; - } - - let body_xml = roxmltree::Document::parse(std::str::from_utf8(&body)?)?; - let body_list_of_parts = parse_complete_multipart_upload_body(&body_xml) - .ok_or_bad_request("Invalid CompleteMultipartUpload XML")?; - debug!( - "CompleteMultipartUpload list of parts: {:?}", - body_list_of_parts - ); - - let version_uuid = decode_upload_id(upload_id)?; - - // Get object and version - let key = key.to_string(); - let (object, version) = futures::try_join!( - garage.object_table.get(&bucket.id, &key), - garage.version_table.get(&version_uuid, &EmptyKey), - )?; - - let object = object.ok_or(Error::NoSuchKey)?; - let mut object_version = object - .versions() - .iter() - .find(|v| v.uuid == version_uuid && v.is_uploading()) - .cloned() - .ok_or(Error::NoSuchUpload)?; - - let version = version.ok_or(Error::NoSuchKey)?; - if version.blocks.is_empty() { - return Err(Error::bad_request("No data was uploaded")); - } - - let headers = match object_version.state { - ObjectVersionState::Uploading(headers) => headers, - _ => unreachable!(), - }; - - // Check that part numbers are an increasing sequence. - // (it doesn't need to start at 1 nor to be a continuous sequence, - // see discussion in #192) - if body_list_of_parts.is_empty() { - return Err(Error::EntityTooSmall); - } - if !body_list_of_parts - .iter() - .zip(body_list_of_parts.iter().skip(1)) - .all(|(p1, p2)| p1.part_number < p2.part_number) - { - return Err(Error::InvalidPartOrder); - } - - // Garage-specific restriction, see #204: part numbers must be - // consecutive starting at 1 - if body_list_of_parts[0].part_number != 1 - || !body_list_of_parts - .iter() - .zip(body_list_of_parts.iter().skip(1)) - .all(|(p1, p2)| p1.part_number + 1 == p2.part_number) - { - return Err(Error::NotImplemented("Garage does not support completing a Multipart upload with non-consecutive part numbers. This is a restriction of Garage's data model, which might be fixed in a future release. See issue #204 for more information on this topic.".into())); - } - - // Check that the list of parts they gave us corresponds to the parts we have here - debug!("Expected parts from request: {:?}", body_list_of_parts); - debug!("Parts stored in version: {:?}", version.parts_etags.items()); - let parts = version - .parts_etags - .items() - .iter() - .map(|pair| (&pair.0, &pair.1)); - let same_parts = body_list_of_parts - .iter() - .map(|x| (&x.part_number, &x.etag)) - .eq(parts); - if !same_parts { - return Err(Error::InvalidPart); - } - - // Check that all blocks belong to one of the parts - let block_parts = version - .blocks - .items() - .iter() - .map(|(bk, _)| bk.part_number) - .collect::<BTreeSet<_>>(); - let same_parts = body_list_of_parts - .iter() - .map(|x| x.part_number) - .eq(block_parts.into_iter()); - if !same_parts { - return Err(Error::bad_request( - "Part numbers in block list and part list do not match. This can happen if a part was partially uploaded. Please abort the multipart upload and try again." - )); - } - - // Calculate etag of final object - // To understand how etags are calculated, read more here: - // https://teppen.io/2018/06/23/aws_s3_etags/ - let num_parts = body_list_of_parts.len(); - let mut etag_md5_hasher = Md5::new(); - for (_, etag) in version.parts_etags.items().iter() { - etag_md5_hasher.update(etag.as_bytes()); - } - let etag = format!("{}-{}", hex::encode(etag_md5_hasher.finalize()), num_parts); - - // Calculate total size of final object - let total_size = version.blocks.items().iter().map(|x| x.1.size).sum(); - - if let Err(e) = check_quotas(&garage, bucket, &key, total_size).await { - object_version.state = ObjectVersionState::Aborted; - let final_object = Object::new(bucket.id, key.clone(), vec![object_version]); - garage.object_table.insert(&final_object).await?; - - return Err(e); - } - - // Write final object version - object_version.state = ObjectVersionState::Complete(ObjectVersionData::FirstBlock( - ObjectVersionMeta { - headers, - size: total_size, - etag: etag.clone(), - }, - version.blocks.items()[0].1.hash, - )); - - let final_object = Object::new(bucket.id, key.clone(), vec![object_version]); - garage.object_table.insert(&final_object).await?; - - // Send response saying ok we're done - let result = s3_xml::CompleteMultipartUploadResult { - xmlns: (), - location: None, - bucket: s3_xml::Value(bucket_name.to_string()), - key: s3_xml::Value(key), - etag: s3_xml::Value(format!("\"{}\"", etag)), - }; - let xml = s3_xml::to_xml_with_header(&result)?; - - Ok(Response::new(Body::from(xml.into_bytes()))) -} - -pub async fn handle_abort_multipart_upload( - garage: Arc<Garage>, - bucket_id: Uuid, - key: &str, - upload_id: &str, -) -> Result<Response<Body>, Error> { - let version_uuid = decode_upload_id(upload_id)?; - - let object = garage - .object_table - .get(&bucket_id, &key.to_string()) - .await?; - let object = object.ok_or(Error::NoSuchKey)?; - - let object_version = object - .versions() - .iter() - .find(|v| v.uuid == version_uuid && v.is_uploading()); - let mut object_version = match object_version { - None => return Err(Error::NoSuchUpload), - Some(x) => x.clone(), - }; - - object_version.state = ObjectVersionState::Aborted; - let final_object = Object::new(bucket_id, key.to_string(), vec![object_version]); - garage.object_table.insert(&final_object).await?; - - Ok(Response::new(Body::from(vec![]))) -} - -fn get_mime_type(headers: &HeaderMap<HeaderValue>) -> Result<String, Error> { +pub(crate) fn get_mime_type(headers: &HeaderMap<HeaderValue>) -> Result<String, Error> { Ok(headers .get(hyper::header::CONTENT_TYPE) .map(|x| x.to_str()) @@ -821,54 +519,3 @@ pub(crate) fn get_headers(headers: &HeaderMap<HeaderValue>) -> Result<ObjectVers other, }) } - -pub fn decode_upload_id(id: &str) -> Result<Uuid, Error> { - let id_bin = hex::decode(id).map_err(|_| Error::NoSuchUpload)?; - if id_bin.len() != 32 { - return Err(Error::NoSuchUpload); - } - let mut uuid = [0u8; 32]; - uuid.copy_from_slice(&id_bin[..]); - Ok(Uuid::from(uuid)) -} - -#[derive(Debug)] -struct CompleteMultipartUploadPart { - etag: String, - part_number: u64, -} - -fn parse_complete_multipart_upload_body( - xml: &roxmltree::Document, -) -> Option<Vec<CompleteMultipartUploadPart>> { - let mut parts = vec![]; - - let root = xml.root(); - let cmu = root.first_child()?; - if !cmu.has_tag_name("CompleteMultipartUpload") { - return None; - } - - for item in cmu.children() { - // Only parse <Part> nodes - if !item.is_element() { - continue; - } - - if item.has_tag_name("Part") { - let etag = item.children().find(|e| e.has_tag_name("ETag"))?.text()?; - let part_number = item - .children() - .find(|e| e.has_tag_name("PartNumber"))? - .text()?; - parts.push(CompleteMultipartUploadPart { - etag: etag.trim_matches('"').to_string(), - part_number: part_number.parse().ok()?, - }); - } else { - return None; - } - } - - Some(parts) -} diff --git a/src/api/s3/website.rs b/src/api/s3/website.rs index 77738971..7f2ab925 100644 --- a/src/api/s3/website.rs +++ b/src/api/s3/website.rs @@ -43,14 +43,11 @@ pub async fn handle_get_website(bucket: &Bucket) -> Result<Response<Body>, Error pub async fn handle_delete_website( garage: Arc<Garage>, - bucket_id: Uuid, + mut bucket: Bucket, ) -> Result<Response<Body>, Error> { - let mut bucket = garage - .bucket_helper() - .get_existing_bucket(bucket_id) - .await?; - - let param = bucket.params_mut().unwrap(); + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; param.website_config.update(None); garage.bucket_table.insert(&bucket).await?; @@ -62,7 +59,7 @@ pub async fn handle_delete_website( pub async fn handle_put_website( garage: Arc<Garage>, - bucket_id: Uuid, + mut bucket: Bucket, req: Request<Body>, content_sha256: Option<Hash>, ) -> Result<Response<Body>, Error> { @@ -72,12 +69,9 @@ pub async fn handle_put_website( verify_signed_content(content_sha256, &body[..])?; } - let mut bucket = garage - .bucket_helper() - .get_existing_bucket(bucket_id) - .await?; - - let param = bucket.params_mut().unwrap(); + let param = bucket + .params_mut() + .ok_or_internal_error("Bucket should not be deleted at this point")?; let conf: WebsiteConfiguration = from_reader(&body as &[u8])?; conf.validate()?; diff --git a/src/block/Cargo.toml b/src/block/Cargo.toml index 963086ac..6a8f1af4 100644 --- a/src/block/Cargo.toml +++ b/src/block/Cargo.toml @@ -24,6 +24,7 @@ opentelemetry = "0.17" arc-swap = "1.5" async-trait = "0.1.7" bytes = "1.0" +bytesize = "1.2" hex = "0.4" tracing = "0.1" rand = "0.8" diff --git a/src/block/block.rs b/src/block/block.rs index 935aa900..20f57aa5 100644 --- a/src/block/block.rs +++ b/src/block/block.rs @@ -1,3 +1,5 @@ +use std::path::PathBuf; + use bytes::Bytes; use serde::{Deserialize, Serialize}; use zstd::stream::{decode_all as zstd_decode, Encoder}; @@ -19,6 +21,14 @@ pub enum DataBlock { Compressed(Bytes), } +#[derive(Debug)] +pub enum DataBlockPath { + /// Uncompressed data fail + Plain(PathBuf), + /// Compressed data fail + Compressed(PathBuf), +} + impl DataBlock { /// Query whether this block is compressed pub fn is_compressed(&self) -> bool { diff --git a/src/block/layout.rs b/src/block/layout.rs new file mode 100644 index 00000000..e8339405 --- /dev/null +++ b/src/block/layout.rs @@ -0,0 +1,337 @@ +use std::path::PathBuf; + +use serde::{Deserialize, Serialize}; + +use garage_util::config::DataDirEnum; +use garage_util::data::Hash; +use garage_util::error::{Error, OkOrMessage}; +use garage_util::migrate::*; + +type Idx = u16; + +const DRIVE_NPART: usize = 1024; + +const HASH_DRIVE_BYTES: (usize, usize) = (2, 3); + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub(crate) struct DataLayout { + pub(crate) data_dirs: Vec<DataDir>, + + /// Primary storage location (index in data_dirs) for each partition + /// = the location where the data is supposed to be, blocks are always + /// written there (copies in other dirs may be deleted if they exist) + pub(crate) part_prim: Vec<Idx>, + /// Secondary storage locations for each partition = locations + /// where data blocks might be, we check from these dirs when reading + pub(crate) part_sec: Vec<Vec<Idx>>, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)] +pub(crate) struct DataDir { + pub(crate) path: PathBuf, + pub(crate) state: DataDirState, +} + +#[derive(Serialize, Deserialize, Debug, Clone, Copy, Eq, PartialEq)] +pub(crate) enum DataDirState { + Active { capacity: u64 }, + ReadOnly, +} + +impl DataLayout { + pub(crate) fn initialize(dirs: &DataDirEnum) -> Result<Self, Error> { + let data_dirs = make_data_dirs(dirs)?; + + // Split partitions proportionnally to capacity for all drives + // to affect primary storage location + let total_cap = data_dirs.iter().filter_map(|x| x.capacity()).sum::<u64>(); + assert!(total_cap > 0); + + let mut part_prim = Vec::with_capacity(DRIVE_NPART); + let mut cum_cap = 0; + for (i, dd) in data_dirs.iter().enumerate() { + if let DataDirState::Active { capacity } = dd.state { + cum_cap += capacity; + let n_total = (cum_cap * DRIVE_NPART as u64) / total_cap; + part_prim.resize(n_total as usize, i as Idx); + } + } + assert_eq!(cum_cap, total_cap); + assert_eq!(part_prim.len(), DRIVE_NPART); + + // If any of the storage locations is non-empty, it probably existed before + // this algorithm was added, so add it as a secondary storage location for all partitions + // to make sure existing files are not lost + let mut part_sec = vec![vec![]; DRIVE_NPART]; + for (i, dd) in data_dirs.iter().enumerate() { + if dir_not_empty(&dd.path)? { + for (sec, prim) in part_sec.iter_mut().zip(part_prim.iter()) { + if *prim != i as Idx { + sec.push(i as Idx); + } + } + } + } + + Ok(Self { + data_dirs, + part_prim, + part_sec, + }) + } + + pub(crate) fn update(&mut self, dirs: &DataDirEnum) -> Result<(), Error> { + // Make list of new data directories, exit if nothing changed + let data_dirs = make_data_dirs(dirs)?; + if data_dirs == self.data_dirs { + return Ok(()); + } + + let total_cap = data_dirs.iter().filter_map(|x| x.capacity()).sum::<u64>(); + assert!(total_cap > 0); + + // Compute mapping of old indices to new indices + let old2new = self + .data_dirs + .iter() + .map(|x| { + data_dirs + .iter() + .position(|y| y.path == x.path) + .map(|x| x as Idx) + }) + .collect::<Vec<_>>(); + + // Compute secondary location list for partitions based on existing + // folders, translating indices from old to new + let mut part_sec = self + .part_sec + .iter() + .map(|dl| { + dl.iter() + .filter_map(|old| old2new.get(*old as usize).copied().flatten()) + .collect::<Vec<_>>() + }) + .collect::<Vec<_>>(); + + // Compute a vector that, for each data dir, + // contains the list of partitions primarily stored on that drive + let mut dir_prim = vec![vec![]; data_dirs.len()]; + for (ipart, prim) in self.part_prim.iter().enumerate() { + if let Some(new) = old2new.get(*prim as usize).copied().flatten() { + dir_prim[new as usize].push(ipart); + } + } + + // Compute the target number of partitions per data directory + let mut cum_cap = 0; + let mut npart_per_dir = vec![0; data_dirs.len()]; + for (idir, dd) in data_dirs.iter().enumerate() { + if let DataDirState::Active { capacity } = dd.state { + let begin = (cum_cap * DRIVE_NPART as u64) / total_cap; + cum_cap += capacity; + let end = (cum_cap * DRIVE_NPART as u64) / total_cap; + npart_per_dir[idir] = (end - begin) as usize; + } + } + assert_eq!(cum_cap, total_cap); + assert_eq!(npart_per_dir.iter().sum::<usize>(), DRIVE_NPART); + + // For all directories that have too many primary partitions, + // move that partition to secondary + for (idir, (parts, tgt_npart)) in dir_prim.iter_mut().zip(npart_per_dir.iter()).enumerate() + { + while parts.len() > *tgt_npart { + let part = parts.pop().unwrap(); + if !part_sec[part].contains(&(idir as Idx)) { + part_sec[part].push(idir as Idx); + } + } + } + + // Calculate the vector of primary partition dir index + let mut part_prim = vec![None; DRIVE_NPART]; + for (idir, parts) in dir_prim.iter().enumerate() { + for part in parts.iter() { + assert!(part_prim[*part].is_none()); + part_prim[*part] = Some(idir as Idx) + } + } + + // Calculate a vector of unassigned partitions + let mut unassigned = part_prim + .iter() + .enumerate() + .filter(|(_, dir)| dir.is_none()) + .map(|(ipart, _)| ipart) + .collect::<Vec<_>>(); + + // For all directories that don't have enough primary partitions, + // add partitions from unassigned + for (idir, (parts, tgt_npart)) in dir_prim.iter_mut().zip(npart_per_dir.iter()).enumerate() + { + if parts.len() < *tgt_npart { + let required = *tgt_npart - parts.len(); + assert!(unassigned.len() >= required); + for _ in 0..required { + let new_part = unassigned.pop().unwrap(); + part_prim[new_part] = Some(idir as Idx); + part_sec[new_part].retain(|x| *x != idir as Idx); + } + } + } + + // Sanity checks + assert!(part_prim.iter().all(|x| x.is_some())); + assert!(unassigned.is_empty()); + + // Transform part_prim from vec of Option<Idx> to vec of Idx + let part_prim = part_prim + .into_iter() + .map(|x| x.unwrap()) + .collect::<Vec<_>>(); + assert!(part_prim.iter().all(|p| data_dirs + .get(*p as usize) + .and_then(|x| x.capacity()) + .unwrap_or(0) + > 0)); + + // If any of the newly added storage locations is non-empty, + // it might have been removed and added again and might contain data, + // so add it as a secondary storage location for all partitions + // to make sure existing files are not lost + for (i, dd) in data_dirs.iter().enumerate() { + if self.data_dirs.iter().any(|ed| ed.path == dd.path) { + continue; + } + if dir_not_empty(&dd.path)? { + for (sec, prim) in part_sec.iter_mut().zip(part_prim.iter()) { + if *prim != i as Idx && !sec.contains(&(i as Idx)) { + sec.push(i as Idx); + } + } + } + } + + // Apply newly generated config + *self = Self { + data_dirs, + part_prim, + part_sec, + }; + Ok(()) + } + + pub(crate) fn primary_block_dir(&self, hash: &Hash) -> PathBuf { + let ipart = self.partition_from(hash); + let idir = self.part_prim[ipart] as usize; + self.block_dir_from(hash, &self.data_dirs[idir].path) + } + + pub(crate) fn secondary_block_dirs<'a>( + &'a self, + hash: &'a Hash, + ) -> impl Iterator<Item = PathBuf> + 'a { + let ipart = self.partition_from(hash); + self.part_sec[ipart] + .iter() + .map(move |idir| self.block_dir_from(hash, &self.data_dirs[*idir as usize].path)) + } + + fn partition_from(&self, hash: &Hash) -> usize { + u16::from_be_bytes([ + hash.as_slice()[HASH_DRIVE_BYTES.0], + hash.as_slice()[HASH_DRIVE_BYTES.1], + ]) as usize % DRIVE_NPART + } + + fn block_dir_from(&self, hash: &Hash, dir: &PathBuf) -> PathBuf { + let mut path = dir.clone(); + path.push(hex::encode(&hash.as_slice()[0..1])); + path.push(hex::encode(&hash.as_slice()[1..2])); + path + } + + pub(crate) fn without_secondary_locations(&self) -> Self { + Self { + data_dirs: self.data_dirs.clone(), + part_prim: self.part_prim.clone(), + part_sec: self.part_sec.iter().map(|_| vec![]).collect::<Vec<_>>(), + } + } +} + +impl InitialFormat for DataLayout { + const VERSION_MARKER: &'static [u8] = b"G09bmdl"; +} + +impl DataDir { + pub fn capacity(&self) -> Option<u64> { + match self.state { + DataDirState::Active { capacity } => Some(capacity), + _ => None, + } + } +} + +fn make_data_dirs(dirs: &DataDirEnum) -> Result<Vec<DataDir>, Error> { + let mut data_dirs = vec![]; + match dirs { + DataDirEnum::Single(path) => data_dirs.push(DataDir { + path: path.clone(), + state: DataDirState::Active { + capacity: 1_000_000_000, // whatever, doesn't matter + }, + }), + DataDirEnum::Multiple(dirs) => { + let mut ok = false; + for dir in dirs.iter() { + let state = match &dir.capacity { + Some(cap) if dir.read_only == false => { + let capacity = cap.parse::<bytesize::ByteSize>() + .ok_or_message("invalid capacity value")?.as_u64(); + if capacity == 0 { + return Err(Error::Message(format!("data directory {} should have non-zero capacity", dir.path.to_string_lossy()))); + } + ok = true; + DataDirState::Active { + capacity, + } + } + None if dir.read_only == true => { + DataDirState::ReadOnly + } + _ => return Err(Error::Message(format!("data directories in data_dir should have a capacity value or be marked read_only, not the case for {}", dir.path.to_string_lossy()))), + }; + data_dirs.push(DataDir { + path: dir.path.clone(), + state, + }); + } + if !ok { + return Err(Error::Message( + "incorrect data_dir configuration, no primary writable directory specified" + .into(), + )); + } + } + } + Ok(data_dirs) +} + +fn dir_not_empty(path: &PathBuf) -> Result<bool, Error> { + for entry in std::fs::read_dir(&path)? { + let dir = entry?; + if dir.file_type()?.is_dir() + && dir + .file_name() + .into_string() + .ok() + .and_then(|hex| hex::decode(&hex).ok()) + .is_some() + { + return Ok(true); + } + } + Ok(false) +} diff --git a/src/block/lib.rs b/src/block/lib.rs index d2814f77..c9ff2845 100644 --- a/src/block/lib.rs +++ b/src/block/lib.rs @@ -6,5 +6,6 @@ pub mod repair; pub mod resync; mod block; +mod layout; mod metrics; mod rc; diff --git a/src/block/manager.rs b/src/block/manager.rs index 3ece9a8a..2d1b5c67 100644 --- a/src/block/manager.rs +++ b/src/block/manager.rs @@ -3,7 +3,7 @@ use std::pin::Pin; use std::sync::Arc; use std::time::Duration; -use arc_swap::ArcSwapOption; +use arc_swap::{ArcSwap, ArcSwapOption}; use async_trait::async_trait; use bytes::Bytes; use rand::prelude::*; @@ -25,10 +25,11 @@ use garage_rpc::rpc_helper::netapp::stream::{stream_asyncread, ByteStream}; use garage_db as db; use garage_util::background::{vars, BackgroundRunner}; +use garage_util::config::DataDirEnum; use garage_util::data::*; use garage_util::error::*; use garage_util::metrics::RecordDuration; -use garage_util::persister::PersisterShared; +use garage_util::persister::{Persister, PersisterShared}; use garage_util::time::msec_to_rfc3339; use garage_rpc::rpc_helper::OrderTag; @@ -38,6 +39,7 @@ use garage_rpc::*; use garage_table::replication::{TableReplication, TableShardedReplication}; use crate::block::*; +use crate::layout::*; use crate::metrics::*; use crate::rc::*; use crate::repair::*; @@ -77,12 +79,16 @@ impl Rpc for BlockRpc { pub struct BlockManager { /// Replication strategy, allowing to find on which node blocks should be located pub replication: TableShardedReplication, - /// Directory in which block are stored - pub data_dir: PathBuf, + /// Data layout + pub(crate) data_layout: ArcSwap<DataLayout>, + /// Data layout persister + pub(crate) data_layout_persister: Persister<DataLayout>, + + data_fsync: bool, compression_level: Option<i32>, - mutation_lock: [Mutex<BlockManagerLocked>; 256], + mutation_lock: Vec<Mutex<BlockManagerLocked>>, pub(crate) rc: BlockRc, pub resync: BlockResyncManager, @@ -105,6 +111,9 @@ pub struct BlockResyncErrorInfo { pub next_try: u64, } +// The number of different mutexes used to parallelize write access to data blocks +const MUTEX_COUNT: usize = 256; + // This custom struct contains functions that must only be ran // when the lock is held. We ensure that it is the case by storing // it INSIDE a Mutex. @@ -113,11 +122,29 @@ struct BlockManagerLocked(); impl BlockManager { pub fn new( db: &db::Db, - data_dir: PathBuf, + data_dir: DataDirEnum, + data_fsync: bool, compression_level: Option<i32>, replication: TableShardedReplication, system: Arc<System>, - ) -> Arc<Self> { + ) -> Result<Arc<Self>, Error> { + // Load or compute layout, i.e. assignment of data blocks to the different data directories + let data_layout_persister: Persister<DataLayout> = + Persister::new(&system.metadata_dir, "data_layout"); + let data_layout = match data_layout_persister.load() { + Ok(mut layout) => { + layout + .update(&data_dir) + .ok_or_message("invalid data_dir config")?; + layout + } + Err(_) => DataLayout::initialize(&data_dir).ok_or_message("invalid data_dir config")?, + }; + data_layout_persister + .save(&data_layout) + .expect("cannot save data_layout"); + + // Open metadata tables let rc = db .open_tree("block_local_rc") .expect("Unable to open block_local_rc tree"); @@ -140,9 +167,14 @@ impl BlockManager { let block_manager = Arc::new(Self { replication, - data_dir, + data_layout: ArcSwap::new(Arc::new(data_layout)), + data_layout_persister, + data_fsync, compression_level, - mutation_lock: [(); 256].map(|_| Mutex::new(BlockManagerLocked())), + mutation_lock: vec![(); MUTEX_COUNT] + .iter() + .map(|_| Mutex::new(BlockManagerLocked())) + .collect::<Vec<_>>(), rc, resync, system, @@ -154,7 +186,7 @@ impl BlockManager { block_manager.endpoint.set_handler(block_manager.clone()); block_manager.scrub_persister.set_with(|_| ()).unwrap(); - block_manager + Ok(block_manager) } pub fn spawn_workers(self: &Arc<Self>, bg: &BackgroundRunner) { @@ -201,44 +233,10 @@ impl BlockManager { hash: &Hash, order_tag: Option<OrderTag>, ) -> Result<(DataBlockHeader, ByteStream), Error> { - let who = self.replication.read_nodes(hash); - let who = self.system.rpc.request_order(&who); - - for node in who.iter() { - let node_id = NodeID::from(*node); - let rpc = self.endpoint.call_streaming( - &node_id, - BlockRpc::GetBlock(*hash, order_tag), - PRIO_NORMAL | PRIO_SECONDARY, - ); - tokio::select! { - res = rpc => { - let res = match res { - Ok(res) => res, - Err(e) => { - debug!("Node {:?} returned error: {}", node, e); - continue; - } - }; - let (header, stream) = match res.into_parts() { - (Ok(BlockRpc::PutBlock { hash: _, header }), Some(stream)) => (header, stream), - _ => { - debug!("Node {:?} returned a malformed response", node); - continue; - } - }; - return Ok((header, stream)); - } - _ = tokio::time::sleep(self.system.rpc.rpc_timeout()) => { - debug!("Node {:?} didn't return block in time, trying next.", node); - } - }; - } - - Err(Error::Message(format!( - "Unable to read block {:?}: no node returned a valid block", - hash - ))) + self.rpc_get_raw_block_internal(hash, order_tag, |header, stream| async move { + Ok((header, stream)) + }) + .await } /// Ask nodes that might have a (possibly compressed) block for it @@ -248,6 +246,24 @@ impl BlockManager { hash: &Hash, order_tag: Option<OrderTag>, ) -> Result<DataBlock, Error> { + self.rpc_get_raw_block_internal(hash, order_tag, |header, stream| async move { + read_stream_to_end(stream) + .await + .map(|data| DataBlock::from_parts(header, data)) + }) + .await + } + + async fn rpc_get_raw_block_internal<F, Fut, T>( + &self, + hash: &Hash, + order_tag: Option<OrderTag>, + f: F, + ) -> Result<T, Error> + where + F: Fn(DataBlockHeader, ByteStream) -> Fut, + Fut: futures::Future<Output = Result<T, Error>>, + { let who = self.replication.read_nodes(hash); let who = self.system.rpc.request_order(&who); @@ -263,34 +279,41 @@ impl BlockManager { let res = match res { Ok(res) => res, Err(e) => { - debug!("Node {:?} returned error: {}", node, e); + debug!("Get block {:?}: node {:?} could not be contacted: {}", hash, node, e); continue; } }; let (header, stream) = match res.into_parts() { (Ok(BlockRpc::PutBlock { hash: _, header }), Some(stream)) => (header, stream), - _ => { - debug!("Node {:?} returned a malformed response", node); + (Ok(_), _) => { + debug!("Get block {:?}: node {:?} returned a malformed response", hash, node); + continue; + } + (Err(e), _) => { + debug!("Get block {:?}: node {:?} returned error: {}", hash, node, e); continue; } }; - match read_stream_to_end(stream).await { - Ok(bytes) => return Ok(DataBlock::from_parts(header, bytes)), + match f(header, stream).await { + Ok(ret) => return Ok(ret), Err(e) => { - debug!("Error reading stream from node {:?}: {}", node, e); + debug!("Get block {:?}: error reading stream from node {:?}: {}", hash, node, e); } } } + // TODO: sleep less long (fail early), initiate a second request earlier + // if the first one doesn't succeed rapidly + // TODO: keep first request running when initiating a new one and take the + // one that finishes earlier _ = tokio::time::sleep(self.system.rpc.rpc_timeout()) => { - debug!("Node {:?} didn't return block in time, trying next.", node); + debug!("Get block {:?}: node {:?} didn't return block in time, trying next.", hash, node); } }; } - Err(Error::Message(format!( - "Unable to read block {:?}: no node returned a valid block", - hash - ))) + let msg = format!("Get block {:?}: no node returned a valid block", hash); + debug!("{}", msg); + Err(Error::Message(msg)) } // ---- Public interface ---- @@ -468,8 +491,6 @@ impl BlockManager { pub(crate) async fn write_block(&self, hash: &Hash, data: &DataBlock) -> Result<(), Error> { let tracer = opentelemetry::global::tracer("garage"); - let write_size = data.inner_buffer().len() as u64; - self.lock_mutate(hash) .await .write_block(hash, data, self) @@ -479,8 +500,6 @@ impl BlockManager { )) .await?; - self.metrics.bytes_written.add(write_size); - Ok(()) } @@ -507,36 +526,42 @@ impl BlockManager { /// Read block from disk, verifying it's integrity pub(crate) async fn read_block(&self, hash: &Hash) -> Result<DataBlock, Error> { - let data = self - .read_block_internal(hash) - .bound_record_duration(&self.metrics.block_read_duration) - .await?; - - self.metrics - .bytes_read - .add(data.inner_buffer().len() as u64); - - Ok(data) + let tracer = opentelemetry::global::tracer("garage"); + async { + match self.find_block(hash).await { + Some(p) => self.read_block_from(hash, &p).await, + None => { + // Not found but maybe we should have had it ?? + self.resync + .put_to_resync(hash, 2 * self.system.rpc.rpc_timeout())?; + return Err(Error::Message(format!( + "block {:?} not found on node", + hash + ))); + } + } + } + .bound_record_duration(&self.metrics.block_read_duration) + .with_context(Context::current_with_span( + tracer.start("BlockManager::read_block"), + )) + .await } - async fn read_block_internal(&self, hash: &Hash) -> Result<DataBlock, Error> { - let mut path = self.block_path(hash); - let compressed = match self.is_block_compressed(hash).await { - Ok(c) => c, - Err(e) => { - // Not found but maybe we should have had it ?? - self.resync - .put_to_resync(hash, 2 * self.system.rpc.rpc_timeout())?; - return Err(Into::into(e)); - } + pub(crate) async fn read_block_from( + &self, + hash: &Hash, + block_path: &DataBlockPath, + ) -> Result<DataBlock, Error> { + let (path, compressed) = match block_path { + DataBlockPath::Plain(p) => (p, false), + DataBlockPath::Compressed(p) => (p, true), }; - if compressed { - path.set_extension("zst"); - } - let mut f = fs::File::open(&path).await?; + let mut f = fs::File::open(&path).await?; let mut data = vec![]; f.read_to_end(&mut data).await?; + self.metrics.bytes_read.add(data.len() as u64); drop(f); let data = if compressed { @@ -548,29 +573,27 @@ impl BlockManager { if data.verify(*hash).is_err() { self.metrics.corruption_counter.add(1); + warn!( + "Block {:?} is corrupted. Renaming to .corrupted and resyncing.", + hash + ); self.lock_mutate(hash) .await - .move_block_to_corrupted(hash, self) + .move_block_to_corrupted(block_path) .await?; self.resync.put_to_resync(hash, Duration::from_millis(0))?; + return Err(Error::CorruptData(*hash)); } Ok(data) } - /// Check if this node has a block and whether it needs it - pub(crate) async fn check_block_status(&self, hash: &Hash) -> Result<BlockStatus, Error> { - self.lock_mutate(hash) - .await - .check_block_status(hash, self) - .await - } - /// Check if this node should have a block, but don't actually have it async fn need_block(&self, hash: &Hash) -> Result<bool, Error> { - let BlockStatus { exists, needed } = self.check_block_status(hash).await?; - Ok(needed.is_nonzero() && !exists) + let rc = self.rc.get_block_rc(hash)?; + let exists = self.find_block(hash).await.is_some(); + Ok(rc.is_nonzero() && !exists) } /// Delete block if it is not needed anymore @@ -581,59 +604,65 @@ impl BlockManager { .await } - /// Utility: gives the path of the directory in which a block should be found - fn block_dir(&self, hash: &Hash) -> PathBuf { - let mut path = self.data_dir.clone(); - path.push(hex::encode(&hash.as_slice()[0..1])); - path.push(hex::encode(&hash.as_slice()[1..2])); - path - } - - /// Utility: give the full path where a block should be found, minus extension if block is - /// compressed - fn block_path(&self, hash: &Hash) -> PathBuf { - let mut path = self.block_dir(hash); - path.push(hex::encode(hash.as_ref())); - path - } + /// Find the path where a block is currently stored + pub(crate) async fn find_block(&self, hash: &Hash) -> Option<DataBlockPath> { + let data_layout = self.data_layout.load_full(); + let dirs = Some(data_layout.primary_block_dir(hash)) + .into_iter() + .chain(data_layout.secondary_block_dirs(hash)); + let filename = hex::encode(hash.as_ref()); - /// Utility: check if block is stored compressed. Error if block is not stored - async fn is_block_compressed(&self, hash: &Hash) -> Result<bool, Error> { - let mut path = self.block_path(hash); + for dir in dirs { + let mut path = dir; + path.push(&filename); - // If compression is disabled on node - check for the raw block - // first and then a compressed one (as compression may have been - // previously enabled). - match self.compression_level { - None => { + if self.compression_level.is_none() { + // If compression is disabled on node - check for the raw block + // first and then a compressed one (as compression may have been + // previously enabled). if fs::metadata(&path).await.is_ok() { - return Ok(false); + return Some(DataBlockPath::Plain(path)); } - path.set_extension("zst"); - - fs::metadata(&path).await.map(|_| true).map_err(Into::into) - } - _ => { + if fs::metadata(&path).await.is_ok() { + return Some(DataBlockPath::Compressed(path)); + } + } else { path.set_extension("zst"); - if fs::metadata(&path).await.is_ok() { - return Ok(true); + return Some(DataBlockPath::Compressed(path)); } - path.set_extension(""); - - fs::metadata(&path).await.map(|_| false).map_err(Into::into) + if fs::metadata(&path).await.is_ok() { + return Some(DataBlockPath::Plain(path)); + } } } + + None + } + + /// Rewrite a block at the primary location for its path and delete the old path. + /// Returns the number of bytes read/written + pub(crate) async fn fix_block_location( + &self, + hash: &Hash, + wrong_path: DataBlockPath, + ) -> Result<usize, Error> { + self.lock_mutate(hash) + .await + .fix_block_location(hash, wrong_path, self) + .await } async fn lock_mutate(&self, hash: &Hash) -> MutexGuard<'_, BlockManagerLocked> { let tracer = opentelemetry::global::tracer("garage"); - self.mutation_lock[hash.as_slice()[0] as usize] + let ilock = u16::from_be_bytes([hash.as_slice()[0], hash.as_slice()[1]]) as usize + % self.mutation_lock.len(); + self.mutation_lock[ilock] .lock() .with_context(Context::current_with_span( - tracer.start("Acquire mutation_lock"), + tracer.start(format!("Acquire mutation_lock #{}", ilock)), )) .await } @@ -646,7 +675,7 @@ impl StreamingEndpointHandler<BlockRpc> for BlockManager { BlockRpc::PutBlock { hash, header } => Resp::new( self.handle_put_block(*hash, *header, message.take_stream()) .await - .map(|_| BlockRpc::Ok), + .map(|()| BlockRpc::Ok), ), BlockRpc::GetBlock(h, order_tag) => self.handle_get_block(h, *order_tag).await, BlockRpc::NeedBlockQuery(h) => { @@ -657,66 +686,78 @@ impl StreamingEndpointHandler<BlockRpc> for BlockManager { } } -pub(crate) struct BlockStatus { - pub(crate) exists: bool, - pub(crate) needed: RcEntry, -} - impl BlockManagerLocked { - async fn check_block_status( + async fn write_block( &self, hash: &Hash, + data: &DataBlock, mgr: &BlockManager, - ) -> Result<BlockStatus, Error> { - let exists = mgr.is_block_compressed(hash).await.is_ok(); - let needed = mgr.rc.get_block_rc(hash)?; - - Ok(BlockStatus { exists, needed }) + ) -> Result<(), Error> { + let existing_path = mgr.find_block(hash).await; + self.write_block_inner(hash, data, mgr, existing_path).await } - async fn write_block( + async fn write_block_inner( &self, hash: &Hash, data: &DataBlock, mgr: &BlockManager, + existing_path: Option<DataBlockPath>, ) -> Result<(), Error> { let compressed = data.is_compressed(); let data = data.inner_buffer(); - let mut path = mgr.block_dir(hash); - let directory = path.clone(); - path.push(hex::encode(hash)); + let directory = mgr.data_layout.load().primary_block_dir(hash); - fs::create_dir_all(&directory).await?; + let mut tgt_path = directory.clone(); + tgt_path.push(hex::encode(hash)); + if compressed { + tgt_path.set_extension("zst"); + } - let to_delete = match (mgr.is_block_compressed(hash).await, compressed) { - (Ok(true), _) => return Ok(()), - (Ok(false), false) => return Ok(()), - (Ok(false), true) => { - let path_to_delete = path.clone(); - path.set_extension("zst"); - Some(path_to_delete) - } - (Err(_), compressed) => { - if compressed { - path.set_extension("zst"); - } - None - } + let to_delete = match (existing_path, compressed) { + // If the block is stored in the wrong directory, + // write it again at the correct path and delete the old path + (Some(DataBlockPath::Plain(p)), false) if p != tgt_path => Some(p), + (Some(DataBlockPath::Compressed(p)), true) if p != tgt_path => Some(p), + + // If the block is already stored not compressed but we have a compressed + // copy, write the compressed copy and delete the uncompressed one + (Some(DataBlockPath::Plain(plain_path)), true) => Some(plain_path), + + // If the block is already stored compressed, + // keep the stored copy, we have nothing to do + (Some(DataBlockPath::Compressed(_)), _) => return Ok(()), + + // If the block is already stored not compressed, + // and we don't have a compressed copy either, + // keep the stored copy, we have nothing to do + (Some(DataBlockPath::Plain(_)), false) => return Ok(()), + + // If the block isn't stored already, just store what is given to us + (None, _) => None, }; + assert!(to_delete.as_ref() != Some(&tgt_path)); - let mut path_tmp = path.clone(); + let mut path_tmp = tgt_path.clone(); let tmp_extension = format!("tmp{}", hex::encode(thread_rng().gen::<[u8; 4]>())); path_tmp.set_extension(tmp_extension); + fs::create_dir_all(&directory).await?; + let mut delete_on_drop = DeleteOnDrop(Some(path_tmp.clone())); let mut f = fs::File::create(&path_tmp).await?; f.write_all(data).await?; - f.sync_all().await?; + mgr.metrics.bytes_written.add(data.len() as u64); + + if mgr.data_fsync { + f.sync_all().await?; + } + drop(f); - fs::rename(path_tmp, path).await?; + fs::rename(path_tmp, tgt_path).await?; delete_on_drop.cancel(); @@ -724,52 +765,67 @@ impl BlockManagerLocked { fs::remove_file(to_delete).await?; } - // We want to ensure that when this function returns, data is properly persisted - // to disk. The first step is the sync_all above that does an fsync on the data file. - // Now, we do an fsync on the containing directory, to ensure that the rename - // is persisted properly. See: - // http://thedjbway.b0llix.net/qmail/syncdir.html - let dir = fs::OpenOptions::new() - .read(true) - .mode(0) - .open(directory) - .await?; - dir.sync_all().await?; - drop(dir); + if mgr.data_fsync { + // We want to ensure that when this function returns, data is properly persisted + // to disk. The first step is the sync_all above that does an fsync on the data file. + // Now, we do an fsync on the containing directory, to ensure that the rename + // is persisted properly. See: + // http://thedjbway.b0llix.net/qmail/syncdir.html + let dir = fs::OpenOptions::new() + .read(true) + .mode(0) + .open(directory) + .await?; + dir.sync_all().await?; + drop(dir); + } Ok(()) } - async fn move_block_to_corrupted(&self, hash: &Hash, mgr: &BlockManager) -> Result<(), Error> { - warn!( - "Block {:?} is corrupted. Renaming to .corrupted and resyncing.", - hash - ); - let mut path = mgr.block_path(hash); - let mut path2 = path.clone(); - if mgr.is_block_compressed(hash).await? { - path.set_extension("zst"); - path2.set_extension("zst.corrupted"); - } else { - path2.set_extension("corrupted"); - } + async fn move_block_to_corrupted(&self, block_path: &DataBlockPath) -> Result<(), Error> { + let (path, path2) = match block_path { + DataBlockPath::Plain(p) => { + let mut p2 = p.clone(); + p2.set_extension("corrupted"); + (p, p2) + } + DataBlockPath::Compressed(p) => { + let mut p2 = p.clone(); + p2.set_extension("zst.corrupted"); + (p, p2) + } + }; + fs::rename(path, path2).await?; Ok(()) } async fn delete_if_unneeded(&self, hash: &Hash, mgr: &BlockManager) -> Result<(), Error> { - let BlockStatus { exists, needed } = self.check_block_status(hash, mgr).await?; - - if exists && needed.is_deletable() { - let mut path = mgr.block_path(hash); - if mgr.is_block_compressed(hash).await? { - path.set_extension("zst"); + let rc = mgr.rc.get_block_rc(hash)?; + if rc.is_deletable() { + while let Some(path) = mgr.find_block(hash).await { + let path = match path { + DataBlockPath::Plain(p) | DataBlockPath::Compressed(p) => p, + }; + fs::remove_file(path).await?; + mgr.metrics.delete_counter.add(1); } - fs::remove_file(path).await?; - mgr.metrics.delete_counter.add(1); } Ok(()) } + + async fn fix_block_location( + &self, + hash: &Hash, + wrong_path: DataBlockPath, + mgr: &BlockManager, + ) -> Result<usize, Error> { + let data = mgr.read_block_from(hash, &wrong_path).await?; + self.write_block_inner(hash, &data, mgr, Some(wrong_path)) + .await?; + Ok(data.inner_buffer().len()) + } } async fn read_stream_to_end(mut stream: ByteStream) -> Result<Bytes, Error> { diff --git a/src/block/rc.rs b/src/block/rc.rs index 94cb5eea..b6afb277 100644 --- a/src/block/rc.rs +++ b/src/block/rc.rs @@ -56,7 +56,7 @@ impl BlockRc { /// deletion time has passed pub(crate) fn clear_deleted_block_rc(&self, hash: &Hash) -> Result<(), Error> { let now = now_msec(); - self.rc.db().transaction(|mut tx| { + self.rc.db().transaction(|tx| { let rcval = RcEntry::parse_opt(tx.get(&self.rc, hash)?); match rcval { RcEntry::Deletable { at_time } if now > at_time => { @@ -64,7 +64,7 @@ impl BlockRc { } _ => (), }; - tx.commit(()) + Ok(()) })?; Ok(()) } diff --git a/src/block/repair.rs b/src/block/repair.rs index 71093d69..77ee0d14 100644 --- a/src/block/repair.rs +++ b/src/block/repair.rs @@ -17,6 +17,7 @@ use garage_util::persister::PersisterShared; use garage_util::time::*; use garage_util::tranquilizer::Tranquilizer; +use crate::block::*; use crate::manager::*; // Full scrub every 25 days with a random element of 10 days mixed in below @@ -136,7 +137,7 @@ impl Worker for RepairWorker { // Lists all blocks on disk and adds them to the resync queue. // This allows us to find blocks we are storing but don't actually need, // so that we can offload them if necessary and then delete them locally. - if let Some(hash) = bi.next().await? { + if let Some((_path, hash)) = bi.next().await? { self.manager .resync .put_to_resync(&hash, Duration::from_secs(0))?; @@ -175,7 +176,9 @@ mod v081 { } mod v082 { + use garage_util::data::Hash; use serde::{Deserialize, Serialize}; + use std::path::PathBuf; use super::v081; @@ -185,6 +188,27 @@ mod v082 { pub(crate) time_last_complete_scrub: u64, pub(crate) time_next_run_scrub: u64, pub(crate) corruptions_detected: u64, + #[serde(default)] + pub(crate) checkpoint: Option<BlockStoreIterator>, + } + + #[derive(Serialize, Deserialize, Clone)] + pub struct BlockStoreIterator { + pub todo: Vec<BsiTodo>, + } + + #[derive(Serialize, Deserialize, Clone)] + pub enum BsiTodo { + Directory { + path: PathBuf, + progress_min: u64, + progress_max: u64, + }, + File { + path: PathBuf, + hash: Hash, + progress: u64, + }, } impl garage_util::migrate::Migrate for ScrubWorkerPersisted { @@ -199,6 +223,7 @@ mod v082 { time_last_complete_scrub: old.time_last_complete_scrub, time_next_run_scrub: randomize_next_scrub_run_time(old.time_last_complete_scrub), corruptions_detected: old.corruptions_detected, + checkpoint: None, } } } @@ -235,14 +260,23 @@ impl Default for ScrubWorkerPersisted { time_next_run_scrub: randomize_next_scrub_run_time(now_msec()), tranquility: INITIAL_SCRUB_TRANQUILITY, corruptions_detected: 0, + checkpoint: None, } } } #[derive(Default)] enum ScrubWorkerState { - Running(BlockStoreIterator), - Paused(BlockStoreIterator, u64), // u64 = time when to resume scrub + Running { + iterator: BlockStoreIterator, + // time of the last checkpoint + t_cp: u64, + }, + Paused { + iterator: BlockStoreIterator, + // time at which the scrub should be resumed + t_resume: u64, + }, #[default] Finished, } @@ -261,10 +295,17 @@ impl ScrubWorker { rx_cmd: mpsc::Receiver<ScrubWorkerCommand>, persister: PersisterShared<ScrubWorkerPersisted>, ) -> Self { + let work = match persister.get_with(|x| x.checkpoint.clone()) { + None => ScrubWorkerState::Finished, + Some(iterator) => ScrubWorkerState::Running { + iterator, + t_cp: now_msec(), + }, + }; Self { manager, rx_cmd, - work: ScrubWorkerState::Finished, + work, tranquilizer: Tranquilizer::new(30), persister, } @@ -277,7 +318,16 @@ impl ScrubWorker { ScrubWorkerState::Finished => { info!("Scrub worker initializing, now performing datastore scrub"); let iterator = BlockStoreIterator::new(&self.manager); - ScrubWorkerState::Running(iterator) + if let Err(e) = self + .persister + .set_with(|x| x.checkpoint = Some(iterator.clone())) + { + error!("Could not save scrub checkpoint: {}", e); + } + ScrubWorkerState::Running { + iterator, + t_cp: now_msec(), + } } work => { error!("Cannot start scrub worker: already running!"); @@ -287,8 +337,18 @@ impl ScrubWorker { } ScrubWorkerCommand::Pause(dur) => { self.work = match std::mem::take(&mut self.work) { - ScrubWorkerState::Running(it) | ScrubWorkerState::Paused(it, _) => { - ScrubWorkerState::Paused(it, now_msec() + dur.as_millis() as u64) + ScrubWorkerState::Running { iterator, .. } + | ScrubWorkerState::Paused { iterator, .. } => { + if let Err(e) = self + .persister + .set_with(|x| x.checkpoint = Some(iterator.clone())) + { + error!("Could not save scrub checkpoint: {}", e); + } + ScrubWorkerState::Paused { + iterator, + t_resume: now_msec() + dur.as_millis() as u64, + } } work => { error!("Cannot pause scrub worker: not running!"); @@ -298,7 +358,10 @@ impl ScrubWorker { } ScrubWorkerCommand::Resume => { self.work = match std::mem::take(&mut self.work) { - ScrubWorkerState::Paused(it, _) => ScrubWorkerState::Running(it), + ScrubWorkerState::Paused { iterator, .. } => ScrubWorkerState::Running { + iterator, + t_cp: now_msec(), + }, work => { error!("Cannot resume scrub worker: not paused!"); work @@ -307,7 +370,10 @@ impl ScrubWorker { } ScrubWorkerCommand::Cancel => { self.work = match std::mem::take(&mut self.work) { - ScrubWorkerState::Running(_) | ScrubWorkerState::Paused(_, _) => { + ScrubWorkerState::Running { .. } | ScrubWorkerState::Paused { .. } => { + if let Err(e) = self.persister.set_with(|x| x.checkpoint = None) { + error!("Could not save scrub checkpoint: {}", e); + } ScrubWorkerState::Finished } work => { @@ -343,12 +409,15 @@ impl Worker for ScrubWorker { ..Default::default() }; match &self.work { - ScrubWorkerState::Running(bsi) => { - s.progress = Some(format!("{:.2}%", bsi.progress() * 100.)); + ScrubWorkerState::Running { iterator, .. } => { + s.progress = Some(format!("{:.2}%", iterator.progress() * 100.)); } - ScrubWorkerState::Paused(bsi, rt) => { - s.progress = Some(format!("{:.2}%", bsi.progress() * 100.)); - s.freeform = vec![format!("Scrub paused, resumes at {}", msec_to_rfc3339(*rt))]; + ScrubWorkerState::Paused { iterator, t_resume } => { + s.progress = Some(format!("{:.2}%", iterator.progress() * 100.)); + s.freeform = vec![format!( + "Scrub paused, resumes at {}", + msec_to_rfc3339(*t_resume) + )]; } ScrubWorkerState::Finished => { s.freeform = vec![ @@ -374,9 +443,11 @@ impl Worker for ScrubWorker { }; match &mut self.work { - ScrubWorkerState::Running(bsi) => { + ScrubWorkerState::Running { iterator, t_cp } => { self.tranquilizer.reset(); - if let Some(hash) = bsi.next().await? { + let now = now_msec(); + + if let Some((_path, hash)) = iterator.next().await? { match self.manager.read_block(&hash).await { Err(Error::CorruptData(_)) => { error!("Found corrupt data block during scrub: {:?}", hash); @@ -385,16 +456,23 @@ impl Worker for ScrubWorker { Err(e) => return Err(e), _ => (), }; + + if now - *t_cp > 60 * 1000 { + self.persister + .set_with(|p| p.checkpoint = Some(iterator.clone()))?; + *t_cp = now; + } + Ok(self .tranquilizer .tranquilize_worker(self.persister.get_with(|p| p.tranquility))) } else { - let now = now_msec(); let next_scrub_timestamp = randomize_next_scrub_run_time(now); self.persister.set_with(|p| { p.time_last_complete_scrub = now; p.time_next_run_scrub = next_scrub_timestamp; + p.checkpoint = None; })?; self.work = ScrubWorkerState::Finished; self.tranquilizer.clear(); @@ -413,8 +491,8 @@ impl Worker for ScrubWorker { async fn wait_for_work(&mut self) -> WorkerState { let (wait_until, command) = match &self.work { - ScrubWorkerState::Running(_) => return WorkerState::Busy, - ScrubWorkerState::Paused(_, resume_time) => (*resume_time, ScrubWorkerCommand::Resume), + ScrubWorkerState::Running { .. } => return WorkerState::Busy, + ScrubWorkerState::Paused { t_resume, .. } => (*t_resume, ScrubWorkerCommand::Resume), ScrubWorkerState::Finished => ( self.persister.get_with(|p| p.time_next_run_scrub), ScrubWorkerCommand::Start, @@ -437,110 +515,250 @@ impl Worker for ScrubWorker { } match &self.work { - ScrubWorkerState::Running(_) => WorkerState::Busy, + ScrubWorkerState::Running { .. } => WorkerState::Busy, _ => WorkerState::Idle, } } } // ---- ---- ---- -// UTILITY FOR ENUMERATING THE BLOCK STORE +// THIRD KIND OF REPAIR: REBALANCING DATA BLOCKS +// between multiple storage locations. +// This is a one-shot repair operation that can be launched, +// checks everything, and then exits. // ---- ---- ---- -struct BlockStoreIterator { - path: Vec<ReadingDir>, +pub struct RebalanceWorker { + manager: Arc<BlockManager>, + block_iter: BlockStoreIterator, + t_started: u64, + t_finished: Option<u64>, + moved: usize, + moved_bytes: u64, } -enum ReadingDir { - Pending(PathBuf), - Read { - subpaths: Vec<fs::DirEntry>, - pos: usize, - }, +impl RebalanceWorker { + pub fn new(manager: Arc<BlockManager>) -> Self { + let block_iter = BlockStoreIterator::new(&manager); + Self { + manager, + block_iter, + t_started: now_msec(), + t_finished: None, + moved: 0, + moved_bytes: 0, + } + } +} + +#[async_trait] +impl Worker for RebalanceWorker { + fn name(&self) -> String { + "Block rebalance worker".into() + } + + fn status(&self) -> WorkerStatus { + let t_cur = self.t_finished.unwrap_or_else(|| now_msec()); + let rate = self.moved_bytes / std::cmp::max(1, (t_cur - self.t_started) / 1000); + let mut freeform = vec![ + format!("Blocks moved: {}", self.moved), + format!( + "Bytes moved: {} ({}/s)", + bytesize::ByteSize::b(self.moved_bytes), + bytesize::ByteSize::b(rate) + ), + format!("Started: {}", msec_to_rfc3339(self.t_started)), + ]; + if let Some(t_fin) = self.t_finished { + freeform.push(format!("Finished: {}", msec_to_rfc3339(t_fin))) + } + WorkerStatus { + progress: Some(format!("{:.2}%", self.block_iter.progress() * 100.)), + freeform, + ..Default::default() + } + } + + async fn work(&mut self, _must_exit: &mut watch::Receiver<bool>) -> Result<WorkerState, Error> { + if let Some((path, hash)) = self.block_iter.next().await? { + let prim_loc = self.manager.data_layout.load().primary_block_dir(&hash); + if path.ancestors().all(|x| x != prim_loc) { + let block_path = match path.extension() { + None => DataBlockPath::Plain(path.clone()), + Some(x) if x.to_str() == Some("zst") => DataBlockPath::Compressed(path.clone()), + _ => { + warn!("not rebalancing file: {}", path.to_string_lossy()); + return Ok(WorkerState::Busy); + } + }; + // block is not in its primary location, + // move it there (reading and re-writing does the trick) + debug!("rebalance: moving block {:?} => {:?}", block_path, prim_loc); + let block_len = self.manager.fix_block_location(&hash, block_path).await?; + self.moved += 1; + self.moved_bytes += block_len as u64; + } + Ok(WorkerState::Busy) + } else { + // all blocks are in their primary location: + // - the ones we moved now are + // - the ones written in the meantime always were, because we only + // write to primary locations + // so we can safely remove all secondary locations from the data layout + let new_layout = self + .manager + .data_layout + .load_full() + .without_secondary_locations(); + self.manager + .data_layout_persister + .save_async(&new_layout) + .await?; + self.manager.data_layout.store(Arc::new(new_layout)); + self.t_finished = Some(now_msec()); + Ok(WorkerState::Done) + } + } + + async fn wait_for_work(&mut self) -> WorkerState { + unreachable!() + } } +// ---- ---- ---- +// UTILITY FOR ENUMERATING THE BLOCK STORE +// ---- ---- ---- + +const PROGRESS_FP: u64 = 1_000_000_000; + impl BlockStoreIterator { fn new(manager: &BlockManager) -> Self { - let root_dir = manager.data_dir.clone(); - Self { - path: vec![ReadingDir::Pending(root_dir)], + let data_layout = manager.data_layout.load_full(); + + let mut dir_cap = vec![0; data_layout.data_dirs.len()]; + for prim in data_layout.part_prim.iter() { + dir_cap[*prim as usize] += 1; + } + for sec_vec in data_layout.part_sec.iter() { + for sec in sec_vec.iter() { + dir_cap[*sec as usize] += 1; + } } + let sum_cap = dir_cap.iter().sum::<usize>() as u64; + + let mut cum_cap = 0; + let mut todo = vec![]; + for (dir, cap) in data_layout.data_dirs.iter().zip(dir_cap.into_iter()) { + let progress_min = (cum_cap * PROGRESS_FP) / sum_cap; + let progress_max = ((cum_cap + cap as u64) * PROGRESS_FP) / sum_cap; + cum_cap += cap as u64; + + todo.push(BsiTodo::Directory { + path: dir.path.clone(), + progress_min, + progress_max, + }); + } + // entries are processed back-to-front (because of .pop()), + // so reverse entries to process them in increasing progress bounds + todo.reverse(); + + let ret = Self { todo }; + debug_assert!(ret.progress_invariant()); + + ret } /// Returns progress done, between 0 and 1 fn progress(&self) -> f32 { - if self.path.is_empty() { - 1.0 - } else { - let mut ret = 0.0; - let mut next_div = 1; - for p in self.path.iter() { - match p { - ReadingDir::Pending(_) => break, - ReadingDir::Read { subpaths, pos } => { - next_div *= subpaths.len(); - ret += ((*pos - 1) as f32) / (next_div as f32); - } - } - } - ret - } + self.todo + .last() + .map(|x| match x { + BsiTodo::Directory { progress_min, .. } => *progress_min, + BsiTodo::File { progress, .. } => *progress, + }) + .map(|x| x as f32 / PROGRESS_FP as f32) + .unwrap_or(1.0) } - async fn next(&mut self) -> Result<Option<Hash>, Error> { + async fn next(&mut self) -> Result<Option<(PathBuf, Hash)>, Error> { loop { - let last_path = match self.path.last_mut() { + match self.todo.pop() { None => return Ok(None), - Some(lp) => lp, - }; - - if let ReadingDir::Pending(path) = last_path { - let mut reader = fs::read_dir(&path).await?; - let mut subpaths = vec![]; - while let Some(ent) = reader.next_entry().await? { - subpaths.push(ent); - } - *last_path = ReadingDir::Read { subpaths, pos: 0 }; - } + Some(BsiTodo::Directory { + path, + progress_min, + progress_max, + }) => { + let istart = self.todo.len(); + + let mut reader = fs::read_dir(&path).await?; + while let Some(ent) = reader.next_entry().await? { + let name = if let Ok(n) = ent.file_name().into_string() { + n + } else { + continue; + }; + let ft = ent.file_type().await?; + if ft.is_dir() && hex::decode(&name).is_ok() { + self.todo.push(BsiTodo::Directory { + path: ent.path(), + progress_min: 0, + progress_max: 0, + }); + } else if ft.is_file() { + let filename = name.split_once('.').map(|(f, _)| f).unwrap_or(&name); + if filename.len() == 64 { + if let Ok(h) = hex::decode(filename) { + let mut hash = [0u8; 32]; + hash.copy_from_slice(&h); + self.todo.push(BsiTodo::File { + path: ent.path(), + hash: hash.into(), + progress: 0, + }); + } + } + } + } - let (subpaths, pos) = match *last_path { - ReadingDir::Read { - ref subpaths, - ref mut pos, - } => (subpaths, pos), - ReadingDir::Pending(_) => unreachable!(), - }; - - let data_dir_ent = match subpaths.get(*pos) { - None => { - self.path.pop(); - continue; - } - Some(ent) => { - *pos += 1; - ent + let count = self.todo.len() - istart; + for (i, ent) in self.todo[istart..].iter_mut().enumerate() { + let p1 = progress_min + + ((progress_max - progress_min) * i as u64) / count as u64; + let p2 = progress_min + + ((progress_max - progress_min) * (i + 1) as u64) / count as u64; + match ent { + BsiTodo::Directory { + progress_min, + progress_max, + .. + } => { + *progress_min = p1; + *progress_max = p2; + } + BsiTodo::File { progress, .. } => { + *progress = p1; + } + } + } + self.todo[istart..].reverse(); + debug_assert!(self.progress_invariant()); } - }; - - let name = data_dir_ent.file_name(); - let name = if let Ok(n) = name.into_string() { - n - } else { - continue; - }; - let ent_type = data_dir_ent.file_type().await?; - - let name = name.strip_suffix(".zst").unwrap_or(&name); - if name.len() == 2 && hex::decode(name).is_ok() && ent_type.is_dir() { - let path = data_dir_ent.path(); - self.path.push(ReadingDir::Pending(path)); - } else if name.len() == 64 { - if let Ok(h) = hex::decode(name) { - let mut hash = [0u8; 32]; - hash.copy_from_slice(&h); - return Ok(Some(hash.into())); + Some(BsiTodo::File { path, hash, .. }) => { + return Ok(Some((path, hash))); } } } } + + // for debug_assert! + fn progress_invariant(&self) -> bool { + let iter = self.todo.iter().map(|x| match x { + BsiTodo::Directory { progress_min, .. } => progress_min, + BsiTodo::File { progress, .. } => progress, + }); + let iter_1 = iter.clone().skip(1); + iter.zip(iter_1).all(|(prev, next)| prev >= next) + } } diff --git a/src/block/resync.rs b/src/block/resync.rs index ea280ad4..9c1da4a7 100644 --- a/src/block/resync.rs +++ b/src/block/resync.rs @@ -41,7 +41,7 @@ pub(crate) const RESYNC_RETRY_DELAY: Duration = Duration::from_secs(60); pub(crate) const RESYNC_RETRY_DELAY_MAX_BACKOFF_POWER: u64 = 6; // No more than 4 resync workers can be running in the system -pub(crate) const MAX_RESYNC_WORKERS: usize = 4; +pub(crate) const MAX_RESYNC_WORKERS: usize = 8; // Resync tranquility is initially set to 2, but can be changed in the CLI // and the updated version is persisted over Garage restarts const INITIAL_RESYNC_TRANQUILITY: u32 = 2; @@ -359,20 +359,23 @@ impl BlockResyncManager { } async fn resync_block(&self, manager: &BlockManager, hash: &Hash) -> Result<(), Error> { - let BlockStatus { exists, needed } = manager.check_block_status(hash).await?; + let existing_path = manager.find_block(hash).await; + let exists = existing_path.is_some(); + let rc = manager.rc.get_block_rc(hash)?; - if exists != needed.is_needed() || exists != needed.is_nonzero() { + if exists != rc.is_needed() || exists != rc.is_nonzero() { debug!( "Resync block {:?}: exists {}, nonzero rc {}, deletable {}", hash, exists, - needed.is_nonzero(), - needed.is_deletable(), + rc.is_nonzero(), + rc.is_deletable(), ); } - if exists && needed.is_deletable() { + if exists && rc.is_deletable() { info!("Resync block {:?}: offloading and deleting", hash); + let existing_path = existing_path.unwrap(); let mut who = manager.replication.write_nodes(hash); if who.len() < manager.replication.write_quorum() { @@ -419,7 +422,7 @@ impl BlockResyncManager { .add(1, &[KeyValue::new("to", format!("{:?}", node))]); } - let block = manager.read_block(hash).await?; + let block = manager.read_block_from(hash, &existing_path).await?; let (header, bytes) = block.into_parts(); let put_block_message = Req::new(BlockRpc::PutBlock { hash: *hash, @@ -451,7 +454,7 @@ impl BlockResyncManager { manager.rc.clear_deleted_block_rc(hash)?; } - if needed.is_nonzero() && !exists { + if rc.is_nonzero() && !exists { info!( "Resync block {:?}: fetching absent but needed block (refcount > 0)", hash diff --git a/src/db/Cargo.toml b/src/db/Cargo.toml index fa1a4419..b46a6c01 100644 --- a/src/db/Cargo.toml +++ b/src/db/Cargo.toml @@ -28,7 +28,7 @@ pretty_env_logger = { version = "0.5", optional = true } mktemp = "0.5" [features] -default = [ "sled" ] +default = [ "sled", "lmdb", "sqlite" ] bundled-libs = [ "rusqlite?/bundled" ] cli = ["clap", "pretty_env_logger"] lmdb = [ "heed" ] diff --git a/src/db/counted_tree_hack.rs b/src/db/counted_tree_hack.rs index bbe943a2..a4ce12e0 100644 --- a/src/db/counted_tree_hack.rs +++ b/src/db/counted_tree_hack.rs @@ -85,7 +85,7 @@ impl CountedTree { let old_some = expected_old.is_some(); let new_some = new.is_some(); - let tx_res = self.0.tree.db().transaction(|mut tx| { + let tx_res = self.0.tree.db().transaction(|tx| { let old_val = tx.get(&self.0.tree, &key)?; let is_same = match (&old_val, &expected_old) { (None, None) => true, @@ -101,9 +101,9 @@ impl CountedTree { tx.remove(&self.0.tree, &key)?; } } - tx.commit(()) + Ok(()) } else { - tx.abort(()) + Err(TxError::Abort(())) } }); diff --git a/src/db/lib.rs b/src/db/lib.rs index 11cae4e3..fe44b01e 100644 --- a/src/db/lib.rs +++ b/src/db/lib.rs @@ -2,9 +2,6 @@ #[cfg(feature = "sqlite")] extern crate tracing; -#[cfg(not(any(feature = "lmdb", feature = "sled", feature = "sqlite")))] -compile_error!("Must activate the Cargo feature for at least one DB engine: lmdb, sled or sqlite."); - #[cfg(feature = "lmdb")] pub mod lmdb_adapter; #[cfg(feature = "sled")] @@ -25,10 +22,15 @@ use std::sync::Arc; use err_derive::Error; +pub(crate) type OnCommit = Vec<Box<dyn FnOnce()>>; + #[derive(Clone)] pub struct Db(pub(crate) Arc<dyn IDb>); -pub struct Transaction<'a>(&'a mut dyn ITx); +pub struct Transaction<'a> { + tx: &'a mut dyn ITx, + on_commit: OnCommit, +} #[derive(Clone)] pub struct Tree(Arc<dyn IDb>, usize); @@ -88,7 +90,7 @@ impl Db { pub fn transaction<R, E, F>(&self, fun: F) -> TxResult<R, E> where - F: Fn(Transaction<'_>) -> TxResult<R, E>, + F: Fn(&mut Transaction<'_>) -> TxResult<R, E>, { let f = TxFn { function: fun, @@ -101,14 +103,17 @@ impl Db { .expect("Transaction did not store result"); match tx_res { - Ok(()) => { - assert!(matches!(ret, Ok(_))); - ret - } - Err(TxError::Abort(())) => { - assert!(matches!(ret, Err(TxError::Abort(_)))); - ret - } + Ok(on_commit) => match ret { + Ok(value) => { + on_commit.into_iter().for_each(|f| f()); + Ok(value) + } + _ => unreachable!(), + }, + Err(TxError::Abort(())) => match ret { + Err(TxError::Abort(e)) => Err(TxError::Abort(e)), + _ => unreachable!(), + }, Err(TxError::Db(e2)) => match ret { // Ok was stored -> the error occured when finalizing // transaction @@ -142,7 +147,7 @@ impl Db { let ex_tree = other.open_tree(&name)?; - let tx_res = self.transaction(|mut tx| { + let tx_res = self.transaction(|tx| { let mut i = 0; for item in ex_tree.iter().map_err(TxError::Abort)? { let (k, v) = item.map_err(TxError::Abort)?; @@ -152,7 +157,7 @@ impl Db { println!("{}: imported {}", name, i); } } - tx.commit(i) + Ok(i) }); let total = match tx_res { Err(TxError::Db(e)) => return Err(e), @@ -252,11 +257,11 @@ impl Tree { impl<'a> Transaction<'a> { #[inline] pub fn get<T: AsRef<[u8]>>(&self, tree: &Tree, key: T) -> TxOpResult<Option<Value>> { - self.0.get(tree.1, key.as_ref()) + self.tx.get(tree.1, key.as_ref()) } #[inline] pub fn len(&self, tree: &Tree) -> TxOpResult<usize> { - self.0.len(tree.1) + self.tx.len(tree.1) } /// Returns the old value if there was one @@ -267,21 +272,21 @@ impl<'a> Transaction<'a> { key: T, value: U, ) -> TxOpResult<Option<Value>> { - self.0.insert(tree.1, key.as_ref(), value.as_ref()) + self.tx.insert(tree.1, key.as_ref(), value.as_ref()) } /// Returns the old value if there was one #[inline] pub fn remove<T: AsRef<[u8]>>(&mut self, tree: &Tree, key: T) -> TxOpResult<Option<Value>> { - self.0.remove(tree.1, key.as_ref()) + self.tx.remove(tree.1, key.as_ref()) } #[inline] pub fn iter(&self, tree: &Tree) -> TxOpResult<TxValueIter<'_>> { - self.0.iter(tree.1) + self.tx.iter(tree.1) } #[inline] pub fn iter_rev(&self, tree: &Tree) -> TxOpResult<TxValueIter<'_>> { - self.0.iter_rev(tree.1) + self.tx.iter_rev(tree.1) } #[inline] @@ -292,7 +297,7 @@ impl<'a> Transaction<'a> { { let sb = range.start_bound(); let eb = range.end_bound(); - self.0.range(tree.1, get_bound(sb), get_bound(eb)) + self.tx.range(tree.1, get_bound(sb), get_bound(eb)) } #[inline] pub fn range_rev<K, R>(&self, tree: &Tree, range: R) -> TxOpResult<TxValueIter<'_>> @@ -302,19 +307,12 @@ impl<'a> Transaction<'a> { { let sb = range.start_bound(); let eb = range.end_bound(); - self.0.range_rev(tree.1, get_bound(sb), get_bound(eb)) + self.tx.range_rev(tree.1, get_bound(sb), get_bound(eb)) } - // ---- - #[inline] - pub fn abort<R, E>(self, e: E) -> TxResult<R, E> { - Err(TxError::Abort(e)) - } - - #[inline] - pub fn commit<R, E>(self, r: R) -> TxResult<R, E> { - Ok(r) + pub fn on_commit<F: FnOnce() + 'static>(&mut self, f: F) { + self.on_commit.push(Box::new(f)); } } @@ -351,7 +349,7 @@ pub(crate) trait IDb: Send + Sync { high: Bound<&'r [u8]>, ) -> Result<ValueIter<'_>>; - fn transaction(&self, f: &dyn ITxFn) -> TxResult<(), ()>; + fn transaction(&self, f: &dyn ITxFn) -> TxResult<OnCommit, ()>; } pub(crate) trait ITx { @@ -383,14 +381,14 @@ pub(crate) trait ITxFn { } pub(crate) enum TxFnResult { - Ok, + Ok(OnCommit), Abort, DbErr, } struct TxFn<F, R, E> where - F: Fn(Transaction<'_>) -> TxResult<R, E>, + F: Fn(&mut Transaction<'_>) -> TxResult<R, E>, { function: F, result: Cell<Option<TxResult<R, E>>>, @@ -398,12 +396,16 @@ where impl<F, R, E> ITxFn for TxFn<F, R, E> where - F: Fn(Transaction<'_>) -> TxResult<R, E>, + F: Fn(&mut Transaction<'_>) -> TxResult<R, E>, { fn try_on(&self, tx: &mut dyn ITx) -> TxFnResult { - let res = (self.function)(Transaction(tx)); + let mut tx = Transaction { + tx, + on_commit: vec![], + }; + let res = (self.function)(&mut tx); let res2 = match &res { - Ok(_) => TxFnResult::Ok, + Ok(_) => TxFnResult::Ok(tx.on_commit), Err(TxError::Abort(_)) => TxFnResult::Abort, Err(TxError::Db(_)) => TxFnResult::DbErr, }; diff --git a/src/db/lmdb_adapter.rs b/src/db/lmdb_adapter.rs index ecbc3b81..59fa132d 100644 --- a/src/db/lmdb_adapter.rs +++ b/src/db/lmdb_adapter.rs @@ -9,8 +9,8 @@ use heed::types::ByteSlice; use heed::{BytesDecode, Env, RoTxn, RwTxn, UntypedDatabase as Database}; use crate::{ - Db, Error, IDb, ITx, ITxFn, Result, TxError, TxFnResult, TxOpError, TxOpResult, TxResult, - TxValueIter, Value, ValueIter, + Db, Error, IDb, ITx, ITxFn, OnCommit, Result, TxError, TxFnResult, TxOpError, TxOpResult, + TxResult, TxValueIter, Value, ValueIter, }; pub use heed; @@ -186,7 +186,7 @@ impl IDb for LmdbDb { // ---- - fn transaction(&self, f: &dyn ITxFn) -> TxResult<(), ()> { + fn transaction(&self, f: &dyn ITxFn) -> TxResult<OnCommit, ()> { let trees = self.trees.read().unwrap(); let mut tx = LmdbTx { trees: &trees.0[..], @@ -199,9 +199,9 @@ impl IDb for LmdbDb { let res = f.try_on(&mut tx); match res { - TxFnResult::Ok => { + TxFnResult::Ok(on_commit) => { tx.tx.commit().map_err(Error::from).map_err(TxError::Db)?; - Ok(()) + Ok(on_commit) } TxFnResult::Abort => { tx.tx.abort().map_err(Error::from).map_err(TxError::Db)?; diff --git a/src/db/sled_adapter.rs b/src/db/sled_adapter.rs index cf61867d..84f2001b 100644 --- a/src/db/sled_adapter.rs +++ b/src/db/sled_adapter.rs @@ -10,8 +10,8 @@ use sled::transaction::{ }; use crate::{ - Db, Error, IDb, ITx, ITxFn, Result, TxError, TxFnResult, TxOpError, TxOpResult, TxResult, - TxValueIter, Value, ValueIter, + Db, Error, IDb, ITx, ITxFn, OnCommit, Result, TxError, TxFnResult, TxOpError, TxOpResult, + TxResult, TxValueIter, Value, ValueIter, }; pub use sled; @@ -38,7 +38,15 @@ pub struct SledDb { } impl SledDb { + #[deprecated( + since = "0.9.0", + note = "The Sled database is now deprecated and will be removed in Garage v1.0. Please migrate to LMDB or Sqlite as soon as possible." + )] pub fn init(db: sled::Db) -> Db { + tracing::warn!("-------------------- IMPORTANT WARNING !!! ----------------------"); + tracing::warn!("The Sled database is now deprecated and will be removed in Garage v1.0."); + tracing::warn!("Please migrate to LMDB or Sqlite as soon as possible."); + tracing::warn!("-----------------------------------------------------------------------"); let s = Self { db, trees: RwLock::new((Vec::new(), HashMap::new())), @@ -158,7 +166,7 @@ impl IDb for SledDb { // ---- - fn transaction(&self, f: &dyn ITxFn) -> TxResult<(), ()> { + fn transaction(&self, f: &dyn ITxFn) -> TxResult<OnCommit, ()> { let trees = self.trees.read().unwrap(); let res = trees.0.transaction(|txtrees| { let mut tx = SledTx { @@ -166,9 +174,9 @@ impl IDb for SledDb { err: Cell::new(None), }; match f.try_on(&mut tx) { - TxFnResult::Ok => { + TxFnResult::Ok(on_commit) => { assert!(tx.err.into_inner().is_none()); - Ok(()) + Ok(on_commit) } TxFnResult::Abort => { assert!(tx.err.into_inner().is_none()); @@ -181,7 +189,7 @@ impl IDb for SledDb { } }); match res { - Ok(()) => Ok(()), + Ok(on_commit) => Ok(on_commit), Err(TransactionError::Abort(())) => Err(TxError::Abort(())), Err(TransactionError::Storage(s)) => Err(TxError::Db(s.into())), } diff --git a/src/db/sqlite_adapter.rs b/src/db/sqlite_adapter.rs index 63b4506e..9f967c66 100644 --- a/src/db/sqlite_adapter.rs +++ b/src/db/sqlite_adapter.rs @@ -9,8 +9,8 @@ use std::sync::{Arc, Mutex, MutexGuard}; use rusqlite::{params, Connection, Rows, Statement, Transaction}; use crate::{ - Db, Error, IDb, ITx, ITxFn, Result, TxError, TxFnResult, TxOpError, TxOpResult, TxResult, - TxValueIter, Value, ValueIter, + Db, Error, IDb, ITx, ITxFn, OnCommit, Result, TxError, TxFnResult, TxOpError, TxOpResult, + TxResult, TxValueIter, Value, ValueIter, }; pub use rusqlite; @@ -261,7 +261,7 @@ impl IDb for SqliteDb { // ---- - fn transaction(&self, f: &dyn ITxFn) -> TxResult<(), ()> { + fn transaction(&self, f: &dyn ITxFn) -> TxResult<OnCommit, ()> { trace!("transaction: lock db"); let mut this = self.0.lock().unwrap(); trace!("transaction: lock acquired"); @@ -277,9 +277,9 @@ impl IDb for SqliteDb { trees: &this_mut_ref.trees, }; let res = match f.try_on(&mut tx) { - TxFnResult::Ok => { + TxFnResult::Ok(on_commit) => { tx.tx.commit().map_err(Error::from).map_err(TxError::Db)?; - Ok(()) + Ok(on_commit) } TxFnResult::Abort => { tx.tx.rollback().map_err(Error::from).map_err(TxError::Db)?; diff --git a/src/db/test.rs b/src/db/test.rs index 40e6c41e..cd99eafa 100644 --- a/src/db/test.rs +++ b/src/db/test.rs @@ -13,26 +13,26 @@ fn test_suite(db: Db) { assert!(tree.insert(ka, va).unwrap().is_none()); assert_eq!(tree.get(ka).unwrap().unwrap(), va); - let res = db.transaction::<_, (), _>(|mut tx| { + let res = db.transaction::<_, (), _>(|tx| { assert_eq!(tx.get(&tree, ka).unwrap().unwrap(), va); assert_eq!(tx.insert(&tree, ka, vb).unwrap().unwrap(), va); assert_eq!(tx.get(&tree, ka).unwrap().unwrap(), vb); - tx.commit(12) + Ok(12) }); assert!(matches!(res, Ok(12))); assert_eq!(tree.get(ka).unwrap().unwrap(), vb); - let res = db.transaction::<(), _, _>(|mut tx| { + let res = db.transaction::<(), _, _>(|tx| { assert_eq!(tx.get(&tree, ka).unwrap().unwrap(), vb); assert_eq!(tx.insert(&tree, ka, vc).unwrap().unwrap(), vb); assert_eq!(tx.get(&tree, ka).unwrap().unwrap(), vc); - tx.abort(42) + Err(TxError::Abort(42)) }); assert!(matches!(res, Err(TxError::Abort(42)))); assert_eq!(tree.get(ka).unwrap().unwrap(), vb); diff --git a/src/garage/Cargo.toml b/src/garage/Cargo.toml index 35d87a3e..dab2fa3e 100644 --- a/src/garage/Cargo.toml +++ b/src/garage/Cargo.toml @@ -53,7 +53,7 @@ futures = "0.3" futures-util = "0.3" tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] } -netapp = "0.5" +netapp = "0.10" opentelemetry = { version = "0.17", features = [ "rt-tokio" ] } opentelemetry-prometheus = { version = "0.10", optional = true } @@ -78,7 +78,7 @@ k2v-client.workspace = true [features] -default = [ "bundled-libs", "metrics", "sled", "k2v" ] +default = [ "bundled-libs", "metrics", "sled", "lmdb", "sqlite", "k2v" ] k2v = [ "garage_util/k2v", "garage_api/k2v" ] diff --git a/src/garage/admin/block.rs b/src/garage/admin/block.rs index e9e3ff96..c4a45738 100644 --- a/src/garage/admin/block.rs +++ b/src/garage/admin/block.rs @@ -34,6 +34,7 @@ impl AdminRpcHandler { .get_range(&hash, None, None, 10000, Default::default()) .await?; let mut versions = vec![]; + let mut uploads = vec![]; for br in block_refs { if let Some(v) = self .garage @@ -41,6 +42,11 @@ impl AdminRpcHandler { .get(&br.version, &EmptyKey) .await? { + if let VersionBacklink::MultipartUpload { upload_id } = &v.backlink { + if let Some(u) = self.garage.mpu_table.get(upload_id, &EmptyKey).await? { + uploads.push(u); + } + } versions.push(Ok(v)); } else { versions.push(Err(br.version)); @@ -50,6 +56,7 @@ impl AdminRpcHandler { hash, refcount, versions, + uploads, }) } @@ -93,6 +100,7 @@ impl AdminRpcHandler { } let mut obj_dels = 0; + let mut mpu_dels = 0; let mut ver_dels = 0; for hash in blocks { @@ -105,56 +113,80 @@ impl AdminRpcHandler { .await?; for br in block_refs { - let version = match self + if let Some(version) = self .garage .version_table .get(&br.version, &EmptyKey) .await? { - Some(v) => v, - None => continue, - }; + self.handle_block_purge_version_backlink( + &version, + &mut obj_dels, + &mut mpu_dels, + ) + .await?; - if let Some(object) = self - .garage - .object_table - .get(&version.bucket_id, &version.key) - .await? - { - let ov = object.versions().iter().rev().find(|v| v.is_complete()); - if let Some(ov) = ov { - if ov.uuid == br.version { - let del_uuid = gen_uuid(); - let deleted_object = Object::new( - version.bucket_id, - version.key.clone(), - vec![ObjectVersion { - uuid: del_uuid, - timestamp: ov.timestamp + 1, - state: ObjectVersionState::Complete( - ObjectVersionData::DeleteMarker, - ), - }], - ); - self.garage.object_table.insert(&deleted_object).await?; - obj_dels += 1; - } + if !version.deleted.get() { + let deleted_version = Version::new(version.uuid, version.backlink, true); + self.garage.version_table.insert(&deleted_version).await?; + ver_dels += 1; } } - - if !version.deleted.get() { - let deleted_version = - Version::new(version.uuid, version.bucket_id, version.key.clone(), true); - self.garage.version_table.insert(&deleted_version).await?; - ver_dels += 1; - } } } + Ok(AdminRpc::Ok(format!( - "{} blocks were purged: {} object deletion markers added, {} versions marked deleted", + "Purged {} blocks, {} versions, {} objects, {} multipart uploads", blocks.len(), + ver_dels, obj_dels, - ver_dels + mpu_dels, ))) } + + async fn handle_block_purge_version_backlink( + &self, + version: &Version, + obj_dels: &mut usize, + mpu_dels: &mut usize, + ) -> Result<(), Error> { + let (bucket_id, key, ov_id) = match &version.backlink { + VersionBacklink::Object { bucket_id, key } => (*bucket_id, key.clone(), version.uuid), + VersionBacklink::MultipartUpload { upload_id } => { + if let Some(mut mpu) = self.garage.mpu_table.get(upload_id, &EmptyKey).await? { + if !mpu.deleted.get() { + mpu.parts.clear(); + mpu.deleted.set(); + self.garage.mpu_table.insert(&mpu).await?; + *mpu_dels += 1; + } + (mpu.bucket_id, mpu.key.clone(), *upload_id) + } else { + return Ok(()); + } + } + }; + + if let Some(object) = self.garage.object_table.get(&bucket_id, &key).await? { + let ov = object.versions().iter().rev().find(|v| v.is_complete()); + if let Some(ov) = ov { + if ov.uuid == ov_id { + let del_uuid = gen_uuid(); + let deleted_object = Object::new( + bucket_id, + key, + vec![ObjectVersion { + uuid: del_uuid, + timestamp: ov.timestamp + 1, + state: ObjectVersionState::Complete(ObjectVersionData::DeleteMarker), + }], + ); + self.garage.object_table.insert(&deleted_object).await?; + *obj_dels += 1; + } + } + } + + Ok(()) + } } diff --git a/src/garage/admin/bucket.rs b/src/garage/admin/bucket.rs index 11bb8730..0781cb8b 100644 --- a/src/garage/admin/bucket.rs +++ b/src/garage/admin/bucket.rs @@ -73,6 +73,15 @@ impl AdminRpcHandler { .map(|x| x.filtered_values(&self.garage.system.ring.borrow())) .unwrap_or_default(); + let mpu_counters = self + .garage + .mpu_counter_table + .table + .get(&bucket_id, &EmptyKey) + .await? + .map(|x| x.filtered_values(&self.garage.system.ring.borrow())) + .unwrap_or_default(); + let mut relevant_keys = HashMap::new(); for (k, _) in bucket .state @@ -112,6 +121,7 @@ impl AdminRpcHandler { bucket, relevant_keys, counters, + mpu_counters, }) } diff --git a/src/garage/admin/key.rs b/src/garage/admin/key.rs index cab13bcf..1c92670c 100644 --- a/src/garage/admin/key.rs +++ b/src/garage/admin/key.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use garage_table::*; -use garage_model::helper::error::Error; +use garage_model::helper::error::*; use garage_model::key_table::*; use crate::cli::*; @@ -14,7 +14,7 @@ impl AdminRpcHandler { match cmd { KeyOperation::List => self.handle_list_keys().await, KeyOperation::Info(query) => self.handle_key_info(query).await, - KeyOperation::New(query) => self.handle_create_key(query).await, + KeyOperation::Create(query) => self.handle_create_key(query).await, KeyOperation::Rename(query) => self.handle_rename_key(query).await, KeyOperation::Delete(query) => self.handle_delete_key(query).await, KeyOperation::Allow(query) => self.handle_allow_key(query).await, @@ -41,12 +41,17 @@ impl AdminRpcHandler { Ok(AdminRpc::KeyList(key_ids)) } - async fn handle_key_info(&self, query: &KeyOpt) -> Result<AdminRpc, Error> { - let key = self + async fn handle_key_info(&self, query: &KeyInfoOpt) -> Result<AdminRpc, Error> { + let mut key = self .garage .key_helper() .get_existing_matching_key(&query.key_pattern) .await?; + + if !query.show_secret { + key.state.as_option_mut().unwrap().secret_key = "(redacted)".into(); + } + self.key_info_result(key).await } @@ -118,11 +123,17 @@ impl AdminRpcHandler { } async fn handle_import_key(&self, query: &KeyImportOpt) -> Result<AdminRpc, Error> { + if !query.yes { + return Err(Error::BadRequest("This command is intended to re-import keys that were previously generated by Garage. If you want to create a new key, use `garage key new` instead. Add the --yes flag if you really want to re-import a key.".to_string())); + } + let prev_key = self.garage.key_table.get(&EmptyKey, &query.key_id).await?; if prev_key.is_some() { return Err(Error::BadRequest(format!("Key {} already exists in data store. Even if it is deleted, we can't let you create a new key with the same ID. Sorry.", query.key_id))); } - let imported_key = Key::import(&query.key_id, &query.secret_key, &query.name); + + let imported_key = Key::import(&query.key_id, &query.secret_key, &query.name) + .ok_or_bad_request("Invalid key format")?; self.garage.key_table.insert(&imported_key).await?; self.key_info_result(imported_key).await diff --git a/src/garage/admin/mod.rs b/src/garage/admin/mod.rs index 2709f08a..b6f9c426 100644 --- a/src/garage/admin/mod.rs +++ b/src/garage/admin/mod.rs @@ -28,6 +28,7 @@ use garage_model::garage::Garage; use garage_model::helper::error::{Error, OkOrBadRequest}; use garage_model::key_table::*; use garage_model::migrate::Migrate; +use garage_model::s3::mpu_table::MultipartUpload; use garage_model::s3::version_table::Version; use crate::cli::*; @@ -53,6 +54,7 @@ pub enum AdminRpc { bucket: Bucket, relevant_keys: HashMap<String, Key>, counters: HashMap<String, i64>, + mpu_counters: HashMap<String, i64>, }, KeyList(Vec<(String, String)>), KeyInfo(Key, HashMap<Uuid, Bucket>), @@ -67,6 +69,7 @@ pub enum AdminRpc { hash: Hash, refcount: u64, versions: Vec<Result<Version, Uuid>>, + uploads: Vec<MultipartUpload>, }, } @@ -274,7 +277,7 @@ impl AdminRpcHandler { // Gather storage node and free space statistics let layout = &self.garage.system.ring.borrow().layout; let mut node_partition_count = HashMap::<Uuid, u64>::new(); - for short_id in layout.ring_assignation_data.iter() { + for short_id in layout.ring_assignment_data.iter() { let id = layout.node_id_vec[*short_id as usize]; *node_partition_count.entry(id).or_default() += 1; } diff --git a/src/garage/cli/cmd.rs b/src/garage/cli/cmd.rs index cb7a898c..48359614 100644 --- a/src/garage/cli/cmd.rs +++ b/src/garage/cli/cmd.rs @@ -85,7 +85,7 @@ pub async fn cmd_status(rpc_cli: &Endpoint<SystemRpc, ()>, rpc_host: NodeID) -> )); } _ => { - let new_role = match layout.staging.get(&adv.id) { + let new_role = match layout.staging_roles.get(&adv.id) { Some(NodeRoleV(Some(_))) => "(pending)", _ => "NO ROLE ASSIGNED", }; @@ -190,8 +190,9 @@ pub async fn cmd_admin( bucket, relevant_keys, counters, + mpu_counters, } => { - print_bucket_info(&bucket, &relevant_keys, &counters); + print_bucket_info(&bucket, &relevant_keys, &counters, &mpu_counters); } AdminRpc::KeyList(kl) => { print_key_list(kl); @@ -215,8 +216,9 @@ pub async fn cmd_admin( hash, refcount, versions, + uploads, } => { - print_block_info(hash, refcount, versions); + print_block_info(hash, refcount, versions, uploads); } r => { error!("Unexpected response: {:?}", r); diff --git a/src/garage/cli/convert_db.rs b/src/garage/cli/convert_db.rs index f590a4b6..ffb5c44c 100644 --- a/src/garage/cli/convert_db.rs +++ b/src/garage/cli/convert_db.rs @@ -41,6 +41,8 @@ fn open_db(path: PathBuf, engine: String) -> Result<Db> { #[cfg(feature = "sqlite")] "sqlite" | "sqlite3" | "rusqlite" => { let db = sqlite_adapter::rusqlite::Connection::open(&path)?; + db.pragma_update(None, "journal_mode", &"WAL")?; + db.pragma_update(None, "synchronous", &"NORMAL")?; Ok(sqlite_adapter::SqliteDb::init(db)) } #[cfg(feature = "lmdb")] @@ -51,11 +53,13 @@ fn open_db(path: PathBuf, engine: String) -> Result<Db> { let map_size = lmdb_adapter::recommended_map_size(); - let db = lmdb_adapter::heed::EnvOpenOptions::new() - .max_dbs(100) - .map_size(map_size) - .open(&path) - .unwrap(); + let mut env_builder = lmdb_adapter::heed::EnvOpenOptions::new(); + env_builder.max_dbs(100); + env_builder.map_size(map_size); + unsafe { + env_builder.flag(heed::flags::Flags::MdbNoMetaSync); + } + let db = env_builder.open(&path)?; Ok(lmdb_adapter::LmdbDb::init(db)) } e => Err(Error( diff --git a/src/garage/cli/layout.rs b/src/garage/cli/layout.rs index dc5315a1..ce2b11e0 100644 --- a/src/garage/cli/layout.rs +++ b/src/garage/cli/layout.rs @@ -1,3 +1,5 @@ +use bytesize::ByteSize; + use format_table::format_table; use garage_util::crdt::Crdt; use garage_util::error::*; @@ -14,8 +16,8 @@ pub async fn cli_layout_command_dispatch( rpc_host: NodeID, ) -> Result<(), Error> { match cmd { - LayoutOperation::Assign(configure_opt) => { - cmd_assign_role(system_rpc_endpoint, rpc_host, configure_opt).await + LayoutOperation::Assign(assign_opt) => { + cmd_assign_role(system_rpc_endpoint, rpc_host, assign_opt).await } LayoutOperation::Remove(remove_opt) => { cmd_remove_role(system_rpc_endpoint, rpc_host, remove_opt).await @@ -27,6 +29,9 @@ pub async fn cli_layout_command_dispatch( LayoutOperation::Revert(revert_opt) => { cmd_revert_layout(system_rpc_endpoint, rpc_host, revert_opt).await } + LayoutOperation::Config(config_opt) => { + cmd_config_layout(system_rpc_endpoint, rpc_host, config_opt).await + } } } @@ -60,14 +65,14 @@ pub async fn cmd_assign_role( .collect::<Result<Vec<_>, _>>()?; let mut roles = layout.roles.clone(); - roles.merge(&layout.staging); + roles.merge(&layout.staging_roles); for replaced in args.replace.iter() { let replaced_node = find_matching_node(layout.node_ids().iter().cloned(), replaced)?; match roles.get(&replaced_node) { Some(NodeRoleV(Some(_))) => { layout - .staging + .staging_roles .merge(&roles.update_mutator(replaced_node, NodeRoleV(None))); } _ => { @@ -83,7 +88,7 @@ pub async fn cmd_assign_role( return Err(Error::Message( "-c and -g are mutually exclusive, please configure node either with c>0 to act as a storage node or with -g to act as a gateway node".into())); } - if args.capacity == Some(0) { + if args.capacity == Some(ByteSize::b(0)) { return Err(Error::Message("Invalid capacity value: 0".into())); } @@ -91,7 +96,7 @@ pub async fn cmd_assign_role( let new_entry = match roles.get(&added_node) { Some(NodeRoleV(Some(old))) => { let capacity = match args.capacity { - Some(c) => Some(c), + Some(c) => Some(c.as_u64()), None if args.gateway => None, None => old.capacity, }; @@ -108,7 +113,7 @@ pub async fn cmd_assign_role( } _ => { let capacity = match args.capacity { - Some(c) => Some(c), + Some(c) => Some(c.as_u64()), None if args.gateway => None, None => return Err(Error::Message( "Please specify a capacity with the -c flag, or set node explicitly as gateway with -g".into())), @@ -125,7 +130,7 @@ pub async fn cmd_assign_role( }; layout - .staging + .staging_roles .merge(&roles.update_mutator(added_node, NodeRoleV(Some(new_entry)))); } @@ -145,13 +150,13 @@ pub async fn cmd_remove_role( let mut layout = fetch_layout(rpc_cli, rpc_host).await?; let mut roles = layout.roles.clone(); - roles.merge(&layout.staging); + roles.merge(&layout.staging_roles); let deleted_node = find_matching_node(roles.items().iter().map(|(id, _, _)| *id), &args.node_id)?; layout - .staging + .staging_roles .merge(&roles.update_mutator(deleted_node, NodeRoleV(None))); send_layout(rpc_cli, rpc_host, layout).await?; @@ -166,40 +171,45 @@ pub async fn cmd_show_layout( rpc_cli: &Endpoint<SystemRpc, ()>, rpc_host: NodeID, ) -> Result<(), Error> { - let mut layout = fetch_layout(rpc_cli, rpc_host).await?; + let layout = fetch_layout(rpc_cli, rpc_host).await?; println!("==== CURRENT CLUSTER LAYOUT ===="); - if !print_cluster_layout(&layout) { - println!("No nodes currently have a role in the cluster."); - println!("See `garage status` to view available nodes."); - } + print_cluster_layout(&layout, "No nodes currently have a role in the cluster.\nSee `garage status` to view available nodes."); println!(); println!("Current cluster layout version: {}", layout.version); - if print_staging_role_changes(&layout) { - layout.roles.merge(&layout.staging); - - println!(); - println!("==== NEW CLUSTER LAYOUT AFTER APPLYING CHANGES ===="); - if !print_cluster_layout(&layout) { - println!("No nodes have a role in the new layout."); - } - println!(); + let has_role_changes = print_staging_role_changes(&layout); + if has_role_changes { + let v = layout.version; + let res_apply = layout.apply_staged_changes(Some(v + 1)); // this will print the stats of what partitions // will move around when we apply - if layout.calculate_partition_assignation() { - println!("To enact the staged role changes, type:"); - println!(); - println!(" garage layout apply --version {}", layout.version + 1); - println!(); - println!( - "You can also revert all proposed changes with: garage layout revert --version {}", - layout.version + 1 - ); - } else { - println!("Not enough nodes have an assigned role to maintain enough copies of data."); - println!("This new layout cannot yet be applied."); + match res_apply { + Ok((layout, msg)) => { + println!(); + println!("==== NEW CLUSTER LAYOUT AFTER APPLYING CHANGES ===="); + print_cluster_layout(&layout, "No nodes have a role in the new layout."); + println!(); + + for line in msg.iter() { + println!("{}", line); + } + println!("To enact the staged role changes, type:"); + println!(); + println!(" garage layout apply --version {}", v + 1); + println!(); + println!( + "You can also revert all proposed changes with: garage layout revert --version {}", + v + 1) + } + Err(e) => { + println!("Error while trying to compute the assignment: {}", e); + println!("This new layout cannot yet be applied."); + println!( + "You can also revert all proposed changes with: garage layout revert --version {}", + v + 1) + } } } @@ -213,11 +223,14 @@ pub async fn cmd_apply_layout( ) -> Result<(), Error> { let layout = fetch_layout(rpc_cli, rpc_host).await?; - let layout = layout.apply_staged_changes(apply_opt.version)?; + let (layout, msg) = layout.apply_staged_changes(apply_opt.version)?; + for line in msg.iter() { + println!("{}", line); + } send_layout(rpc_cli, rpc_host, layout).await?; - println!("New cluster layout with updated role assignation has been applied in cluster."); + println!("New cluster layout with updated role assignment has been applied in cluster."); println!("Data will now be moved around between nodes accordingly."); Ok(()) @@ -238,6 +251,52 @@ pub async fn cmd_revert_layout( Ok(()) } +pub async fn cmd_config_layout( + rpc_cli: &Endpoint<SystemRpc, ()>, + rpc_host: NodeID, + config_opt: ConfigLayoutOpt, +) -> Result<(), Error> { + let mut layout = fetch_layout(rpc_cli, rpc_host).await?; + + let mut did_something = false; + match config_opt.redundancy { + None => (), + Some(r_str) => { + let r = r_str + .parse::<ZoneRedundancy>() + .ok_or_message("invalid zone redundancy value")?; + if let ZoneRedundancy::AtLeast(r_int) = r { + if r_int > layout.replication_factor { + return Err(Error::Message(format!( + "The zone redundancy must be smaller or equal to the \ + replication factor ({}).", + layout.replication_factor + ))); + } else if r_int < 1 { + return Err(Error::Message( + "The zone redundancy must be at least 1.".into(), + )); + } + } + + layout + .staging_parameters + .update(LayoutParameters { zone_redundancy: r }); + println!("The zone redundancy parameter has been set to '{}'.", r); + did_something = true; + } + } + + if !did_something { + return Err(Error::Message( + "Please specify an action for `garage layout config`".into(), + )); + } + + send_layout(rpc_cli, rpc_host, layout).await?; + Ok(()) +} + // --- utility --- pub async fn fetch_layout( @@ -268,59 +327,84 @@ pub async fn send_layout( Ok(()) } -pub fn print_cluster_layout(layout: &ClusterLayout) -> bool { - let mut table = vec!["ID\tTags\tZone\tCapacity".to_string()]; +pub fn print_cluster_layout(layout: &ClusterLayout, empty_msg: &str) { + let mut table = vec!["ID\tTags\tZone\tCapacity\tUsable capacity".to_string()]; for (id, _, role) in layout.roles.items().iter() { let role = match &role.0 { Some(r) => r, _ => continue, }; let tags = role.tags.join(","); - table.push(format!( - "{:?}\t{}\t{}\t{}", - id, - tags, - role.zone, - role.capacity_string() - )); + let usage = layout.get_node_usage(id).unwrap_or(0); + let capacity = layout.get_node_capacity(id).unwrap_or(0); + if capacity > 0 { + table.push(format!( + "{:?}\t{}\t{}\t{}\t{} ({:.1}%)", + id, + tags, + role.zone, + role.capacity_string(), + ByteSize::b(usage as u64 * layout.partition_size).to_string_as(false), + (100.0 * usage as f32 * layout.partition_size as f32) / (capacity as f32) + )); + } else { + table.push(format!( + "{:?}\t{}\t{}\t{}", + id, + tags, + role.zone, + role.capacity_string() + )); + }; } - if table.len() == 1 { - false - } else { + if table.len() > 1 { format_table(table); - true + println!(); + println!("Zone redundancy: {}", layout.parameters.zone_redundancy); + } else { + println!("{}", empty_msg); } } pub fn print_staging_role_changes(layout: &ClusterLayout) -> bool { - let has_changes = layout - .staging + let has_role_changes = layout + .staging_roles .items() .iter() .any(|(k, _, v)| layout.roles.get(k) != Some(v)); + let has_layout_changes = *layout.staging_parameters.get() != layout.parameters; - if has_changes { + if has_role_changes || has_layout_changes { println!(); println!("==== STAGED ROLE CHANGES ===="); - let mut table = vec!["ID\tTags\tZone\tCapacity".to_string()]; - for (id, _, role) in layout.staging.items().iter() { - if layout.roles.get(id) == Some(role) { - continue; - } - if let Some(role) = &role.0 { - let tags = role.tags.join(","); - table.push(format!( - "{:?}\t{}\t{}\t{}", - id, - tags, - role.zone, - role.capacity_string() - )); - } else { - table.push(format!("{:?}\tREMOVED", id)); + if has_role_changes { + let mut table = vec!["ID\tTags\tZone\tCapacity".to_string()]; + for (id, _, role) in layout.staging_roles.items().iter() { + if layout.roles.get(id) == Some(role) { + continue; + } + if let Some(role) = &role.0 { + let tags = role.tags.join(","); + table.push(format!( + "{:?}\t{}\t{}\t{}", + id, + tags, + role.zone, + role.capacity_string() + )); + } else { + table.push(format!("{:?}\tREMOVED", id)); + } } + format_table(table); + println!(); + } + if has_layout_changes { + println!( + "Zone redundancy: {}", + layout.staging_parameters.get().zone_redundancy + ); } - format_table(table); true } else { false diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs index ee7c2988..aba57551 100644 --- a/src/garage/cli/structs.rs +++ b/src/garage/cli/structs.rs @@ -19,7 +19,7 @@ pub enum Command { #[structopt(name = "node", version = garage_version())] Node(NodeOperation), - /// Operations on the assignation of node roles in the cluster layout + /// Operations on the assignment of node roles in the cluster layout #[structopt(name = "layout", version = garage_version())] Layout(LayoutOperation), @@ -97,6 +97,10 @@ pub enum LayoutOperation { #[structopt(name = "remove", version = garage_version())] Remove(RemoveRoleOpt), + /// Configure parameters value for the layout computation + #[structopt(name = "config", version = garage_version())] + Config(ConfigLayoutOpt), + /// Show roles currently assigned to nodes and changes staged for commit #[structopt(name = "show", version = garage_version())] Show, @@ -120,9 +124,9 @@ pub struct AssignRoleOpt { #[structopt(short = "z", long = "zone")] pub(crate) zone: Option<String>, - /// Capacity (in relative terms, use 1 to represent your smallest server) + /// Storage capacity, in bytes (supported suffixes: B, KB, MB, GB, TB, PB) #[structopt(short = "c", long = "capacity")] - pub(crate) capacity: Option<u32>, + pub(crate) capacity: Option<bytesize::ByteSize>, /// Gateway-only node #[structopt(short = "g", long = "gateway")] @@ -144,6 +148,13 @@ pub struct RemoveRoleOpt { } #[derive(StructOpt, Debug)] +pub struct ConfigLayoutOpt { + /// Zone redundancy parameter ('none'/'max' or integer) + #[structopt(short = "r", long = "redundancy")] + pub(crate) redundancy: Option<String>, +} + +#[derive(StructOpt, Debug)] pub struct ApplyLayoutOpt { /// Version number of new configuration: this command will fail if /// it is not exactly 1 + the previous configuration's version @@ -323,11 +334,11 @@ pub enum KeyOperation { /// Get key info #[structopt(name = "info", version = garage_version())] - Info(KeyOpt), + Info(KeyInfoOpt), /// Create new key - #[structopt(name = "new", version = garage_version())] - New(KeyNewOpt), + #[structopt(name = "create", version = garage_version())] + Create(KeyNewOpt), /// Rename key #[structopt(name = "rename", version = garage_version())] @@ -351,15 +362,18 @@ pub enum KeyOperation { } #[derive(Serialize, Deserialize, StructOpt, Debug)] -pub struct KeyOpt { +pub struct KeyInfoOpt { /// ID or name of the key pub key_pattern: String, + /// Whether to display the secret key + #[structopt(long = "show-secret")] + pub show_secret: bool, } #[derive(Serialize, Deserialize, StructOpt, Debug)] pub struct KeyNewOpt { /// Name of the key - #[structopt(long = "name", default_value = "Unnamed key")] + #[structopt(default_value = "Unnamed key")] pub name: String, } @@ -403,6 +417,10 @@ pub struct KeyImportOpt { /// Key name #[structopt(short = "n", default_value = "Imported key")] pub name: String, + + /// Confirm key import + #[structopt(long = "yes")] + pub yes: bool, } #[derive(Serialize, Deserialize, StructOpt, Debug, Clone)] @@ -438,24 +456,30 @@ pub struct RepairOpt { #[derive(Serialize, Deserialize, StructOpt, Debug, Eq, PartialEq, Clone)] pub enum RepairWhat { - /// Only do a full sync of metadata tables + /// Do a full sync of metadata tables #[structopt(name = "tables", version = garage_version())] Tables, - /// Only repair (resync/rebalance) the set of stored blocks + /// Repair (resync/rebalance) the set of stored blocks in the cluster #[structopt(name = "blocks", version = garage_version())] Blocks, - /// Only redo the propagation of object deletions to the version table (slow) + /// Repropagate object deletions to the version table #[structopt(name = "versions", version = garage_version())] Versions, - /// Only redo the propagation of version deletions to the block ref table (extremely slow) + /// Repropagate object deletions to the multipart upload table + #[structopt(name = "mpu", version = garage_version())] + MultipartUploads, + /// Repropagate version deletions to the block ref table #[structopt(name = "block_refs", version = garage_version())] BlockRefs, - /// Verify integrity of all blocks on disc (extremely slow, i/o intensive) + /// Verify integrity of all blocks on disc #[structopt(name = "scrub", version = garage_version())] Scrub { #[structopt(subcommand)] cmd: ScrubCmd, }, + /// Rebalance data blocks among HDDs on individual nodes + #[structopt(name = "rebalance", version = garage_version())] + Rebalance, } #[derive(Serialize, Deserialize, StructOpt, Debug, Eq, PartialEq, Clone)] diff --git a/src/garage/cli/util.rs b/src/garage/cli/util.rs index 1140cf22..2232d395 100644 --- a/src/garage/cli/util.rs +++ b/src/garage/cli/util.rs @@ -12,8 +12,9 @@ use garage_block::manager::BlockResyncErrorInfo; use garage_model::bucket_table::*; use garage_model::key_table::*; -use garage_model::s3::object_table::{BYTES, OBJECTS, UNFINISHED_UPLOADS}; -use garage_model::s3::version_table::Version; +use garage_model::s3::mpu_table::{self, MultipartUpload}; +use garage_model::s3::object_table; +use garage_model::s3::version_table::*; use crate::cli::structs::WorkerListOpt; @@ -135,6 +136,7 @@ pub fn print_bucket_info( bucket: &Bucket, relevant_keys: &HashMap<String, Key>, counters: &HashMap<String, i64>, + mpu_counters: &HashMap<String, i64>, ) { let key_name = |k| { relevant_keys @@ -148,7 +150,7 @@ pub fn print_bucket_info( Deletable::Deleted => println!("Bucket is deleted."), Deletable::Present(p) => { let size = - bytesize::ByteSize::b(counters.get(BYTES).cloned().unwrap_or_default() as u64); + bytesize::ByteSize::b(*counters.get(object_table::BYTES).unwrap_or(&0) as u64); println!( "\nSize: {} ({})", size.to_string_as(true), @@ -156,14 +158,22 @@ pub fn print_bucket_info( ); println!( "Objects: {}", - counters.get(OBJECTS).cloned().unwrap_or_default() + *counters.get(object_table::OBJECTS).unwrap_or(&0) + ); + println!( + "Unfinished uploads (multipart and non-multipart): {}", + *counters.get(object_table::UNFINISHED_UPLOADS).unwrap_or(&0) ); println!( "Unfinished multipart uploads: {}", - counters - .get(UNFINISHED_UPLOADS) - .cloned() - .unwrap_or_default() + *mpu_counters.get(mpu_table::UPLOADS).unwrap_or(&0) + ); + let mpu_size = + bytesize::ByteSize::b(*mpu_counters.get(mpu_table::BYTES).unwrap_or(&0) as u64); + println!( + "Size of unfinished multipart uploads: {} ({})", + mpu_size.to_string_as(true), + mpu_size.to_string_as(false), ); println!("\nWebsite access: {}", p.website_config.get().is_some()); @@ -390,29 +400,49 @@ pub fn print_block_error_list(el: Vec<BlockResyncErrorInfo>) { format_table(table); } -pub fn print_block_info(hash: Hash, refcount: u64, versions: Vec<Result<Version, Uuid>>) { +pub fn print_block_info( + hash: Hash, + refcount: u64, + versions: Vec<Result<Version, Uuid>>, + uploads: Vec<MultipartUpload>, +) { println!("Block hash: {}", hex::encode(hash.as_slice())); println!("Refcount: {}", refcount); println!(); - let mut table = vec!["Version\tBucket\tKey\tDeleted".into()]; + let mut table = vec!["Version\tBucket\tKey\tMPU\tDeleted".into()]; let mut nondeleted_count = 0; for v in versions.iter() { match v { Ok(ver) => { - table.push(format!( - "{:?}\t{:?}\t{}\t{:?}", - ver.uuid, - ver.bucket_id, - ver.key, - ver.deleted.get() - )); + match &ver.backlink { + VersionBacklink::Object { bucket_id, key } => { + table.push(format!( + "{:?}\t{:?}\t{}\t\t{:?}", + ver.uuid, + bucket_id, + key, + ver.deleted.get() + )); + } + VersionBacklink::MultipartUpload { upload_id } => { + let upload = uploads.iter().find(|x| x.upload_id == *upload_id); + table.push(format!( + "{:?}\t{:?}\t{}\t{:?}\t{:?}", + ver.uuid, + upload.map(|u| u.bucket_id).unwrap_or_default(), + upload.map(|u| u.key.as_str()).unwrap_or_default(), + upload_id, + ver.deleted.get() + )); + } + } if !ver.deleted.get() { nondeleted_count += 1; } } Err(vh) => { - table.push(format!("{:?}\t\t\tyes", vh)); + table.push(format!("{:?}\t\t\t\tyes", vh)); } } } diff --git a/src/garage/main.rs b/src/garage/main.rs index bec3197c..66403d05 100644 --- a/src/garage/main.rs +++ b/src/garage/main.rs @@ -17,6 +17,9 @@ compile_error!("Either bundled-libs or system-libs Cargo feature must be enabled #[cfg(all(feature = "bundled-libs", feature = "system-libs"))] compile_error!("Only one of bundled-libs and system-libs Cargo features must be enabled"); +#[cfg(not(any(feature = "lmdb", feature = "sled", feature = "sqlite")))] +compile_error!("Must activate the Cargo feature for at least one DB engine: lmdb, sled or sqlite."); + use std::net::SocketAddr; use std::path::PathBuf; diff --git a/src/garage/repair/online.rs b/src/garage/repair/online.rs index 0e14ed51..9e4de873 100644 --- a/src/garage/repair/online.rs +++ b/src/garage/repair/online.rs @@ -5,11 +5,16 @@ use async_trait::async_trait; use tokio::sync::watch; use garage_block::repair::ScrubWorkerCommand; + use garage_model::garage::Garage; use garage_model::s3::block_ref_table::*; +use garage_model::s3::mpu_table::*; use garage_model::s3::object_table::*; use garage_model::s3::version_table::*; + +use garage_table::replication::*; use garage_table::*; + use garage_util::background::*; use garage_util::error::Error; use garage_util::migrate::Migrate; @@ -32,11 +37,15 @@ pub async fn launch_online_repair( } RepairWhat::Versions => { info!("Repairing the versions table"); - bg.spawn_worker(RepairVersionsWorker::new(garage.clone())); + bg.spawn_worker(TableRepairWorker::new(garage.clone(), RepairVersions)); + } + RepairWhat::MultipartUploads => { + info!("Repairing the multipart uploads table"); + bg.spawn_worker(TableRepairWorker::new(garage.clone(), RepairMpu)); } RepairWhat::BlockRefs => { info!("Repairing the block refs table"); - bg.spawn_worker(RepairBlockrefsWorker::new(garage.clone())); + bg.spawn_worker(TableRepairWorker::new(garage.clone(), RepairBlockRefs)); } RepairWhat::Blocks => { info!("Repairing the stored blocks"); @@ -61,76 +70,82 @@ pub async fn launch_online_repair( info!("Sending command to scrub worker: {:?}", cmd); garage.block_manager.send_scrub_command(cmd).await?; } + RepairWhat::Rebalance => { + info!("Rebalancing the stored blocks among storage locations"); + bg.spawn_worker(garage_block::repair::RebalanceWorker::new( + garage.block_manager.clone(), + )); + } } Ok(()) } // ---- -struct RepairVersionsWorker { +#[async_trait] +trait TableRepair: Send + Sync + 'static { + type T: TableSchema; + + fn table(garage: &Garage) -> &Table<Self::T, TableShardedReplication>; + + async fn process( + &mut self, + garage: &Garage, + entry: <<Self as TableRepair>::T as TableSchema>::E, + ) -> Result<bool, Error>; +} + +struct TableRepairWorker<T: TableRepair> { garage: Arc<Garage>, pos: Vec<u8>, counter: usize, + repairs: usize, + inner: T, } -impl RepairVersionsWorker { - fn new(garage: Arc<Garage>) -> Self { +impl<R: TableRepair> TableRepairWorker<R> { + fn new(garage: Arc<Garage>, inner: R) -> Self { Self { garage, + inner, pos: vec![], counter: 0, + repairs: 0, } } } #[async_trait] -impl Worker for RepairVersionsWorker { +impl<R: TableRepair> Worker for TableRepairWorker<R> { fn name(&self) -> String { - "Version repair worker".into() + format!("{} repair worker", R::T::TABLE_NAME) } fn status(&self) -> WorkerStatus { WorkerStatus { - progress: Some(self.counter.to_string()), + progress: Some(format!("{} ({})", self.counter, self.repairs)), ..Default::default() } } async fn work(&mut self, _must_exit: &mut watch::Receiver<bool>) -> Result<WorkerState, Error> { - let (item_bytes, next_pos) = match self.garage.version_table.data.store.get_gt(&self.pos)? { + let (item_bytes, next_pos) = match R::table(&self.garage).data.store.get_gt(&self.pos)? { Some((k, v)) => (v, k), None => { - info!("repair_versions: finished, done {}", self.counter); + info!( + "{}: finished, done {}, fixed {}", + self.name(), + self.counter, + self.repairs + ); return Ok(WorkerState::Done); } }; - let version = Version::decode(&item_bytes).ok_or_message("Cannot decode Version")?; - if !version.deleted.get() { - let object = self - .garage - .object_table - .get(&version.bucket_id, &version.key) - .await?; - let version_exists = match object { - Some(o) => o - .versions() - .iter() - .any(|x| x.uuid == version.uuid && x.state != ObjectVersionState::Aborted), - None => false, - }; - if !version_exists { - info!("Repair versions: marking version as deleted: {:?}", version); - self.garage - .version_table - .insert(&Version::new( - version.uuid, - version.bucket_id, - version.key, - true, - )) - .await?; - } + let entry = <R::T as TableSchema>::E::decode(&item_bytes) + .ok_or_message("Cannot decode table entry")?; + if self.inner.process(&self.garage, entry).await? { + self.repairs += 1; } self.counter += 1; @@ -146,77 +161,124 @@ impl Worker for RepairVersionsWorker { // ---- -struct RepairBlockrefsWorker { - garage: Arc<Garage>, - pos: Vec<u8>, - counter: usize, -} +struct RepairVersions; -impl RepairBlockrefsWorker { - fn new(garage: Arc<Garage>) -> Self { - Self { - garage, - pos: vec![], - counter: 0, +#[async_trait] +impl TableRepair for RepairVersions { + type T = VersionTable; + + fn table(garage: &Garage) -> &Table<Self::T, TableShardedReplication> { + &garage.version_table + } + + async fn process(&mut self, garage: &Garage, version: Version) -> Result<bool, Error> { + if !version.deleted.get() { + let ref_exists = match &version.backlink { + VersionBacklink::Object { bucket_id, key } => garage + .object_table + .get(bucket_id, key) + .await? + .map(|o| { + o.versions().iter().any(|x| { + x.uuid == version.uuid && x.state != ObjectVersionState::Aborted + }) + }) + .unwrap_or(false), + VersionBacklink::MultipartUpload { upload_id } => garage + .mpu_table + .get(upload_id, &EmptyKey) + .await? + .map(|u| !u.deleted.get()) + .unwrap_or(false), + }; + + if !ref_exists { + info!("Repair versions: marking version as deleted: {:?}", version); + garage + .version_table + .insert(&Version::new(version.uuid, version.backlink, true)) + .await?; + return Ok(true); + } } + + Ok(false) } } +// ---- + +struct RepairBlockRefs; + #[async_trait] -impl Worker for RepairBlockrefsWorker { - fn name(&self) -> String { - "Block refs repair worker".into() - } +impl TableRepair for RepairBlockRefs { + type T = BlockRefTable; - fn status(&self) -> WorkerStatus { - WorkerStatus { - progress: Some(self.counter.to_string()), - ..Default::default() - } + fn table(garage: &Garage) -> &Table<Self::T, TableShardedReplication> { + &garage.block_ref_table } - async fn work(&mut self, _must_exit: &mut watch::Receiver<bool>) -> Result<WorkerState, Error> { - let (item_bytes, next_pos) = - match self.garage.block_ref_table.data.store.get_gt(&self.pos)? { - Some((k, v)) => (v, k), - None => { - info!("repair_block_ref: finished, done {}", self.counter); - return Ok(WorkerState::Done); - } - }; - - let block_ref = BlockRef::decode(&item_bytes).ok_or_message("Cannot decode BlockRef")?; + async fn process(&mut self, garage: &Garage, mut block_ref: BlockRef) -> Result<bool, Error> { if !block_ref.deleted.get() { - let version = self - .garage + let ref_exists = garage .version_table .get(&block_ref.version, &EmptyKey) - .await?; - // The version might not exist if it has been GC'ed - let ref_exists = version.map(|v| !v.deleted.get()).unwrap_or(false); + .await? + .map(|v| !v.deleted.get()) + .unwrap_or(false); + if !ref_exists { info!( "Repair block ref: marking block_ref as deleted: {:?}", block_ref ); - self.garage - .block_ref_table - .insert(&BlockRef { - block: block_ref.block, - version: block_ref.version, - deleted: true.into(), - }) - .await?; + block_ref.deleted.set(); + garage.block_ref_table.insert(&block_ref).await?; + return Ok(true); } } - self.counter += 1; - self.pos = next_pos; + Ok(false) + } +} - Ok(WorkerState::Busy) +// ---- + +struct RepairMpu; + +#[async_trait] +impl TableRepair for RepairMpu { + type T = MultipartUploadTable; + + fn table(garage: &Garage) -> &Table<Self::T, TableShardedReplication> { + &garage.mpu_table } - async fn wait_for_work(&mut self) -> WorkerState { - unreachable!() + async fn process(&mut self, garage: &Garage, mut mpu: MultipartUpload) -> Result<bool, Error> { + if !mpu.deleted.get() { + let ref_exists = garage + .object_table + .get(&mpu.bucket_id, &mpu.key) + .await? + .map(|o| { + o.versions() + .iter() + .any(|x| x.uuid == mpu.upload_id && x.is_uploading(Some(true))) + }) + .unwrap_or(false); + + if !ref_exists { + info!( + "Repair multipart uploads: marking mpu as deleted: {:?}", + mpu + ); + mpu.parts.clear(); + mpu.deleted.set(); + garage.mpu_table.insert(&mpu).await?; + return Ok(true); + } + } + + Ok(false) } } diff --git a/src/garage/tests/common/garage.rs b/src/garage/tests/common/garage.rs index 8aaf6f5b..d1f0867a 100644 --- a/src/garage/tests/common/garage.rs +++ b/src/garage/tests/common/garage.rs @@ -52,6 +52,7 @@ impl Instance { r#" metadata_dir = "{path}/meta" data_dir = "{path}/data" +db_engine = "lmdb" replication_mode = "1" @@ -141,7 +142,7 @@ api_bind_addr = "127.0.0.1:{admin_port}" self.command() .args(["layout", "assign"]) .arg(node_short_id) - .args(["-c", "1", "-z", "unzonned"]) + .args(["-c", "1G", "-z", "unzonned"]) .quiet() .expect_success_status("Could not assign garage node layout"); self.command() @@ -186,9 +187,9 @@ api_bind_addr = "127.0.0.1:{admin_port}" let mut key = Key::default(); let mut cmd = self.command(); - let base = cmd.args(["key", "new"]); + let base = cmd.args(["key", "create"]); let with_name = match maybe_name { - Some(name) => base.args(["--name", name]), + Some(name) => base.args([name]), None => base, }; diff --git a/src/garage/tests/k2v/item.rs b/src/garage/tests/k2v/item.rs index 25d9cce4..20add889 100644 --- a/src/garage/tests/k2v/item.rs +++ b/src/garage/tests/k2v/item.rs @@ -44,6 +44,7 @@ async fn test_items_and_indices() { let content = format!("{}: hello world", sk).into_bytes(); let content2 = format!("{}: hello universe", sk).into_bytes(); let content3 = format!("{}: concurrent value", sk).into_bytes(); + eprintln!("test iteration {}: {}", i, sk); // Put initially, no causality token let res = ctx @@ -89,7 +90,7 @@ async fn test_items_and_indices() { assert_eq!(res_body, content); // ReadIndex -- now there should be some stuff - tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_millis(100)).await; let res = ctx .k2v .request @@ -158,7 +159,7 @@ async fn test_items_and_indices() { assert_eq!(res_body, content2); // ReadIndex -- now there should be some stuff - tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_millis(100)).await; let res = ctx .k2v .request @@ -230,7 +231,7 @@ async fn test_items_and_indices() { ); // ReadIndex -- now there should be some stuff - tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_millis(100)).await; let res = ctx .k2v .request @@ -299,7 +300,7 @@ async fn test_items_and_indices() { assert_eq!(res.status(), StatusCode::NO_CONTENT); // ReadIndex -- now there should be some stuff - tokio::time::sleep(Duration::from_secs(1)).await; + tokio::time::sleep(Duration::from_millis(100)).await; let res = ctx .k2v .request diff --git a/src/garage/tests/s3/multipart.rs b/src/garage/tests/s3/multipart.rs index aeff94b4..09ae5e5b 100644 --- a/src/garage/tests/s3/multipart.rs +++ b/src/garage/tests/s3/multipart.rs @@ -6,6 +6,190 @@ const SZ_5MB: usize = 5 * 1024 * 1024; const SZ_10MB: usize = 10 * 1024 * 1024; #[tokio::test] +async fn test_multipart_upload() { + let ctx = common::context(); + let bucket = ctx.create_bucket("testmpu"); + + let u1 = vec![0x11; SZ_5MB]; + let u2 = vec![0x22; SZ_5MB]; + let u3 = vec![0x33; SZ_5MB]; + let u4 = vec![0x44; SZ_5MB]; + let u5 = vec![0x55; SZ_5MB]; + + let up = ctx + .client + .create_multipart_upload() + .bucket(&bucket) + .key("a") + .send() + .await + .unwrap(); + assert!(up.upload_id.is_some()); + + let uid = up.upload_id.as_ref().unwrap(); + + let p3 = ctx + .client + .upload_part() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .part_number(3) + .body(ByteStream::from(u3.clone())) + .send() + .await + .unwrap(); + + let _p1 = ctx + .client + .upload_part() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .part_number(1) + .body(ByteStream::from(u1)) + .send() + .await + .unwrap(); + + let _p4 = ctx + .client + .upload_part() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .part_number(4) + .body(ByteStream::from(u4)) + .send() + .await + .unwrap(); + + let p1bis = ctx + .client + .upload_part() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .part_number(1) + .body(ByteStream::from(u2.clone())) + .send() + .await + .unwrap(); + + let p6 = ctx + .client + .upload_part() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .part_number(6) + .body(ByteStream::from(u5.clone())) + .send() + .await + .unwrap(); + + { + let r = ctx + .client + .list_parts() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .send() + .await + .unwrap(); + assert_eq!(r.parts.unwrap().len(), 4); + } + + let cmp = CompletedMultipartUpload::builder() + .parts( + CompletedPart::builder() + .part_number(1) + .e_tag(p1bis.e_tag.unwrap()) + .build(), + ) + .parts( + CompletedPart::builder() + .part_number(3) + .e_tag(p3.e_tag.unwrap()) + .build(), + ) + .parts( + CompletedPart::builder() + .part_number(6) + .e_tag(p6.e_tag.unwrap()) + .build(), + ) + .build(); + + ctx.client + .complete_multipart_upload() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .multipart_upload(cmp) + .send() + .await + .unwrap(); + + // The multipart upload must not appear anymore + assert!(ctx + .client + .list_parts() + .bucket(&bucket) + .key("a") + .upload_id(uid) + .send() + .await + .is_err()); + + { + // The object must appear as a regular object + let r = ctx + .client + .head_object() + .bucket(&bucket) + .key("a") + .send() + .await + .unwrap(); + + assert_eq!(r.content_length, (SZ_5MB * 3) as i64); + } + + { + let o = ctx + .client + .get_object() + .bucket(&bucket) + .key("a") + .send() + .await + .unwrap(); + + assert_bytes_eq!(o.body, &[&u2[..], &u3[..], &u5[..]].concat()); + } + + { + for (part_number, data) in [(1, &u2), (2, &u3), (3, &u5)] { + let o = ctx + .client + .get_object() + .bucket(&bucket) + .key("a") + .part_number(part_number) + .send() + .await + .unwrap(); + + eprintln!("get_object with part_number = {}", part_number); + assert_eq!(o.content_length, SZ_5MB as i64); + assert_bytes_eq!(o.body, data); + } + } +} + +#[tokio::test] async fn test_uploadlistpart() { let ctx = common::context(); let bucket = ctx.create_bucket("uploadpart"); @@ -65,7 +249,8 @@ async fn test_uploadlistpart() { let ps = r.parts.unwrap(); assert_eq!(ps.len(), 1); - let fp = ps.iter().find(|x| x.part_number == 2).unwrap(); + assert_eq!(ps[0].part_number, 2); + let fp = &ps[0]; assert!(fp.last_modified.is_some()); assert_eq!( fp.e_tag.as_ref().unwrap(), @@ -100,13 +285,24 @@ async fn test_uploadlistpart() { let ps = r.parts.unwrap(); assert_eq!(ps.len(), 2); - let fp = ps.iter().find(|x| x.part_number == 1).unwrap(); + + assert_eq!(ps[0].part_number, 1); + let fp = &ps[0]; assert!(fp.last_modified.is_some()); assert_eq!( fp.e_tag.as_ref().unwrap(), "\"3c484266f9315485694556e6c693bfa2\"" ); assert_eq!(fp.size, SZ_5MB as i64); + + assert_eq!(ps[1].part_number, 2); + let sp = &ps[1]; + assert!(sp.last_modified.is_some()); + assert_eq!( + sp.e_tag.as_ref().unwrap(), + "\"3366bb9dcf710d6801b5926467d02e19\"" + ); + assert_eq!(sp.size, SZ_5MB as i64); } { @@ -123,12 +319,19 @@ async fn test_uploadlistpart() { .unwrap(); assert!(r.part_number_marker.is_none()); - assert!(r.next_part_number_marker.is_some()); + assert_eq!(r.next_part_number_marker.as_deref(), Some("1")); assert_eq!(r.max_parts, 1_i32); assert!(r.is_truncated); assert_eq!(r.key.unwrap(), "a"); assert_eq!(r.upload_id.unwrap().as_str(), uid.as_str()); - assert_eq!(r.parts.unwrap().len(), 1); + let parts = r.parts.unwrap(); + assert_eq!(parts.len(), 1); + let fp = &parts[0]; + assert_eq!(fp.part_number, 1); + assert_eq!( + fp.e_tag.as_ref().unwrap(), + "\"3c484266f9315485694556e6c693bfa2\"" + ); let r2 = ctx .client @@ -147,10 +350,18 @@ async fn test_uploadlistpart() { r.next_part_number_marker.as_ref().unwrap() ); assert_eq!(r2.max_parts, 1_i32); - assert!(r2.is_truncated); assert_eq!(r2.key.unwrap(), "a"); assert_eq!(r2.upload_id.unwrap().as_str(), uid.as_str()); - assert_eq!(r2.parts.unwrap().len(), 1); + let parts = r2.parts.unwrap(); + assert_eq!(parts.len(), 1); + let fp = &parts[0]; + assert_eq!(fp.part_number, 2); + assert_eq!( + fp.e_tag.as_ref().unwrap(), + "\"3366bb9dcf710d6801b5926467d02e19\"" + ); + //assert!(r2.is_truncated); // WHY? (this was the test before) + assert!(!r2.is_truncated); } let cmp = CompletedMultipartUpload::builder() diff --git a/src/model/Cargo.toml b/src/model/Cargo.toml index 1d3600a6..7db7f15d 100644 --- a/src/model/Cargo.toml +++ b/src/model/Cargo.toml @@ -23,6 +23,7 @@ garage_util.workspace = true async-trait = "0.1.7" arc-swap = "1.0" blake2 = "0.10" +chrono = "0.4" err-derive = "0.3" hex = "0.4" base64 = "0.21" @@ -38,10 +39,10 @@ futures-util = "0.3" tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] } opentelemetry = "0.17" -netapp = "0.5" +netapp = "0.10" [features] -default = [ "sled" ] +default = [ "sled", "lmdb", "sqlite" ] k2v = [ "garage_util/k2v" ] lmdb = [ "garage_db/lmdb" ] sled = [ "garage_db/sled" ] diff --git a/src/model/bucket_table.rs b/src/model/bucket_table.rs index ac163736..4c48a76f 100644 --- a/src/model/bucket_table.rs +++ b/src/model/bucket_table.rs @@ -48,6 +48,9 @@ mod v08 { pub website_config: crdt::Lww<Option<WebsiteConfig>>, /// CORS rules pub cors_config: crdt::Lww<Option<Vec<CorsRule>>>, + /// Lifecycle configuration + #[serde(default)] + pub lifecycle_config: crdt::Lww<Option<Vec<LifecycleRule>>>, /// Bucket quotas #[serde(default)] pub quotas: crdt::Lww<BucketQuotas>, @@ -69,6 +72,42 @@ mod v08 { pub expose_headers: Vec<String>, } + /// Lifecycle configuration rule + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct LifecycleRule { + /// The ID of the rule + pub id: Option<String>, + /// Whether the rule is active + pub enabled: bool, + /// The filter to check whether rule applies to a given object + pub filter: LifecycleFilter, + /// Number of days after which incomplete multipart uploads are aborted + pub abort_incomplete_mpu_days: Option<usize>, + /// Expiration policy for stored objects + pub expiration: Option<LifecycleExpiration>, + } + + /// A lifecycle filter is a set of conditions that must all be true. + /// For each condition, if it is None, it is not verified (always true), + /// and if it is Some(x), then it is verified for value x + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize, Default)] + pub struct LifecycleFilter { + /// If Some(x), object key has to start with prefix x + pub prefix: Option<String>, + /// If Some(x), object size has to be more than x + pub size_gt: Option<u64>, + /// If Some(x), object size has to be less than x + pub size_lt: Option<u64>, + } + + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub enum LifecycleExpiration { + /// Objects expire x days after they were created + AfterDays(usize), + /// Objects expire at date x (must be in yyyy-mm-dd format) + AtDate(String), + } + #[derive(Default, PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] pub struct BucketQuotas { /// Maximum size in bytes (bucket size = sum of sizes of objects in the bucket) @@ -88,7 +127,7 @@ impl AutoCrdt for BucketQuotas { impl BucketParams { /// Create an empty BucketParams with no authorized keys and no website accesss - pub fn new() -> Self { + fn new() -> Self { BucketParams { creation_date: now_msec(), authorized_keys: crdt::Map::new(), @@ -96,6 +135,7 @@ impl BucketParams { local_aliases: crdt::LwwMap::new(), website_config: crdt::Lww::new(None), cors_config: crdt::Lww::new(None), + lifecycle_config: crdt::Lww::new(None), quotas: crdt::Lww::new(BucketQuotas::default()), } } @@ -111,10 +151,25 @@ impl Crdt for BucketParams { self.website_config.merge(&o.website_config); self.cors_config.merge(&o.cors_config); + self.lifecycle_config.merge(&o.lifecycle_config); self.quotas.merge(&o.quotas); } } +pub fn parse_lifecycle_date(date: &str) -> Result<chrono::NaiveDate, &'static str> { + use chrono::prelude::*; + + if let Ok(datetime) = NaiveDateTime::parse_from_str(date, "%Y-%m-%dT%H:%M:%SZ") { + if datetime.time() == NaiveTime::MIN { + Ok(datetime.date()) + } else { + Err("date must be at midnight") + } + } else { + NaiveDate::parse_from_str(date, "%Y-%m-%d").map_err(|_| "date has invalid format") + } +} + impl Default for Bucket { fn default() -> Self { Self::new() diff --git a/src/model/garage.rs b/src/model/garage.rs index a432aa7a..8c9a3af3 100644 --- a/src/model/garage.rs +++ b/src/model/garage.rs @@ -7,6 +7,7 @@ use garage_db as db; use garage_util::background::*; use garage_util::config::*; use garage_util::error::*; +use garage_util::persister::PersisterShared; use garage_rpc::replication_mode::ReplicationMode; use garage_rpc::system::System; @@ -17,6 +18,8 @@ use garage_table::replication::TableShardedReplication; use garage_table::*; use crate::s3::block_ref_table::*; +use crate::s3::lifecycle_worker; +use crate::s3::mpu_table::*; use crate::s3::object_table::*; use crate::s3::version_table::*; @@ -57,11 +60,18 @@ pub struct Garage { pub object_table: Arc<Table<ObjectTable, TableShardedReplication>>, /// Counting table containing object counters pub object_counter_table: Arc<IndexCounter<Object>>, + /// Table containing S3 multipart uploads + pub mpu_table: Arc<Table<MultipartUploadTable, TableShardedReplication>>, + /// Counting table containing multipart object counters + pub mpu_counter_table: Arc<IndexCounter<MultipartUpload>>, /// Table containing S3 object versions pub version_table: Arc<Table<VersionTable, TableShardedReplication>>, /// Table containing S3 block references (not blocks themselves) pub block_ref_table: Arc<Table<BlockRefTable, TableShardedReplication>>, + /// Persister for lifecycle worker info + pub lifecycle_persister: PersisterShared<lifecycle_worker::LifecycleWorkerPersisted>, + #[cfg(feature = "k2v")] pub k2v: GarageK2V, } @@ -82,8 +92,22 @@ impl Garage { // Create meta dir and data dir if they don't exist already std::fs::create_dir_all(&config.metadata_dir) .ok_or_message("Unable to create Garage metadata directory")?; - std::fs::create_dir_all(&config.data_dir) - .ok_or_message("Unable to create Garage data directory")?; + match &config.data_dir { + DataDirEnum::Single(data_dir) => { + std::fs::create_dir_all(data_dir).ok_or_message(format!( + "Unable to create Garage data directory: {}", + data_dir.to_string_lossy() + ))?; + } + DataDirEnum::Multiple(data_dirs) => { + for dir in data_dirs { + std::fs::create_dir_all(&dir.path).ok_or_message(format!( + "Unable to create Garage data directory: {}", + dir.path.to_string_lossy() + ))?; + } + } + } info!("Opening database..."); let mut db_path = config.metadata_dir.clone(); @@ -91,6 +115,11 @@ impl Garage { // ---- Sled DB ---- #[cfg(feature = "sled")] "sled" => { + if config.metadata_fsync { + return Err(Error::Message(format!( + "`metadata_fsync = true` is not supported with the Sled database engine" + ))); + } db_path.push("db"); info!("Opening Sled database at: {}", db_path.display()); let db = db::sled_adapter::sled::Config::default() @@ -109,6 +138,15 @@ impl Garage { db_path.push("db.sqlite"); info!("Opening Sqlite database at: {}", db_path.display()); let db = db::sqlite_adapter::rusqlite::Connection::open(db_path) + .and_then(|db| { + db.pragma_update(None, "journal_mode", &"WAL")?; + if config.metadata_fsync { + db.pragma_update(None, "synchronous", &"NORMAL")?; + } else { + db.pragma_update(None, "synchronous", &"OFF")?; + } + Ok(db) + }) .ok_or_message("Unable to open sqlite DB")?; db::sqlite_adapter::SqliteDb::init(db) } @@ -136,8 +174,10 @@ impl Garage { env_builder.max_readers(500); env_builder.map_size(map_size); unsafe { - env_builder.flag(heed::flags::Flags::MdbNoSync); env_builder.flag(heed::flags::Flags::MdbNoMetaSync); + if !config.metadata_fsync { + env_builder.flag(heed::flags::Flags::MdbNoSync); + } } let db = match env_builder.open(&db_path) { Err(heed::Error::Io(e)) if e.kind() == std::io::ErrorKind::OutOfMemory => { @@ -182,6 +222,9 @@ impl Garage { let replication_mode = ReplicationMode::parse(&config.replication_mode) .ok_or_message("Invalid replication_mode in config file.")?; + info!("Initialize background variable system..."); + let mut bg_vars = vars::BgVars::new(); + info!("Initialize membership management system..."); let system = System::new(network_key, replication_mode, &config)?; @@ -208,10 +251,12 @@ impl Garage { let block_manager = BlockManager::new( &db, config.data_dir.clone(), + config.data_fsync, config.compression_level, data_rep_param, system.clone(), - ); + )?; + block_manager.register_bg_vars(&mut bg_vars); // ---- admin tables ---- info!("Initialize bucket_table..."); @@ -248,6 +293,20 @@ impl Garage { &db, ); + info!("Initialize multipart upload counter table..."); + let mpu_counter_table = IndexCounter::new(system.clone(), meta_rep_param.clone(), &db); + + info!("Initialize multipart upload table..."); + let mpu_table = Table::new( + MultipartUploadTable { + version_table: version_table.clone(), + mpu_counter_table: mpu_counter_table.clone(), + }, + meta_rep_param.clone(), + system.clone(), + &db, + ); + info!("Initialize object counter table..."); let object_counter_table = IndexCounter::new(system.clone(), meta_rep_param.clone(), &db); @@ -256,6 +315,7 @@ impl Garage { let object_table = Table::new( ObjectTable { version_table: version_table.clone(), + mpu_table: mpu_table.clone(), object_counter_table: object_counter_table.clone(), }, meta_rep_param.clone(), @@ -263,14 +323,15 @@ impl Garage { &db, ); + info!("Load lifecycle worker state..."); + let lifecycle_persister = + PersisterShared::new(&system.metadata_dir, "lifecycle_worker_state"); + lifecycle_worker::register_bg_vars(&lifecycle_persister, &mut bg_vars); + // ---- K2V ---- #[cfg(feature = "k2v")] let k2v = GarageK2V::new(system.clone(), &db, meta_rep_param); - // Initialize bg vars - let mut bg_vars = vars::BgVars::new(); - block_manager.register_bg_vars(&mut bg_vars); - // -- done -- Ok(Arc::new(Self { config, @@ -284,14 +345,17 @@ impl Garage { key_table, object_table, object_counter_table, + mpu_table, + mpu_counter_table, version_table, block_ref_table, + lifecycle_persister, #[cfg(feature = "k2v")] k2v, })) } - pub fn spawn_workers(&self, bg: &BackgroundRunner) { + pub fn spawn_workers(self: &Arc<Self>, bg: &BackgroundRunner) { self.block_manager.spawn_workers(bg); self.bucket_table.spawn_workers(bg); @@ -300,9 +364,16 @@ impl Garage { self.object_table.spawn_workers(bg); self.object_counter_table.spawn_workers(bg); + self.mpu_table.spawn_workers(bg); + self.mpu_counter_table.spawn_workers(bg); self.version_table.spawn_workers(bg); self.block_ref_table.spawn_workers(bg); + bg.spawn_worker(lifecycle_worker::LifecycleWorker::new( + self.clone(), + self.lifecycle_persister.clone(), + )); + #[cfg(feature = "k2v")] self.k2v.spawn_workers(bg); } diff --git a/src/model/helper/bucket.rs b/src/model/helper/bucket.rs index 4a488d7f..576d03f3 100644 --- a/src/model/helper/bucket.rs +++ b/src/model/helper/bucket.rs @@ -478,7 +478,9 @@ impl<'a> BucketHelper<'a> { // ---- /// Deletes all incomplete multipart uploads that are older than a certain time. - /// Returns the number of uploads aborted + /// Returns the number of uploads aborted. + /// This will also include non-multipart uploads, which may be lingering + /// after a node crash pub async fn cleanup_incomplete_uploads( &self, bucket_id: &Uuid, @@ -496,7 +498,9 @@ impl<'a> BucketHelper<'a> { .get_range( bucket_id, start, - Some(ObjectFilter::IsUploading), + Some(ObjectFilter::IsUploading { + check_multipart: None, + }), 1000, EnumerationOrder::Forward, ) @@ -508,7 +512,7 @@ impl<'a> BucketHelper<'a> { let aborted_versions = object .versions() .iter() - .filter(|v| v.is_uploading() && v.timestamp < older_than) + .filter(|v| v.is_uploading(None) && v.timestamp < older_than) .map(|v| ObjectVersion { state: ObjectVersionState::Aborted, uuid: v.uuid, diff --git a/src/model/index_counter.rs b/src/model/index_counter.rs index 35d6596d..a46c165f 100644 --- a/src/model/index_counter.rs +++ b/src/model/index_counter.rs @@ -294,7 +294,7 @@ impl<T: CountedItem> IndexCounter<T> { let counter_entry = local_counter.into_counter_entry(self.this_node); self.local_counter .db() - .transaction(|mut tx| self.table.queue_insert(&mut tx, &counter_entry))?; + .transaction(|tx| self.table.queue_insert(tx, &counter_entry))?; next_start = Some(local_counter_k); } @@ -360,7 +360,7 @@ impl<T: CountedItem> IndexCounter<T> { let counter_entry = local_counter.into_counter_entry(self.this_node); self.local_counter .db() - .transaction(|mut tx| self.table.queue_insert(&mut tx, &counter_entry))?; + .transaction(|tx| self.table.queue_insert(tx, &counter_entry))?; next_start = Some(counted_entry_k); } diff --git a/src/model/key_table.rs b/src/model/key_table.rs index bb5334a3..a9762f1b 100644 --- a/src/model/key_table.rs +++ b/src/model/key_table.rs @@ -149,11 +149,19 @@ impl Key { } /// Import a key from it's parts - pub fn import(key_id: &str, secret_key: &str, name: &str) -> Self { - Self { + pub fn import(key_id: &str, secret_key: &str, name: &str) -> Result<Self, &'static str> { + if key_id.len() != 26 || &key_id[..2] != "GK" || hex::decode(&key_id[2..]).is_err() { + return Err("The specified key ID is not a valid Garage key ID (starts with `GK`, followed by 12 hex-encoded bytes)"); + } + + if secret_key.len() != 64 || hex::decode(&secret_key).is_err() { + return Err("The specified secret key is not a valid Garage secret key (composed of 32 hex-encoded bytes)"); + } + + Ok(Self { key_id: key_id.to_string(), state: crdt::Deletable::present(KeyParams::new(secret_key, name)), - } + }) } /// Create a new Key which can me merged to mark an existing key deleted diff --git a/src/model/migrate.rs b/src/model/migrate.rs index 6b4c3eed..4c74b43b 100644 --- a/src/model/migrate.rs +++ b/src/model/migrate.rs @@ -78,6 +78,7 @@ impl Migrate { local_aliases: LwwMap::new(), website_config: Lww::new(website), cors_config: Lww::new(None), + lifecycle_config: Lww::new(None), quotas: Lww::new(Default::default()), }), }) diff --git a/src/model/s3/lifecycle_worker.rs b/src/model/s3/lifecycle_worker.rs new file mode 100644 index 00000000..50d4283f --- /dev/null +++ b/src/model/s3/lifecycle_worker.rs @@ -0,0 +1,410 @@ +use std::sync::Arc; + +use async_trait::async_trait; +use chrono::prelude::*; +use std::time::{Duration, Instant}; +use tokio::sync::watch; + +use garage_util::background::*; +use garage_util::data::*; +use garage_util::error::Error; +use garage_util::persister::PersisterShared; +use garage_util::time::*; + +use garage_table::EmptyKey; + +use crate::bucket_table::*; +use crate::s3::object_table::*; + +use crate::garage::Garage; + +mod v090 { + use serde::{Deserialize, Serialize}; + + #[derive(Serialize, Deserialize, Default, Clone)] + pub struct LifecycleWorkerPersisted { + pub last_completed: Option<String>, + } + + impl garage_util::migrate::InitialFormat for LifecycleWorkerPersisted { + const VERSION_MARKER: &'static [u8] = b"G09lwp"; + } +} + +pub use v090::*; + +pub struct LifecycleWorker { + garage: Arc<Garage>, + + state: State, + + persister: PersisterShared<LifecycleWorkerPersisted>, +} + +enum State { + Completed(NaiveDate), + Running { + date: NaiveDate, + pos: Vec<u8>, + counter: usize, + objects_expired: usize, + mpu_aborted: usize, + last_bucket: Option<Bucket>, + }, +} + +#[derive(Clone, Copy, Eq, PartialEq)] +enum Skip { + SkipBucket, + NextObject, +} + +pub fn register_bg_vars( + persister: &PersisterShared<LifecycleWorkerPersisted>, + vars: &mut vars::BgVars, +) { + vars.register_ro(persister, "lifecycle-last-completed", |p| { + p.get_with(|x| x.last_completed.clone().unwrap_or("never".to_string())) + }); +} + +impl LifecycleWorker { + pub fn new(garage: Arc<Garage>, persister: PersisterShared<LifecycleWorkerPersisted>) -> Self { + let today = today(); + let last_completed = persister.get_with(|x| { + x.last_completed + .as_deref() + .and_then(|x| x.parse::<NaiveDate>().ok()) + }); + let state = match last_completed { + Some(d) if d >= today => State::Completed(d), + _ => State::start(today), + }; + Self { + garage, + state, + persister, + } + } +} + +impl State { + fn start(date: NaiveDate) -> Self { + info!("Starting lifecycle worker for {}", date); + State::Running { + date, + pos: vec![], + counter: 0, + objects_expired: 0, + mpu_aborted: 0, + last_bucket: None, + } + } +} + +#[async_trait] +impl Worker for LifecycleWorker { + fn name(&self) -> String { + "object lifecycle worker".to_string() + } + + fn status(&self) -> WorkerStatus { + match &self.state { + State::Completed(d) => WorkerStatus { + freeform: vec![format!("Last completed: {}", d)], + ..Default::default() + }, + State::Running { + date, + counter, + objects_expired, + mpu_aborted, + .. + } => { + let n_objects = self + .garage + .object_table + .data + .store + .fast_len() + .unwrap_or(None); + let progress = match n_objects { + None => "...".to_string(), + Some(total) => format!( + "~{:.2}%", + 100. * std::cmp::min(*counter, total) as f32 / total as f32 + ), + }; + WorkerStatus { + progress: Some(progress), + freeform: vec![ + format!("Started: {}", date), + format!("Objects expired: {}", objects_expired), + format!("Multipart uploads aborted: { }", mpu_aborted), + ], + ..Default::default() + } + } + } + } + + async fn work(&mut self, _must_exit: &mut watch::Receiver<bool>) -> Result<WorkerState, Error> { + match &mut self.state { + State::Completed(_) => Ok(WorkerState::Idle), + State::Running { + date, + counter, + objects_expired, + mpu_aborted, + pos, + last_bucket, + } => { + // Process a batch of 100 items before yielding to bg task scheduler + for _ in 0..100 { + let (object_bytes, next_pos) = match self + .garage + .object_table + .data + .store + .get_gt(&pos)? + { + None => { + info!("Lifecycle worker finished for {}, objects expired: {}, mpu aborted: {}", date, *objects_expired, *mpu_aborted); + self.persister + .set_with(|x| x.last_completed = Some(date.to_string()))?; + self.state = State::Completed(*date); + return Ok(WorkerState::Idle); + } + Some((k, v)) => (v, k), + }; + + let object = self.garage.object_table.data.decode_entry(&object_bytes)?; + let skip = process_object( + &self.garage, + *date, + &object, + objects_expired, + mpu_aborted, + last_bucket, + ) + .await?; + + *counter += 1; + if skip == Skip::SkipBucket { + let bucket_id_len = object.bucket_id.as_slice().len(); + assert_eq!( + next_pos.get(..bucket_id_len), + Some(object.bucket_id.as_slice()) + ); + let last_bucket_pos = [&next_pos[..bucket_id_len], &[0xFFu8][..]].concat(); + *pos = std::cmp::max(next_pos, last_bucket_pos); + } else { + *pos = next_pos; + } + } + + Ok(WorkerState::Busy) + } + } + } + + async fn wait_for_work(&mut self) -> WorkerState { + match &self.state { + State::Completed(d) => { + let next_day = d.succ_opt().expect("no next day"); + let next_start = midnight_ts(next_day); + loop { + let now = now_msec(); + if now < next_start { + tokio::time::sleep_until( + (Instant::now() + Duration::from_millis(next_start - now)).into(), + ) + .await; + } else { + break; + } + } + self.state = State::start(std::cmp::max(next_day, today())); + } + State::Running { .. } => (), + } + WorkerState::Busy + } +} + +async fn process_object( + garage: &Arc<Garage>, + now_date: NaiveDate, + object: &Object, + objects_expired: &mut usize, + mpu_aborted: &mut usize, + last_bucket: &mut Option<Bucket>, +) -> Result<Skip, Error> { + if !object + .versions() + .iter() + .any(|x| x.is_data() || x.is_uploading(None)) + { + return Ok(Skip::NextObject); + } + + let bucket = match last_bucket.take() { + Some(b) if b.id == object.bucket_id => b, + _ => { + match garage + .bucket_table + .get(&EmptyKey, &object.bucket_id) + .await? + { + Some(b) => b, + None => { + warn!( + "Lifecycle worker: object in non-existent bucket {:?}", + object.bucket_id + ); + return Ok(Skip::SkipBucket); + } + } + } + }; + + let lifecycle_policy: &[LifecycleRule] = bucket + .state + .as_option() + .and_then(|s| s.lifecycle_config.get().as_deref()) + .unwrap_or_default(); + + if lifecycle_policy.iter().all(|x| !x.enabled) { + return Ok(Skip::SkipBucket); + } + + let db = garage.object_table.data.store.db(); + + for rule in lifecycle_policy.iter() { + if !rule.enabled { + continue; + } + + if let Some(pfx) = &rule.filter.prefix { + if !object.key.starts_with(pfx) { + continue; + } + } + + if let Some(expire) = &rule.expiration { + if let Some(current_version) = object.versions().iter().rev().find(|v| v.is_data()) { + let version_date = next_date(current_version.timestamp); + + let current_version_data = match ¤t_version.state { + ObjectVersionState::Complete(c) => c, + _ => unreachable!(), + }; + + let size_match = check_size_filter(current_version_data, &rule.filter); + let date_match = match expire { + LifecycleExpiration::AfterDays(n_days) => { + (now_date - version_date) >= chrono::Duration::days(*n_days as i64) + } + LifecycleExpiration::AtDate(exp_date) => { + if let Ok(exp_date) = parse_lifecycle_date(exp_date) { + now_date >= exp_date + } else { + warn!("Invalid expiration date stored in bucket {:?} lifecycle config: {}", bucket.id, exp_date); + false + } + } + }; + + if size_match && date_match { + // Delete expired version + let deleted_object = Object::new( + object.bucket_id, + object.key.clone(), + vec![ObjectVersion { + uuid: gen_uuid(), + timestamp: std::cmp::max(now_msec(), current_version.timestamp + 1), + state: ObjectVersionState::Complete(ObjectVersionData::DeleteMarker), + }], + ); + info!( + "Lifecycle: expiring 1 object in bucket {:?}", + object.bucket_id + ); + db.transaction(|tx| garage.object_table.queue_insert(tx, &deleted_object))?; + *objects_expired += 1; + } + } + } + + if let Some(abort_mpu_days) = &rule.abort_incomplete_mpu_days { + let aborted_versions = object + .versions() + .iter() + .filter_map(|v| { + let version_date = next_date(v.timestamp); + if (now_date - version_date) >= chrono::Duration::days(*abort_mpu_days as i64) + && matches!(&v.state, ObjectVersionState::Uploading { .. }) + { + Some(ObjectVersion { + state: ObjectVersionState::Aborted, + ..*v + }) + } else { + None + } + }) + .collect::<Vec<_>>(); + if !aborted_versions.is_empty() { + // Insert aborted mpu info + let n_aborted = aborted_versions.len(); + info!( + "Lifecycle: aborting {} incomplete upload(s) in bucket {:?}", + n_aborted, object.bucket_id + ); + let aborted_object = + Object::new(object.bucket_id, object.key.clone(), aborted_versions); + db.transaction(|tx| garage.object_table.queue_insert(tx, &aborted_object))?; + *mpu_aborted += n_aborted; + } + } + } + + *last_bucket = Some(bucket); + Ok(Skip::NextObject) +} + +fn check_size_filter(version_data: &ObjectVersionData, filter: &LifecycleFilter) -> bool { + let size = match version_data { + ObjectVersionData::Inline(meta, _) | ObjectVersionData::FirstBlock(meta, _) => meta.size, + _ => unreachable!(), + }; + if let Some(size_gt) = filter.size_gt { + if !(size > size_gt) { + return false; + } + } + if let Some(size_lt) = filter.size_lt { + if !(size < size_lt) { + return false; + } + } + true +} + +fn midnight_ts(date: NaiveDate) -> u64 { + date.and_hms_opt(0, 0, 0) + .expect("midnight does not exist") + .timestamp_millis() as u64 +} + +fn next_date(ts: u64) -> NaiveDate { + NaiveDateTime::from_timestamp_millis(ts as i64) + .expect("bad timestamp") + .date() + .succ_opt() + .expect("no next day") +} + +fn today() -> NaiveDate { + Utc::now().naive_utc().date() +} diff --git a/src/model/s3/mod.rs b/src/model/s3/mod.rs index 4e94337d..5c776fb0 100644 --- a/src/model/s3/mod.rs +++ b/src/model/s3/mod.rs @@ -1,3 +1,6 @@ pub mod block_ref_table; +pub mod mpu_table; pub mod object_table; pub mod version_table; + +pub mod lifecycle_worker; diff --git a/src/model/s3/mpu_table.rs b/src/model/s3/mpu_table.rs new file mode 100644 index 00000000..238cbf11 --- /dev/null +++ b/src/model/s3/mpu_table.rs @@ -0,0 +1,254 @@ +use std::sync::Arc; + +use garage_db as db; + +use garage_util::crdt::Crdt; +use garage_util::data::*; +use garage_util::time::*; + +use garage_table::replication::TableShardedReplication; +use garage_table::*; + +use crate::index_counter::*; +use crate::s3::version_table::*; + +pub const UPLOADS: &str = "uploads"; +pub const PARTS: &str = "parts"; +pub const BYTES: &str = "bytes"; + +mod v09 { + use garage_util::crdt; + use garage_util::data::Uuid; + use serde::{Deserialize, Serialize}; + + /// A part of a multipart upload + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct MultipartUpload { + /// Partition key = Upload id = UUID of the object version + pub upload_id: Uuid, + + /// The timestamp at which the multipart upload was created + pub timestamp: u64, + /// Is this multipart upload deleted + /// The MultipartUpload is marked as deleted as soon as the + /// multipart upload is either completed or aborted + pub deleted: crdt::Bool, + /// List of uploaded parts, key = (part number, timestamp) + /// In case of retries, all versions for each part are kept + /// Everything is cleaned up only once the MultipartUpload is marked deleted + pub parts: crdt::Map<MpuPartKey, MpuPart>, + + // Back link to bucket+key so that we can find the object this mpu + // belongs to and check whether it is still valid + /// Bucket in which the related object is stored + pub bucket_id: Uuid, + /// Key in which the related object is stored + pub key: String, + } + + #[derive(PartialEq, Eq, Clone, Copy, Debug, Serialize, Deserialize)] + pub struct MpuPartKey { + /// Number of the part + pub part_number: u64, + /// Timestamp of part upload + pub timestamp: u64, + } + + /// The version of an uploaded part + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct MpuPart { + /// Links to a Version in VersionTable + pub version: Uuid, + /// ETag of the content of this part (known only once done uploading) + pub etag: Option<String>, + /// Size of this part (known only once done uploading) + pub size: Option<u64>, + } + + impl garage_util::migrate::InitialFormat for MultipartUpload { + const VERSION_MARKER: &'static [u8] = b"G09s3mpu"; + } +} + +pub use v09::*; + +impl Ord for MpuPartKey { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.part_number + .cmp(&other.part_number) + .then(self.timestamp.cmp(&other.timestamp)) + } +} + +impl PartialOrd for MpuPartKey { + fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { + Some(self.cmp(other)) + } +} + +impl MultipartUpload { + pub fn new( + upload_id: Uuid, + timestamp: u64, + bucket_id: Uuid, + key: String, + deleted: bool, + ) -> Self { + Self { + upload_id, + timestamp, + deleted: crdt::Bool::new(deleted), + parts: crdt::Map::new(), + bucket_id, + key, + } + } + + pub fn next_timestamp(&self, part_number: u64) -> u64 { + std::cmp::max( + now_msec(), + 1 + self + .parts + .items() + .iter() + .filter(|(x, _)| x.part_number == part_number) + .map(|(x, _)| x.timestamp) + .max() + .unwrap_or(0), + ) + } +} + +impl Entry<Uuid, EmptyKey> for MultipartUpload { + fn partition_key(&self) -> &Uuid { + &self.upload_id + } + fn sort_key(&self) -> &EmptyKey { + &EmptyKey + } + fn is_tombstone(&self) -> bool { + self.deleted.get() + } +} + +impl Crdt for MultipartUpload { + fn merge(&mut self, other: &Self) { + self.deleted.merge(&other.deleted); + + if self.deleted.get() { + self.parts.clear(); + } else { + self.parts.merge(&other.parts); + } + } +} + +impl Crdt for MpuPart { + fn merge(&mut self, other: &Self) { + self.etag = match (self.etag.take(), &other.etag) { + (None, Some(_)) => other.etag.clone(), + (Some(x), Some(y)) if x < *y => other.etag.clone(), + (x, _) => x, + }; + self.size = match (self.size, other.size) { + (None, Some(_)) => other.size, + (Some(x), Some(y)) if x < y => other.size, + (x, _) => x, + }; + } +} + +pub struct MultipartUploadTable { + pub version_table: Arc<Table<VersionTable, TableShardedReplication>>, + pub mpu_counter_table: Arc<IndexCounter<MultipartUpload>>, +} + +impl TableSchema for MultipartUploadTable { + const TABLE_NAME: &'static str = "multipart_upload"; + + type P = Uuid; + type S = EmptyKey; + type E = MultipartUpload; + type Filter = DeletedFilter; + + fn updated( + &self, + tx: &mut db::Transaction, + old: Option<&Self::E>, + new: Option<&Self::E>, + ) -> db::TxOpResult<()> { + // 1. Count + let counter_res = self.mpu_counter_table.count(tx, old, new); + if let Err(e) = db::unabort(counter_res)? { + error!( + "Unable to update multipart object part counter: {}. Index values will be wrong!", + e + ); + } + + // 2. Propagate deletions to version table + if let (Some(old_mpu), Some(new_mpu)) = (old, new) { + if new_mpu.deleted.get() && !old_mpu.deleted.get() { + let deleted_versions = old_mpu.parts.items().iter().map(|(_k, p)| { + Version::new( + p.version, + VersionBacklink::MultipartUpload { + upload_id: old_mpu.upload_id, + }, + true, + ) + }); + for version in deleted_versions { + let res = self.version_table.queue_insert(tx, &version); + if let Err(e) = db::unabort(res)? { + error!("Unable to enqueue version deletion propagation: {}. A repair will be needed.", e); + } + } + } + } + + Ok(()) + } + + fn matches_filter(entry: &Self::E, filter: &Self::Filter) -> bool { + filter.apply(entry.is_tombstone()) + } +} + +impl CountedItem for MultipartUpload { + const COUNTER_TABLE_NAME: &'static str = "bucket_mpu_counter"; + + // Partition key = bucket id + type CP = Uuid; + // Sort key = nothing + type CS = EmptyKey; + + fn counter_partition_key(&self) -> &Uuid { + &self.bucket_id + } + fn counter_sort_key(&self) -> &EmptyKey { + &EmptyKey + } + + fn counts(&self) -> Vec<(&'static str, i64)> { + let uploads = if self.deleted.get() { 0 } else { 1 }; + let mut parts = self + .parts + .items() + .iter() + .map(|(k, _)| k.part_number) + .collect::<Vec<_>>(); + parts.dedup(); + let bytes = self + .parts + .items() + .iter() + .map(|(_, p)| p.size.unwrap_or(0)) + .sum::<u64>(); + vec![ + (UPLOADS, uploads), + (PARTS, parts.len() as i64), + (BYTES, bytes as i64), + ] + } +} diff --git a/src/model/s3/object_table.rs b/src/model/s3/object_table.rs index 518acc95..ebea04bd 100644 --- a/src/model/s3/object_table.rs +++ b/src/model/s3/object_table.rs @@ -10,6 +10,7 @@ use garage_table::replication::TableShardedReplication; use garage_table::*; use crate::index_counter::*; +use crate::s3::mpu_table::*; use crate::s3::version_table::*; pub const OBJECTS: &str = "objects"; @@ -130,7 +131,86 @@ mod v08 { } } -pub use v08::*; +mod v09 { + use garage_util::data::Uuid; + use serde::{Deserialize, Serialize}; + + use super::v08; + + pub use v08::{ObjectVersionData, ObjectVersionHeaders, ObjectVersionMeta}; + + /// An object + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct Object { + /// The bucket in which the object is stored, used as partition key + pub bucket_id: Uuid, + + /// The key at which the object is stored in its bucket, used as sorting key + pub key: String, + + /// The list of currenty stored versions of the object + pub(super) versions: Vec<ObjectVersion>, + } + + /// Informations about a version of an object + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct ObjectVersion { + /// Id of the version + pub uuid: Uuid, + /// Timestamp of when the object was created + pub timestamp: u64, + /// State of the version + pub state: ObjectVersionState, + } + + /// State of an object version + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub enum ObjectVersionState { + /// The version is being received + Uploading { + /// Indicates whether this is a multipart upload + multipart: bool, + /// Headers to be included in the final object + headers: ObjectVersionHeaders, + }, + /// The version is fully received + Complete(ObjectVersionData), + /// The version uploaded containded errors or the upload was explicitly aborted + Aborted, + } + + impl garage_util::migrate::Migrate for Object { + const VERSION_MARKER: &'static [u8] = b"G09s3o"; + + type Previous = v08::Object; + + fn migrate(old: v08::Object) -> Object { + let versions = old + .versions + .into_iter() + .map(|x| ObjectVersion { + uuid: x.uuid, + timestamp: x.timestamp, + state: match x.state { + v08::ObjectVersionState::Uploading(h) => ObjectVersionState::Uploading { + multipart: false, + headers: h, + }, + v08::ObjectVersionState::Complete(d) => ObjectVersionState::Complete(d), + v08::ObjectVersionState::Aborted => ObjectVersionState::Aborted, + }, + }) + .collect(); + Object { + bucket_id: old.bucket_id, + key: old.key, + versions, + } + } + } +} + +pub use v09::*; impl Object { /// Initialize an Object struct from parts @@ -180,11 +260,11 @@ impl Crdt for ObjectVersionState { Complete(a) => { a.merge(b); } - Uploading(_) => { + Uploading { .. } => { *self = Complete(b.clone()); } }, - Uploading(_) => {} + Uploading { .. } => {} } } } @@ -199,8 +279,17 @@ impl ObjectVersion { } /// Is the object version currently being uploaded - pub fn is_uploading(&self) -> bool { - matches!(self.state, ObjectVersionState::Uploading(_)) + /// + /// matches only multipart uploads if check_multipart is Some(true) + /// matches only non-multipart uploads if check_multipart is Some(false) + /// matches both if check_multipart is None + pub fn is_uploading(&self, check_multipart: Option<bool>) -> bool { + match &self.state { + ObjectVersionState::Uploading { multipart, .. } => { + check_multipart.map(|x| x == *multipart).unwrap_or(true) + } + _ => false, + } } /// Is the object version completely received @@ -267,13 +356,20 @@ impl Crdt for Object { pub struct ObjectTable { pub version_table: Arc<Table<VersionTable, TableShardedReplication>>, + pub mpu_table: Arc<Table<MultipartUploadTable, TableShardedReplication>>, pub object_counter_table: Arc<IndexCounter<Object>>, } #[derive(Clone, Copy, Debug, Serialize, Deserialize)] pub enum ObjectFilter { + /// Is the object version available (received and not a tombstone) IsData, - IsUploading, + /// Is the object version currently being uploaded + /// + /// matches only multipart uploads if check_multipart is Some(true) + /// matches only non-multipart uploads if check_multipart is Some(false) + /// matches both if check_multipart is None + IsUploading { check_multipart: Option<bool> }, } impl TableSchema for ObjectTable { @@ -301,21 +397,28 @@ impl TableSchema for ObjectTable { // 2. Enqueue propagation deletions to version table if let (Some(old_v), Some(new_v)) = (old, new) { - // Propagate deletion of old versions for v in old_v.versions.iter() { - let newly_deleted = match new_v + let new_v_id = new_v .versions - .binary_search_by(|nv| nv.cmp_key().cmp(&v.cmp_key())) - { + .binary_search_by(|nv| nv.cmp_key().cmp(&v.cmp_key())); + + // Propagate deletion of old versions to the Version table + let delete_version = match new_v_id { Err(_) => true, Ok(i) => { new_v.versions[i].state == ObjectVersionState::Aborted && v.state != ObjectVersionState::Aborted } }; - if newly_deleted { - let deleted_version = - Version::new(v.uuid, old_v.bucket_id, old_v.key.clone(), true); + if delete_version { + let deleted_version = Version::new( + v.uuid, + VersionBacklink::Object { + bucket_id: old_v.bucket_id, + key: old_v.key.clone(), + }, + true, + ); let res = self.version_table.queue_insert(tx, &deleted_version); if let Err(e) = db::unabort(res)? { error!( @@ -324,6 +427,39 @@ impl TableSchema for ObjectTable { ); } } + + // After abortion or completion of multipart uploads, delete MPU table entry + if matches!( + v.state, + ObjectVersionState::Uploading { + multipart: true, + .. + } + ) { + let delete_mpu = match new_v_id { + Err(_) => true, + Ok(i) => !matches!( + new_v.versions[i].state, + ObjectVersionState::Uploading { .. } + ), + }; + if delete_mpu { + let deleted_mpu = MultipartUpload::new( + v.uuid, + v.timestamp, + old_v.bucket_id, + old_v.key.clone(), + true, + ); + let res = self.mpu_table.queue_insert(tx, &deleted_mpu); + if let Err(e) = db::unabort(res)? { + error!( + "Unable to enqueue multipart upload deletion propagation: {}. A repair will be needed.", + e + ); + } + } + } } } @@ -333,7 +469,10 @@ impl TableSchema for ObjectTable { fn matches_filter(entry: &Self::E, filter: &Self::Filter) -> bool { match filter { ObjectFilter::IsData => entry.versions.iter().any(|v| v.is_data()), - ObjectFilter::IsUploading => entry.versions.iter().any(|v| v.is_uploading()), + ObjectFilter::IsUploading { check_multipart } => entry + .versions + .iter() + .any(|v| v.is_uploading(*check_multipart)), } } } @@ -360,10 +499,7 @@ impl CountedItem for Object { } else { 0 }; - let n_unfinished_uploads = versions - .iter() - .filter(|v| matches!(v.state, ObjectVersionState::Uploading(_))) - .count(); + let n_unfinished_uploads = versions.iter().filter(|v| v.is_uploading(None)).count(); let n_bytes = versions .iter() .map(|v| match &v.state { diff --git a/src/model/s3/version_table.rs b/src/model/s3/version_table.rs index 6edc83f4..5c032f9f 100644 --- a/src/model/s3/version_table.rs +++ b/src/model/s3/version_table.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use garage_db as db; use garage_util::data::*; +use garage_util::error::*; use garage_table::crdt::*; use garage_table::replication::TableShardedReplication; @@ -66,6 +67,8 @@ mod v08 { use super::v05; + pub use v05::{VersionBlock, VersionBlockKey}; + /// A version of an object #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] pub struct Version { @@ -90,8 +93,6 @@ mod v08 { pub key: String, } - pub use v05::{VersionBlock, VersionBlockKey}; - impl garage_util::migrate::Migrate for Version { type Previous = v05::Version; @@ -110,32 +111,94 @@ mod v08 { } } -pub use v08::*; +pub(crate) mod v09 { + use garage_util::crdt; + use garage_util::data::Uuid; + use serde::{Deserialize, Serialize}; + + use super::v08; + + pub use v08::{VersionBlock, VersionBlockKey}; + + /// A version of an object + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub struct Version { + /// UUID of the version, used as partition key + pub uuid: Uuid, + + // Actual data: the blocks for this version + // In the case of a multipart upload, also store the etags + // of individual parts and check them when doing CompleteMultipartUpload + /// Is this version deleted + pub deleted: crdt::Bool, + /// list of blocks of data composing the version + pub blocks: crdt::Map<VersionBlockKey, VersionBlock>, + + // Back link to owner of this version (either an object or a multipart + // upload), used to find whether it has been deleted and this version + // should in turn be deleted (see versions repair procedure) + pub backlink: VersionBacklink, + } + + #[derive(PartialEq, Eq, Clone, Debug, Serialize, Deserialize)] + pub enum VersionBacklink { + Object { + /// Bucket in which the related object is stored + bucket_id: Uuid, + /// Key in which the related object is stored + key: String, + }, + MultipartUpload { + upload_id: Uuid, + }, + } + + impl garage_util::migrate::Migrate for Version { + const VERSION_MARKER: &'static [u8] = b"G09s3v"; + + type Previous = v08::Version; + + fn migrate(old: v08::Version) -> Version { + Version { + uuid: old.uuid, + deleted: old.deleted, + blocks: old.blocks, + backlink: VersionBacklink::Object { + bucket_id: old.bucket_id, + key: old.key, + }, + } + } + } +} + +pub use v09::*; impl Version { - pub fn new(uuid: Uuid, bucket_id: Uuid, key: String, deleted: bool) -> Self { + pub fn new(uuid: Uuid, backlink: VersionBacklink, deleted: bool) -> Self { Self { uuid, deleted: deleted.into(), blocks: crdt::Map::new(), - parts_etags: crdt::Map::new(), - bucket_id, - key, + backlink, } } pub fn has_part_number(&self, part_number: u64) -> bool { - let case1 = self - .parts_etags + self.blocks .items() - .binary_search_by(|(k, _)| k.cmp(&part_number)) - .is_ok(); - let case2 = self + .binary_search_by(|(k, _)| k.part_number.cmp(&part_number)) + .is_ok() + } + + pub fn n_parts(&self) -> Result<u64, Error> { + Ok(self .blocks .items() - .binary_search_by(|(k, _)| k.part_number.cmp(&part_number)) - .is_ok(); - case1 || case2 + .last() + .ok_or_message("version has no parts")? + .0 + .part_number) } } @@ -175,10 +238,8 @@ impl Crdt for Version { if self.deleted.get() { self.blocks.clear(); - self.parts_etags.clear(); } else { self.blocks.merge(&other.blocks); - self.parts_etags.merge(&other.parts_etags); } } } diff --git a/src/rpc/Cargo.toml b/src/rpc/Cargo.toml index 0cda723e..028c1367 100644 --- a/src/rpc/Cargo.toml +++ b/src/rpc/Cargo.toml @@ -14,15 +14,18 @@ path = "lib.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +format_table.workspace = true garage_db.workspace = true garage_util.workspace = true arc-swap = "1.0" bytes = "1.0" +bytesize = "1.1" gethostname = "0.4" hex = "0.4" tracing = "0.1" rand = "0.8" +itertools="0.10" sodiumoxide = { version = "0.2.5-0", package = "kuska-sodiumoxide" } nix = { version = "0.27", default-features = false, features = ["fs"] } @@ -46,7 +49,7 @@ tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi tokio-stream = { version = "0.1", features = ["net"] } opentelemetry = "0.17" -netapp = { version = "=0.5.2", features = ["telemetry"] } +netapp = { version = "0.10", features = ["telemetry"] } [features] kubernetes-discovery = [ "kube", "k8s-openapi", "schemars" ] diff --git a/src/rpc/graph_algo.rs b/src/rpc/graph_algo.rs new file mode 100644 index 00000000..d8c6c9b9 --- /dev/null +++ b/src/rpc/graph_algo.rs @@ -0,0 +1,415 @@ +//! This module deals with graph algorithms. +//! It is used in layout.rs to build the partition to node assignment. + +use rand::prelude::{SeedableRng, SliceRandom}; +use std::cmp::{max, min}; +use std::collections::HashMap; +use std::collections::VecDeque; + +/// Vertex data structures used in all the graphs used in layout.rs. +/// usize parameters correspond to node/zone/partitions ids. +/// To understand the vertex roles below, please refer to the formal description +/// of the layout computation algorithm. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Vertex { + Source, + Pup(usize), // The vertex p+ of partition p + Pdown(usize), // The vertex p- of partition p + PZ(usize, usize), // The vertex corresponding to x_(partition p, zone z) + N(usize), // The vertex corresponding to node n + Sink, +} + +/// Edge data structure for the flow algorithm. +#[derive(Clone, Copy, Debug)] +pub struct FlowEdge { + cap: u64, // flow maximal capacity of the edge + flow: i64, // flow value on the edge + dest: usize, // destination vertex id + rev: usize, // index of the reversed edge (v, self) in the edge list of vertex v +} + +/// Edge data structure for the detection of negative cycles. +#[derive(Clone, Copy, Debug)] +pub struct WeightedEdge { + w: i64, // weight of the edge + dest: usize, +} + +pub trait Edge: Clone + Copy {} +impl Edge for FlowEdge {} +impl Edge for WeightedEdge {} + +/// Struct for the graph structure. We do encapsulation here to be able to both +/// provide user friendly Vertex enum to address vertices, and to use internally usize +/// indices and Vec instead of HashMap in the graph algorithm to optimize execution speed. +pub struct Graph<E: Edge> { + vertex_to_id: HashMap<Vertex, usize>, + id_to_vertex: Vec<Vertex>, + + // The graph is stored as an adjacency list + graph: Vec<Vec<E>>, +} + +pub type CostFunction = HashMap<(Vertex, Vertex), i64>; + +impl<E: Edge> Graph<E> { + pub fn new(vertices: &[Vertex]) -> Self { + let mut map = HashMap::<Vertex, usize>::new(); + for (i, vert) in vertices.iter().enumerate() { + map.insert(*vert, i); + } + Graph::<E> { + vertex_to_id: map, + id_to_vertex: vertices.to_vec(), + graph: vec![Vec::<E>::new(); vertices.len()], + } + } + + fn get_vertex_id(&self, v: &Vertex) -> Result<usize, String> { + self.vertex_to_id + .get(v) + .cloned() + .ok_or_else(|| format!("The graph does not contain vertex {:?}", v)) + } +} + +impl Graph<FlowEdge> { + /// This function adds a directed edge to the graph with capacity c, and the + /// corresponding reversed edge with capacity 0. + pub fn add_edge(&mut self, u: Vertex, v: Vertex, c: u64) -> Result<(), String> { + let idu = self.get_vertex_id(&u)?; + let idv = self.get_vertex_id(&v)?; + if idu == idv { + return Err("Cannot add edge from vertex to itself in flow graph".into()); + } + + let rev_u = self.graph[idu].len(); + let rev_v = self.graph[idv].len(); + self.graph[idu].push(FlowEdge { + cap: c, + dest: idv, + flow: 0, + rev: rev_v, + }); + self.graph[idv].push(FlowEdge { + cap: 0, + dest: idu, + flow: 0, + rev: rev_u, + }); + Ok(()) + } + + /// This function returns the list of vertices that receive a positive flow from + /// vertex v. + pub fn get_positive_flow_from(&self, v: Vertex) -> Result<Vec<Vertex>, String> { + let idv = self.get_vertex_id(&v)?; + let mut result = Vec::<Vertex>::new(); + for edge in self.graph[idv].iter() { + if edge.flow > 0 { + result.push(self.id_to_vertex[edge.dest]); + } + } + Ok(result) + } + + /// This function returns the value of the flow incoming to v. + pub fn get_inflow(&self, v: Vertex) -> Result<i64, String> { + let idv = self.get_vertex_id(&v)?; + let mut result = 0; + for edge in self.graph[idv].iter() { + result += max(0, self.graph[edge.dest][edge.rev].flow); + } + Ok(result) + } + + /// This function returns the value of the flow outgoing from v. + pub fn get_outflow(&self, v: Vertex) -> Result<i64, String> { + let idv = self.get_vertex_id(&v)?; + let mut result = 0; + for edge in self.graph[idv].iter() { + result += max(0, edge.flow); + } + Ok(result) + } + + /// This function computes the flow total value by computing the outgoing flow + /// from the source. + pub fn get_flow_value(&mut self) -> Result<i64, String> { + self.get_outflow(Vertex::Source) + } + + /// This function shuffles the order of the edge lists. It keeps the ids of the + /// reversed edges consistent. + fn shuffle_edges(&mut self) { + // We use deterministic randomness so that the layout calculation algorihtm + // will output the same thing every time it is run. This way, the results + // pre-calculated in `garage layout show` will match exactly those used + // in practice with `garage layout apply` + let mut rng = rand::rngs::StdRng::from_seed([0x12u8; 32]); + for i in 0..self.graph.len() { + self.graph[i].shuffle(&mut rng); + // We need to update the ids of the reverse edges. + for j in 0..self.graph[i].len() { + let target_v = self.graph[i][j].dest; + let target_rev = self.graph[i][j].rev; + self.graph[target_v][target_rev].rev = j; + } + } + } + + /// Computes an upper bound of the flow on the graph + pub fn flow_upper_bound(&self) -> Result<u64, String> { + let idsource = self.get_vertex_id(&Vertex::Source)?; + let mut flow_upper_bound = 0; + for edge in self.graph[idsource].iter() { + flow_upper_bound += edge.cap; + } + Ok(flow_upper_bound) + } + + /// This function computes the maximal flow using Dinic's algorithm. It starts with + /// the flow values already present in the graph. So it is possible to add some edge to + /// the graph, compute a flow, add other edges, update the flow. + pub fn compute_maximal_flow(&mut self) -> Result<(), String> { + let idsource = self.get_vertex_id(&Vertex::Source)?; + let idsink = self.get_vertex_id(&Vertex::Sink)?; + + let nb_vertices = self.graph.len(); + + let flow_upper_bound = self.flow_upper_bound()?; + + // To ensure the dispersion of the associations generated by the + // assignment, we shuffle the neighbours of the nodes. Hence, + // the vertices do not consider their neighbours in the same order. + self.shuffle_edges(); + + // We run Dinic's max flow algorithm + loop { + // We build the level array from Dinic's algorithm. + let mut level = vec![None; nb_vertices]; + + let mut fifo = VecDeque::new(); + fifo.push_back((idsource, 0)); + while let Some((id, lvl)) = fifo.pop_front() { + if level[id].is_none() { + // it means id has not yet been reached + level[id] = Some(lvl); + for edge in self.graph[id].iter() { + if edge.cap as i64 - edge.flow > 0 { + fifo.push_back((edge.dest, lvl + 1)); + } + } + } + } + if level[idsink].is_none() { + // There is no residual flow + break; + } + // Now we run DFS respecting the level array + let mut next_nbd = vec![0; nb_vertices]; + let mut lifo = Vec::new(); + + lifo.push((idsource, flow_upper_bound)); + + while let Some((id, f)) = lifo.last().cloned() { + if id == idsink { + // The DFS reached the sink, we can add a + // residual flow. + lifo.pop(); + while let Some((id, _)) = lifo.pop() { + let nbd = next_nbd[id]; + self.graph[id][nbd].flow += f as i64; + let id_rev = self.graph[id][nbd].dest; + let nbd_rev = self.graph[id][nbd].rev; + self.graph[id_rev][nbd_rev].flow -= f as i64; + } + lifo.push((idsource, flow_upper_bound)); + continue; + } + // else we did not reach the sink + let nbd = next_nbd[id]; + if nbd >= self.graph[id].len() { + // There is nothing to explore from id anymore + lifo.pop(); + if let Some((parent, _)) = lifo.last() { + next_nbd[*parent] += 1; + } + continue; + } + // else we can try to send flow from id to its nbd + let new_flow = min( + f as i64, + self.graph[id][nbd].cap as i64 - self.graph[id][nbd].flow, + ) as u64; + if new_flow == 0 { + next_nbd[id] += 1; + continue; + } + if let (Some(lvldest), Some(lvlid)) = (level[self.graph[id][nbd].dest], level[id]) { + if lvldest <= lvlid { + // We cannot send flow to nbd. + next_nbd[id] += 1; + continue; + } + } + // otherwise, we send flow to nbd. + lifo.push((self.graph[id][nbd].dest, new_flow)); + } + } + Ok(()) + } + + /// This function takes a flow, and a cost function on the edges, and tries to find an + /// equivalent flow with a better cost, by finding improving overflow cycles. It uses + /// as subroutine the Bellman Ford algorithm run up to path_length. + /// We assume that the cost of edge (u,v) is the opposite of the cost of (v,u), and + /// only one needs to be present in the cost function. + pub fn optimize_flow_with_cost( + &mut self, + cost: &CostFunction, + path_length: usize, + ) -> Result<(), String> { + // We build the weighted graph g where we will look for negative cycle + let mut gf = self.build_cost_graph(cost)?; + let mut cycles = gf.list_negative_cycles(path_length); + while !cycles.is_empty() { + // we enumerate negative cycles + for c in cycles.iter() { + for i in 0..c.len() { + // We add one flow unit to the edge (u,v) of cycle c + let idu = self.vertex_to_id[&c[i]]; + let idv = self.vertex_to_id[&c[(i + 1) % c.len()]]; + for j in 0..self.graph[idu].len() { + // since idu appears at most once in the cycles, we enumerate every + // edge at most once. + let edge = self.graph[idu][j]; + if edge.dest == idv { + self.graph[idu][j].flow += 1; + self.graph[idv][edge.rev].flow -= 1; + break; + } + } + } + } + + gf = self.build_cost_graph(cost)?; + cycles = gf.list_negative_cycles(path_length); + } + Ok(()) + } + + /// Construct the weighted graph G_f from the flow and the cost function + fn build_cost_graph(&self, cost: &CostFunction) -> Result<Graph<WeightedEdge>, String> { + let mut g = Graph::<WeightedEdge>::new(&self.id_to_vertex); + let nb_vertices = self.id_to_vertex.len(); + for i in 0..nb_vertices { + for edge in self.graph[i].iter() { + if edge.cap as i64 - edge.flow > 0 { + // It is possible to send overflow through this edge + let u = self.id_to_vertex[i]; + let v = self.id_to_vertex[edge.dest]; + if cost.contains_key(&(u, v)) { + g.add_edge(u, v, cost[&(u, v)])?; + } else if cost.contains_key(&(v, u)) { + g.add_edge(u, v, -cost[&(v, u)])?; + } else { + g.add_edge(u, v, 0)?; + } + } + } + } + Ok(g) + } +} + +impl Graph<WeightedEdge> { + /// This function adds a single directed weighted edge to the graph. + pub fn add_edge(&mut self, u: Vertex, v: Vertex, w: i64) -> Result<(), String> { + let idu = self.get_vertex_id(&u)?; + let idv = self.get_vertex_id(&v)?; + self.graph[idu].push(WeightedEdge { w, dest: idv }); + Ok(()) + } + + /// This function lists the negative cycles it manages to find after path_length + /// iterations of the main loop of the Bellman-Ford algorithm. For the classical + /// algorithm, path_length needs to be equal to the number of vertices. However, + /// for particular graph structures like in our case, the algorithm is still correct + /// when path_length is the length of the longest possible simple path. + /// See the formal description of the algorithm for more details. + fn list_negative_cycles(&self, path_length: usize) -> Vec<Vec<Vertex>> { + let nb_vertices = self.graph.len(); + + // We start with every vertex at distance 0 of some imaginary extra -1 vertex. + let mut distance = vec![0; nb_vertices]; + // The prev vector collects for every vertex from where does the shortest path come + let mut prev = vec![None; nb_vertices]; + + for _ in 0..path_length + 1 { + for id in 0..nb_vertices { + for e in self.graph[id].iter() { + if distance[id] + e.w < distance[e.dest] { + distance[e.dest] = distance[id] + e.w; + prev[e.dest] = Some(id); + } + } + } + } + + // If self.graph contains a negative cycle, then at this point the graph described + // by prev (which is a directed 1-forest/functional graph) + // must contain a cycle. We list the cycles of prev. + let cycles_prev = cycles_of_1_forest(&prev); + + // Remark that the cycle in prev is in the reverse order compared to the cycle + // in the graph. Thus the .rev(). + return cycles_prev + .iter() + .map(|cycle| { + cycle + .iter() + .rev() + .map(|id| self.id_to_vertex[*id]) + .collect() + }) + .collect(); + } +} + +/// This function returns the list of cycles of a directed 1 forest. It does not +/// check for the consistency of the input. +fn cycles_of_1_forest(forest: &[Option<usize>]) -> Vec<Vec<usize>> { + let mut cycles = Vec::<Vec<usize>>::new(); + let mut time_of_discovery = vec![None; forest.len()]; + + for t in 0..forest.len() { + let mut id = t; + // while we are on a valid undiscovered node + while time_of_discovery[id].is_none() { + time_of_discovery[id] = Some(t); + if let Some(i) = forest[id] { + id = i; + } else { + break; + } + } + if forest[id].is_some() && time_of_discovery[id] == Some(t) { + // We discovered an id that we explored at this iteration t. + // It means we are on a cycle + let mut cy = vec![id; 1]; + let mut id2 = id; + while let Some(id_next) = forest[id2] { + id2 = id_next; + if id2 != id { + cy.push(id2); + } else { + break; + } + } + cycles.push(cy); + } + } + cycles +} diff --git a/src/rpc/layout.rs b/src/rpc/layout.rs index 1030e3a6..e02a180b 100644 --- a/src/rpc/layout.rs +++ b/src/rpc/layout.rs @@ -1,87 +1,286 @@ use std::cmp::Ordering; -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; +use std::collections::HashSet; +use std::fmt; -use serde::{Deserialize, Serialize}; +use bytesize::ByteSize; +use itertools::Itertools; -use garage_util::crdt::{AutoCrdt, Crdt, LwwMap}; +use garage_util::crdt::{AutoCrdt, Crdt, Lww, LwwMap}; use garage_util::data::*; use garage_util::encode::nonversioned_encode; use garage_util::error::*; +use crate::graph_algo::*; + use crate::ring::*; -/// The layout of the cluster, i.e. the list of roles -/// which are assigned to each cluster node -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct ClusterLayout { - pub version: u64, - - pub replication_factor: usize, - pub roles: LwwMap<Uuid, NodeRoleV>, - - /// node_id_vec: a vector of node IDs with a role assigned - /// in the system (this includes gateway nodes). - /// The order here is different than the vec stored by `roles`, because: - /// 1. non-gateway nodes are first so that they have lower numbers - /// 2. nodes that don't have a role are excluded (but they need to - /// stay in the CRDT as tombstones) - pub node_id_vec: Vec<Uuid>, - /// the assignation of data partitions to node, the values - /// are indices in node_id_vec - #[serde(with = "serde_bytes")] - pub ring_assignation_data: Vec<CompactNodeType>, - - /// Role changes which are staged for the next version of the layout - pub staging: LwwMap<Uuid, NodeRoleV>, - pub staging_hash: Hash, +use std::convert::TryInto; + +const NB_PARTITIONS: usize = 1usize << PARTITION_BITS; + +// The Message type will be used to collect information on the algorithm. +type Message = Vec<String>; + +mod v08 { + use crate::ring::CompactNodeType; + use garage_util::crdt::LwwMap; + use garage_util::data::{Hash, Uuid}; + use serde::{Deserialize, Serialize}; + + /// The layout of the cluster, i.e. the list of roles + /// which are assigned to each cluster node + #[derive(Clone, Debug, Serialize, Deserialize)] + pub struct ClusterLayout { + pub version: u64, + + pub replication_factor: usize, + pub roles: LwwMap<Uuid, NodeRoleV>, + + /// node_id_vec: a vector of node IDs with a role assigned + /// in the system (this includes gateway nodes). + /// The order here is different than the vec stored by `roles`, because: + /// 1. non-gateway nodes are first so that they have lower numbers + /// 2. nodes that don't have a role are excluded (but they need to + /// stay in the CRDT as tombstones) + pub node_id_vec: Vec<Uuid>, + /// the assignation of data partitions to node, the values + /// are indices in node_id_vec + #[serde(with = "serde_bytes")] + pub ring_assignation_data: Vec<CompactNodeType>, + + /// Role changes which are staged for the next version of the layout + pub staging: LwwMap<Uuid, NodeRoleV>, + pub staging_hash: Hash, + } + + #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] + pub struct NodeRoleV(pub Option<NodeRole>); + + /// The user-assigned roles of cluster nodes + #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] + pub struct NodeRole { + /// Datacenter at which this entry belong. This information is used to + /// perform a better geodistribution + pub zone: String, + /// The capacity of the node + /// If this is set to None, the node does not participate in storing data for the system + /// and is only active as an API gateway to other nodes + pub capacity: Option<u64>, + /// A set of tags to recognize the node + pub tags: Vec<String>, + } + + impl garage_util::migrate::InitialFormat for ClusterLayout {} } -impl garage_util::migrate::InitialFormat for ClusterLayout {} +mod v09 { + use super::v08; + use crate::ring::CompactNodeType; + use garage_util::crdt::{Lww, LwwMap}; + use garage_util::data::{Hash, Uuid}; + use serde::{Deserialize, Serialize}; + pub use v08::{NodeRole, NodeRoleV}; + + /// The layout of the cluster, i.e. the list of roles + /// which are assigned to each cluster node + #[derive(Clone, Debug, Serialize, Deserialize)] + pub struct ClusterLayout { + pub version: u64, + + pub replication_factor: usize, + + /// This attribute is only used to retain the previously computed partition size, + /// to know to what extent does it change with the layout update. + pub partition_size: u64, + /// Parameters used to compute the assignment currently given by + /// ring_assignment_data + pub parameters: LayoutParameters, + + pub roles: LwwMap<Uuid, NodeRoleV>, + + /// see comment in v08::ClusterLayout + pub node_id_vec: Vec<Uuid>, + /// see comment in v08::ClusterLayout + #[serde(with = "serde_bytes")] + pub ring_assignment_data: Vec<CompactNodeType>, + + /// Parameters to be used in the next partition assignment computation. + pub staging_parameters: Lww<LayoutParameters>, + /// Role changes which are staged for the next version of the layout + pub staging_roles: LwwMap<Uuid, NodeRoleV>, + pub staging_hash: Hash, + } + + /// This struct is used to set the parameters to be used in the assignment computation + /// algorithm. It is stored as a Crdt. + #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Serialize, Deserialize)] + pub struct LayoutParameters { + pub zone_redundancy: ZoneRedundancy, + } -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] -pub struct NodeRoleV(pub Option<NodeRole>); + /// Zone redundancy: if set to AtLeast(x), the layout calculation will aim to store copies + /// of each partition on at least that number of different zones. + /// Otherwise, copies will be stored on the maximum possible number of zones. + #[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Debug, Serialize, Deserialize)] + pub enum ZoneRedundancy { + AtLeast(usize), + Maximum, + } -impl AutoCrdt for NodeRoleV { + impl garage_util::migrate::Migrate for ClusterLayout { + const VERSION_MARKER: &'static [u8] = b"G09layout"; + + type Previous = v08::ClusterLayout; + + fn migrate(previous: Self::Previous) -> Self { + use itertools::Itertools; + + // In the old layout, capacities are in an arbitrary unit, + // but in the new layout they are in bytes. + // Here we arbitrarily multiply everything by 1G, + // such that 1 old capacity unit = 1GB in the new units. + // This is totally arbitrary and won't work for most users. + let cap_mul = 1024 * 1024 * 1024; + let roles = multiply_all_capacities(previous.roles, cap_mul); + let staging_roles = multiply_all_capacities(previous.staging, cap_mul); + let node_id_vec = previous.node_id_vec; + + // Determine partition size + let mut tmp = previous.ring_assignation_data.clone(); + tmp.sort(); + let partition_size = tmp + .into_iter() + .dedup_with_count() + .map(|(npart, node)| { + roles + .get(&node_id_vec[node as usize]) + .and_then(|p| p.0.as_ref().and_then(|r| r.capacity)) + .unwrap_or(0) / npart as u64 + }) + .min() + .unwrap_or(0); + + // By default, zone_redundancy is maximum possible value + let parameters = LayoutParameters { + zone_redundancy: ZoneRedundancy::Maximum, + }; + + let mut res = Self { + version: previous.version, + replication_factor: previous.replication_factor, + partition_size, + parameters, + roles, + node_id_vec, + ring_assignment_data: previous.ring_assignation_data, + staging_parameters: Lww::new(parameters), + staging_roles, + staging_hash: [0u8; 32].into(), + }; + res.staging_hash = res.calculate_staging_hash(); + res + } + } + + fn multiply_all_capacities( + old_roles: LwwMap<Uuid, NodeRoleV>, + mul: u64, + ) -> LwwMap<Uuid, NodeRoleV> { + let mut new_roles = LwwMap::new(); + for (node, ts, role) in old_roles.items() { + let mut role = role.clone(); + if let NodeRoleV(Some(NodeRole { + capacity: Some(ref mut cap), + .. + })) = role + { + *cap *= mul; + } + new_roles.merge_raw(node, *ts, &role); + } + new_roles + } +} + +pub use v09::*; + +impl AutoCrdt for LayoutParameters { const WARN_IF_DIFFERENT: bool = true; } -/// The user-assigned roles of cluster nodes -#[derive(PartialEq, Eq, PartialOrd, Ord, Clone, Debug, Serialize, Deserialize)] -pub struct NodeRole { - /// Datacenter at which this entry belong. This information might be used to perform a better - /// geodistribution - pub zone: String, - /// The (relative) capacity of the node - /// If this is set to None, the node does not participate in storing data for the system - /// and is only active as an API gateway to other nodes - pub capacity: Option<u32>, - /// A set of tags to recognize the node - pub tags: Vec<String>, +impl AutoCrdt for NodeRoleV { + const WARN_IF_DIFFERENT: bool = true; } impl NodeRole { pub fn capacity_string(&self) -> String { match self.capacity { - Some(c) => format!("{}", c), + Some(c) => ByteSize::b(c).to_string_as(false), None => "gateway".to_string(), } } + + pub fn tags_string(&self) -> String { + self.tags.join(",") + } } +impl fmt::Display for ZoneRedundancy { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ZoneRedundancy::Maximum => write!(f, "maximum"), + ZoneRedundancy::AtLeast(x) => write!(f, "{}", x), + } + } +} + +impl core::str::FromStr for ZoneRedundancy { + type Err = &'static str; + fn from_str(s: &str) -> Result<Self, Self::Err> { + match s { + "none" | "max" | "maximum" => Ok(ZoneRedundancy::Maximum), + x => { + let v = x + .parse::<usize>() + .map_err(|_| "zone redundancy must be 'none'/'max' or an integer")?; + Ok(ZoneRedundancy::AtLeast(v)) + } + } + } +} + +// Implementation of the ClusterLayout methods unrelated to the assignment algorithm. impl ClusterLayout { pub fn new(replication_factor: usize) -> Self { + // We set the default zone redundancy to be Maximum, meaning that the maximum + // possible value will be used depending on the cluster topology + let parameters = LayoutParameters { + zone_redundancy: ZoneRedundancy::Maximum, + }; + let staging_parameters = Lww::<LayoutParameters>::new(parameters); + let empty_lwwmap = LwwMap::new(); - let empty_lwwmap_hash = blake2sum(&nonversioned_encode(&empty_lwwmap).unwrap()[..]); - ClusterLayout { + let mut ret = ClusterLayout { version: 0, replication_factor, + partition_size: 0, roles: LwwMap::new(), node_id_vec: Vec::new(), - ring_assignation_data: Vec::new(), - staging: empty_lwwmap, - staging_hash: empty_lwwmap_hash, - } + ring_assignment_data: Vec::new(), + parameters, + staging_parameters, + staging_roles: empty_lwwmap, + staging_hash: [0u8; 32].into(), + }; + ret.staging_hash = ret.calculate_staging_hash(); + ret + } + + fn calculate_staging_hash(&self) -> Hash { + let hashed_tuple = (&self.staging_roles, &self.staging_parameters); + blake2sum(&nonversioned_encode(&hashed_tuple).unwrap()[..]) } pub fn merge(&mut self, other: &ClusterLayout) -> bool { @@ -91,9 +290,10 @@ impl ClusterLayout { true } Ordering::Equal => { - self.staging.merge(&other.staging); + self.staging_parameters.merge(&other.staging_parameters); + self.staging_roles.merge(&other.staging_roles); - let new_staging_hash = blake2sum(&nonversioned_encode(&self.staging).unwrap()[..]); + let new_staging_hash = self.calculate_staging_hash(); let changed = new_staging_hash != self.staging_hash; self.staging_hash = new_staging_hash; @@ -104,7 +304,7 @@ impl ClusterLayout { } } - pub fn apply_staged_changes(mut self, version: Option<u64>) -> Result<Self, Error> { + pub fn apply_staged_changes(mut self, version: Option<u64>) -> Result<(Self, Message), Error> { match version { None => { let error = r#" @@ -120,19 +320,18 @@ To know the correct value of the new layout version, invoke `garage layout show` } } - self.roles.merge(&self.staging); + self.roles.merge(&self.staging_roles); self.roles.retain(|(_, _, v)| v.0.is_some()); + self.parameters = *self.staging_parameters.get(); - if !self.calculate_partition_assignation() { - return Err(Error::Message("Could not calculate new assignation of partitions to nodes. This can happen if there are less nodes than the desired number of copies of your data (see the replication_mode configuration parameter).".into())); - } + self.staging_roles.clear(); + self.staging_hash = self.calculate_staging_hash(); - self.staging.clear(); - self.staging_hash = blake2sum(&nonversioned_encode(&self.staging).unwrap()[..]); + let msg = self.calculate_partition_assignment()?; self.version += 1; - Ok(self) + Ok((self, msg)) } pub fn revert_staged_changes(mut self, version: Option<u64>) -> Result<Self, Error> { @@ -151,8 +350,9 @@ To know the correct value of the new layout version, invoke `garage layout show` } } - self.staging.clear(); - self.staging_hash = blake2sum(&nonversioned_encode(&self.staging).unwrap()[..]); + self.staging_roles.clear(); + self.staging_parameters.update(self.parameters); + self.staging_hash = self.calculate_staging_hash(); self.version += 1; @@ -177,13 +377,98 @@ To know the correct value of the new layout version, invoke `garage layout show` } } + /// Returns the uuids of the non_gateway nodes in self.node_id_vec. + fn nongateway_nodes(&self) -> Vec<Uuid> { + let mut result = Vec::<Uuid>::new(); + for uuid in self.node_id_vec.iter() { + match self.node_role(uuid) { + Some(role) if role.capacity.is_some() => result.push(*uuid), + _ => (), + } + } + result + } + + /// Given a node uuids, this function returns the label of its zone + fn get_node_zone(&self, uuid: &Uuid) -> Result<String, Error> { + match self.node_role(uuid) { + Some(role) => Ok(role.zone.clone()), + _ => Err(Error::Message( + "The Uuid does not correspond to a node present in the cluster.".into(), + )), + } + } + + /// Given a node uuids, this function returns its capacity or fails if it does not have any + pub fn get_node_capacity(&self, uuid: &Uuid) -> Result<u64, Error> { + match self.node_role(uuid) { + Some(NodeRole { + capacity: Some(cap), + zone: _, + tags: _, + }) => Ok(*cap), + _ => Err(Error::Message( + "The Uuid does not correspond to a node present in the \ + cluster or this node does not have a positive capacity." + .into(), + )), + } + } + + /// Returns the number of partitions associated to this node in the ring + pub fn get_node_usage(&self, uuid: &Uuid) -> Result<usize, Error> { + for (i, id) in self.node_id_vec.iter().enumerate() { + if id == uuid { + let mut count = 0; + for nod in self.ring_assignment_data.iter() { + if i as u8 == *nod { + count += 1 + } + } + return Ok(count); + } + } + Err(Error::Message( + "The Uuid does not correspond to a node present in the \ + cluster or this node does not have a positive capacity." + .into(), + )) + } + + /// Returns the sum of capacities of non gateway nodes in the cluster + fn get_total_capacity(&self) -> Result<u64, Error> { + let mut total_capacity = 0; + for uuid in self.nongateway_nodes().iter() { + total_capacity += self.get_node_capacity(uuid)?; + } + Ok(total_capacity) + } + + /// Returns the effective value of the zone_redundancy parameter + fn effective_zone_redundancy(&self) -> usize { + match self.parameters.zone_redundancy { + ZoneRedundancy::AtLeast(v) => v, + ZoneRedundancy::Maximum => { + let n_zones = self + .roles + .items() + .iter() + .filter_map(|(_, _, role)| role.0.as_ref().map(|x| x.zone.as_str())) + .collect::<HashSet<&str>>() + .len(); + std::cmp::min(n_zones, self.replication_factor) + } + } + } + /// Check a cluster layout for internal consistency + /// (assignment, roles, parameters, partition size) /// returns true if consistent, false if error - pub fn check(&self) -> bool { + pub fn check(&self) -> Result<(), String> { // Check that the hash of the staging data is correct - let staging_hash = blake2sum(&nonversioned_encode(&self.staging).unwrap()[..]); + let staging_hash = self.calculate_staging_hash(); if staging_hash != self.staging_hash { - return false; + return Err("staging_hash is incorrect".into()); } // Check that node_id_vec contains the correct list of nodes @@ -198,472 +483,811 @@ To know the correct value of the new layout version, invoke `garage layout show` let mut node_id_vec = self.node_id_vec.clone(); node_id_vec.sort(); if expected_nodes != node_id_vec { - return false; + return Err(format!("node_id_vec does not contain the correct set of nodes\nnode_id_vec: {:?}\nexpected: {:?}", node_id_vec, expected_nodes)); } - // Check that the assignation data has the correct length - if self.ring_assignation_data.len() != (1 << PARTITION_BITS) * self.replication_factor { - return false; + // Check that the assignment data has the correct length + let expected_assignment_data_len = (1 << PARTITION_BITS) * self.replication_factor; + if self.ring_assignment_data.len() != expected_assignment_data_len { + return Err(format!( + "ring_assignment_data has incorrect length {} instead of {}", + self.ring_assignment_data.len(), + expected_assignment_data_len + )); } // Check that the assigned nodes are correct identifiers // of nodes that are assigned a role // and that role is not the role of a gateway nodes - for x in self.ring_assignation_data.iter() { + for x in self.ring_assignment_data.iter() { if *x as usize >= self.node_id_vec.len() { - return false; + return Err(format!( + "ring_assignment_data contains invalid node id {}", + *x + )); } let node = self.node_id_vec[*x as usize]; match self.roles.get(&node) { Some(NodeRoleV(Some(x))) if x.capacity.is_some() => (), - _ => return false, + _ => return Err("ring_assignment_data contains id of a gateway node".into()), + } + } + + // Check that every partition is associated to distinct nodes + let zone_redundancy = self.effective_zone_redundancy(); + let rf = self.replication_factor; + for p in 0..(1 << PARTITION_BITS) { + let nodes_of_p = self.ring_assignment_data[rf * p..rf * (p + 1)].to_vec(); + if nodes_of_p.iter().unique().count() != rf { + return Err(format!("partition does not contain {} unique node ids", rf)); + } + // Check that every partition is spread over at least zone_redundancy zones. + let zones_of_p = nodes_of_p + .iter() + .map(|n| { + self.get_node_zone(&self.node_id_vec[*n as usize]) + .expect("Zone not found.") + }) + .collect::<Vec<_>>(); + if zones_of_p.iter().unique().count() < zone_redundancy { + return Err(format!( + "nodes of partition are in less than {} distinct zones", + zone_redundancy + )); + } + } + + // Check that the nodes capacities is consistent with the stored partitions + let mut node_usage = vec![0; MAX_NODE_NUMBER]; + for n in self.ring_assignment_data.iter() { + node_usage[*n as usize] += 1; + } + for (n, usage) in node_usage.iter().enumerate() { + if *usage > 0 { + let uuid = self.node_id_vec[n]; + let partusage = usage * self.partition_size; + let nodecap = self.get_node_capacity(&uuid).unwrap(); + if partusage > nodecap { + return Err(format!( + "node usage ({}) is bigger than node capacity ({})", + usage * self.partition_size, + nodecap + )); + } } } - true + // Check that the partition size stored is the one computed by the asignation + // algorithm. + let cl2 = self.clone(); + let (_, zone_to_id) = cl2.generate_nongateway_zone_ids().unwrap(); + match cl2.compute_optimal_partition_size(&zone_to_id, zone_redundancy) { + Ok(s) if s != self.partition_size => { + return Err(format!( + "partition_size ({}) is different than optimal value ({})", + self.partition_size, s + )) + } + Err(e) => return Err(format!("could not calculate optimal partition size: {}", e)), + _ => (), + } + + Ok(()) } +} - /// Calculate an assignation of partitions to nodes - pub fn calculate_partition_assignation(&mut self) -> bool { - let (configured_nodes, zones) = self.configured_nodes_and_zones(); - let n_zones = zones.len(); +// ==================================================================================== - println!("Calculating updated partition assignation, this may take some time..."); - println!(); +// Implementation of the ClusterLayout methods related to the assignment algorithm. +impl ClusterLayout { + /// This function calculates a new partition-to-node assignment. + /// The computed assignment respects the node replication factor + /// and the zone redundancy parameter It maximizes the capacity of a + /// partition (assuming all partitions have the same size). + /// Among such optimal assignment, it minimizes the distance to + /// the former assignment (if any) to minimize the amount of + /// data to be moved. + /// Staged role changes must be merged with nodes roles before calling this function, + /// hence it must only be called from apply_staged_changes() and hence is not public. + fn calculate_partition_assignment(&mut self) -> Result<Message, Error> { + // We update the node ids, since the node role list might have changed with the + // changes in the layout. We retrieve the old_assignment reframed with new ids + let old_assignment_opt = self.update_node_id_vec()?; + + let zone_redundancy = self.effective_zone_redundancy(); + + let mut msg = Message::new(); + msg.push("==== COMPUTATION OF A NEW PARTITION ASSIGNATION ====".into()); + msg.push("".into()); + msg.push(format!( + "Partitions are \ + replicated {} times on at least {} distinct zones.", + self.replication_factor, zone_redundancy + )); + + // We generate for once numerical ids for the zones of non gateway nodes, + // to use them as indices in the flow graphs. + let (id_to_zone, zone_to_id) = self.generate_nongateway_zone_ids()?; + + let nb_nongateway_nodes = self.nongateway_nodes().len(); + if nb_nongateway_nodes < self.replication_factor { + return Err(Error::Message(format!( + "The number of nodes with positive \ + capacity ({}) is smaller than the replication factor ({}).", + nb_nongateway_nodes, self.replication_factor + ))); + } + if id_to_zone.len() < zone_redundancy { + return Err(Error::Message(format!( + "The number of zones with non-gateway \ + nodes ({}) is smaller than the redundancy parameter ({})", + id_to_zone.len(), + zone_redundancy + ))); + } - // Get old partition assignation - let old_partitions = self.parse_assignation_data(); + // We compute the optimal partition size + // Capacities should be given in a unit so that partition size is at least 100. + // In this case, integer rounding plays a marginal role in the percentages of + // optimality. + let partition_size = self.compute_optimal_partition_size(&zone_to_id, zone_redundancy)?; + + msg.push("".into()); + if old_assignment_opt.is_some() { + msg.push(format!( + "Optimal partition size: {} ({} in previous layout)", + ByteSize::b(partition_size).to_string_as(false), + ByteSize::b(self.partition_size).to_string_as(false) + )); + } else { + msg.push(format!( + "Optimal partition size: {}", + ByteSize::b(partition_size).to_string_as(false) + )); + } + // We write the partition size. + self.partition_size = partition_size; + + if partition_size < 100 { + msg.push( + "WARNING: The partition size is low (< 100), make sure the capacities of your nodes are correct and are of at least a few MB" + .into(), + ); + } - // Start new partition assignation with nodes from old assignation where it is relevant - let mut partitions = old_partitions - .iter() - .map(|old_part| { - let mut new_part = PartitionAss::new(); - for node in old_part.nodes.iter() { - if let Some(role) = node.1 { - if role.capacity.is_some() { - new_part.add(None, n_zones, node.0, role); - } - } - } - new_part - }) - .collect::<Vec<_>>(); + // We compute a first flow/assignment that is heuristically close to the previous + // assignment + let mut gflow = + self.compute_candidate_assignment(&zone_to_id, &old_assignment_opt, zone_redundancy)?; + if let Some(assoc) = &old_assignment_opt { + // We minimize the distance to the previous assignment. + self.minimize_rebalance_load(&mut gflow, &zone_to_id, assoc)?; + } - // In various cases, not enough nodes will have been added for all partitions - // in the step above (e.g. due to node removals, or new zones being added). - // Here we add more nodes to make a complete (but sub-optimal) assignation, - // using an initial partition assignation that is calculated using the multi-dc maglev trick - match self.initial_partition_assignation() { - Some(initial_partitions) => { - for (part, ipart) in partitions.iter_mut().zip(initial_partitions.iter()) { - for _ in 0..2 { - for (id, info) in ipart.nodes.iter() { - if part.nodes.len() < self.replication_factor { - part.add(None, n_zones, id, info.unwrap()); - } - } - } - assert!(part.nodes.len() == self.replication_factor); - } - } - None => { - // Not enough nodes in cluster to build a correct assignation. - // Signal it by returning an error. - return false; - } + // We display statistics of the computation + msg.extend(self.output_stat(&gflow, &old_assignment_opt, &zone_to_id, &id_to_zone)?); + + // We update the layout structure + self.update_ring_from_flow(id_to_zone.len(), &gflow)?; + + if let Err(e) = self.check() { + return Err(Error::Message( + format!("Layout check returned an error: {}\nOriginal result of computation: <<<<\n{}\n>>>>", e, msg.join("\n")) + )); } - // Calculate how many partitions each node should ideally store, - // and how many partitions they are storing with the current assignation - // This defines our target for which we will optimize in the following loop. - let total_capacity = configured_nodes + Ok(msg) + } + + /// The LwwMap of node roles might have changed. This function updates the node_id_vec + /// and returns the assignment given by ring, with the new indices of the nodes, and + /// None if the node is not present anymore. + /// We work with the assumption that only this function and calculate_new_assignment + /// do modify assignment_ring and node_id_vec. + fn update_node_id_vec(&mut self) -> Result<Option<Vec<Vec<usize>>>, Error> { + // (1) We compute the new node list + // Non gateway nodes should be coded on 8bits, hence they must be first in the list + // We build the new node ids + let new_non_gateway_nodes: Vec<Uuid> = self + .roles + .items() .iter() - .map(|(_, info)| info.capacity.unwrap_or(0)) - .sum::<u32>() as usize; - let total_partitions = self.replication_factor * (1 << PARTITION_BITS); - let target_partitions_per_node = configured_nodes + .filter(|(_, _, v)| matches!(&v.0, Some(r) if r.capacity.is_some())) + .map(|(k, _, _)| *k) + .collect(); + + if new_non_gateway_nodes.len() > MAX_NODE_NUMBER { + return Err(Error::Message(format!( + "There are more than {} non-gateway nodes in the new \ + layout. This is not allowed.", + MAX_NODE_NUMBER + ))); + } + + let new_gateway_nodes: Vec<Uuid> = self + .roles + .items() .iter() - .map(|(id, info)| { - ( - *id, - info.capacity.unwrap_or(0) as usize * total_partitions / total_capacity, - ) - }) - .collect::<HashMap<&Uuid, usize>>(); - - let mut partitions_per_node = self.partitions_per_node(&partitions[..]); - - println!("Target number of partitions per node:"); - for (node, npart) in target_partitions_per_node.iter() { - println!("{:?}\t{}", node, npart); - } - println!(); - - // Shuffle partitions between nodes so that nodes will reach (or better approach) - // their target number of stored partitions - loop { - let mut option = None; - for (i, part) in partitions.iter_mut().enumerate() { - for (irm, (idrm, _)) in part.nodes.iter().enumerate() { - let errratio = |node, parts| { - let tgt = *target_partitions_per_node.get(node).unwrap() as f32; - (parts - tgt) / tgt - }; - let square = |x| x * x; - - let partsrm = partitions_per_node.get(*idrm).cloned().unwrap_or(0) as f32; - - for (idadd, infoadd) in configured_nodes.iter() { - // skip replacing a node by itself - // and skip replacing by gateway nodes - if idadd == idrm || infoadd.capacity.is_none() { - continue; - } + .filter(|(_, _, v)| matches!(v, NodeRoleV(Some(r)) if r.capacity.is_none())) + .map(|(k, _, _)| *k) + .collect(); + + let mut new_node_id_vec = Vec::<Uuid>::new(); + new_node_id_vec.extend(new_non_gateway_nodes); + new_node_id_vec.extend(new_gateway_nodes); + + let old_node_id_vec = self.node_id_vec.clone(); + self.node_id_vec = new_node_id_vec.clone(); + + // (2) We retrieve the old association + // We rewrite the old association with the new indices. We only consider partition + // to node assignments where the node is still in use. + if self.ring_assignment_data.is_empty() { + // This is a new association + return Ok(None); + } - // We want to try replacing node idrm by node idadd - // if that brings us close to our goal. - let partsadd = partitions_per_node.get(*idadd).cloned().unwrap_or(0) as f32; - let oldcost = square(errratio(*idrm, partsrm) - errratio(*idadd, partsadd)); - let newcost = - square(errratio(*idrm, partsrm - 1.) - errratio(*idadd, partsadd + 1.)); - if newcost >= oldcost { - // not closer to our goal - continue; - } - let gain = oldcost - newcost; + if self.ring_assignment_data.len() != NB_PARTITIONS * self.replication_factor { + return Err(Error::Message( + "The old assignment does not have a size corresponding to \ + the old replication factor or the number of partitions." + .into(), + )); + } - let mut newpart = part.clone(); + // We build a translation table between the uuid and new ids + let mut uuid_to_new_id = HashMap::<Uuid, usize>::new(); - newpart.nodes.remove(irm); - if !newpart.add(None, n_zones, idadd, infoadd) { - continue; - } - assert!(newpart.nodes.len() == self.replication_factor); + // We add the indices of only the new non-gateway nodes that can be used in the + // association ring + for (i, uuid) in new_node_id_vec.iter().enumerate() { + uuid_to_new_id.insert(*uuid, i); + } - if !old_partitions[i] - .is_valid_transition_to(&newpart, self.replication_factor) - { - continue; - } + let mut old_assignment = vec![Vec::<usize>::new(); NB_PARTITIONS]; + let rf = self.replication_factor; - if option - .as_ref() - .map(|(old_gain, _, _, _, _)| gain > *old_gain) - .unwrap_or(true) - { - option = Some((gain, i, idadd, idrm, newpart)); - } - } + for (p, old_assign_p) in old_assignment.iter_mut().enumerate() { + for old_id in &self.ring_assignment_data[p * rf..(p + 1) * rf] { + let uuid = old_node_id_vec[*old_id as usize]; + if uuid_to_new_id.contains_key(&uuid) { + old_assign_p.push(uuid_to_new_id[&uuid]); } } - if let Some((_gain, i, idadd, idrm, newpart)) = option { - *partitions_per_node.entry(idadd).or_insert(0) += 1; - *partitions_per_node.get_mut(idrm).unwrap() -= 1; - partitions[i] = newpart; - } else { - break; - } } - // Check we completed the assignation correctly - // (this is a set of checks for the algorithm's consistency) - assert!(partitions.len() == (1 << PARTITION_BITS)); - assert!(partitions - .iter() - .all(|p| p.nodes.len() == self.replication_factor)); + // We write the ring + self.ring_assignment_data = Vec::<CompactNodeType>::new(); - let new_partitions_per_node = self.partitions_per_node(&partitions[..]); - assert!(new_partitions_per_node == partitions_per_node); + Ok(Some(old_assignment)) + } - // Show statistics - println!("New number of partitions per node:"); - for (node, npart) in partitions_per_node.iter() { - let tgt = *target_partitions_per_node.get(node).unwrap(); - let pct = 100f32 * (*npart as f32) / (tgt as f32); - println!("{:?}\t{}\t({}% of {})", node, npart, pct as i32, tgt); + /// This function generates ids for the zone of the nodes appearing in + /// self.node_id_vec. + fn generate_nongateway_zone_ids(&self) -> Result<(Vec<String>, HashMap<String, usize>), Error> { + let mut id_to_zone = Vec::<String>::new(); + let mut zone_to_id = HashMap::<String, usize>::new(); + + for uuid in self.nongateway_nodes().iter() { + let r = self.node_role(uuid).unwrap(); + if !zone_to_id.contains_key(&r.zone) && r.capacity.is_some() { + zone_to_id.insert(r.zone.clone(), id_to_zone.len()); + id_to_zone.push(r.zone.clone()); + } } - println!(); + Ok((id_to_zone, zone_to_id)) + } - let mut diffcount = HashMap::new(); - for (oldpart, newpart) in old_partitions.iter().zip(partitions.iter()) { - let nminus = oldpart.txtplus(newpart); - let nplus = newpart.txtplus(oldpart); - if nminus != "[...]" || nplus != "[...]" { - let tup = (nminus, nplus); - *diffcount.entry(tup).or_insert(0) += 1; - } + /// This function computes by dichotomy the largest realizable partition size, given + /// the layout roles and parameters. + fn compute_optimal_partition_size( + &self, + zone_to_id: &HashMap<String, usize>, + zone_redundancy: usize, + ) -> Result<u64, Error> { + let empty_set = HashSet::<(usize, usize)>::new(); + let mut g = self.generate_flow_graph(1, zone_to_id, &empty_set, zone_redundancy)?; + g.compute_maximal_flow()?; + if g.get_flow_value()? < (NB_PARTITIONS * self.replication_factor) as i64 { + return Err(Error::Message( + "The storage capacity of he cluster is to small. It is \ + impossible to store partitions of size 1." + .into(), + )); } - if diffcount.is_empty() { - println!("No data will be moved between nodes."); - } else { - let mut diffcount = diffcount.into_iter().collect::<Vec<_>>(); - diffcount.sort(); - println!("Number of partitions that move:"); - for ((nminus, nplus), npart) in diffcount { - println!("\t{}\t{} -> {}", npart, nminus, nplus); + + let mut s_down = 1; + let mut s_up = self.get_total_capacity()?; + while s_down + 1 < s_up { + g = self.generate_flow_graph( + (s_down + s_up) / 2, + zone_to_id, + &empty_set, + zone_redundancy, + )?; + g.compute_maximal_flow()?; + if g.get_flow_value()? < (NB_PARTITIONS * self.replication_factor) as i64 { + s_up = (s_down + s_up) / 2; + } else { + s_down = (s_down + s_up) / 2; } } - println!(); - - // Calculate and save new assignation data - let (nodes, assignation_data) = - self.compute_assignation_data(&configured_nodes[..], &partitions[..]); - self.node_id_vec = nodes; - self.ring_assignation_data = assignation_data; - - true + Ok(s_down) } - fn initial_partition_assignation(&self) -> Option<Vec<PartitionAss<'_>>> { - let (configured_nodes, zones) = self.configured_nodes_and_zones(); - let n_zones = zones.len(); - - // Create a vector of partition indices (0 to 2**PARTITION_BITS-1) - let partitions_idx = (0usize..(1usize << PARTITION_BITS)).collect::<Vec<_>>(); - - // Prepare ring - let mut partitions: Vec<PartitionAss> = partitions_idx - .iter() - .map(|_i| PartitionAss::new()) - .collect::<Vec<_>>(); + fn generate_graph_vertices(nb_zones: usize, nb_nodes: usize) -> Vec<Vertex> { + let mut vertices = vec![Vertex::Source, Vertex::Sink]; + for p in 0..NB_PARTITIONS { + vertices.push(Vertex::Pup(p)); + vertices.push(Vertex::Pdown(p)); + for z in 0..nb_zones { + vertices.push(Vertex::PZ(p, z)); + } + } + for n in 0..nb_nodes { + vertices.push(Vertex::N(n)); + } + vertices + } - // Create MagLev priority queues for each node - let mut queues = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(node_id, node_info)| { - let mut parts = partitions_idx - .iter() - .map(|i| { - let part_data = - [&u16::to_be_bytes(*i as u16)[..], node_id.as_slice()].concat(); - (*i, fasthash(&part_data[..])) - }) - .collect::<Vec<_>>(); - parts.sort_by_key(|(_i, h)| *h); - let parts_i = parts.iter().map(|(i, _h)| *i).collect::<Vec<_>>(); - (node_id, node_info, parts_i, 0) - }) - .collect::<Vec<_>>(); + /// Generates the graph to compute the maximal flow corresponding to the optimal + /// partition assignment. + /// exclude_assoc is the set of (partition, node) association that we are forbidden + /// to use (hence we do not add the corresponding edge to the graph). This parameter + /// is used to compute a first flow that uses only edges appearing in the previous + /// assignment. This produces a solution that heuristically should be close to the + /// previous one. + fn generate_flow_graph( + &self, + partition_size: u64, + zone_to_id: &HashMap<String, usize>, + exclude_assoc: &HashSet<(usize, usize)>, + zone_redundancy: usize, + ) -> Result<Graph<FlowEdge>, Error> { + let vertices = + ClusterLayout::generate_graph_vertices(zone_to_id.len(), self.nongateway_nodes().len()); + let mut g = Graph::<FlowEdge>::new(&vertices); + let nb_zones = zone_to_id.len(); + for p in 0..NB_PARTITIONS { + g.add_edge(Vertex::Source, Vertex::Pup(p), zone_redundancy as u64)?; + g.add_edge( + Vertex::Source, + Vertex::Pdown(p), + (self.replication_factor - zone_redundancy) as u64, + )?; + for z in 0..nb_zones { + g.add_edge(Vertex::Pup(p), Vertex::PZ(p, z), 1)?; + g.add_edge( + Vertex::Pdown(p), + Vertex::PZ(p, z), + self.replication_factor as u64, + )?; + } + } + for n in 0..self.nongateway_nodes().len() { + let node_capacity = self.get_node_capacity(&self.node_id_vec[n])?; + let node_zone = zone_to_id[&self.get_node_zone(&self.node_id_vec[n])?]; + g.add_edge(Vertex::N(n), Vertex::Sink, node_capacity / partition_size)?; + for p in 0..NB_PARTITIONS { + if !exclude_assoc.contains(&(p, n)) { + g.add_edge(Vertex::PZ(p, node_zone), Vertex::N(n), 1)?; + } + } + } + Ok(g) + } - let max_capacity = configured_nodes - .iter() - .filter_map(|(_, node_info)| node_info.capacity) - .fold(0, std::cmp::max); - - // Fill up ring - for rep in 0..self.replication_factor { - queues.sort_by_key(|(ni, _np, _q, _p)| { - let queue_data = [&u16::to_be_bytes(rep as u16)[..], ni.as_slice()].concat(); - fasthash(&queue_data[..]) - }); - - for (_, _, _, pos) in queues.iter_mut() { - *pos = 0; - } - - let mut remaining = partitions_idx.len(); - while remaining > 0 { - let remaining0 = remaining; - for i_round in 0..max_capacity { - for (node_id, node_info, q, pos) in queues.iter_mut() { - if i_round >= node_info.capacity.unwrap() { - continue; - } - for (pos2, &qv) in q.iter().enumerate().skip(*pos) { - if partitions[qv].add(Some(rep + 1), n_zones, node_id, node_info) { - remaining -= 1; - *pos = pos2 + 1; - break; - } - } - } + /// This function computes a first optimal assignment (in the form of a flow graph). + fn compute_candidate_assignment( + &self, + zone_to_id: &HashMap<String, usize>, + prev_assign_opt: &Option<Vec<Vec<usize>>>, + zone_redundancy: usize, + ) -> Result<Graph<FlowEdge>, Error> { + // We list the (partition,node) associations that are not used in the + // previous assignment + let mut exclude_edge = HashSet::<(usize, usize)>::new(); + if let Some(prev_assign) = prev_assign_opt { + let nb_nodes = self.nongateway_nodes().len(); + for (p, prev_assign_p) in prev_assign.iter().enumerate() { + for n in 0..nb_nodes { + exclude_edge.insert((p, n)); } - if remaining == remaining0 { - // No progress made, exit - return None; + for n in prev_assign_p.iter() { + exclude_edge.remove(&(p, *n)); } } } - Some(partitions) + // We compute the best flow using only the edges used in the previous assignment + let mut g = self.generate_flow_graph( + self.partition_size, + zone_to_id, + &exclude_edge, + zone_redundancy, + )?; + g.compute_maximal_flow()?; + + // We add the excluded edges and compute the maximal flow with the full graph. + // The algorithm is such that it will start with the flow that we just computed + // and find ameliorating paths from that. + for (p, n) in exclude_edge.iter() { + let node_zone = zone_to_id[&self.get_node_zone(&self.node_id_vec[*n])?]; + g.add_edge(Vertex::PZ(*p, node_zone), Vertex::N(*n), 1)?; + } + g.compute_maximal_flow()?; + Ok(g) } - fn configured_nodes_and_zones(&self) -> (Vec<(&Uuid, &NodeRole)>, HashSet<&str>) { - let configured_nodes = self - .roles - .items() - .iter() - .filter(|(_id, _, info)| info.0.is_some()) - .map(|(id, _, info)| (id, info.0.as_ref().unwrap())) - .collect::<Vec<(&Uuid, &NodeRole)>>(); + /// This function updates the flow graph gflow to minimize the distance between + /// its corresponding assignment and the previous one + fn minimize_rebalance_load( + &self, + gflow: &mut Graph<FlowEdge>, + zone_to_id: &HashMap<String, usize>, + prev_assign: &[Vec<usize>], + ) -> Result<(), Error> { + // We define a cost function on the edges (pairs of vertices) corresponding + // to the distance between the two assignments. + let mut cost = CostFunction::new(); + for (p, assoc_p) in prev_assign.iter().enumerate() { + for n in assoc_p.iter() { + let node_zone = zone_to_id[&self.get_node_zone(&self.node_id_vec[*n])?]; + cost.insert((Vertex::PZ(p, node_zone), Vertex::N(*n)), -1); + } + } - let zones = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(_id, info)| info.zone.as_str()) - .collect::<HashSet<&str>>(); + // We compute the maximal length of a simple path in gflow. It is used in the + // Bellman-Ford algorithm in optimize_flow_with_cost to set the number + // of iterations. + let nb_nodes = self.nongateway_nodes().len(); + let path_length = 4 * nb_nodes; + gflow.optimize_flow_with_cost(&cost, path_length)?; - (configured_nodes, zones) + Ok(()) } - fn compute_assignation_data<'a>( - &self, - configured_nodes: &[(&'a Uuid, &'a NodeRole)], - partitions: &[PartitionAss<'a>], - ) -> (Vec<Uuid>, Vec<CompactNodeType>) { - assert!(partitions.len() == (1 << PARTITION_BITS)); - - // Make a canonical order for nodes - let mut nodes = configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_some()) - .map(|(id, _)| **id) - .collect::<Vec<_>>(); - let nodes_rev = nodes - .iter() - .enumerate() - .map(|(i, id)| (*id, i as CompactNodeType)) - .collect::<HashMap<Uuid, CompactNodeType>>(); - - let mut assignation_data = vec![]; - for partition in partitions.iter() { - assert!(partition.nodes.len() == self.replication_factor); - for (id, _) in partition.nodes.iter() { - assignation_data.push(*nodes_rev.get(id).unwrap()); + /// This function updates the assignment ring from the flow graph. + fn update_ring_from_flow( + &mut self, + nb_zones: usize, + gflow: &Graph<FlowEdge>, + ) -> Result<(), Error> { + self.ring_assignment_data = Vec::<CompactNodeType>::new(); + for p in 0..NB_PARTITIONS { + for z in 0..nb_zones { + let assoc_vertex = gflow.get_positive_flow_from(Vertex::PZ(p, z))?; + for vertex in assoc_vertex.iter() { + if let Vertex::N(n) = vertex { + self.ring_assignment_data.push((*n).try_into().unwrap()); + } + } } } - nodes.extend( - configured_nodes - .iter() - .filter(|(_id, info)| info.capacity.is_none()) - .map(|(id, _)| **id), - ); - - (nodes, assignation_data) + if self.ring_assignment_data.len() != NB_PARTITIONS * self.replication_factor { + return Err(Error::Message( + "Critical Error : the association ring we produced does not \ + have the right size." + .into(), + )); + } + Ok(()) } - fn parse_assignation_data(&self) -> Vec<PartitionAss<'_>> { - if self.ring_assignation_data.len() == self.replication_factor * (1 << PARTITION_BITS) { - // If the previous assignation data is correct, use that - let mut partitions = vec![]; - for i in 0..(1 << PARTITION_BITS) { - let mut part = PartitionAss::new(); - for node_i in self.ring_assignation_data - [i * self.replication_factor..(i + 1) * self.replication_factor] - .iter() - { - let node_id = &self.node_id_vec[*node_i as usize]; + /// This function returns a message summing up the partition repartition of the new + /// layout, and other statistics of the partition assignment computation. + fn output_stat( + &self, + gflow: &Graph<FlowEdge>, + prev_assign_opt: &Option<Vec<Vec<usize>>>, + zone_to_id: &HashMap<String, usize>, + id_to_zone: &[String], + ) -> Result<Message, Error> { + let mut msg = Message::new(); + + let used_cap = self.partition_size * NB_PARTITIONS as u64 * self.replication_factor as u64; + let total_cap = self.get_total_capacity()?; + let percent_cap = 100.0 * (used_cap as f32) / (total_cap as f32); + msg.push(format!( + "Usable capacity / total cluster capacity: {} / {} ({:.1} %)", + ByteSize::b(used_cap).to_string_as(false), + ByteSize::b(total_cap).to_string_as(false), + percent_cap + )); + msg.push(format!( + "Effective capacity (replication factor {}): {}", + self.replication_factor, + ByteSize::b(used_cap / self.replication_factor as u64).to_string_as(false) + )); + if percent_cap < 80. { + msg.push("".into()); + msg.push( + "If the percentage is too low, it might be that the \ + cluster topology and redundancy constraints are forcing the use of nodes/zones with small \ + storage capacities." + .into(), + ); + msg.push( + "You might want to move storage capacity between zones or relax the redundancy constraint." + .into(), + ); + msg.push( + "See the detailed statistics below and look for saturated nodes/zones.".into(), + ); + } - if let Some(NodeRoleV(Some(info))) = self.roles.get(node_id) { - part.nodes.push((node_id, Some(info))); - } else { - part.nodes.push((node_id, None)); + // We define and fill in the following tables + let storing_nodes = self.nongateway_nodes(); + let mut new_partitions = vec![0; storing_nodes.len()]; + let mut stored_partitions = vec![0; storing_nodes.len()]; + + let mut new_partitions_zone = vec![0; id_to_zone.len()]; + let mut stored_partitions_zone = vec![0; id_to_zone.len()]; + + for p in 0..NB_PARTITIONS { + for z in 0..id_to_zone.len() { + let pz_nodes = gflow.get_positive_flow_from(Vertex::PZ(p, z))?; + if !pz_nodes.is_empty() { + stored_partitions_zone[z] += 1; + if let Some(prev_assign) = prev_assign_opt { + let mut old_zones_of_p = Vec::<usize>::new(); + for n in prev_assign[p].iter() { + old_zones_of_p + .push(zone_to_id[&self.get_node_zone(&self.node_id_vec[*n])?]); + } + if !old_zones_of_p.contains(&z) { + new_partitions_zone[z] += 1; + } + } + } + for vert in pz_nodes.iter() { + if let Vertex::N(n) = *vert { + stored_partitions[n] += 1; + if let Some(prev_assign) = prev_assign_opt { + if !prev_assign[p].contains(&n) { + new_partitions[n] += 1; + } + } } } - partitions.push(part); } - partitions - } else { - // Otherwise start fresh - (0..(1 << PARTITION_BITS)) - .map(|_| PartitionAss::new()) - .collect() } - } - fn partitions_per_node<'a>(&self, partitions: &[PartitionAss<'a>]) -> HashMap<&'a Uuid, usize> { - let mut partitions_per_node = HashMap::<&Uuid, usize>::new(); - for p in partitions.iter() { - for (id, _) in p.nodes.iter() { - *partitions_per_node.entry(*id).or_insert(0) += 1; + if prev_assign_opt.is_none() { + new_partitions = stored_partitions.clone(); + //new_partitions_zone = stored_partitions_zone.clone(); + } + + // We display the statistics + + msg.push("".into()); + if prev_assign_opt.is_some() { + let total_new_partitions: usize = new_partitions.iter().sum(); + msg.push(format!( + "A total of {} new copies of partitions need to be \ + transferred.", + total_new_partitions + )); + msg.push("".into()); + } + + let mut table = vec![]; + for z in 0..id_to_zone.len() { + let mut nodes_of_z = Vec::<usize>::new(); + for n in 0..storing_nodes.len() { + if self.get_node_zone(&self.node_id_vec[n])? == id_to_zone[z] { + nodes_of_z.push(n); + } + } + let replicated_partitions: usize = + nodes_of_z.iter().map(|n| stored_partitions[*n]).sum(); + table.push(format!( + "{}\tTags\tPartitions\tCapacity\tUsable capacity", + id_to_zone[z] + )); + + let available_cap_z: u64 = self.partition_size * replicated_partitions as u64; + let mut total_cap_z = 0; + for n in nodes_of_z.iter() { + total_cap_z += self.get_node_capacity(&self.node_id_vec[*n])?; } + let percent_cap_z = 100.0 * (available_cap_z as f32) / (total_cap_z as f32); + + for n in nodes_of_z.iter() { + let available_cap_n = stored_partitions[*n] as u64 * self.partition_size; + let total_cap_n = self.get_node_capacity(&self.node_id_vec[*n])?; + let tags_n = (self.node_role(&self.node_id_vec[*n]).ok_or("<??>"))?.tags_string(); + table.push(format!( + " {:?}\t{}\t{} ({} new)\t{}\t{} ({:.1}%)", + self.node_id_vec[*n], + tags_n, + stored_partitions[*n], + new_partitions[*n], + ByteSize::b(total_cap_n).to_string_as(false), + ByteSize::b(available_cap_n).to_string_as(false), + (available_cap_n as f32) / (total_cap_n as f32) * 100.0, + )); + } + + table.push(format!( + " TOTAL\t\t{} ({} unique)\t{}\t{} ({:.1}%)", + replicated_partitions, + stored_partitions_zone[z], + //new_partitions_zone[z], + ByteSize::b(total_cap_z).to_string_as(false), + ByteSize::b(available_cap_z).to_string_as(false), + percent_cap_z + )); + table.push("".into()); } - partitions_per_node + msg.push(format_table::format_table_to_string(table)); + + Ok(msg) } } -// ---- Internal structs for partition assignation in layout ---- +// ==================================================================================== + +#[cfg(test)] +mod tests { + use super::{Error, *}; + use std::cmp::min; + + // This function checks that the partition size S computed is at least better than the + // one given by a very naive algorithm. To do so, we try to run the naive algorithm + // assuming a partion size of S+1. If we succed, it means that the optimal assignment + // was not optimal. The naive algorithm is the following : + // - we compute the max number of partitions associated to every node, capped at the + // partition number. It gives the number of tokens of every node. + // - every zone has a number of tokens equal to the sum of the tokens of its nodes. + // - we cycle over the partitions and associate zone tokens while respecting the + // zone redundancy constraint. + // NOTE: the naive algorithm is not optimal. Counter example: + // take nb_partition = 3 ; replication_factor = 5; redundancy = 4; + // number of tokens by zone : (A, 4), (B,1), (C,4), (D, 4), (E, 2) + // With these parameters, the naive algo fails, whereas there is a solution: + // (A,A,C,D,E) , (A,B,C,D,D) (A,C,C,D,E) + fn check_against_naive(cl: &ClusterLayout) -> Result<bool, Error> { + let over_size = cl.partition_size + 1; + let mut zone_token = HashMap::<String, usize>::new(); + + let (zones, zone_to_id) = cl.generate_nongateway_zone_ids()?; + + if zones.is_empty() { + return Ok(false); + } -#[derive(Clone)] -struct PartitionAss<'a> { - nodes: Vec<(&'a Uuid, Option<&'a NodeRole>)>, -} + for z in zones.iter() { + zone_token.insert(z.clone(), 0); + } + for uuid in cl.nongateway_nodes().iter() { + let z = cl.get_node_zone(uuid)?; + let c = cl.get_node_capacity(uuid)?; + zone_token.insert( + z.clone(), + zone_token[&z] + min(NB_PARTITIONS, (c / over_size) as usize), + ); + } -impl<'a> PartitionAss<'a> { - fn new() -> Self { - Self { nodes: Vec::new() } - } + // For every partition, we count the number of zone already associated and + // the name of the last zone associated - fn nplus(&self, other: &PartitionAss<'a>) -> usize { - self.nodes - .iter() - .filter(|x| !other.nodes.contains(x)) - .count() - } + let mut id_zone_token = vec![0; zones.len()]; + for (z, t) in zone_token.iter() { + id_zone_token[zone_to_id[z]] = *t; + } - fn txtplus(&self, other: &PartitionAss<'a>) -> String { - let mut nodes = self - .nodes - .iter() - .filter(|x| !other.nodes.contains(x)) - .map(|x| format!("{:?}", x.0)) - .collect::<Vec<_>>(); - nodes.sort(); - if self.nodes.iter().any(|x| other.nodes.contains(x)) { - nodes.push("...".into()); + let mut nb_token = vec![0; NB_PARTITIONS]; + let mut last_zone = vec![zones.len(); NB_PARTITIONS]; + + let mut curr_zone = 0; + + let redundancy = cl.effective_zone_redundancy(); + + for replic in 0..cl.replication_factor { + for p in 0..NB_PARTITIONS { + while id_zone_token[curr_zone] == 0 + || (last_zone[p] == curr_zone + && redundancy - nb_token[p] <= cl.replication_factor - replic) + { + curr_zone += 1; + if curr_zone >= zones.len() { + return Ok(true); + } + } + id_zone_token[curr_zone] -= 1; + if last_zone[p] != curr_zone { + nb_token[p] += 1; + last_zone[p] = curr_zone; + } + } } - format!("[{}]", nodes.join(" ")) - } - fn is_valid_transition_to(&self, other: &PartitionAss<'a>, replication_factor: usize) -> bool { - let min_keep_nodes_per_part = (replication_factor + 1) / 2; - let n_removed = self.nplus(other); + return Ok(false); + } - if self.nodes.len() <= min_keep_nodes_per_part { - n_removed == 0 - } else { - n_removed <= self.nodes.len() - min_keep_nodes_per_part + fn show_msg(msg: &Message) { + for s in msg.iter() { + println!("{}", s); } } - // add is a key function in creating a PartitionAss, i.e. the list of nodes - // to which a partition is assigned. It tries to add a certain node id to the - // assignation, but checks that doing so is compatible with the NECESSARY - // condition that the partition assignation must be dispersed over different - // zones (datacenters) if enough zones exist. This is why it takes a n_zones - // parameter, which is the total number of zones that have existing nodes: - // if nodes in the assignation already cover all n_zones zones, then any node - // that is not yet in the assignation can be added. Otherwise, only nodes - // that are in a new zone can be added. - fn add( - &mut self, - target_len: Option<usize>, - n_zones: usize, - node: &'a Uuid, - role: &'a NodeRole, - ) -> bool { - if let Some(tl) = target_len { - if self.nodes.len() != tl - 1 { - return false; + fn update_layout( + cl: &mut ClusterLayout, + node_id_vec: &Vec<u8>, + node_capacity_vec: &Vec<u64>, + node_zone_vec: &Vec<String>, + zone_redundancy: usize, + ) { + for i in 0..node_id_vec.len() { + if let Some(x) = FixedBytes32::try_from(&[i as u8; 32]) { + cl.node_id_vec.push(x); } - } - let p_zns = self - .nodes - .iter() - .map(|(_id, info)| info.unwrap().zone.as_str()) - .collect::<HashSet<&str>>(); - if (p_zns.len() < n_zones && !p_zns.contains(&role.zone.as_str())) - || (p_zns.len() == n_zones && !self.nodes.iter().any(|(id, _)| *id == node)) - { - self.nodes.push((node, Some(role))); - true - } else { - false + let update = cl.staging_roles.update_mutator( + cl.node_id_vec[i], + NodeRoleV(Some(NodeRole { + zone: (node_zone_vec[i].to_string()), + capacity: (Some(node_capacity_vec[i])), + tags: (vec![]), + })), + ); + cl.staging_roles.merge(&update); } + cl.staging_parameters.update(LayoutParameters { + zone_redundancy: ZoneRedundancy::AtLeast(zone_redundancy), + }); + cl.staging_hash = cl.calculate_staging_hash(); + } + + #[test] + fn test_assignment() { + let mut node_id_vec = vec![1, 2, 3]; + let mut node_capacity_vec = vec![4000, 1000, 2000]; + let mut node_zone_vec = vec!["A", "B", "C"] + .into_iter() + .map(|x| x.to_string()) + .collect(); + + let mut cl = ClusterLayout::new(3); + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec, 3); + let v = cl.version; + let (mut cl, msg) = cl.apply_staged_changes(Some(v + 1)).unwrap(); + show_msg(&msg); + assert_eq!(cl.check(), Ok(())); + assert!(matches!(check_against_naive(&cl), Ok(true))); + + node_id_vec = vec![1, 2, 3, 4, 5, 6, 7, 8, 9]; + node_capacity_vec = vec![4000, 1000, 1000, 3000, 1000, 1000, 2000, 10000, 2000]; + node_zone_vec = vec!["A", "B", "C", "C", "C", "B", "G", "H", "I"] + .into_iter() + .map(|x| x.to_string()) + .collect(); + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec, 2); + let v = cl.version; + let (mut cl, msg) = cl.apply_staged_changes(Some(v + 1)).unwrap(); + show_msg(&msg); + assert_eq!(cl.check(), Ok(())); + assert!(matches!(check_against_naive(&cl), Ok(true))); + + node_capacity_vec = vec![4000, 1000, 2000, 7000, 1000, 1000, 2000, 10000, 2000]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec, 3); + let v = cl.version; + let (mut cl, msg) = cl.apply_staged_changes(Some(v + 1)).unwrap(); + show_msg(&msg); + assert_eq!(cl.check(), Ok(())); + assert!(matches!(check_against_naive(&cl), Ok(true))); + + node_capacity_vec = vec![ + 4000000, 4000000, 2000000, 7000000, 1000000, 9000000, 2000000, 10000, 2000000, + ]; + update_layout(&mut cl, &node_id_vec, &node_capacity_vec, &node_zone_vec, 1); + let v = cl.version; + let (cl, msg) = cl.apply_staged_changes(Some(v + 1)).unwrap(); + show_msg(&msg); + assert_eq!(cl.check(), Ok(())); + assert!(matches!(check_against_naive(&cl), Ok(true))); } } diff --git a/src/rpc/lib.rs b/src/rpc/lib.rs index 5aec92c0..a5f8fc6e 100644 --- a/src/rpc/lib.rs +++ b/src/rpc/lib.rs @@ -11,6 +11,7 @@ mod consul; #[cfg(feature = "kubernetes-discovery")] mod kubernetes; +pub mod graph_algo; pub mod layout; pub mod replication_mode; pub mod ring; diff --git a/src/rpc/ring.rs b/src/rpc/ring.rs index 73a126a2..6a2e5c72 100644 --- a/src/rpc/ring.rs +++ b/src/rpc/ring.rs @@ -40,6 +40,7 @@ pub struct Ring { // Type to store compactly the id of a node in the system // Change this to u16 the day we want to have more than 256 nodes in a cluster pub type CompactNodeType = u8; +pub const MAX_NODE_NUMBER: usize = 256; // The maximum number of times an object might get replicated // This must be at least 3 because Garage supports 3-way replication @@ -62,12 +63,12 @@ struct RingEntry { impl Ring { pub(crate) fn new(layout: ClusterLayout, replication_factor: usize) -> Self { if replication_factor != layout.replication_factor { - warn!("Could not build ring: replication factor does not match between local configuration and network role assignation."); + warn!("Could not build ring: replication factor does not match between local configuration and network role assignment."); return Self::empty(layout, replication_factor); } - if layout.ring_assignation_data.len() != replication_factor * (1 << PARTITION_BITS) { - warn!("Could not build ring: network role assignation data has invalid length"); + if layout.ring_assignment_data.len() != replication_factor * (1 << PARTITION_BITS) { + warn!("Could not build ring: network role assignment data has invalid length"); return Self::empty(layout, replication_factor); } @@ -77,7 +78,7 @@ impl Ring { let top = (i as u16) << (16 - PARTITION_BITS); let mut nodes_buf = [0u8; MAX_REPLICATION]; nodes_buf[..replication_factor].copy_from_slice( - &layout.ring_assignation_data + &layout.ring_assignment_data [replication_factor * i..replication_factor * (i + 1)], ); RingEntry { diff --git a/src/rpc/system.rs b/src/rpc/system.rs index 4daa5ba9..78fcc74b 100644 --- a/src/rpc/system.rs +++ b/src/rpc/system.rs @@ -22,9 +22,9 @@ use netapp::peering::fullmesh::FullMeshPeeringStrategy; use netapp::util::parse_and_resolve_peer_addr_async; use netapp::{NetApp, NetworkKey, NodeID, NodeKey}; -use garage_util::config::Config; #[cfg(feature = "kubernetes-discovery")] use garage_util::config::KubernetesDiscoveryConfig; +use garage_util::config::{Config, DataDirEnum}; use garage_util::data::*; use garage_util::error::*; use garage_util::persister::Persister; @@ -119,7 +119,7 @@ pub struct System { /// Path to metadata directory pub metadata_dir: PathBuf, /// Path to data directory - pub data_dir: PathBuf, + pub data_dir: DataDirEnum, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -151,7 +151,7 @@ pub struct KnownNodeInfo { pub status: NodeStatus, } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy)] pub struct ClusterHealth { /// The current health status of the cluster (see below) pub status: ClusterHealthStatus, @@ -171,7 +171,7 @@ pub struct ClusterHealth { pub partitions_all_ok: usize, } -#[derive(Debug, Clone, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy)] pub enum ClusterHealthStatus { /// All nodes are available Healthy, @@ -666,9 +666,9 @@ impl System { let update_ring = self.update_ring.lock().await; let mut layout: ClusterLayout = self.ring.borrow().layout.clone(); - let prev_layout_check = layout.check(); + let prev_layout_check = layout.check().is_ok(); if layout.merge(adv) { - if prev_layout_check && !layout.check() { + if prev_layout_check && layout.check().is_err() { error!("New cluster layout is invalid, discarding."); return Err(Error::Message( "New cluster layout is invalid, discarding.".into(), @@ -725,7 +725,7 @@ impl System { async fn discovery_loop(self: &Arc<Self>, mut stop_signal: watch::Receiver<bool>) { while !*stop_signal.borrow() { - let not_configured = !self.ring.borrow().layout.check(); + let not_configured = self.ring.borrow().layout.check().is_err(); let no_peers = self.fullmesh.get_peer_list().len() < self.replication_factor; let expected_n_nodes = self.ring.borrow().layout.num_nodes(); let bad_peers = self @@ -890,19 +890,47 @@ impl NodeStatus { } } - fn update_disk_usage(&mut self, meta_dir: &Path, data_dir: &Path, metrics: &SystemMetrics) { + fn update_disk_usage( + &mut self, + meta_dir: &Path, + data_dir: &DataDirEnum, + metrics: &SystemMetrics, + ) { use nix::sys::statvfs::statvfs; let mount_avail = |path: &Path| match statvfs(path) { Ok(x) => { let avail = x.blocks_available() * x.fragment_size() as u64; let total = x.blocks() * x.fragment_size() as u64; - Some((avail, total)) + Some((x.filesystem_id(), avail, total)) } Err(_) => None, }; - self.meta_disk_avail = mount_avail(meta_dir); - self.data_disk_avail = mount_avail(data_dir); + self.meta_disk_avail = mount_avail(meta_dir).map(|(_, a, t)| (a, t)); + self.data_disk_avail = match data_dir { + DataDirEnum::Single(dir) => mount_avail(dir).map(|(_, a, t)| (a, t)), + DataDirEnum::Multiple(dirs) => (|| { + // TODO: more precise calculation that takes into account + // how data is going to be spread among partitions + let mut mounts = HashMap::new(); + for dir in dirs.iter() { + if dir.capacity.is_none() { + continue; + } + match mount_avail(&dir.path) { + Some((fsid, avail, total)) => { + mounts.insert(fsid, (avail, total)); + } + None => return None, + } + } + Some( + mounts + .into_iter() + .fold((0, 0), |(x, y), (_, (a, b))| (x + a, y + b)), + ) + })(), + }; if let Some((avail, total)) = self.meta_disk_avail { metrics diff --git a/src/table/data.rs b/src/table/data.rs index e76836ca..bbfdf58b 100644 --- a/src/table/data.rs +++ b/src/table/data.rs @@ -34,7 +34,7 @@ pub struct TableData<F: TableSchema, R: TableReplication> { pub(crate) merkle_todo_notify: Notify, pub(crate) insert_queue: db::Tree, - pub(crate) insert_queue_notify: Notify, + pub(crate) insert_queue_notify: Arc<Notify>, pub(crate) gc_todo: CountedTree, @@ -80,7 +80,7 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { merkle_todo, merkle_todo_notify: Notify::new(), insert_queue, - insert_queue_notify: Notify::new(), + insert_queue_notify: Arc::new(Notify::new()), gc_todo, metrics, }) @@ -203,14 +203,14 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { ) -> Result<Option<F::E>, Error> { let tree_key = self.tree_key(partition_key, sort_key); - let changed = self.store.db().transaction(|mut tx| { + let changed = self.store.db().transaction(|tx| { let (old_entry, old_bytes, new_entry) = match tx.get(&self.store, &tree_key)? { Some(old_bytes) => { let old_entry = self.decode_entry(&old_bytes).map_err(db::TxError::Abort)?; - let new_entry = update_fn(&mut tx, Some(old_entry.clone()))?; + let new_entry = update_fn(tx, Some(old_entry.clone()))?; (Some(old_entry), Some(old_bytes), new_entry) } - None => (None, None, update_fn(&mut tx, None)?), + None => (None, None, update_fn(tx, None)?), }; // Changed can be true in two scenarios @@ -233,7 +233,7 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { tx.insert(&self.store, &tree_key, new_bytes)?; self.instance - .updated(&mut tx, old_entry.as_ref(), Some(&new_entry))?; + .updated(tx, old_entry.as_ref(), Some(&new_entry))?; Ok(Some((new_entry, new_bytes_hash))) } else { @@ -270,14 +270,14 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { let removed = self .store .db() - .transaction(|mut tx| match tx.get(&self.store, k)? { + .transaction(|tx| match tx.get(&self.store, k)? { Some(cur_v) if cur_v == v => { let old_entry = self.decode_entry(v).map_err(db::TxError::Abort)?; tx.remove(&self.store, k)?; tx.insert(&self.merkle_todo, k, vec![])?; - self.instance.updated(&mut tx, Some(&old_entry), None)?; + self.instance.updated(tx, Some(&old_entry), None)?; Ok(true) } _ => Ok(false), @@ -298,14 +298,14 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { let removed = self .store .db() - .transaction(|mut tx| match tx.get(&self.store, k)? { + .transaction(|tx| match tx.get(&self.store, k)? { Some(cur_v) if blake2sum(&cur_v[..]) == vhash => { let old_entry = self.decode_entry(&cur_v[..]).map_err(db::TxError::Abort)?; tx.remove(&self.store, k)?; tx.insert(&self.merkle_todo, k, vec![])?; - self.instance.updated(&mut tx, Some(&old_entry), None)?; + self.instance.updated(tx, Some(&old_entry), None)?; Ok(true) } _ => Ok(false), @@ -339,7 +339,9 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { .map_err(Error::RmpEncode) .map_err(db::TxError::Abort)?; tx.insert(&self.insert_queue, &tree_key, new_entry)?; - self.insert_queue_notify.notify_one(); + + let notif = self.insert_queue_notify.clone(); + tx.on_commit(move || notif.notify_one()); Ok(()) } @@ -347,9 +349,7 @@ impl<F: TableSchema, R: TableReplication> TableData<F, R> { // ---- Utility functions ---- pub fn tree_key(&self, p: &F::P, s: &F::S) -> Vec<u8> { - let mut ret = p.hash().to_vec(); - ret.extend(s.sort_key()); - ret + [p.hash().as_slice(), s.sort_key()].concat() } pub fn decode_entry(&self, bytes: &[u8]) -> Result<F::E, Error> { diff --git a/src/table/merkle.rs b/src/table/merkle.rs index e86d0251..4577f872 100644 --- a/src/table/merkle.rs +++ b/src/table/merkle.rs @@ -108,9 +108,9 @@ impl<F: TableSchema, R: TableReplication> MerkleUpdater<F, R> { self.data .merkle_tree .db() - .transaction(|mut tx| self.update_item_rec(&mut tx, k, &khash, &key, new_vhash))?; + .transaction(|tx| self.update_item_rec(tx, k, &khash, &key, new_vhash))?; - let deleted = self.data.merkle_todo.db().transaction(|mut tx| { + let deleted = self.data.merkle_todo.db().transaction(|tx| { let remove = matches!(tx.get(&self.data.merkle_todo, k)?, Some(ov) if ov == vhash_by); if remove { tx.remove(&self.data.merkle_todo, k)?; diff --git a/src/table/queue.rs b/src/table/queue.rs index 0857209b..ffe0a4a7 100644 --- a/src/table/queue.rs +++ b/src/table/queue.rs @@ -12,7 +12,7 @@ use crate::replication::*; use crate::schema::*; use crate::table::*; -const BATCH_SIZE: usize = 100; +const BATCH_SIZE: usize = 1024; pub(crate) struct InsertQueueWorker<F, R>(pub(crate) Arc<Table<F, R>>) where @@ -53,7 +53,7 @@ impl<F: TableSchema, R: TableReplication> Worker for InsertQueueWorker<F, R> { self.0.insert_many(values).await?; - self.0.data.insert_queue.db().transaction(|mut tx| { + self.0.data.insert_queue.db().transaction(|tx| { for (k, v) in kv_pairs.iter() { if let Some(v2) = tx.get(&self.0.data.insert_queue, k)? { if &v2 == v { diff --git a/src/table/schema.rs b/src/table/schema.rs index 5cbf6c95..fc1a465e 100644 --- a/src/table/schema.rs +++ b/src/table/schema.rs @@ -6,6 +6,8 @@ use garage_util::migrate::Migrate; use crate::crdt::Crdt; +// =================================== PARTITION KEYS + /// Trait for field used to partition data pub trait PartitionKey: Clone + PartialEq + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static @@ -29,6 +31,8 @@ impl PartitionKey for FixedBytes32 { } } +// =================================== SORT KEYS + /// Trait for field used to sort data pub trait SortKey: Clone + Serialize + for<'de> Deserialize<'de> + Send + Sync + 'static { /// Get the key used to sort @@ -47,6 +51,8 @@ impl SortKey for FixedBytes32 { } } +// =================================== SCHEMA + /// Trait for an entry in a table. It must be sortable and partitionnable. pub trait Entry<P: PartitionKey, S: SortKey>: Crdt + PartialEq + Clone + Migrate + Send + Sync + 'static diff --git a/src/util/Cargo.toml b/src/util/Cargo.toml index 2efb0270..641d1e90 100644 --- a/src/util/Cargo.toml +++ b/src/util/Cargo.toml @@ -32,7 +32,7 @@ rand = "0.8" sha2 = "0.10" chrono = "0.4" -rmp-serde = "0.15" +rmp-serde = "1.1.2" serde = { version = "1.0", default-features = false, features = ["derive", "rc"] } serde_json = "1.0" toml = "0.6" @@ -40,7 +40,7 @@ toml = "0.6" futures = "0.3" tokio = { version = "1.0", default-features = false, features = ["rt", "rt-multi-thread", "io-util", "net", "time", "macros", "sync", "signal", "fs"] } -netapp = "0.5" +netapp = "0.10" http = "0.2" hyper = "0.14" diff --git a/src/util/config.rs b/src/util/config.rs index ebcb5fbe..ad5c8e1f 100644 --- a/src/util/config.rs +++ b/src/util/config.rs @@ -15,7 +15,14 @@ pub struct Config { /// Path where to store metadata. Should be fast, but low volume pub metadata_dir: PathBuf, /// Path where to store data. Can be slower, but need higher volume - pub data_dir: PathBuf, + pub data_dir: DataDirEnum, + + /// Whether to fsync after all metadata transactions (disabled by default) + #[serde(default)] + pub metadata_fsync: bool, + /// Whether to fsync after all data block writes (disabled by default) + #[serde(default)] + pub data_fsync: bool, /// Size of data blocks to save to disk #[serde( @@ -99,6 +106,26 @@ pub struct Config { pub admin: AdminConfig, } +/// Value for data_dir: either a single directory or a list of dirs with attributes +#[derive(Deserialize, Debug, Clone)] +#[serde(untagged)] +pub enum DataDirEnum { + Single(PathBuf), + Multiple(Vec<DataDir>), +} + +#[derive(Deserialize, Debug, Clone)] +pub struct DataDir { + /// Path to the data directory + pub path: PathBuf, + /// Capacity of the drive (required if read_only is false) + #[serde(default)] + pub capacity: Option<String>, + /// Whether this is a legacy read-only path (capacity should be None) + #[serde(default)] + pub read_only: bool, +} + /// Configuration for S3 api #[derive(Deserialize, Debug, Clone)] pub struct S3ApiConfig { @@ -195,7 +222,7 @@ pub struct KubernetesDiscoveryConfig { } fn default_db_engine() -> String { - "sled".into() + "lmdb".into() } fn default_sled_cache_capacity() -> usize { diff --git a/src/util/encode.rs b/src/util/encode.rs index 1cd3198f..a9ab9a35 100644 --- a/src/util/encode.rs +++ b/src/util/encode.rs @@ -8,9 +8,7 @@ where T: Serialize + ?Sized, { let mut wr = Vec::with_capacity(128); - let mut se = rmp_serde::Serializer::new(&mut wr) - .with_struct_map() - .with_string_variants(); + let mut se = rmp_serde::Serializer::new(&mut wr).with_struct_map(); val.serialize(&mut se)?; Ok(wr) } @@ -22,7 +20,7 @@ pub fn nonversioned_decode<T>(bytes: &[u8]) -> Result<T, rmp_serde::decode::Erro where T: for<'de> Deserialize<'de> + ?Sized, { - rmp_serde::decode::from_read_ref::<_, T>(bytes) + rmp_serde::decode::from_slice::<_>(bytes) } /// Serialize to JSON, truncating long result diff --git a/src/util/migrate.rs b/src/util/migrate.rs index b9cce08a..45147c74 100644 --- a/src/util/migrate.rs +++ b/src/util/migrate.rs @@ -19,7 +19,7 @@ pub trait Migrate: Serialize + for<'de> Deserialize<'de> + 'static { fn decode(bytes: &[u8]) -> Option<Self> { let marker_len = Self::VERSION_MARKER.len(); if bytes.get(..marker_len) == Some(Self::VERSION_MARKER) { - if let Ok(value) = rmp_serde::decode::from_read_ref::<_, Self>(&bytes[marker_len..]) { + if let Ok(value) = rmp_serde::decode::from_slice::<_>(&bytes[marker_len..]) { return Some(value); } } @@ -31,9 +31,7 @@ pub trait Migrate: Serialize + for<'de> Deserialize<'de> + 'static { fn encode(&self) -> Result<Vec<u8>, rmp_serde::encode::Error> { let mut wr = Vec::with_capacity(128); wr.extend_from_slice(Self::VERSION_MARKER); - let mut se = rmp_serde::Serializer::new(&mut wr) - .with_struct_map() - .with_string_variants(); + let mut se = rmp_serde::Serializer::new(&mut wr).with_struct_map(); self.serialize(&mut se)?; Ok(wr) } |