Author SHA1 Message Date
Jacques Supcik 72cc4f3ca8 wip 2024-03-22 12:19:12 +00:00
Jacques Supcik b398243da3 improve script 2024-03-22 12:17:05 +00:00
Jacques Supcik 5a5149a875 imprive rootfs sync 2024-03-22 12:01:23 +00:00
Jacques Supcik 0ddacae1f3 fix kernel version 2024-03-22 11:53:37 +00:00
Jacques Supcik 13cf29498f add sync-rootfs script 2024-03-22 11:52:15 +00:00
Jacques Supcik 2a80fbec9f fix Linux extras config 2024-03-04 14:41:02 +00:00
Jacques Supcik ba8053f349 changes for 2024 2024-02-22 21:29:32 +00:00
Jacques Supcik ab81b78bb8 move and fix workspaces 2023-03-02 13:32:19 +01:00
Jacques Supcik c971926fe3 fix 2023-02-24 17:27:13 +01:00
Jacques SupcikandGitHub b3e2882bf5 Import changes from 2021-2022 2023-02-23 20:46:06 +01:00
Jacques Supcik ea25559612 add mini project 2022-06-02 22:45:18 +02:00
Jacques Supcik 042c3fd02d wip 2022-05-20 08:54:38 +02:00
Jacques Supcik 7c7c7f3e66 new structure + serie 6 2022-05-11 15:14:01 +02:00
Jacques Supcik efeaeca819 add core dump debug 2022-03-04 11:28:30 +01:00
Jacques SupcikandGitHub c303139ead remove recycle option 2022-02-26 01:25:27 +01:00
Jacques SupcikandGitHub b9bb77be65 fix samba config to allow unlink 2022-02-26 00:58:43 +01:00
Jacques SupcikandGitHub a655859304 fix script (#1) 2022-02-25 23:44:56 +01:00
Jacques Supcik 2eeb71e110 Initial commit 2022-02-24 00:00:47 +01:00
261 changed files with 359 additions and 3492 deletions
+4 -16
View File
@@ -5,20 +5,8 @@
"workspaceFolder": "/workspace",
"shutdownAction": "stopCompose",
"remoteUser": "root",
"customizations": {
"vscode": {
"settings": {},
"extensions": [
"ms-vscode-remote.remote-containers",
"ms-vscode-remote.remote-ssh",
"ms-vscode-remote.remote-ssh-edit",
"ms-vscode-remote.remote-wsl",
"ms-vscode.cpptools",
"ms-vscode.cpptools-extension-pack",
"dan-c-underwood.arm",
"editorconfig.editorconfig",
"myriad-dreamin.tinymist"
]
}
}
"settings": {},
"extensions": [
"ms-vscode.cpptools"
]
}
+1 -13
View File
@@ -37,19 +37,7 @@ services:
- rootfs:/rootfs
- home:/root-home
tftp:
image: csel/tftp
build:
context: tftp
dockerfile: Dockerfile
ports:
- "69:69/udp"
# - "10000-10010:10000-10010/udp"
volumes:
- buildroot:/buildroot
command: "dnsmasq --no-daemon --enable-tftp --tftp-root=/buildroot --tftp-no-blocksize --tftp-single-port --log-facility=- --log-dhcp"
volumes:
buildroot: {}
rootfs: {}
home: {}
home: {}
-11
View File
@@ -1,11 +0,0 @@
# https://github.com/devcontainers/images/tree/main/src/cpp
ARG VARIANT=ubuntu-24.04
FROM mcr.microsoft.com/devcontainers/base:${VARIANT}
EXPOSE 69/udp
RUN apt-get update && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y install --no-install-recommends \
dnsmasq \
tcpdump
+4 -8
View File
@@ -1,6 +1,5 @@
# https://github.com/devcontainers/images/tree/main/src/cpp
ARG VARIANT=ubuntu-24.04
FROM mcr.microsoft.com/devcontainers/cpp:${VARIANT}
ARG VARIANT=ubuntu-22.04
FROM mcr.microsoft.com/vscode/devcontainers/cpp:0-${VARIANT}
RUN apt-get update && \
export DEBIAN_FRONTEND=noninteractive && \
@@ -9,12 +8,10 @@ RUN apt-get update && \
automake \
bc \
bison \
clang-format \
cpio \
device-tree-compiler \
file \
flex \
just \
libfl-dev \
libglib2.0-dev \
libssl-dev \
@@ -25,8 +22,7 @@ RUN apt-get update && \
rsync \
swig \
u-boot-tools \
wget \
bear
wget
COPY scripts/* /usr/local/bin/
RUN chmod +x /usr/local/bin/*
RUN chmod +x /usr/local/bin/*
@@ -5,7 +5,7 @@ set -o pipefail
set -o nounset
# set -o xtrace
git clone https://gitlab.com/buildroot.org/buildroot.git /buildroot
git clone git://git.buildroot.net/buildroot /buildroot
cd /buildroot
git checkout -b csel 2022.08.3
-34
View File
@@ -1,34 +0,0 @@
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
GO_VERSION=1.24.1
remove_go() {
rm -rf /usr/local/go
rm -f /etc/profile.d/go.sh
}
install_go() {
remove_go
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then
ARCH="amd64"
elif [ "$ARCH" = "aarch64" ]; then
ARCH="arm64"
else
echo "Unsupported architecture: ${ARCH}"
exit 1
fi
echo "Installing Go ${GO_VERSION} for ${ARCH}"
curl -sSfL https://go.dev/dl/go${GO_VERSION}.linux-${ARCH}.tar.gz | tar -C /usr/local -xz
echo "Go ${GO_VERSION} installed successfully"
echo "export PATH=\$PATH:/usr/local/go/bin" >> /etc/profile.d/go.sh
}
install_go
@@ -1,32 +0,0 @@
#!/usr/bin/env bash
set -o errexit
set -o pipefail
set -o nounset
# set -o xtrace
ZIG_VERSION=0.14.0
remove_zig() {
rm -rf /usr/local/bin/zio
rm -rf /usr/local/lib/zig
rm -rf /usr/local/share/zig
}
install_zig() {
remove_zig
ARCH=$(uname -m)
TMP=$(mktemp -d)
echo "Installing Zig ${ZIG_VERSION} for ${ARCH}"
echo "Downloading files to ${TMP}"
curl -sSfL https://ziglang.org/download/${ZIG_VERSION}/zig-linux-${ARCH}-${ZIG_VERSION}.tar.xz | tar -xJ -C $TMP
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/zig /usr/local/bin/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/lib /usr/local/lib/zig
mkdir -p /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/doc /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/README.md /usr/local/share/zig
cp -a $TMP/zig-linux-${ARCH}-${ZIG_VERSION}/LICENSE /usr/local/share/zig
# rm -rf $TMP
}
install_zig
@@ -29,6 +29,5 @@ rsync -crlpgoD --itemize-changes \
--exclude=/etc/passwd \
--exclude=/etc/shadow \
--exclude=/etc/fstab \
--exclude=/run/lock \
--exclude=THIS_IS_NOT_YOUR_ROOT_FILESYSTEM \
$RSYNC_OPT $SRC $DST
+8 -39
View File
@@ -1,32 +1,11 @@
# IDE
.idea
.zed
.vscode
images
buildroot-images
solutions/
src/*/app
.obj
.deleted
.DS_Store
solutions/**/.Module.*
solutions/**/Module.symvers
solutions/**/.mymodule.*
solutions/**/mymodule.*
solutions/**/.modules.*
solutions/**/.*.cmd*
solutions/**/app
solutions/**/core
solutions/**/modules.order
solutions/**/.skeleton.*
src/**/*.o
src/**/*.dtb
src/**/*.ovl
src/**/.Module.*
src/**/Module.symvers
src/**/.mymodule.*
@@ -38,23 +17,13 @@ src/**/core
src/**/modules.order
src/**/.skeleton.*
solutions/02_modules/procstat/procstat
solutions/02_modules/procstat/procstat_s
src/**/*.o
src/**/*.dtb
src/**/*.ovl
solutions/03_drivers/sample01/main1
solutions/03_drivers/sample01/main2
solutions/03_drivers/sample01/main3
src/02_modules/procstat/procstat
src/02_modules/procstat/procstat_s
.zig-cache
solutions/**/build
/SOLUTION
boot-scripts/boot.cifs
boot-scripts/boot.net
doc/**/*.pdf
build
src/03-led-controller/led-controller
src/03_drivers/sample01/main1
src/03_drivers/sample01/main2
src/03_drivers/sample01/main3
+4 -14
View File
@@ -2,17 +2,6 @@
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [],
"compilerPath": "/buildroot/output/host/bin/aarch64-linux-gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++17",
"intelliSenseMode": "linux-gcc-arm64"
},
{
"name": "Linux-Kernel",
"includePath": [
"${workspaceFolder}/**",
"/buildroot/output/build/linux-headers-5.15.148/include",
@@ -21,9 +10,10 @@
"/buildroot/output/build/linux-headers-5.15.148/**"
],
"defines": [],
"compilerPath": "/buildroot/output/host/bin/aarch64-linux-gcc",
"cStandard": "gnu11",
"intelliSenseMode": "linux-gcc-arm64"
"compilerPath": "/usr/bin/clang",
"cStandard": "c99",
"cppStandard": "c++14",
"intelliSenseMode": "linux-clang-arm64"
}
],
"version": 4
-23
View File
@@ -1,23 +0,0 @@
// Project-local debug tasks
//
// For more documentation on how to configure debug tasks,
// see: https://zed.dev/docs/debugger
[
{
"label": "Debug Fibonacci (CodeLLDB Remote)",
"adapter": "CodeLLDB",
"request": "launch",
"build": {
"command": "make",
"args": [
"-C",
"/workspace/src/01_environment/fibonacci"
]
},
"program": "/workspace/src/01_environment/fibonacci/app",
"cwd": "/workspace/src/01_environment/fibonacci",
"processCreateCommands": [
"gdb-remote 192.168.53.14:1234"
]
}
]
-64
View File
@@ -1,64 +0,0 @@
[
{
"label": "Get buildroot",
"command": "/usr/local/bin/get-buildroot.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Build linux",
"command": "cd /buildroot && make",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Extract rootfs",
"command": "/usr/local/bin/extract-rootfs.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "Sync image (sd card)",
"command": "/usr/local/bin/sync-images.sh",
"use_new_terminal": false,
"allow_concurrent_runs": false,
"reveal": "always",
"reveal_target": "dock",
"hide": "never",
"shell": "system",
"show_summary": true,
"show_command": true,
},
{
"label": "gdbserver (fibonacci)",
"command": "ssh",
"args": [
"-t",
"root@192.168.53.14",
"/usr/bin/gdbserver :1234 /workspace/src/01_environment/fibonacci/app 2"
],
"use_new_terminal": true
},
]
-5
View File
@@ -1,5 +0,0 @@
boot.cifs: boot_cifs.cmd
mkimage -T script -A arm -C none -d boot_cifs.cmd boot.cifs
boot.net: boot_net.cmd
mkimage -T script -A arm -C none -d boot_net.cmd boot.net
-12
View File
@@ -1,12 +0,0 @@
setenv ipaddr 192.168.53.14
setenv serverip 192.168.53.4
setenv netmask 255.255.255.0
setenv gatewayip 192.168.53.4
setenv hostname myhost
setenv mountpath rootfs
setenv bootargs console=ttyS0,115200 earlyprintk rootdelay=1 root=/dev/cifs rw cifsroot=//$serverip/$mountpath,username=root,password=toor,port=1445 ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname::off
fatload mmc 0 $kernel_addr_r Image
fatload mmc 0 $fdt_addr_r nanopi-neo-plus2.dtb
booti $kernel_addr_r - $fdt_addr_r
-18
View File
@@ -1,18 +0,0 @@
setenv ipaddr 192.168.53.14
setenv serverip 192.168.53.4
setenv netmask 255.255.255.0
setenv gatewayip 192.168.53.4
setenv hostname myhost
setenv mountpath rootfs
setenv tftppath output/images
setenv bootargs console=ttyS0,115200 earlyprintk rootdelay=1 root=/dev/cifs rw cifsroot=//$serverip/$mountpath,username=root,password=toor,port=1445 ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname::off
usb start
ping $serverip
setenv kernel_comp_addr_r 0x50000000
tftp $kernel_comp_addr_r $serverip:$tftppath/Image.gz
unzip $kernel_comp_addr_r $kernel_addr_r
tftp $fdt_addr_r $serverip:$tftppath/nanopi-neo-plus2.dtb
booti $kernel_addr_r - $fdt_addr_r
@@ -5,6 +5,6 @@ iface lo inet loopback
auto eth0
iface eth0 inet static
address 192.168.53.14
address 192.168.0.14
netmask 255.255.255.0
gateway 192.168.53.4
gateway 192.168.0.4
-75
View File
@@ -1,75 +0,0 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "/doc/metadata.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "Environment & Kernel Programming"
doc.subtitle = [
Lab 01: Embedded Linux Environment \
& \
Lab 02: Linux Kernel Programming
]
doc.logos.tp_main = dragon-curve(
10,
step-size: 10,
stroke-style: stroke(
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#v(5em)
#infobox()[
The repository for this labs can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
#include "lab00-env/main.typ"
#pagebreak()
#include "lab01-module/main.typ"
#pagebreak()
#include "lab02-peripheral/main.typ"
#pagebreak()
= #i18n("appendix-title", lang: option.lang) <sec:appendix>
== Exercices Lab 01
#include "lab01-module/ex01.typ"
#pagebreak()
#include "lab01-module/ex02.typ"
#include "lab01-module/ex03.typ"
#pagebreak()
#include "lab01-module/ex04.typ"
#pagebreak()
#include "lab01-module/ex05.typ"
#include "lab01-module/ex06.typ"
#pagebreak()
#include "lab01-module/ex07.typ"
#include "lab01-module/ex08.typ"
//-------------------------------------
// Glossary
//
// #heading(numbering:none, outlined: false)[] <sec:end>
// #make_glossary(gloss:gloss, title:i18n("gloss-title"))
-71
View File
@@ -1,71 +0,0 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "@preview/hei-synd-thesis:0.2.3": *
#import "/doc/metadata.typ": *
#import "/doc/resources/glossary.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "System Programming & Optimisation"
doc.subtitle = [
Lab 03: Linux System Programming \
& \
Lab 04: Linux System Optimisation
]
doc.logos.tp_main = dragon-curve(
11,
step-size: 10,
stroke-style: stroke(
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#v(5em)
#infobox()[
The repository for this labs can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
#include "lab03-silly_led/main.typ"
#lorem(150)
#lorem(50)
//--------------------------------------
#pagebreak()
= Linux System Optimisation
#lorem(150)
#lorem(50)
//-------------------------------------
// Glossary
//
#heading(numbering:none, outlined: false)[] <sec:end>
#make_glossary(gloss:gloss, title:i18n("gloss-title"))
File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 82 KiB

-45
View File
@@ -1,45 +0,0 @@
= Embedded Linux Environment
In this laboratory, we see how to setup our environnement and how to have several way to boot. That include a `boot.cifs` that allow us to load the rootfs from samba to easily share the rootfs between the host and the target. And also a `boot.tftp` that allow us to load the kernel by tftp, which is really usefull when we want to modify the kernel and test it without having to reflash the whole system.
We also see how to debug our system with a remote debugger. That allow us to use debug in our code editor (vscode) a programm that run on the target.
#figure(
image("./dev-environment.png"),
caption: "Development environment schema"
) <fig:dev-env>
== Questions
=== How to generate U-Boot?
We use buildroot, a tool to build embedded Linux.
It can generate the U-Boot bootloader.
With `make menuconfig`, we can select the U-Boot package.
U-boot can be configured with `make uboot-menuconfig`
And finally, when we have configured everything, we can build the whole system with `make` command.
Or only uboot with `make uboot` command.
=== How to add and build a additional package in Buildroot?
In buildroot, with `make menuconfig`, we can select the package we want in `Target packages` section. We can specifically build it with `make <package-name>` command. Otherwise, it will be built with the whole system when we run `make` command.
=== How to modify the Linux kernel configuration?
Like all package, with `make <package-name>-menuconfig` command. So, for Linux kernel:
```bash
|> make linux-menuconfig
```
=== How to generate a custom rootfs?
First of all, select the type of filesystem you want to generate in `Filesystem images` section of `make menuconfig`. We can use an overlay to customise our rootfs.
The overlay is a directory (in the board folder) with the same structure as rootfs and it will merge with the generated rootfs. So, we can add files and directories in the overlay and they will be added to the final rootfs.
=== How to use the eMMC card instead of the SD card?
We need to change the boot script `(boot*.cmd)` to load from eMMC by changing the `fatload` command with the correct number. Probably 1 instead of 0.
```
fatload mmc 1 $kernel_addr_r Image
```
=== In cours support, we find several configurations of the development environment. What would be the optimal configuration for developing only user-space applications?
If we develop only user space program, we don't need to load kernel by tftp. But it's really usefull to have rootfs load by samba. So the best approach is to use the `boot.cifs`.
-95
View File
@@ -1,95 +0,0 @@
#import "/doc/metadata.typ": *
=== Generate kernel module out of tree <lab01:ex01>
#colorbox(title: "Exercise", color: hei-blue)[
Create the skeleton of a kernel module and generate it outside the kernel sources using a Makefile. The module should display a message when it is registered and when it is uninstalled.
]
//--------------
We already have a skeleton in `src/02-modules/exercice01` (now `solutions/02_modules/exercice01` that we move to `src/01-skeleton`). We see on the Makefile that the module is generated outside the kernel sources with the `KDIR` variable imported from `src/kernel_settings`. This variable point to the kernel sources.
The Makefile also use the `PWD` variable to the current directory.
The `make` command will use these variables to generate the module in the current directory.
```makefile
$(MAKE) -C $(KDIR) M=$(PWD) ARCH=$(CPU) CROSS_COMPILE=$(TOOLS) modules
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Test on the host machine the command modinfo1 on your module skeleton and compare the information returned with that of the source code.
]
```bash
|> modinfo mymodule.ko
filename: /workspace/src/01-skeleton/mymodule.ko
license: GPL
description: Module skeleton
author: Klagarge <remi@heredero.ch>
author: Fastium <fastium.pro@proton.me>
depends:
name: mymodule
vermagic: 5.15.148 SMP preempt mod_unload aarch64
parm: text:charp
parm: elements:int
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Install the module (insmod) and check the kernel log (dmesg)
]
```bash
|> insmod mymodule.ko
[ 1727.896902] mymodule: loading out-of-tree module taints kernel.
[ 1727.903442] Linux module 01 skeleton loaded
```
We can see the module is indead out-of-tree and correctly loaded.
```bash
|> dmesg | tail -5
[ 1381.694764] CIFS: Attempting to mount \\192.168.53.4\workspace
[ 1727.896902] mymodule: loading out-of-tree module taints kernel.
[ 1727.903442] Linux module 01 skeleton loaded
[ 1727.907659] text: dummy text
[ 1727.907659] elements: 1
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Compare the results obtained by the lsmod command with those obtained with the cat /proc/modules command
]
```bash
|> lsmod
Module Size Used by Tainted: G
mymodule 16384 0
···
|> cat /proc/modules
mymodule 16384 0 - Live 0xffff8000011bf000 (O)
···
```
The `/proc/modules` file give us more details about the state of the module. We see it is now live (charged in memory and running)
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Uninstall the module (rmmod).
]
```bash
|> rmmod mymodule.ko
[ 2989.535793] Linux module skeleton unloaded
```
//--------------
#colorbox(title: "Exercise", color: hei-blue)[
Adapt the Makefile of the module to allow the installation of the module with other kernel modules allowing the use of the modprobe command. The module should be installed in the root filesystem used in cifs by the target.
]
```bash
# On host:
|> make install
# On target:
|> modprobe mymodule
[ 3359.811183] Linux module 01 skeleton loaded
```
-19
View File
@@ -1,19 +0,0 @@
#import "/doc/metadata.typ": *
=== Adapt the kernel module to receive parameters <lab01:ex02>
#colorbox(title: "Exercise", color: hei-blue)[
Adapt the kernel module of the previous exercise to receive two or three parameters of your choice. These parameters will be displayed in the console when the module is loaded.
]
```bash
|> modprobe mymodule
[ 3583.616662] Linux module skeleton ex02 loaded
|> dmesg | tail -5
[ 3559.279143] number: 1
[ 3581.198562] Linux module skeleton unloaded
[ 3583.616662] Linux module skeleton ex03 loaded
[ 3583.621085] text: The answer to the Ultimate Question of Life, The Universe, and Everything
[ 3583.621085] number: 42
|> modprobe -r mymodule
[ 3588.404778] Linux module skeleton unloaded
```
-33
View File
@@ -1,33 +0,0 @@
#import "/doc/metadata.typ": *
=== What does it mean the 4 values in ```/proc/sys/kernel/printk``` ? <lab01:ex03>
We can show what there is in:
```bash
|> cat /proc/sys/kernel/printk
7 4 1 7
```
The number specified the level of output in a console.
This file specifies the log level for: \
current (7), default (4), minimum (1) and boot-time default (7).
This number matches with this table (#link("https://www.kernel.org/doc/html/latest/core-api/printk-basics.html", [printk documentation])):
#table(
columns: (2fr, 1fr, 3fr),
[*Name*], [*String*], [*Alias function*],
[KERN_EMERG], ["0"], [pr_emerg()],
[KERN_ALERT], ["1"], [pr_alert()],
[KERN_CRIT], ["2"], [pr_crit()],
[KERN_ERR], ["3"], [pr_err()],
[KERN_WARNING], ["4"], [pr_warning()],
[KERN_NOTICE], ["5"], [pr_notice()],
[KERN_INFO], ["6"], [pr_info()],
[KERN_DEBUG], ["7"], [pr_debug() and pr_devel() if DEBUG is defined],
[KERN_DEFAULT], [""], [],
[KERN_CONT], ["c"], [pr_cont()],
)
-25
View File
@@ -1,25 +0,0 @@
#import "/doc/metadata.typ": *
=== Create module with dynamic allocation and a chained list <lab01:ex04>
#colorbox(title: "Exercise", color: hei-blue)[
Create dynamically elements in the kernel. Adapt a kernel module to specify at the installation the number of element to create a initial text.
Each element will contain a unique number. The elements are create at the installation of the module adn chained in a list.
These elements will be destruct during the uninstallation of the module.
Some information messages are emits to allow debugging.
]
To allocate memory in the kernel, we can use the `kcalloc` function. It allows to allocate directly the memory for all element. It's also possible to use `kzalloc` in a loop to allocate memory for each element. We prefer allocate all the memory at once to avoid fragmentation and to be sure all the memory can be allocated.
```bash
struct element* element_ptr = kcalloc(elements, sizeof(struct element), GFP_KERNEL);
for (int i = 0; i < elements; i++) {
struct element* e = element_ptr + i;
if (e != 0) {
strncpy(e->text, text, TEXT_LENGTH_MAX - 1);
e->unique_number = i;
list_add_tail(&e->node, &list_unique_elements);
pr_info ("add element %d: %s\n", e->unique_number, e->text);
}
}
```
-33
View File
@@ -1,33 +0,0 @@
#import "/doc/metadata.typ": *
=== Display the processor chip ID, CPU temperature and the MAC adress of the Ethernet controller <lab01:ex05>
#colorbox(title: "Exercise", color: hei-blue)[
- Chip ID registers: _0x01c1'4200_ to _0x01c1'420c_
- 32 bits register of the temperature sensor: _0x01c2'5080_
- two 32 bits registers of the Ethernet controller MAC address: _0x01c3'0050_ and _0x01c3'0054_
To calculate the temperature value, there is this formul:
$
"temperature" = -1991 dot "register value" / 10 + 223000
$
The chip ID can be verified in ```/proc/iomem```.
The register value of the temperature can be verified in the file: ```/sys/class/thermal/thermal_zone0/temp```.
The MAC address can be verified with ``` ifconfig```.
]
The resources are savec in a struct:
```c
static struct resource* resources[3] = {[0] = 0,};
```
resources[0] is reserved for the chip ID, resources[1] for the temperature sensor and resources[2] for the Ethernet controller.
We first allocate the resources with `request_mem_region` function. Then we can map the physical address to a virtual address with `ioremap` function. Finally, we can read the value of the registers with `ioread32` function. The request fail because we have an overlap with the EEPROM, but we can ignore this error because we can still read the registers with `ioremap` function.
```c
// Request the resource at (CHIP_ID_BASE_ADDR)
resources[0] = request_mem_region(CHIP_ID_BASE_ADDR, 0x1000, "nanopi - chip ID");
// Map the physical address (CHIP_ID_BASE_ADDR) to a virtual address (registers[0])
registers[0] = ioremap(CHIP_ID_BASE_ADDR, 0x1000);
```
-8
View File
@@ -1,8 +0,0 @@
#import "/doc/metadata.typ": *
=== Kernel thread <lab01:ex06>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which allows to instanciate a thread in the kernel. This thread will display a message every 5 seconds. Use the function ```ssleep(5)``` to sleep the thread from ``` linux/delay.h```.
]
Easy exercice, a thread in the kernel is a `struct task_struct*` that can be created with `kthread_run`
-15
View File
@@ -1,15 +0,0 @@
#import "/doc/metadata.typ": *
=== Sleeping <lab01:ex07>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which instanciate 2 threads in the kernel. The first one will wait a wake up notification from the second thread and will sleep. The second will send the notification every 5 seconds. Then it will sleep. We will use the waitqueue for the sleeping function. To allow debugging, each thread will send a message when it wakes up.
]
This exercice make 2 threads in concurrency with wait queue. Here the queue ware declare
statically with the macro `DECLARE_WAIT_QUEUE_HEAD`. Then for this exercice we use an atomic
trigger with 2 queues. It important that the trigger is atomic or protected by mutex because
there is concurrency. The wait queues are used to wait until the trigger has changed to keep
synchronization between the threads.
It is very important to add `kthread_should_stop()` as a condition to wake up queue, because if there is
a problem during the implementation, we cannot kill the code.
-24
View File
@@ -1,24 +0,0 @@
#import "/doc/metadata.typ": *
=== Interrupts <lab01:ex08>
#colorbox(title: "Exercise", color: hei-blue)[
Develop a module which allows to detect every push on the button of the nanopi with interrupt. Every interrupts will send a message for debugging.
- Use the service ``` gpio_request(<io_nr>, <label>)```
- Get the interrupt vector with ``` gpio_to_irq(<io_nr>)```
- Extension card information:
- k1 - gpio: A, pin_nr=0, io_nr=0
- k2 - gpio: A, pin_nr=2, io_nr=2
- k3 - gpio: A, pin_nr=3, io_nr=3
]
We made a custom structur for the gpio device that contain all useful information like the name and the id.
```c
struct gpio_nanopi {
int id;
char* name;
};
static struct gpio_nanopi switchK1 = {0, "K1: GPIOA.0"};
static struct gpio_nanopi switchK2 = {2, "K2: GPIOA.2"};
static struct gpio_nanopi switchK3 = {3, "K3: GPIOA.3"};
```
-79
View File
@@ -1,79 +0,0 @@
#import "/doc/metadata.typ": *
#let ln(num) = {
let str_num = if int(num) < 10 { "0" + str(num) } else { str(num) }
let lbl = label("lab01:ex" + str_num)
link(lbl)[Ex 1.#num]
}
= Linux Kernel Programming
In this lab, we learn how to develop a tiny kernel module. We initially create a tiny skeleton that just print a message when the module is loaded and unloaded in #ln(1). Then in #ln(2), we see how to use parameters with insmod and with modprobe. To make things easier for us, weve added a line to the makefile that copy the modules configuration file (that contain the parameters for the modules) to the correct directory on the target. The `install` command is used as a combination of `mkdir`, `cp` and `chmod`.
```makefile
install:
$(MAKE) -C $(KDIR) M=$(PWD) INSTALL_MOD_PATH=$(MODPATH) modules_install
install -D -m 0644 $(SOURCE).conf $(MODPATH)/etc/modprobe.d/$(SOURCE).conf
```
The exercise 3 ask us what does it mean the 4 values in `/proc/sys/kernel/printk`?
We can show what there is in:
```bash
|> cat /proc/sys/kernel/printk
7 4 1 7
```
The number specified the level of output in a console.
This file specifies the log level for: \
current (7), default (4), minimum (1) and boot-time default (7).
This number matches with this table (#link("https://www.kernel.org/doc/html/latest/core-api/printk-basics.html", [printk documentation])):
#table(
columns: (2fr, 1fr, 3fr),
[*Name*], [*String*], [*Alias function*],
[KERN_EMERG], ["0"], [pr_emerg()],
[KERN_ALERT], ["1"], [pr_alert()],
[KERN_CRIT], ["2"], [pr_crit()],
[KERN_ERR], ["3"], [pr_err()],
[KERN_WARNING], ["4"], [pr_warning()],
[KERN_NOTICE], ["5"], [pr_notice()],
[KERN_INFO], ["6"], [pr_info()],
[KERN_DEBUG], ["7"], [pr_debug() and pr_devel() if DEBUG is defined],
[KERN_DEFAULT], [""], [],
[KERN_CONT], ["c"], [pr_cont()],
)
In #ln(4), we see how to dynamically create elements in the kernel. We use `kcallo` instead of `kzalloc` to allocate all the memory at once and be certain we have the necessary place for all elements of our module. It also a better approach in our opinion to avoid fragmentation.
We spent some time on the #ln(5) to understand that the `request_mem_region` failed because we have an overlap with the EEPROM.
The #ln(6) was a straightforward exercise where we had to develop a module that instantiated a thread.
In the #ln(7) was on concurrency. We had 2 threads with a wait queue. We learn how to suspend a thread, how to wake it up and how to do atomic operation.
In the last exercise of this lab, #ln(8), we see how to manage interruptions and connect them to a gpio.
== Cheat sheet commands
- `modinfo <module.ko>`: display information about a kernel module
- `insmod <module.ko>`: install a kernel module (without checking for dependencies)
- `rmmod <module.ko>`: uninstall a kernel module
- `lsmod`: list the currently loaded kernel modules
- `dmesg`: display the kernel log
- `cat /proc/modules`: display the currently loaded kernel modules with more details
- `modprobe <module>`: install a kernel module and its dependencies
- `modprobe -r <module>`: uninstall a kernel module and its dependencies
- `make`: build the kernel module
- `make install`: install the kernel module in the root filesystem
== Zed
For this lab, we start to work with another code editor than vscode. Not because we don't like Microsoft, ... but mostly for this reason. We use zed with the new devcontainer implementation on this wonderful code editor. To be able to work in nice condition, we add our own `.clangd` build with the help `bear`.
This clangd, allow us to have a perfect autocompletion and a enjoyable code navigation. We can easily jump to the definition of a function and see the documentation of a function.
Thanks to Zed teams for this awesome code editor and \@Fastium for his clangd
== Conclusion
All this lab was done by iteration on the initial skeleton. We develop everything in the #link("https://github.com/Klagarge/MSE-MA-CSEL/tree/main/src/01-skeleton")[src/01-skeleton] folder.
It was a very delightful introduction lab that show us some possibilities when we want to create a kernel module. Everything was new for us, so even it's basics concept, this was a bit challenging to grasp the subject.
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-1
View File
@@ -1 +0,0 @@
#import "/doc/metadata.typ": *
-34
View File
@@ -1,34 +0,0 @@
#import "/doc/metadata.typ": *
#let ln(num) = {
// let str_num = if int(num) < 10 { "0" + str(num) } else { str(num) }
// let lbl = label("lab02:ex" + str_num)
// link(lbl)[Ex 2.#num]
[Ex 2.#num]
}
= Linux Kernel Programming
In the First exercise, we learn how to access a register thought the `/dev/mem` interface. The purpose was to read the chip ID, but we learn how to access in a specific region of the memory. How pages work and how to map them in the user space.
For exercise 2, we see how to create a character device driver. We learn how to create a device file, how to write a read and write functions and how to test it with `echo` and `cat`. Our module has a `MAJOR` dynamically allocated (but should be 511 with default nanopi installation) and only one minor. To verify the major number, we can use `cat /proc/devices` and look for our module name. To test the module, we need to create a character device file with the right major and minor number.
```bash
mknod /dev/test-device c 511 0 # Create character device
echo "lalalalalaalalalalallala" > /dev/test-device # Write to the device
cat /dev/test-device # Read from the device
```
Quite easy to extend to exercise 3 by adding the parameters as we did in the previous lab. This parameters define the number of minor available.
Exercise 4 is the continuity, we had to create a tiny app that basically do the `echo` and `cat` for us. We can use the `open`, `write`, `read` and `close` system calls to interact with our device file. We still need to create the device file:
```bash
mknod /dev/toto0 c 511 0
```
The next step in exercise 5 is to create a sysfs entry for our module. Lot of theory, but once the theory is grasped, it's relatively straightforward to use the sysfs functions in our module.
The sysfs class is useful when we are attribute oriented. It's easy to store attributes in files. The platform driver is useful when we are processes oriented. The misc device simplify the peripheral instantiation.
== Adaptation for Zed environment
For this lab, we have to work with application and not with module. We have the same problem with clang for the LSP with Zed. To solve it, we include the Linux header files and specify the path of sysroot. Like this, clang have all the dependencies that we need. And tadam, the wonderful environment we had on previous lab is back!
== Conclusion
All the content of this is on #link("https://github.com/Klagarge/MSE-MA-CSEL/tree/main/src/02-driver")[src/02-driver]. It was pleasant to initially see how to manage a character device manually and step by step see how to do it with an easier method. I personally like to start from the bottom.
-3
View File
@@ -1,3 +0,0 @@
#import "/doc/metadata.typ": *
= Linux System Programming
-62
View File
@@ -1,62 +0,0 @@
#import "@preview/hei-synd-thesis:0.4.0": *
#import "/doc/resources/glossary.typ": *
#import "@preview/grape-suite:3.1.0": exercise
#import exercise: task, subtask
//-------------------------------------
// Document options
//
#let option = (
type : "final",
lang : "en",
)
//-------------------------------------
// Metadata of the document
//
#let doc= (
abbr : "CSEL",
logos: (
tp_topleft : image("/doc/resources/img/logo-mse.png", width: 9cm),
tp_topright : image("/doc/resources/img/hesso-logo.svg", width: 4.5cm),
header : image("/doc/resources/img/csel.png", width: 2.5cm),
),
authors: (
(
name : "Yann Sierro",
abbr : "SIY",
email : "yann.sierro@master.hes-so.ch",
),
(
name : "Rémi Heredero",
abbr : "HER",
email : "remi.heredero@hevs.ch",
),
),
school: (
name : "HES-SO Master",
major : "Computer Science",
orientation : "Embedded",
),
course: (
name : "CSEL",
prof : "Jacques Supcik",
semester : "Spring Semester 2026",
),
keywords : ("HES-SO", "Computer Science", "Embedded Systems", "CSEL"),
)
#let date = datetime.today()
//-------------------------------------
// Settings
//
#let tableof = (
toc: true,
tof: false,
tot: false,
tol: false,
toe: false,
maxdepth: 3,
)
#let gloss = true
-61
View File
@@ -1,61 +0,0 @@
// #import "@preview/hei-synd-report:0.1.1": *
#import "@preview/hei-synd-thesis:0.2.3": *
#import "/doc/metadata.typ": *
#import "/doc/resources/glossary.typ": *
#show:make-glossary
#register-glossary(entry-list)
#import "@preview/fractusist:0.1.1":*
//-------------------------------------
// Template config
//
#{
doc.title = "Mini-Project"
doc.subtitle = [
Mini-Project
]
doc.logos.tp_main = dragon-curve(
12,
step-size: 10,
stroke-style: stroke(
//paint: gradient.linear(..color.map.rocket, angle: 135deg),
paint: gradient.radial(..color.map.rocket),
thickness: 3pt, join: "round"),
height: 10cm,
)
doc.version = "v0.1.0"
}
#show: report.with(
option: option,
doc: doc,
date: date,
tableof: tableof,
)
#v(5em)
#infobox()[
The repository for this labs can be found at the following address:
#align(center)[https://github.com/Klagarge/MSE-MA-CSEL]
]
#pagebreak()
//-------------------------------------
// Content
//
= Mini-Project
#lorem(150)
#lorem(50)
//-------------------------------------
// Glossary
//
#heading(numbering:none, outlined: false)[] <sec:end>
#make_glossary(gloss:gloss, title:i18n("gloss-title"))
-59
View File
@@ -1,59 +0,0 @@
#import "@preview/hei-synd-report:0.1.1": *
#let entry-list = (
(
key: "hei",
short: "HEI",
long: "Haute École d'Ingénierie",
group: "University"
),
(
key: "synd",
short: "SYND",
long: "Systems Engineering",
group: "University"
),
(
key: "it",
short: "IT",
long: "Infotronics",
group: "University"
),
(
key: "rust",
short: "Rust",
plural: "Rust programs",
long: "Rust Programming Language",
description: "Rust is a modern systems programming language focused on safety, speed, and concurrency. It prevents common programming errors such as null pointer dereferencing and data races at compile time, making it a preferred choice for performance-critical applications.",
group: "Programming Language"
),
)
#let make_glossary(
gloss:true,
title: i18n("gloss-title"),
) = {[
#if gloss == true {[
#pagebreak()
#set heading(numbering: none)
= #title <sec:glossary>
#print-glossary(
entry-list,
// show all term even if they are not referenced, default to true
show-all: false,
// disable the back ref at the end of the descriptions
disable-back-references: false,
)
]} else{[
#set text(size: 0pt)
#title <sec:glossary>
#print-glossary(
entry-list,
// show all term even if they are not referenced, default to true
show-all: false,
// disable the back ref at the end of the descriptions
disable-back-references: false,
)
]}
]}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

-390
View File
@@ -1,390 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
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"
viewBox="0 0 270.79999 138.8"
height="138.8"
width="270.79999"
xml:space="preserve"
version="1.1"
id="svg2"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><g
transform="matrix(1.25,0,0,-1.25,0,138.8)"
id="g10"><g
transform="scale(0.1,0.1)"
id="g12"><path
id="path14"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 957.816,609.5 c -5.812,0 -6.246,0 -12.39,-0.312 l -0.653,0.722 c 0.325,11.574 0.653,24.067 0.543,34.711 -2.523,0 -5.265,0.106 -10.312,0.106 -8.555,0 -17.992,-0.106 -25.547,-0.211 -0.117,-19.625 0.215,-26.547 0.758,-34.297 l -0.543,-0.719 c -6.035,0 -6.359,0 -12.391,-0.312 l -0.66,0.722 c 0.434,10.129 0.543,15.395 0.543,46.695 0,13.942 -0.324,18.907 -0.648,25.11 l 0.648,0.715 c 5.606,0.109 6.914,0.109 12.176,0.308 l 0.555,-0.718 c -0.11,-6.098 -0.329,-14.571 -0.329,-28.719 5.7,-0.11 8.77,-0.211 15.903,-0.211 10.082,0 14.691,0.101 19.847,0.316 -0.218,19.625 -0.218,21.895 -0.773,28.309 l 0.555,0.715 c 5.918,0.109 6.797,0.109 12.168,0.308 l 0.55,-0.718 c -0.332,-10.024 -0.437,-16.532 -0.437,-34.602 0,-20.051 0.437,-27.691 1.098,-37.199 l -0.661,-0.719" /><path
id="path16"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1020.65,641.004 c 0,4.336 0,10.019 -0.76,12.918 -2.3,8.055 -10.2,10.633 -18.31,10.633 -6.475,0 -12.834,-1.34 -18.982,-3.403 l -0.649,-0.621 c -0.109,-2.168 -0.109,-2.789 -0.332,-7.539 l 0.871,-0.512 c 4.617,1.856 9.547,3.915 16.676,3.915 5.476,0 8.006,-1.961 9.106,-3.825 0.99,-1.652 0.99,-3.605 0.99,-6.398 l -1.88,-0.211 c -19.735,-2.168 -32.013,-6.613 -32.013,-20.453 0,-10.227 7.68,-17.246 18.641,-17.246 8.332,0 13.272,3.715 15.362,5.261 l -0.11,-3.714 0.43,-0.621 c 5.05,0.207 5.93,0.312 11.07,0.406 l 0.56,0.527 c -0.56,6.719 -0.67,7.848 -0.67,20.652 l 0,10.231 z m -11.28,-2.481 0,-17.25 c -1.21,-1.031 -5.16,-4.543 -11.964,-4.543 -10.414,0 -10.414,8.879 -10.414,9.399 0,9.195 10.309,10.637 21.378,12.191 l 1,0.203" /><path
id="path18"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1089.31,662.898 c -0.22,-7.839 -0.33,-15.171 -0.33,-23.55 0,-12.7 0.33,-20.34 0.56,-24.785 0,-1.454 0.1,-2.895 0.21,-4.344 l -0.44,-0.625 c -5.26,-0.094 -6.14,-0.199 -11.18,-0.406 l -0.66,0.621 0.11,4.336 c -2.41,-1.653 -8.23,-5.883 -17.22,-5.883 -4.28,0 -8.99,0.926 -12.5,3.515 -7.02,5.364 -7.02,14.149 -7.13,22.2 l 0,6.414 c -0.22,14.769 -0.22,16.425 -0.55,21.996 l 0.55,0.726 c 5.15,0.102 6.14,0.102 11.29,0.516 l 0.67,-0.731 -0.45,-22.617 c 0,-2.789 -0.11,-4.859 0,-9.808 0.11,-4.344 0.34,-13.633 11.41,-13.633 6.47,0 11.08,3.402 13.71,5.367 0.11,5.578 0.11,10.332 0.11,16.316 0,14.368 -0.11,17.258 -0.77,23.977 l 0.66,0.715 c 5.05,0.105 6.24,0.105 11.29,0.414 l 0.66,-0.731" /><path
id="path20"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1134.82,617.66 c -0.32,-3.406 -0.32,-4.137 -0.43,-7.129 l -0.55,-0.621 c -2.3,-0.515 -4.17,-0.926 -8.23,-0.926 -2.63,0 -9.54,0 -12.93,5.36 -1.98,3.008 -1.98,5.484 -1.98,17.668 l 0.22,22.726 c -3.84,0 -3.95,-0.09 -7.9,-0.199 l -0.43,0.621 c 0.21,3.305 0.21,4.133 0.21,7.438 l 0.65,0.617 c 2.42,0 3.84,-0.102 7.47,0 -0.11,2.176 -0.11,4.441 -0.11,6.613 -0.11,1.969 -0.22,3.926 -0.33,5.895 l 0.55,0.715 c 4.93,1.14 6.14,1.445 11.19,2.886 l 0.76,-0.508 c -0.33,-6.82 -0.44,-8.16 -0.44,-15.703 4.61,0.102 5.92,0.102 12.17,0.313 l 0.56,-0.621 c -0.23,-2.684 -0.34,-3.821 -0.34,-7.336 l -0.54,-0.621 c -5.48,0.105 -6.15,0.211 -11.95,0.211 l -0.22,-19.223 c 0.11,-1.238 0.11,-7.121 0.11,-8.578 0,-7.531 0.98,-9.906 6.47,-9.906 2.3,0 4.06,0.507 5.26,0.929 l 0.76,-0.621" /><path
id="path22"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1193.61,622.617 c -1.43,-1.133 -3.84,-3 -7.9,-4.543 -3.06,-1.035 -6.36,-1.551 -9.53,-1.551 -3.41,0 -9.67,0.516 -14.15,5.579 -3.74,4.226 -4.06,9.296 -4.17,12.91 17.97,0.105 20.95,0.105 38.06,0 l 0.75,0.621 c 0.11,4.547 0.35,14.769 -5.91,21.801 -3.3,3.718 -9.32,7.121 -17.99,7.121 -14.37,0 -26.65,-9.395 -26.65,-28.61 0,-17.976 11.29,-27.683 29.28,-27.683 9.76,0 15.68,2.988 17.56,3.914 l 0.65,0.726 c 0.22,4.032 0.33,5.067 0.87,9.2 l -0.87,0.515 z m -8.22,20.356 c -10.1,-0.11 -14.26,-0.215 -27.53,-0.11 1.1,10.328 8.33,14.258 14.47,14.258 4.93,0 9.76,-2.383 11.96,-8.055 0.87,-2.378 0.99,-4.652 1.1,-6.093" /><path
id="path24"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1298.24,617.969 c -0.34,-3.516 -0.34,-4.235 -0.56,-7.75 l -0.77,-0.719 c -21.37,0 -24.77,-0.105 -45.61,-0.312 l -0.56,0.722 c 0.34,8.164 0.67,13.742 0.67,32.649 0,17.351 0,27.269 -0.78,39.156 l 0.67,0.715 c 21.6,0.109 25.88,0.109 46.06,0.308 l 0.66,-0.718 c -0.34,-3.106 -0.55,-4.34 -0.77,-8.055 l -0.65,-0.723 c -14.15,0.403 -18.88,0.403 -32.79,0.512 -0.34,-9.508 -0.34,-12.504 -0.34,-22 13.5,-0.109 17.66,0 31.04,0.199 l 0.54,-0.715 c -0.43,-3.621 -0.43,-4.656 -0.54,-7.965 l -0.67,-0.714 c -12.71,0.304 -15.47,0.304 -30.37,0.304 -0.22,-11.98 -0.11,-14.875 0,-24.691 16.56,0 19.95,0 34.1,0.519 l 0.67,-0.722" /><path
id="path26"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1355.93,621.797 c -0.45,-4.445 -0.56,-4.957 -0.89,-9.199 l -0.77,-0.731 c -3.17,-1.437 -7.44,-3.515 -15.12,-3.515 -16.57,0 -27.31,11.265 -27.31,27.39 0,16.414 10.52,28.813 27.52,28.813 7.12,0 12.17,-2.168 15.02,-3.305 l 0.43,-0.719 c -0.43,-3.715 -0.54,-5.062 -0.76,-8.16 l -0.88,-0.418 c -3.6,2.481 -7.77,4.027 -12.17,4.027 -9.1,0 -17.1,-6.605 -17.1,-19.828 0,-14.05 8.45,-19.113 16.99,-19.113 7.47,0 12.06,3.613 14.15,5.168 l 0.89,-0.41" /><path
id="path28"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1421.28,637.18 c -0.22,7.234 -1.66,14.465 -6.69,19.941 -4.81,5.168 -12.18,7.434 -19.63,7.434 -10.96,0 -17.32,-4.223 -20.39,-7.231 -7.35,-6.922 -7.57,-17.043 -7.57,-20.969 0,-3.406 0.1,-13.945 7.57,-21.074 3.5,-3.414 9.75,-6.929 19.63,-6.929 7.67,0 14.15,1.769 18.97,6.308 3.62,3.414 5.93,7.442 7.12,12.508 0.77,3.094 0.99,6.504 0.99,10.012 z m -11.95,-0.414 c 0.1,-2.168 0,-9.09 -2.53,-13.735 -3.17,-5.679 -8.45,-6.918 -12.51,-6.918 -2.18,0 -4.49,0.41 -6.45,1.336 -8.67,4.141 -8.78,14.563 -8.78,18.703 0,4.344 0.34,10.336 3.28,14.563 3.84,5.789 9.99,5.992 12.08,5.992 6.13,0 9.64,-2.684 11.73,-5.883 2.74,-4.554 3.18,-11.476 3.18,-14.058" /><path
id="path30"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1450.56,609.594 c -5.27,-0.094 -6.35,-0.199 -11.52,-0.406 l -0.54,0.722 c 0.23,7.328 0.54,16.637 0.54,36.473 0,14.254 0,29.539 -1.09,42.762 l 0.55,0.625 c 5.37,0.82 6.49,1.031 11.96,2.168 l 0.65,-0.719 c -0.77,-13.539 -0.77,-27.172 -0.77,-40.707 0,-22.629 0.32,-30.473 0.88,-40.293 l -0.66,-0.625" /><path
id="path32"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1515.71,622.617 c -1.43,-1.133 -3.84,-3 -7.9,-4.543 -3.06,-1.035 -6.36,-1.551 -9.53,-1.551 -3.41,0 -9.65,0.516 -14.16,5.579 -3.73,4.226 -4.05,9.296 -4.16,12.91 17.97,0.105 20.95,0.105 38.05,0 l 0.76,0.621 c 0.13,4.547 0.33,14.769 -5.91,21.801 -3.3,3.718 -9.32,7.121 -17.99,7.121 -14.37,0 -26.65,-9.395 -26.65,-28.61 0,-17.976 11.29,-27.683 29.28,-27.683 9.77,0 15.68,2.988 17.54,3.914 l 0.67,0.726 c 0.21,4.032 0.34,5.067 0.86,9.2 l -0.86,0.515 z m -8.24,20.356 c -10.08,-0.11 -14.24,-0.215 -27.51,-0.11 1.08,10.328 8.33,14.258 14.47,14.258 4.93,0 9.76,-2.383 11.96,-8.055 0.88,-2.378 0.99,-4.652 1.08,-6.093" /><path
id="path34"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1601.14,650.824 c 8,-3.316 18.65,-7.652 18.65,-20.875 0,-11.57 -9.12,-21.996 -28.2,-21.996 -11.63,0 -19.08,3.297 -21.71,4.539 l -0.44,0.723 c 0.44,3.625 0.55,5.582 0.87,9.508 l 1.11,0.41 c 2.75,-1.758 9.1,-6.094 19.3,-6.094 11.3,0 16.03,5.473 16.03,11.676 0,7.23 -6.39,10.015 -13.51,12.601 l -5.48,2.278 c -7.8,3.406 -18.2,7.851 -18.2,20.453 0,3.824 1.09,7.75 3.39,10.848 5.05,6.82 14.15,9.093 23.04,9.093 8.67,0 13.91,-1.558 19.73,-3.316 l 0.56,-0.82 c -0.45,-3.93 -0.56,-5.372 -0.88,-9.094 l -0.88,-0.414 c -4.71,2.277 -9.86,4.758 -18.08,4.758 -9.11,0 -14.82,-4.028 -14.82,-10.129 0,-4.641 3.29,-6.809 5.59,-8.157 1.42,-0.836 1.85,-1.035 8.45,-3.726 l 5.48,-2.266" /><path
id="path36"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1648.73,663.32 -0.77,0.614 c -4.92,-0.926 -6.13,-1.235 -11.5,-2.055 l -0.56,-0.629 c 1.33,-11.773 1.33,-19.004 1.42,-35.012 0,-6.101 0.11,-12.195 0.11,-18.285 0,-10.547 -0.2,-17.047 -0.43,-23.351 l 0.56,-0.618 c 3.82,0.102 7.67,0.204 11.5,0.313 l 0.67,0.621 c -0.56,9.703 -0.77,12.391 -0.87,24.781 1.53,-0.105 2.85,-0.199 4.92,-0.199 23.13,0 34.43,13.73 34.43,29.742 0,14.571 -9.75,25.313 -23.69,25.313 -8.54,0 -13.81,-3.918 -16,-5.571 l 0.21,4.336 z m 0,-45.871 c -0.11,5.992 -0.21,12.086 -0.21,18.184 0,5.265 0.1,10.539 0.21,15.91 2.53,1.648 6.69,4.344 12.62,4.344 8.78,0 14.8,-6.621 14.8,-17.364 0,-12.703 -8.34,-21.382 -22.8,-21.382 -1.88,0 -3.19,0.211 -4.62,0.308" /><path
id="path38"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1750.3,622.617 c -1.44,-1.133 -3.84,-3 -7.91,-4.543 -3.06,-1.035 -6.35,-1.551 -9.54,-1.551 -3.39,0 -9.65,0.516 -14.14,5.579 -3.74,4.226 -4.05,9.296 -4.18,12.91 18,0.105 20.95,0.105 38.06,0 l 0.78,0.621 c 0.09,4.547 0.32,14.769 -5.94,21.801 -3.28,3.718 -9.3,7.121 -17.97,7.121 -14.37,0 -26.66,-9.395 -26.66,-28.61 0,-17.976 11.3,-27.683 29.29,-27.683 9.76,0 15.68,2.988 17.54,3.914 l 0.67,0.726 c 0.22,4.032 0.33,5.067 0.86,9.2 l -0.86,0.515 z m -8.78,63.539 c -2.09,-0.113 -4.17,-0.113 -6.26,-0.113 -2.09,0 -4.05,0 -6.46,0.113 l -0.67,-0.527 c -2.4,-6.715 -5.59,-13.316 -6.69,-15.801 l 0.44,-0.719 c 3.85,0 5.05,0 8.01,-0.113 l 0.76,0.422 c 4.95,7.539 5.93,8.98 11.3,15.898 l -0.43,0.84 z m 0.54,-43.183 c -10.08,-0.11 -14.24,-0.215 -27.53,-0.11 1.1,10.328 8.35,14.258 14.49,14.258 4.93,0 9.76,-2.383 11.95,-8.055 0.88,-2.378 0.98,-4.652 1.09,-6.093" /><path
id="path40"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1811.27,621.797 c -0.45,-4.445 -0.54,-4.957 -0.88,-9.199 l -0.76,-0.731 c -3.19,-1.437 -7.46,-3.515 -15.15,-3.515 -16.56,0 -27.3,11.265 -27.3,27.39 0,16.414 10.53,28.813 27.53,28.813 7.14,0 12.17,-2.168 15.01,-3.305 l 0.45,-0.719 c -0.45,-3.715 -0.54,-5.062 -0.76,-8.16 l -0.88,-0.418 c -3.63,2.481 -7.79,4.027 -12.17,4.027 -9.1,0 -17.11,-6.605 -17.11,-19.828 0,-14.05 8.44,-19.113 17,-19.113 7.45,0 12.05,3.613 14.14,5.168 l 0.88,-0.41" /><path
id="path42"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1837.37,678.305 c -5.6,-0.215 -6.81,-0.309 -12.16,-0.836 l -0.67,0.621 c 0.11,1.344 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.515 -0.22,5.594 l 0.78,0.609 c 5.69,0.41 6.68,0.516 12.16,1.031 l 0.66,-0.621 c -0.11,-4.234 -0.11,-5.266 0,-9.809 l -0.66,-0.718 z m -0.12,-68.711 c -5.7,-0.094 -6.57,-0.094 -11.94,-0.406 l -0.55,0.722 c 0.32,5.473 0.66,10.227 0.66,21.692 0,19.73 -0.34,23.457 -1.09,29.55 l 0.53,0.727 c 4.71,0.719 6.37,0.926 11.85,2.055 l 1.09,-0.614 c -0.32,-5.379 -0.66,-10.949 -0.66,-24.277 0,-19.215 0.23,-21.805 0.66,-28.824 l -0.55,-0.625" /><path
id="path44"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1899.44,641.004 c 0,4.336 0,10.019 -0.77,12.918 -2.29,8.055 -10.2,10.633 -18.32,10.633 -6.47,0 -12.82,-1.34 -18.96,-3.403 l -0.67,-0.621 c -0.1,-2.168 -0.1,-2.789 -0.31,-7.539 l 0.87,-0.512 c 4.61,1.856 9.53,3.915 16.67,3.915 5.49,0 8.01,-1.961 9.09,-3.825 0.99,-1.652 0.99,-3.605 0.99,-6.398 l -1.86,-0.211 c -19.73,-2.168 -32.01,-6.613 -32.01,-20.453 0,-10.227 7.68,-17.246 18.63,-17.246 8.33,0 13.27,3.715 15.36,5.261 l -0.12,-3.714 0.44,-0.621 c 5.05,0.207 5.94,0.312 11.08,0.406 l 0.54,0.527 c -0.54,6.719 -0.65,7.848 -0.65,20.652 l 0,10.231 z m -11.29,-2.481 0,-17.25 c -1.22,-1.031 -5.16,-4.543 -11.96,-4.543 -10.42,0 -10.42,8.879 -10.42,9.399 0,9.195 10.31,10.637 21.4,12.191 l 0.98,0.203" /><path
id="path46"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1931.47,609.594 c -5.26,-0.094 -6.37,-0.199 -11.51,-0.406 l -0.56,0.722 c 0.22,7.328 0.56,16.637 0.56,36.473 0,14.254 0,29.539 -1.12,42.762 l 0.56,0.625 c 5.39,0.82 6.47,1.031 11.95,2.168 l 0.65,-0.719 c -0.76,-13.539 -0.76,-27.172 -0.76,-40.707 0,-22.629 0.33,-30.473 0.89,-40.293 l -0.66,-0.625" /><path
id="path48"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1964.14,678.305 c -5.59,-0.215 -6.78,-0.309 -12.17,-0.836 l -0.66,0.621 c 0.11,1.344 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.515 -0.2,5.594 l 0.75,0.609 c 5.71,0.41 6.69,0.516 12.17,1.031 l 0.67,-0.621 c -0.11,-4.234 -0.11,-5.266 0,-9.809 l -0.67,-0.718 z m -0.11,-68.711 c -5.69,-0.094 -6.58,-0.094 -11.95,-0.406 l -0.54,0.722 c 0.33,5.473 0.65,10.227 0.65,21.692 0,19.73 -0.32,23.457 -1.09,29.55 l 0.55,0.727 c 4.71,0.719 6.37,0.926 11.85,2.055 l 1.08,-0.614 c -0.31,-5.379 -0.65,-10.949 -0.65,-24.277 0,-19.215 0.21,-21.805 0.65,-28.824 l -0.55,-0.625" /><path
id="path50"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2007.46,640.898 c 4.41,-1.339 14.38,-4.543 14.38,-15.488 0,-4.137 -1.64,-8.789 -6.14,-12.195 -5.82,-4.641 -13.61,-4.953 -17.56,-4.953 -5.91,0 -10.85,1.031 -15.01,2.586 -0.56,0.199 -1.11,0.402 -1.65,0.613 l -0.55,0.926 c 0.43,4.035 0.43,4.547 0.66,8.676 l 1.11,0.312 c 1.96,-1.441 6.77,-4.953 15.23,-4.953 8.67,0 11.85,4.543 11.85,7.742 0,4.75 -4.71,6.309 -11.42,8.375 l -3.5,1.133 c -4.51,1.34 -14.36,4.332 -14.36,14.984 0,10.637 9.85,15.899 22.14,15.899 8.1,0 13.82,-2.168 15.79,-2.895 l 0.55,-0.719 c -0.44,-3.82 -0.55,-4.234 -0.86,-8.16 l -0.99,-0.41 c -2.76,1.652 -7.03,4.133 -14.15,4.133 -1.53,0 -3.07,-0.109 -4.73,-0.524 -3.3,-0.82 -6.02,-2.988 -6.02,-6.195 0,-4.445 4.49,-5.793 11.31,-7.75 l 3.92,-1.137" /><path
id="path52"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2081.83,622.617 c -1.43,-1.133 -3.84,-3 -7.89,-4.543 -3.07,-1.035 -6.37,-1.551 -9.55,-1.551 -3.4,0 -9.64,0.516 -14.17,5.579 -3.71,4.226 -4.05,9.296 -4.15,12.91 17.98,0.105 20.94,0.105 38.06,0 l 0.76,0.621 c 0.11,4.547 0.34,14.769 -5.92,21.801 -3.29,3.718 -9.33,7.121 -17.98,7.121 -14.36,0 -26.64,-9.395 -26.64,-28.61 0,-17.976 11.29,-27.683 29.27,-27.683 9.77,0 15.69,2.988 17.56,3.914 l 0.65,0.726 c 0.21,4.032 0.32,5.067 0.88,9.2 l -0.88,0.515 z m -8.78,63.539 c -2.07,-0.113 -4.16,-0.113 -6.25,-0.113 -2.08,0 -4.07,0 -6.46,0.113 l -0.67,-0.527 c -2.41,-6.715 -5.59,-13.316 -6.69,-15.801 l 0.44,-0.719 c 3.84,0 5.05,0 8,-0.113 l 0.78,0.422 c 4.94,7.539 5.91,8.98 11.3,15.898 l -0.45,0.84 z m 0.54,-43.183 c -10.08,-0.11 -14.24,-0.215 -27.52,-0.11 1.11,10.328 8.33,14.258 14.47,14.258 4.94,0 9.76,-2.383 11.97,-8.055 0.88,-2.378 0.99,-4.652 1.08,-6.093" /><path
id="path54"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2146.2,622.617 c -1.42,-1.133 -3.84,-3 -7.89,-4.543 -3.09,-1.035 -6.37,-1.551 -9.54,-1.551 -3.41,0 -9.65,0.516 -14.15,5.579 -3.73,4.226 -4.05,9.296 -4.16,12.91 17.97,0.105 20.95,0.105 38.05,0 l 0.76,0.621 c 0.11,4.547 0.34,14.769 -5.92,21.801 -3.29,3.718 -9.34,7.121 -17.99,7.121 -14.36,0 -26.64,-9.395 -26.64,-28.61 0,-17.976 11.3,-27.683 29.28,-27.683 9.76,0 15.68,2.988 17.56,3.914 l 0.64,0.726 c 0.22,4.032 0.33,5.067 0.89,9.2 l -0.89,0.515 z m -8.22,20.356 c -10.09,-0.11 -14.26,-0.215 -27.52,-0.11 1.09,10.328 8.32,14.258 14.45,14.258 4.96,0 9.78,-2.383 11.97,-8.055 0.88,-2.378 0.99,-4.652 1.1,-6.093" /><path
id="path56"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1047.53,565.758 c 0.54,-5.992 1.1,-12.195 0.99,-25 -2.97,0.203 -4.06,0.203 -6.36,0.203 -5.7,0 -16.12,-0.313 -24.14,-7.125 -4.6,-3.824 -9.65,-10.953 -9.65,-22.215 0,-15.699 10.09,-26.555 24.69,-26.555 8,0 12.49,3.313 15.12,5.172 l -0.22,-3.824 0.78,-0.617 c 5.04,0.207 6.35,0.305 11.18,0.305 l 0.55,0.726 c -0.45,7.125 -0.88,14.774 -0.88,30.781 0,10.329 0.11,35.954 0.88,50.313 l -0.77,0.625 c -4.94,-1.035 -6.03,-1.238 -11.63,-2.172 l -0.54,-0.617 z m 0.54,-66.942 c -1.53,-1.238 -5.58,-4.554 -12.27,-4.554 -5.71,0 -9.33,2.484 -11.31,4.652 -2.3,2.578 -4.06,6.82 -4.06,12.707 0,9.192 3.95,14.055 6.37,16.223 5.27,4.644 12.5,4.844 15.9,4.844 2.31,0 3.62,-0.2 5.48,-0.297 0.11,-16.95 0.11,-20.043 -0.11,-33.575" /><path
id="path58"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1124.85,499.227 c -1.43,-1.137 -3.84,-2.997 -7.9,-4.547 -3.08,-1.035 -6.36,-1.555 -9.55,-1.555 -3.39,0 -9.64,0.52 -14.13,5.578 -3.73,4.238 -4.07,9.309 -4.18,12.918 17.99,0.106 20.95,0.106 38.06,0 l 0.77,0.617 c 0.11,4.543 0.32,14.774 -5.93,21.797 -3.28,3.719 -9.31,7.125 -17.98,7.125 -14.37,0 -26.65,-9.398 -26.65,-28.613 0,-17.973 11.29,-27.68 29.29,-27.68 9.75,0 15.68,2.988 17.53,3.922 l 0.67,0.723 c 0.22,4.031 0.33,5.062 0.87,9.191 l -0.87,0.524 z m -8.23,20.351 c -10.09,-0.101 -14.26,-0.211 -27.53,-0.101 1.1,10.328 8.34,14.253 14.48,14.253 4.93,0 9.76,-2.378 11.95,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path60"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1210.28,527.426 c 8.01,-3.305 18.65,-7.649 18.65,-20.871 0,-11.567 -9.11,-22 -28.2,-22 -11.61,0 -19.07,3.3 -21.71,4.554 l -0.43,0.719 c 0.43,3.613 0.54,5.57 0.87,9.496 l 1.1,0.422 c 2.74,-1.758 9.1,-6.101 19.3,-6.101 11.29,0 16.01,5.476 16.01,11.671 0,7.231 -6.36,10.02 -13.5,12.602 l -5.48,2.277 c -7.77,3.407 -18.21,7.852 -18.21,20.453 0,3.825 1.12,7.758 3.41,10.856 5.05,6.809 14.15,9.086 23.04,9.086 8.65,0 13.92,-1.547 19.74,-3.305 l 0.54,-0.824 c -0.43,-3.93 -0.54,-5.379 -0.87,-9.094 l -0.88,-0.414 c -4.72,2.274 -9.88,4.75 -18.1,4.75 -9.1,0 -14.8,-4.023 -14.8,-10.121 0,-4.648 3.28,-6.816 5.59,-8.164 1.42,-0.828 1.87,-1.027 8.44,-3.719 l 5.49,-2.273" /><path
id="path62"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1294.4,539.512 c -0.22,-7.844 -0.34,-15.184 -0.34,-23.551 0,-12.699 0.34,-20.352 0.56,-24.793 0,-1.449 0.11,-2.898 0.21,-4.34 l -0.43,-0.625 c -5.26,-0.101 -6.15,-0.199 -11.19,-0.406 l -0.65,0.617 0.11,4.336 c -2.42,-1.641 -8.24,-5.883 -17.22,-5.883 -4.27,0 -8.99,0.93 -12.51,3.512 -7.02,5.375 -7.02,14.152 -7.12,22.207 l 0,6.406 c -0.22,14.77 -0.22,16.426 -0.56,22 l 0.56,0.727 c 5.14,0.109 6.13,0.109 11.28,0.515 l 0.67,-0.722 -0.44,-22.617 c 0,-2.801 -0.12,-4.856 0,-9.809 0.1,-4.348 0.33,-13.645 11.4,-13.645 6.47,0 11.08,3.407 13.72,5.375 0.11,5.571 0.11,10.329 0.11,16.321 0,14.363 -0.11,17.254 -0.78,23.965 l 0.67,0.726 c 5.05,0.094 6.25,0.094 11.29,0.406 l 0.66,-0.722" /><path
id="path64"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1326.98,554.91 c -5.61,-0.211 -6.82,-0.312 -12.19,-0.84 l -0.66,0.629 c 0.12,1.348 0.12,2.793 0.12,4.129 0,1.863 -0.12,3.516 -0.22,5.586 l 0.76,0.617 c 5.71,0.41 6.7,0.516 12.19,1.024 l 0.65,-0.614 c -0.11,-4.23 -0.11,-5.265 0,-9.808 l -0.65,-0.723 z m -0.13,-68.707 c -5.7,-0.101 -6.58,-0.101 -11.95,-0.406 l -0.54,0.726 c 0.32,5.473 0.65,10.223 0.65,21.688 0,19.727 -0.33,23.457 -1.1,29.543 l 0.56,0.726 c 4.72,0.723 6.36,0.934 11.84,2.071 l 1.1,-0.629 c -0.34,-5.363 -0.65,-10.949 -0.65,-24.27 0,-19.222 0.22,-21.804 0.65,-28.824 l -0.56,-0.625" /><path
id="path66"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1370.3,517.504 c 4.38,-1.332 14.36,-4.535 14.36,-15.484 0,-4.141 -1.65,-8.79 -6.14,-12.192 -5.82,-4.652 -13.61,-4.961 -17.56,-4.961 -5.92,0 -10.85,1.035 -15.02,2.582 -0.54,0.207 -1.1,0.406 -1.64,0.621 l -0.55,0.926 c 0.44,4.031 0.44,4.547 0.66,8.676 l 1.1,0.316 c 1.97,-1.445 6.79,-4.961 15.25,-4.961 8.65,0 11.83,4.551 11.83,7.746 0,4.747 -4.71,6.313 -11.4,8.372 l -3.51,1.128 c -4.49,1.348 -14.37,4.344 -14.37,14.985 0,10.64 9.88,15.902 22.15,15.902 8.12,0 13.82,-2.168 15.8,-2.89 l 0.54,-0.719 c -0.43,-3.821 -0.54,-4.242 -0.87,-8.156 l -0.99,-0.422 c -2.74,1.66 -7.01,4.136 -14.15,4.136 -1.53,0 -3.07,-0.105 -4.72,-0.519 -3.28,-0.828 -6.03,-2.996 -6.03,-6.195 0,-4.442 4.5,-5.786 11.31,-7.743 l 3.95,-1.148" /><path
id="path68"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1423.15,517.504 c 4.38,-1.332 14.35,-4.535 14.35,-15.484 0,-4.141 -1.62,-8.79 -6.14,-12.192 -5.79,-4.652 -13.6,-4.961 -17.53,-4.961 -5.93,0 -10.87,1.035 -15.02,2.582 -0.55,0.207 -1.11,0.406 -1.65,0.621 l -0.54,0.926 c 0.43,4.031 0.43,4.547 0.65,8.676 l 1.09,0.316 c 1.99,-1.445 6.8,-4.961 15.24,-4.961 8.66,0 11.84,4.551 11.84,7.746 0,4.747 -4.7,6.313 -11.39,8.372 l -3.5,1.128 c -4.52,1.348 -14.38,4.344 -14.38,14.985 0,10.64 9.86,15.902 22.15,15.902 8.12,0 13.81,-2.168 15.8,-2.89 l 0.54,-0.719 c -0.44,-3.821 -0.54,-4.242 -0.87,-8.156 l -0.99,-0.422 c -2.74,1.66 -7.03,4.136 -14.14,4.136 -1.55,0 -3.08,-0.105 -4.72,-0.519 -3.3,-0.828 -6.04,-2.996 -6.04,-6.195 0,-4.442 4.51,-5.786 11.29,-7.743 l 3.96,-1.148" /><path
id="path70"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1497.5,499.227 c -1.43,-1.137 -3.84,-2.997 -7.9,-4.547 -3.06,-1.035 -6.36,-1.555 -9.53,-1.555 -3.41,0 -9.65,0.52 -14.15,5.578 -3.72,4.238 -4.06,9.309 -4.17,12.918 17.98,0.106 20.95,0.106 38.05,0 l 0.77,0.617 c 0.12,4.543 0.34,14.774 -5.92,21.797 -3.3,3.719 -9.32,7.125 -17.99,7.125 -14.35,0 -26.65,-9.398 -26.65,-28.613 0,-17.973 11.29,-27.68 29.28,-27.68 9.77,0 15.69,2.988 17.55,3.922 l 0.66,0.723 c 0.21,4.031 0.34,5.062 0.87,9.191 l -0.87,0.524 z m -8.22,20.351 c -10.1,-0.101 -14.26,-0.211 -27.53,-0.101 1.1,10.328 8.33,14.253 14.48,14.253 4.92,0 9.75,-2.378 11.95,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path72"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1605.63,513.789 c -0.22,7.231 -1.64,14.457 -6.68,19.941 -4.82,5.168 -12.18,7.43 -19.64,7.43 -10.96,0 -17.33,-4.226 -20.39,-7.23 -7.36,-6.918 -7.57,-17.035 -7.57,-20.961 0,-3.41 0.12,-13.953 7.57,-21.082 3.51,-3.407 9.77,-6.914 19.62,-6.914 7.67,0 14.15,1.75 18.98,6.3 3.62,3.407 5.91,7.43 7.14,12.497 0.75,3.093 0.97,6.503 0.97,10.019 z m -11.94,-0.41 c 0.1,-2.168 0,-9.098 -2.54,-13.742 -3.17,-5.684 -8.44,-6.922 -12.49,-6.922 -2.2,0 -4.49,0.41 -6.47,1.348 -8.67,4.132 -8.78,14.558 -8.78,18.699 0,4.336 0.34,10.332 3.3,14.554 3.84,5.793 9.97,5.993 12.06,5.993 6.14,0 9.65,-2.676 11.74,-5.883 2.73,-4.543 3.18,-11.465 3.18,-14.047" /><path
id="path74"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1664.31,498.398 c -0.43,-4.445 -0.56,-4.957 -0.86,-9.199 l -0.78,-0.719 c -3.19,-1.445 -7.46,-3.507 -15.14,-3.507 -16.55,0 -27.32,11.257 -27.32,27.375 0,16.422 10.53,28.812 27.53,28.812 7.14,0 12.19,-2.168 15.03,-3.301 l 0.44,-0.726 c -0.44,-3.715 -0.54,-5.063 -0.76,-8.16 l -0.88,-0.41 c -3.61,2.48 -7.79,4.027 -12.17,4.027 -9.11,0 -17.11,-6.606 -17.11,-19.828 0,-14.059 8.44,-19.117 17,-19.117 7.45,0 12.06,3.621 14.16,5.171 l 0.86,-0.418" /><path
id="path76"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1719.49,498.398 c -0.47,-4.445 -0.55,-4.957 -0.9,-9.199 l -0.76,-0.719 c -3.17,-1.445 -7.46,-3.507 -15.12,-3.507 -16.57,0 -27.33,11.257 -27.33,27.375 0,16.422 10.55,28.812 27.54,28.812 7.13,0 12.17,-2.168 15.02,-3.301 l 0.43,-0.726 c -0.43,-3.715 -0.54,-5.063 -0.77,-8.16 l -0.87,-0.41 c -3.61,2.48 -7.78,4.027 -12.17,4.027 -9.1,0 -17.11,-6.606 -17.11,-19.828 0,-14.059 8.44,-19.117 16.99,-19.117 7.46,0 12.07,3.621 14.15,5.171 l 0.9,-0.418" /><path
id="path78"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1745.58,554.91 c -5.59,-0.211 -6.8,-0.312 -12.17,-0.84 l -0.67,0.629 c 0.11,1.348 0.11,2.793 0.11,4.129 0,1.863 -0.11,3.516 -0.2,5.586 l 0.76,0.617 c 5.69,0.41 6.69,0.516 12.17,1.024 l 0.66,-0.614 c -0.12,-4.23 -0.12,-5.265 0,-9.808 l -0.66,-0.723 z m -0.11,-68.707 c -5.69,-0.101 -6.58,-0.101 -11.95,-0.406 l -0.56,0.726 c 0.34,5.473 0.66,10.223 0.66,21.688 0,19.727 -0.32,23.457 -1.09,29.543 l 0.56,0.726 c 4.7,0.723 6.34,0.934 11.82,2.071 l 1.1,-0.629 c -0.33,-5.363 -0.67,-10.949 -0.67,-24.27 0,-19.222 0.24,-21.804 0.67,-28.824 l -0.54,-0.625" /><path
id="path80"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1801.95,565.758 c 0.56,-5.992 1.1,-12.195 0.99,-25 -2.97,0.203 -4.05,0.203 -6.37,0.203 -5.71,0 -16.13,-0.313 -24.13,-7.125 -4.6,-3.824 -9.65,-10.953 -9.65,-22.215 0,-15.699 10.08,-26.555 24.68,-26.555 8.01,0 12.5,3.313 15.15,5.172 l -0.24,-3.824 0.77,-0.617 c 5.05,0.207 6.35,0.305 11.2,0.305 l 0.54,0.726 c -0.45,7.125 -0.88,14.774 -0.88,30.781 0,10.329 0.11,35.954 0.88,50.313 l -0.77,0.625 c -4.92,-1.035 -6.02,-1.238 -11.61,-2.172 l -0.56,-0.617 z m 0.56,-66.942 c -1.55,-1.238 -5.61,-4.554 -12.3,-4.554 -5.7,0 -9.32,2.484 -11.29,4.652 -2.3,2.578 -4.07,6.82 -4.07,12.707 0,9.192 3.97,14.055 6.37,16.223 5.26,4.644 12.49,4.844 15.9,4.844 2.3,0 3.62,-0.2 5.5,-0.297 0.09,-16.95 0.09,-20.043 -0.11,-33.575" /><path
id="path82"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1879.27,499.227 c -1.43,-1.137 -3.84,-2.997 -7.89,-4.547 -3.09,-1.035 -6.37,-1.555 -9.54,-1.555 -3.41,0 -9.66,0.52 -14.15,5.578 -3.73,4.238 -4.07,9.309 -4.18,12.918 17.98,0.106 20.95,0.106 38.05,0 l 0.77,0.617 c 0.11,4.543 0.35,14.774 -5.91,21.797 -3.29,3.719 -9.32,7.125 -17.99,7.125 -14.37,0 -26.66,-9.398 -26.66,-28.613 0,-17.973 11.3,-27.68 29.29,-27.68 9.75,0 15.69,2.988 17.54,3.922 l 0.67,0.723 c 0.21,4.031 0.32,5.062 0.87,9.191 l -0.87,0.524 z m -8.23,20.351 c -10.08,-0.101 -14.25,-0.211 -27.53,-0.101 1.11,10.328 8.34,14.253 14.49,14.253 4.92,0 9.75,-2.378 11.95,-8.054 0.86,-2.379 0.99,-4.656 1.09,-6.098" /><path
id="path84"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1947.6,486.203 c -5.29,-0.101 -5.94,-0.101 -10.99,-0.406 l -0.75,0.726 c 0,1.133 0.11,2.266 0.11,3.407 0.1,5.058 0.1,10.121 0.1,15.187 0,15.903 -0.1,16.938 -0.66,19.106 -2.08,7.847 -8.33,7.847 -9.86,7.847 -6.59,0 -11.63,-3.605 -14.59,-5.781 -0.11,-17.969 0.11,-27.375 0.87,-39.461 l -0.65,-0.625 c -5.37,-0.101 -6.26,-0.101 -11.52,-0.406 l -0.54,0.726 c 0.11,5.782 0.32,11.356 0.32,18.997 0,16.535 -0.77,25.316 -1.31,32.234 l 0.65,0.726 c 5.48,0.934 6.46,1.137 11.62,2.071 l 0.78,-0.723 -0.11,-5.371 c 2.85,1.856 9.66,6.402 19.31,6.402 2.74,0 6.14,-0.421 9.1,-1.961 2.83,-1.554 5.16,-3.929 6.35,-6.718 1.44,-3.094 1.53,-6.196 1.65,-12.602 l 0,-12.094 c 0.31,-12.086 0.44,-16.734 0.78,-20.656 l -0.66,-0.625" /><path
id="path86"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1992.99,494.262 c -0.32,-3.403 -0.32,-4.129 -0.43,-7.121 l -0.56,-0.618 c -2.29,-0.519 -4.15,-0.937 -8.21,-0.937 -2.65,0 -9.55,0 -12.96,5.371 -1.96,2.996 -1.96,5.473 -1.96,17.664 l 0.21,22.731 c -3.84,0 -3.94,-0.102 -7.89,-0.211 l -0.44,0.621 c 0.21,3.316 0.21,4.136 0.21,7.441 l 0.66,0.625 c 2.41,0 3.86,-0.109 7.46,0 -0.11,2.168 -0.11,4.438 -0.11,6.606 -0.1,1.972 -0.21,3.921 -0.34,5.89 l 0.56,0.727 c 4.94,1.129 6.15,1.441 11.18,2.887 l 0.77,-0.52 c -0.32,-6.813 -0.43,-8.16 -0.43,-15.699 4.6,0.109 5.91,0.109 12.17,0.308 l 0.56,-0.613 c -0.22,-2.691 -0.34,-3.828 -0.34,-7.344 l -0.54,-0.617 c -5.49,0.11 -6.15,0.215 -11.95,0.215 l -0.24,-19.219 c 0.13,-1.238 0.13,-7.133 0.13,-8.578 0,-7.535 0.98,-9.918 6.46,-9.918 2.31,0 4.07,0.52 5.27,0.93 l 0.76,-0.621" /><path
id="path88"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2049.03,517.609 c 0,4.344 0,10.028 -0.77,12.918 -2.29,8.067 -10.2,10.633 -18.32,10.633 -6.46,0 -12.81,-1.332 -18.96,-3.406 l -0.67,-0.621 c -0.1,-2.164 -0.1,-2.785 -0.32,-7.539 l 0.88,-0.508 c 4.62,1.855 9.54,3.918 16.66,3.918 5.48,0 8.01,-1.961 9.1,-3.824 1,-1.653 1,-3.61 1,-6.407 l -1.87,-0.203 c -19.73,-2.172 -32.03,-6.609 -32.03,-20.457 0,-10.226 7.69,-17.246 18.66,-17.246 8.33,0 13.25,3.715 15.34,5.266 l -0.1,-3.719 0.43,-0.617 c 5.07,0.207 5.92,0.305 11.08,0.406 l 0.56,0.52 c -0.56,6.718 -0.67,7.851 -0.67,20.664 l 0,10.222 z m -11.3,-2.472 0,-17.258 c -1.21,-1.031 -5.15,-4.543 -11.94,-4.543 -10.43,0 -10.43,8.883 -10.43,9.402 0,9.188 10.31,10.641 21.4,12.192 l 0.97,0.207" /><path
id="path90"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2081.06,486.203 c -5.27,-0.101 -6.37,-0.199 -11.53,-0.406 l -0.54,0.726 c 0.22,7.325 0.54,16.629 0.54,36.457 0,14.266 0,29.551 -1.08,42.778 l 0.54,0.617 c 5.38,0.824 6.47,1.027 11.96,2.172 l 0.66,-0.727 c -0.77,-13.527 -0.77,-27.172 -0.77,-40.703 0,-22.621 0.32,-30.476 0.88,-40.289 l -0.66,-0.625" /><path
id="path92"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2146.2,499.227 c -1.42,-1.137 -3.84,-2.997 -7.89,-4.547 -3.09,-1.035 -6.37,-1.555 -9.54,-1.555 -3.41,0 -9.65,0.52 -14.15,5.578 -3.73,4.238 -4.05,9.309 -4.16,12.918 17.97,0.106 20.95,0.106 38.05,0 l 0.76,0.617 c 0.11,4.543 0.34,14.774 -5.92,21.797 -3.29,3.719 -9.34,7.125 -17.99,7.125 -14.36,0 -26.64,-9.398 -26.64,-28.613 0,-17.973 11.3,-27.68 29.28,-27.68 9.76,0 15.68,2.988 17.56,3.922 l 0.64,0.723 c 0.22,4.031 0.33,5.062 0.89,9.191 l -0.89,0.524 z m -8.22,20.351 c -10.09,-0.101 -14.26,-0.211 -27.52,-0.101 1.09,10.328 8.32,14.253 14.45,14.253 4.96,0 9.78,-2.378 11.97,-8.054 0.88,-2.379 0.99,-4.656 1.1,-6.098" /><path
id="path94"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 649.375,337.137 c -10.859,0.304 -13.051,0.304 -26.105,0.422 -0.211,-4.454 -0.211,-20.262 0.66,-31.516 l -0.539,-0.727 c -6.043,0 -6.914,-0.093 -12.731,-0.296 l -0.547,0.71 c 0.438,7.864 0.653,13.844 0.653,44.329 0,14.66 -0.321,21.164 -0.653,27.464 l 0.547,0.727 c 7.57,-0.094 36.629,0.113 44.203,0.313 l 0.543,-0.723 c -0.433,-3.719 -0.433,-4.235 -0.66,-8.254 l -0.66,-0.637 c -13.594,0.317 -17.324,0.414 -30.695,0.414 -0.121,-4.23 -0.332,-14.656 -0.332,-20.761 l 0,-2.368 c 12.5,0.094 16.226,0.2 27.191,0.512 l 0.551,-0.617 c -0.446,-4.754 -0.446,-5.266 -0.766,-8.27 l -0.66,-0.722" /><path
id="path96"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 706.977,336.82 c 0,4.344 0,10.024 -0.778,12.918 -2.293,8.063 -10.191,10.641 -18.312,10.641 -6.469,0 -12.828,-1.344 -18.965,-3.418 l -0.664,-0.609 c -0.113,-2.172 -0.113,-2.793 -0.328,-7.543 l 0.883,-0.512 c 4.605,1.851 9.539,3.922 16.667,3.922 5.489,0 8.004,-1.957 9.106,-3.821 0.98,-1.652 0.98,-3.609 0.98,-6.406 l -1.855,-0.203 c -19.742,-2.172 -32.027,-6.609 -32.027,-20.453 0,-10.234 7.671,-17.25 18.636,-17.25 8.34,0 13.274,3.707 15.356,5.269 l -0.11,-3.722 0.442,-0.613 c 5.047,0.203 5.922,0.296 11.078,0.402 l 0.551,0.527 c -0.551,6.711 -0.66,7.844 -0.66,20.653 l 0,10.218 z m -11.301,-2.476 0,-17.246 c -1.203,-1.032 -5.149,-4.551 -11.953,-4.551 -10.422,0 -10.422,8.887 -10.422,9.406 0,9.188 10.312,10.645 21.39,12.192 l 0.985,0.199" /><path
id="path98"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 768.398,317.617 c -0.449,-4.433 -0.562,-4.957 -0.882,-9.191 l -0.77,-0.727 c -3.183,-1.457 -7.453,-3.515 -15.137,-3.515 -16.558,0 -27.308,11.254 -27.308,27.371 0,16.433 10.527,28.824 27.531,28.824 7.129,0 12.168,-2.164 15.023,-3.305 l 0.442,-0.722 c -0.442,-3.719 -0.551,-5.071 -0.774,-8.161 l -0.875,-0.41 c -3.617,2.481 -7.781,4.02 -12.175,4.02 -9.11,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.45,-19.118 17,-19.118 7.461,0 12.063,3.618 14.153,5.168 l 0.882,-0.41" /><path
id="path100"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 830.898,305.422 c -5.261,-0.106 -5.914,-0.106 -10.96,-0.402 l -0.774,0.71 0.113,3.411 c 0.114,5.371 0.114,10.851 0.114,16.222 l -0.114,11.047 c 0,2.379 0,4.754 -0.547,7.031 -1.207,4.75 -4.273,7.84 -9.867,7.84 -6.25,0 -11.082,-3.293 -14.703,-5.773 -0.105,-17.977 0.117,-27.375 0.774,-39.465 l -0.547,-0.621 c -5.039,-0.106 -6.364,-0.106 -11.742,-0.402 l -0.543,0.71 c 0.211,7.336 0.543,16.637 0.543,36.465 0,8.684 -0.11,17.364 -0.223,26.039 -0.215,9.09 -0.543,12.086 -0.863,16.735 l 0.543,0.621 c 5.261,0.824 7.007,1.137 11.953,2.168 l 0.664,-0.727 c -0.664,-11.054 -0.664,-22.203 -0.664,-33.367 3.508,2.172 10.418,6.414 19.629,6.414 2.523,0 5.046,-0.312 7.351,-1.246 4.934,-1.871 7.903,-5.566 8.988,-9.809 0.551,-2.078 0.551,-3.308 0.77,-10.234 l 0,-12.086 0.105,-4.855 c 0.219,-8.664 0.219,-10.125 0.668,-15.805 l -0.668,-0.621" /><path
id="path102"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 899.781,305.422 c -5.269,-0.106 -5.929,-0.106 -10.976,-0.402 l -0.758,0.71 0.105,3.411 c 0.11,5.371 0.11,10.851 0.11,16.222 l -0.11,11.047 c 0,2.379 0,4.754 -0.55,7.031 -1.207,4.75 -4.278,7.84 -9.868,7.84 -6.254,0 -11.078,-3.293 -14.703,-5.773 -0.105,-17.977 0.117,-27.375 0.77,-39.465 l -0.543,-0.621 c -5.043,-0.106 -6.363,-0.106 -11.735,-0.402 l -0.55,0.71 c 0.222,7.336 0.55,16.637 0.55,36.465 0,8.684 -0.105,17.364 -0.218,26.039 -0.215,9.09 -0.559,12.086 -0.879,16.735 l 0.547,0.621 c 5.261,0.824 7.019,1.137 11.953,2.168 l 0.66,-0.727 c -0.66,-11.054 -0.66,-22.203 -0.66,-33.367 3.504,2.172 10.418,6.414 19.633,6.414 2.519,0 5.043,-0.312 7.343,-1.246 4.942,-1.871 7.895,-5.566 8.993,-9.809 0.554,-2.078 0.554,-3.308 0.769,-10.234 l 0,-12.086 0.117,-4.855 C 900,313.184 900,311.723 900.43,306.043 l -0.649,-0.621" /><path
id="path104"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 971.492,333.008 c -0.215,7.226 -1.637,14.457 -6.683,19.941 -4.825,5.16 -12.172,7.43 -19.633,7.43 -10.961,0 -17.324,-4.227 -20.391,-7.231 -7.351,-6.914 -7.566,-17.043 -7.566,-20.972 0,-3.406 0.105,-13.949 7.566,-21.074 3.5,-3.403 9.758,-6.918 19.633,-6.918 7.672,0 14.137,1.765 18.965,6.304 3.625,3.403 5.93,7.446 7.129,12.492 0.765,3.114 0.98,6.52 0.98,10.028 z m -11.945,-0.41 c 0.105,-2.168 0,-9.098 -2.527,-13.739 -3.172,-5.675 -8.434,-6.933 -12.493,-6.933 -2.199,0 -4.507,0.418 -6.468,1.344 -8.672,4.136 -8.782,14.57 -8.782,18.707 0,4.336 0.332,10.332 3.286,14.55 3.843,5.805 9.98,6.012 12.07,6.012 6.137,0 9.644,-2.695 11.738,-5.894 2.738,-4.551 3.176,-11.465 3.176,-14.047" /><path
id="path106"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1030.18,317.617 c -0.44,-4.433 -0.56,-4.957 -0.89,-9.191 l -0.75,-0.727 c -3.19,-1.457 -7.47,-3.515 -15.15,-3.515 -16.554,0 -27.312,11.254 -27.312,27.371 0,16.433 10.531,28.824 27.532,28.824 7.14,0 12.18,-2.164 15.03,-3.305 l 0.44,-0.722 c -0.44,-3.719 -0.54,-5.071 -0.77,-8.161 l -0.87,-0.41 c -3.63,2.481 -7.79,4.02 -12.18,4.02 -9.11,0 -17.112,-6.602 -17.112,-19.824 0,-14.043 8.452,-19.118 17.002,-19.118 7.45,0 12.07,3.618 14.14,5.168 l 0.89,-0.41" /><path
id="path108"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1092.69,305.422 c -5.27,-0.106 -5.93,-0.106 -10.97,-0.402 l -0.77,0.71 0.11,3.411 c 0.12,5.371 0.12,10.851 0.12,16.222 l -0.12,11.047 c 0,2.379 0,4.754 -0.55,7.031 -1.21,4.75 -4.27,7.84 -9.87,7.84 -6.25,0 -11.08,-3.293 -14.69,-5.773 -0.11,-17.977 0.1,-27.375 0.76,-39.465 l -0.54,-0.621 c -5.05,-0.106 -6.37,-0.106 -11.74,-0.402 l -0.55,0.71 c 0.22,7.336 0.55,16.637 0.55,36.465 0,8.684 -0.1,17.364 -0.22,26.039 -0.22,9.09 -0.55,12.086 -0.88,16.735 l 0.55,0.621 c 5.26,0.824 7.03,1.137 11.96,2.168 l 0.65,-0.727 c -0.65,-11.054 -0.65,-22.203 -0.65,-33.367 3.51,2.172 10.41,6.414 19.63,6.414 2.52,0 5.04,-0.312 7.35,-1.246 4.93,-1.871 7.89,-5.566 8.99,-9.809 0.54,-2.078 0.54,-3.308 0.77,-10.234 l 0,-12.086 0.11,-4.855 c 0.22,-8.664 0.22,-10.125 0.65,-15.805 l -0.65,-0.621" /><path
id="path110"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1136.11,336.727 c 4.39,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.65,-8.781 -6.13,-12.195 -5.83,-4.652 -13.61,-4.949 -17.56,-4.949 -5.92,0 -10.86,1.031 -15.02,2.574 -0.54,0.203 -1.1,0.418 -1.64,0.617 l -0.56,0.934 c 0.45,4.035 0.45,4.551 0.66,8.668 l 1.1,0.316 c 1.97,-1.445 6.8,-4.949 15.24,-4.949 8.67,0 11.84,4.539 11.84,7.746 0,4.754 -4.7,6.301 -11.4,8.36 l -3.5,1.148 c -4.51,1.344 -14.37,4.332 -14.37,14.973 0,10.632 9.86,15.906 22.15,15.906 8.11,0 13.81,-2.164 15.79,-2.891 l 0.55,-0.726 c -0.44,-3.813 -0.55,-4.223 -0.88,-8.16 l -0.98,-0.411 c -2.74,1.653 -7.02,4.141 -14.15,4.141 -1.54,0 -3.07,-0.113 -4.72,-0.531 -3.29,-0.813 -6.03,-2.992 -6.03,-6.188 0,-4.449 4.49,-5.789 11.3,-7.754 l 3.94,-1.132" /><path
id="path112"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1207.08,317.617 c -0.45,-4.433 -0.56,-4.957 -0.88,-9.191 l -0.78,-0.727 c -3.17,-1.457 -7.45,-3.515 -15.12,-3.515 -16.57,0 -27.32,11.254 -27.32,27.371 0,16.433 10.53,28.824 27.53,28.824 7.13,0 12.17,-2.164 15.02,-3.305 l 0.45,-0.722 c -0.45,-3.719 -0.56,-5.071 -0.77,-8.161 l -0.89,-0.41 c -3.61,2.481 -7.77,4.02 -12.17,4.02 -9.1,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.46,-19.118 17.01,-19.118 7.46,0 12.06,3.618 14.15,5.168 l 0.88,-0.41" /><path
id="path114"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1269.58,305.422 c -5.26,-0.106 -5.91,-0.106 -10.96,-0.402 l -0.77,0.71 0.1,3.411 c 0.13,5.371 0.13,10.851 0.13,16.222 l -0.13,11.047 c 0,2.379 0,4.754 -0.54,7.031 -1.2,4.75 -4.27,7.84 -9.86,7.84 -6.26,0 -11.09,-3.293 -14.71,-5.773 -0.11,-17.977 0.11,-27.375 0.77,-39.465 l -0.55,-0.621 c -5.05,-0.106 -6.35,-0.106 -11.74,-0.402 l -0.54,0.71 c 0.22,7.336 0.54,16.637 0.54,36.465 0,8.684 -0.1,17.364 -0.22,26.039 -0.21,9.09 -0.53,12.086 -0.86,16.735 l 0.54,0.621 c 5.26,0.824 7.01,1.137 11.95,2.168 l 0.67,-0.727 c -0.67,-11.054 -0.67,-22.203 -0.67,-33.367 3.52,2.172 10.42,6.414 19.63,6.414 2.53,0 5.05,-0.312 7.36,-1.246 4.92,-1.871 7.9,-5.566 8.98,-9.809 0.56,-2.078 0.56,-3.308 0.77,-10.234 l 0,-12.086 0.11,-4.855 c 0.23,-8.664 0.23,-10.125 0.67,-15.805 l -0.67,-0.621" /><path
id="path116"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1338.34,358.73 c -0.21,-7.851 -0.33,-15.191 -0.33,-23.55 0,-12.711 0.33,-20.356 0.56,-24.797 0,-1.445 0.11,-2.883 0.22,-4.34 l -0.45,-0.621 c -5.26,-0.106 -6.13,-0.199 -11.18,-0.402 l -0.65,0.613 0.11,4.34 c -2.42,-1.653 -8.24,-5.887 -17.22,-5.887 -4.29,0 -8.99,0.934 -12.51,3.504 -7.01,5.375 -7.01,14.156 -7.13,22.207 l 0,6.414 c -0.22,14.777 -0.22,16.422 -0.55,22.004 l 0.55,0.715 c 5.17,0.105 6.14,0.105 11.3,0.511 l 0.66,-0.711 -0.45,-22.625 c 0,-2.781 -0.1,-4.855 0,-9.812 0.11,-4.34 0.35,-13.633 11.42,-13.633 6.47,0 11.06,3.406 13.7,5.367 0.12,5.571 0.12,10.325 0.12,16.317 0,14.367 -0.12,17.258 -0.77,23.965 l 0.65,0.726 c 5.05,0.113 6.25,0.113 11.3,0.406 l 0.65,-0.711" /><path
id="path118"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1370.59,305.422 c -5.26,-0.106 -6.36,-0.199 -11.5,-0.402 l -0.56,0.71 c 0.22,7.336 0.56,16.637 0.56,36.465 0,14.258 0,29.547 -1.1,42.774 l 0.54,0.621 c 5.37,0.824 6.47,1.023 11.95,2.168 l 0.65,-0.727 c -0.76,-13.531 -0.76,-27.168 -0.76,-40.703 0,-22.617 0.33,-30.469 0.88,-40.285 l -0.66,-0.621" /><path
id="path120"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1435.74,318.445 c -1.44,-1.148 -3.86,-3.007 -7.91,-4.554 -3.06,-1.032 -6.35,-1.547 -9.54,-1.547 -3.39,0 -9.64,0.515 -14.13,5.59 -3.74,4.222 -4.06,9.285 -4.17,12.91 17.98,0.094 20.93,0.094 38.04,0 l 0.76,0.617 c 0.13,4.539 0.34,14.773 -5.91,21.805 -3.29,3.695 -9.33,7.113 -17.98,7.113 -14.37,0 -26.64,-9.391 -26.64,-28.602 0,-17.984 11.28,-27.691 29.26,-27.691 9.77,0 15.68,2.992 17.55,3.922 l 0.67,0.711 c 0.2,4.043 0.32,5.074 0.87,9.215 l -0.87,0.511 z m -8.22,20.344 c -10.09,-0.105 -14.26,-0.199 -27.53,-0.105 1.08,10.339 8.33,14.265 14.46,14.265 4.94,0 9.75,-2.379 11.96,-8.062 0.88,-2.375 0.99,-4.653 1.11,-6.098" /><path
id="path122"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1562.29,305.316 c -7.46,0 -8.56,0 -15.79,-0.296 l -0.76,0.71 c -1.77,10.336 -2.43,13.333 -3.96,20.872 l -9,44.531 -9.1,-42.156 c -0.54,-2.793 -1.1,-5.676 -1.75,-8.473 -0.88,-4.438 -2.51,-11.984 -2.97,-14.461 l -0.65,-0.727 c -7.9,0 -8.33,-0.093 -15.9,-0.296 l -0.76,0.71 c -1.98,9.309 -11.08,48.45 -17,71.793 l 0.54,0.727 c 6.15,0 7.14,0.113 12.5,0.313 l 0.66,-0.723 c 0.67,-3.621 1.32,-6.922 2.31,-12.078 0.88,-4.657 1.75,-9.211 2.63,-13.75 l 7.99,-39.465 9.23,45.762 c 1.53,7.55 1.76,8.781 3.73,19.214 l 0.66,0.727 c 8.33,0.113 9.76,0.113 17.42,0.313 l 0.67,-0.723 c 0.11,-0.824 0.21,-1.66 0.32,-2.578 0.45,-2.692 2.98,-15.914 3.62,-19.426 l 8.67,-43.59 8.55,40.801 c 4.06,19.941 4.17,20.359 4.73,24.476 l 0.64,0.727 c 5.05,0 6.15,0.113 10.76,0.313 l 0.55,-0.723 c -2.53,-8.055 -3.17,-10.844 -9.22,-35.945 -2.73,-11.266 -5.69,-22.422 -8.1,-33.684 -0.11,-0.711 -0.35,-1.449 -0.44,-2.168 l -0.78,-0.727" /><path
id="path124"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1635.79,318.445 c -1.42,-1.148 -3.84,-3.007 -7.9,-4.554 -3.07,-1.032 -6.35,-1.547 -9.53,-1.547 -3.39,0 -9.65,0.515 -14.15,5.59 -3.72,4.222 -4.06,9.285 -4.17,12.91 17.98,0.094 20.95,0.094 38.06,0 l 0.76,0.617 c 0.11,4.539 0.34,14.773 -5.92,21.805 -3.28,3.695 -9.32,7.113 -17.97,7.113 -14.37,0 -26.66,-9.391 -26.66,-28.602 0,-17.984 11.3,-27.691 29.28,-27.691 9.76,0 15.68,2.992 17.55,3.922 l 0.65,0.711 c 0.22,4.043 0.34,5.074 0.88,9.215 l -0.88,0.511 z m -8.22,20.344 c -10.08,-0.105 -14.26,-0.199 -27.53,-0.105 1.1,10.339 8.33,14.265 14.48,14.265 4.93,0 9.75,-2.379 11.95,-8.062 0.88,-2.375 0.99,-4.653 1.1,-6.098" /><path
id="path126"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1678.68,336.727 c 4.38,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.64,-8.781 -6.14,-12.195 -5.82,-4.652 -13.62,-4.949 -17.55,-4.949 -5.91,0 -10.85,1.031 -15.02,2.574 -0.56,0.203 -1.12,0.418 -1.65,0.617 l -0.55,0.934 c 0.43,4.035 0.43,4.551 0.65,8.668 l 1.1,0.316 c 1.98,-1.445 6.79,-4.949 15.25,-4.949 8.67,0 11.83,4.539 11.83,7.746 0,4.754 -4.71,6.301 -11.4,8.36 l -3.5,1.148 c -4.5,1.344 -14.36,4.332 -14.36,14.973 0,10.632 9.86,15.906 22.14,15.906 8.11,0 13.83,-2.164 15.79,-2.891 l 0.56,-0.726 c -0.43,-3.813 -0.56,-4.223 -0.88,-8.16 l -0.98,-0.411 c -2.75,1.653 -7.03,4.141 -14.15,4.141 -1.55,0 -3.07,-0.113 -4.73,-0.531 -3.28,-0.813 -6.01,-2.992 -6.01,-6.188 0,-4.449 4.48,-5.789 11.28,-7.754 l 3.95,-1.132" /><path
id="path128"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1733.52,313.477 c -0.35,-3.411 -0.35,-4.122 -0.43,-7.125 l -0.56,-0.622 c -2.32,-0.507 -4.17,-0.925 -8.22,-0.925 -2.64,0 -9.54,0 -12.96,5.371 -1.97,3.008 -1.97,5.48 -1.97,17.664 l 0.23,22.73 c -3.86,0 -3.95,-0.101 -7.91,-0.215 l -0.43,0.633 c 0.22,3.297 0.22,4.117 0.22,7.434 l 0.66,0.613 c 2.41,0 3.84,-0.105 7.46,0 -0.13,2.168 -0.13,4.449 -0.13,6.613 -0.1,1.969 -0.21,3.938 -0.32,5.895 l 0.56,0.715 c 4.94,1.148 6.15,1.441 11.19,2.898 l 0.76,-0.519 c -0.32,-6.821 -0.45,-8.168 -0.45,-15.707 4.62,0.105 5.93,0.105 12.19,0.312 l 0.54,-0.613 c -0.22,-2.688 -0.33,-3.816 -0.33,-7.348 l -0.53,-0.609 c -5.5,0.098 -6.16,0.207 -11.98,0.207 l -0.2,-19.219 c 0.1,-1.23 0.1,-7.129 0.1,-8.57 0,-7.539 0.99,-9.906 6.47,-9.906 2.31,0 4.05,0.507 5.26,0.925 l 0.78,-0.632" /><path
id="path130"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1770.8,336.727 c 4.4,-1.348 14.37,-4.551 14.37,-15.497 0,-4.132 -1.64,-8.781 -6.15,-12.195 -5.81,-4.652 -13.59,-4.949 -17.55,-4.949 -5.92,0 -10.84,1.031 -15.01,2.574 -0.56,0.203 -1.12,0.418 -1.66,0.617 l -0.54,0.934 c 0.44,4.035 0.44,4.551 0.65,8.668 l 1.1,0.316 c 1.97,-1.445 6.81,-4.949 15.25,-4.949 8.67,0 11.85,4.539 11.85,7.746 0,4.754 -4.73,6.301 -11.42,8.36 l -3.5,1.148 c -4.5,1.344 -14.38,4.332 -14.38,14.973 0,10.632 9.88,15.906 22.16,15.906 8.12,0 13.82,-2.164 15.81,-2.891 l 0.53,-0.726 c -0.44,-3.813 -0.53,-4.223 -0.87,-8.16 l -1,-0.411 c -2.73,1.653 -7.01,4.141 -14.13,4.141 -1.55,0 -3.09,-0.113 -4.73,-0.531 -3.28,-0.813 -6.03,-2.992 -6.03,-6.188 0,-4.449 4.5,-5.789 11.3,-7.754 l 3.95,-1.132" /><path
id="path132"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1841.76,317.617 c -0.45,-4.433 -0.56,-4.957 -0.89,-9.191 l -0.75,-0.727 c -3.18,-1.457 -7.47,-3.515 -15.15,-3.515 -16.55,0 -27.31,11.254 -27.31,27.371 0,16.433 10.54,28.824 27.55,28.824 7.11,0 12.16,-2.164 15.01,-3.305 l 0.43,-0.722 c -0.43,-3.719 -0.53,-5.071 -0.76,-8.161 l -0.88,-0.41 c -3.62,2.481 -7.78,4.02 -12.16,4.02 -9.11,0 -17.11,-6.602 -17.11,-19.824 0,-14.043 8.43,-19.118 17,-19.118 7.44,0 12.06,3.618 14.13,5.168 l 0.89,-0.41" /><path
id="path134"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1904.26,305.422 c -5.25,-0.106 -5.92,-0.106 -10.97,-0.402 l -0.77,0.71 0.13,3.411 c 0.1,5.371 0.1,10.851 0.1,16.222 l -0.1,11.047 c 0,2.379 0,4.754 -0.56,7.031 -1.19,4.75 -4.28,7.84 -9.86,7.84 -6.26,0 -11.09,-3.293 -14.7,-5.773 -0.11,-17.977 0.1,-27.375 0.76,-39.465 l -0.54,-0.621 c -5.04,-0.106 -6.36,-0.106 -11.73,-0.402 l -0.56,0.71 c 0.23,7.336 0.56,16.637 0.56,36.465 0,8.684 -0.13,17.364 -0.22,26.039 -0.22,9.09 -0.56,12.086 -0.89,16.735 l 0.55,0.621 c 5.26,0.824 7.03,1.137 11.96,2.168 l 0.66,-0.727 c -0.66,-11.054 -0.66,-22.203 -0.66,-33.367 3.52,2.172 10.42,6.414 19.62,6.414 2.54,0 5.05,-0.312 7.37,-1.246 4.93,-1.871 7.88,-5.566 8.98,-9.809 0.56,-2.078 0.56,-3.308 0.76,-10.234 l 0,-12.086 0.11,-4.855 c 0.23,-8.664 0.23,-10.125 0.66,-15.805 l -0.66,-0.621" /><path
id="path136"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1987.29,305.422 c -7.36,-0.106 -8.22,-0.106 -14.91,-0.402 l -0.77,0.71 c -1.32,6.305 -3.41,14.68 -5.27,22.004 l -6.36,24.805 -6.47,-25.426 c -3.29,-12.496 -4.38,-16.527 -5.38,-21.07 l -0.65,-0.621 c -7.68,-0.106 -8.23,-0.106 -15.14,-0.402 l -0.65,0.71 c -4.82,18.497 -13.05,45.551 -15.35,52.379 l 0.43,0.723 c 5.26,0.316 6.69,0.316 11.95,0.824 l 0.66,-0.621 c 0.66,-3.41 1.43,-6.605 6.16,-25.711 l 5.26,-21.289 7.12,27.789 c 3.3,13.735 3.5,15.082 4.16,18.391 l 0.76,0.715 c 6.49,0 8.35,0 15.59,0.312 l 0.65,-0.715 c 1.54,-7.129 4.17,-17.043 6.14,-24.91 l 5.82,-21.894 6.14,24.078 c 0.87,3.613 1.76,7.23 2.63,10.844 1.86,7.019 2.07,7.839 2.75,11.777 l 0.77,0.613 c 1.75,0 3.6,-0.105 5.37,-0.105 1.64,0 3.28,0.105 4.92,0.105 l 0.67,-0.613 c -2.09,-5.883 -11.73,-34.711 -16.24,-52.379 l -0.76,-0.621" /><path
id="path138"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2060.99,318.445 c -1.43,-1.148 -3.84,-3.007 -7.89,-4.554 -3.07,-1.032 -6.37,-1.547 -9.55,-1.547 -3.4,0 -9.64,0.515 -14.17,5.59 -3.71,4.222 -4.05,9.285 -4.15,12.91 17.98,0.094 20.94,0.094 38.06,0 l 0.76,0.617 c 0.11,4.539 0.34,14.773 -5.92,21.805 -3.29,3.695 -9.33,7.113 -17.98,7.113 -14.36,0 -26.64,-9.391 -26.64,-28.602 0,-17.984 11.29,-27.691 29.27,-27.691 9.77,0 15.69,2.992 17.56,3.922 l 0.65,0.711 c 0.21,4.043 0.32,5.074 0.88,9.215 l -0.88,0.511 z m -8.23,20.344 c -10.08,-0.105 -14.25,-0.199 -27.53,-0.105 1.11,10.339 8.33,14.265 14.49,14.265 4.92,0 9.75,-2.379 11.95,-8.062 0.88,-2.375 0.99,-4.653 1.09,-6.098" /><path
id="path140"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2092.9,374.121 c -5.6,-0.199 -6.8,-0.305 -12.17,-0.832 l -0.65,0.633 c 0.09,1.34 0.09,2.781 0.09,4.125 0,1.863 -0.09,3.519 -0.22,5.582 l 0.78,0.617 c 5.7,0.414 6.68,0.508 12.17,1.027 l 0.66,-0.613 c -0.1,-4.242 -0.1,-5.277 0,-9.812 l -0.66,-0.727 z m -0.1,-68.699 c -5.71,-0.106 -6.59,-0.106 -11.96,-0.402 l -0.55,0.71 c 0.33,5.485 0.66,10.235 0.66,21.696 0,19.734 -0.33,23.453 -1.11,29.535 l 0.56,0.738 c 4.73,0.723 6.35,0.93 11.85,2.067 l 1.08,-0.618 c -0.32,-5.375 -0.65,-10.957 -0.65,-24.277 0,-19.215 0.22,-21.805 0.65,-28.828 l -0.53,-0.621" /><path
id="path142"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2149.7,305.316 c -3.06,0 -18.08,-0.093 -21.47,-0.093 -12.85,0 -14.27,0 -20.96,-0.203 l -0.44,0.929 c 8.33,13.004 21.6,35.114 27.18,45.039 -14.45,-0.109 -17.09,-0.109 -24.12,-0.418 l -0.53,0.621 c 0.43,3.403 0.53,4.231 0.76,7.118 l 0.66,0.621 c 18.42,0 20.51,0 39.59,0.312 l 0.56,-0.82 c -9.78,-15.082 -23.69,-39.68 -26.66,-44.945 9.44,0.117 18.86,0.316 26.32,0.632 l 0.55,-0.632 c -0.45,-3.196 -0.55,-4.539 -0.77,-7.641 l -0.67,-0.52" /><path
id="path144"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1828.36,930.41 c 19.04,-5.824 62.36,-19.726 62.36,-67.265 0,-17.942 -7.14,-38.114 -26.66,-52.922 -25.23,-20.18 -59.03,-21.524 -76.17,-21.524 -25.7,0 -47.13,4.485 -65.21,11.211 -2.39,0.891 -4.77,1.789 -7.15,2.688 l -2.38,4.043 c 1.91,17.492 1.91,19.742 2.86,37.668 l 4.76,1.343 c 8.57,-6.273 29.51,-21.519 66.17,-21.519 37.61,0 51.42,19.726 51.42,33.629 0,20.625 -20.46,27.347 -49.51,36.328 l -15.24,4.933 c -19.52,5.829 -62.36,18.829 -62.36,65.008 0,46.199 42.84,69.079 96.16,69.079 35.25,0 59.98,-9.43 68.56,-12.56 l 2.39,-3.15 c -1.9,-16.58 -2.39,-18.373 -3.83,-35.42 l -4.28,-1.792 c -11.9,7.179 -30.46,17.941 -61.41,17.941 -6.66,0 -13.33,-0.449 -20.47,-2.246 -14.28,-3.586 -26.18,-13.004 -26.18,-26.899 0,-19.293 19.51,-25.125 49.05,-33.64 l 17.12,-4.934" /><path
id="path146"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2166.38,914.277 c -0.96,31.379 -7.14,62.778 -29.05,86.543 -20.94,22.42 -52.84,32.29 -85.21,32.29 -47.62,0 -75.22,-18.4 -88.57,-31.4 -31.87,-30.042 -32.84,-73.991 -32.84,-91.026 0,-14.801 0.49,-60.539 32.84,-91.481 15.24,-14.808 42.38,-30.058 85.22,-30.058 33.34,0 61.43,7.632 82.37,27.371 15.72,14.785 25.7,32.281 30.93,54.254 3.35,13.445 4.31,28.253 4.31,43.507 z m -51.9,-1.797 c 0.48,-9.414 0,-39.472 -10.96,-59.648 -13.79,-24.664 -36.64,-30.047 -54.25,-30.047 -9.54,0 -19.54,1.801 -28.11,5.832 -37.61,17.934 -38.08,63.238 -38.08,81.168 0,18.832 1.44,44.836 14.29,63.231 16.66,25.113 43.32,26.011 52.37,26.011 26.66,0 41.89,-11.66 50.93,-25.562 11.91,-19.742 13.81,-49.781 13.81,-60.985" /><path
id="path148"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1656.94,910.578 c 0,-15.644 -12.68,-28.34 -28.34,-28.34 -15.65,0 -28.33,12.696 -28.33,28.34 0,15.645 12.68,28.348 28.33,28.348 15.66,0 28.34,-12.703 28.34,-28.348" /><path
id="path150"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1004.69,1107.68 c -0.47,-34.54 -0.95,-55.61 -0.95,-87 0,-75.34 1.43,-150.231 5.24,-225.571 l -2.38,-2.683 c -40.467,0.449 -49.983,0 -85.702,-1.348 l -2.375,2.695 c 2.375,63.219 2.375,78.024 1.434,138.555 -19.043,0.449 -38.086,0.899 -57.137,0.899 -18.558,0 -36.179,-0.45 -57.117,-1.348 0.469,-65.016 0.938,-81.168 3.801,-136.77 l -2.379,-2.683 c -41.887,0.449 -50.465,0 -85.215,-1.348 l -2.383,2.695 c 0.953,37.653 1.911,59.625 1.911,99.997 0,111.2 -2.864,166.37 -5.243,212.57 l 2.86,2.68 c 41.414,0 48.55,0 85.215,1.34 l 2.371,-2.68 -0.938,-118.395 c 16.66,0 33.789,-0.449 50.449,-0.449 21.438,0 42.371,0.449 63.321,0.898 -0.465,52.926 -0.465,65.916 -3.809,116.606 l 2.387,2.68 c 39.992,0 46.168,0 84.259,1.34 l 2.38,-2.68" /><path
id="path152"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1280.73,858.781 c -18.1,-8.965 -39.53,-19.281 -74.27,-19.281 -28.56,0 -48.09,8.527 -59.52,24.672 -7.14,9.418 -8.56,18.387 -10.46,27.359 l 153.77,2.688 2.85,3.133 c -0.46,21.968 -0.95,44.406 -7.6,66.82 -16.68,52.918 -53.34,63.688 -69.52,67.278 -11.9,3.12 -22.85,4.02 -33.8,4.02 -74.75,0 -124.26,-46.185 -124.26,-123.767 0,-21.07 3.82,-43.043 11.43,-58.746 27.62,-60.531 92.36,-65.918 126.64,-65.918 39.51,0 56.66,6.734 81.88,16.149 l 2.86,3.582 3.33,50.664 -3.33,1.347 z m -144.25,80.282 c 1.42,13.902 4.75,32.73 22.85,43.488 5.71,3.59 12.39,4.937 19.04,4.937 15.72,0 25.22,-7.621 30.47,-15.695 6.66,-9.867 7.14,-20.621 7.14,-30.934 l -79.5,-1.796" /><path
id="path154"
style="fill:#0979b8;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1481.62,939.063 c 26.19,-9.43 62.85,-22.43 62.85,-71.75 0,-3.141 0,-6.274 -0.5,-9.879 -8.55,-64.11 -79.96,-70.395 -116.14,-70.395 -34.74,0 -54.75,7.176 -78.08,15.25 l -2.37,4.031 c 1.91,22.418 2.37,27.352 3.33,50.672 l 4.28,1.789 c 7.13,-5.383 10.96,-8.519 19.05,-12.551 17.61,-8.515 37.13,-12.558 50.46,-12.558 26.65,0 37.61,12.109 37.61,23.32 0,16.145 -20.97,22.879 -33.8,26.903 l -18.1,6.289 c -22.37,8.066 -61.88,22.418 -61.88,70.402 0,17.937 6.66,31.387 12.85,39.464 24.75,33.63 71.42,35.42 94.73,35.42 30.96,0 50.48,-5.37 72.83,-11.21 l 2.39,-2.69 -4.75,-48.882 -4.3,-1.348 c -11.88,7.183 -30.46,18.836 -59.49,18.836 -29.53,0 -33.34,-14.793 -33.34,-20.172 0,-12.559 12.85,-17.484 29.05,-22.867 l 23.32,-8.074" /><path
id="path156"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1755.3,153.285 c -11.04,-1.547 -21.32,-2.988 -21.32,-12.164 0,-0.512 0,-9.375 10.39,-9.375 6.78,0 10.72,3.5 11.92,4.535 l 0,17.215 -0.99,-0.211 z m 12.25,-7.523 c 0,-12.774 0.11,-13.914 0.66,-20.614 l -0.55,-0.515 c -5.15,-0.102 -6.01,-0.199 -11.05,-0.41 l -0.43,0.621 0.11,3.703 c -2.07,-1.535 -6.99,-5.25 -15.31,-5.25 -10.93,0 -18.6,7.008 -18.6,17.207 0,13.812 12.25,18.246 31.95,20.402 l 1.85,0.211 c 0,2.778 0,4.742 -0.98,6.387 -1.09,1.859 -3.62,3.816 -9.08,3.816 -7.11,0 -12.03,-2.058 -16.62,-3.918 l -0.88,0.52 c 0.22,4.738 0.22,5.359 0.33,7.516 l 0.67,0.621 c 6.11,2.058 12.46,3.406 18.9,3.406 8.09,0 15.97,-2.578 18.27,-10.625 0.76,-2.875 0.76,-8.547 0.76,-12.879 l 0,-10.199" /><path
id="path158"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1834.4,124.633 c -5.23,-0.102 -5.88,-0.102 -10.93,-0.41 l -0.77,0.722 c 0,1.137 0.12,2.266 0.12,3.403 0.12,5.05 0.12,10.097 0.12,15.152 0,15.867 -0.12,16.898 -0.67,19.059 -2.08,7.832 -8.31,7.832 -9.82,7.832 -6.57,0 -11.62,-3.606 -14.56,-5.77 -0.13,-17.933 0.1,-27.308 0.87,-39.367 l -0.65,-0.621 c -5.36,-0.102 -6.23,-0.102 -11.49,-0.41 l -0.56,0.722 c 0.13,5.77 0.35,11.336 0.35,18.965 0,16.488 -0.78,25.242 -1.3,32.149 l 0.64,0.718 c 5.45,0.934 6.45,1.141 11.58,2.071 l 0.78,-0.731 -0.12,-5.355 c 2.84,1.855 9.63,6.39 19.26,6.39 2.72,0 6.13,-0.414 9.07,-1.957 2.85,-1.547 5.14,-3.914 6.35,-6.703 1.42,-3.09 1.51,-6.176 1.64,-12.574 l 0,-12.051 c 0.31,-12.058 0.43,-16.699 0.74,-20.613 l -0.65,-0.621" /><path
id="path160"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1888.37,170.703 c -1.86,0.098 -3.16,0.305 -5.46,0.305 -3.39,0 -10.61,-0.207 -15.86,-4.844 -2.39,-2.16 -6.33,-7.004 -6.33,-16.18 0,-5.875 1.75,-10.093 4.05,-12.671 1.96,-2.168 5.56,-4.637 11.25,-4.637 6.67,0 10.71,3.301 12.24,4.531 0.22,13.5 0.22,16.594 0.11,33.496 z m -0.11,33.906 c 5.6,0.926 6.68,1.133 11.6,2.157 l 0.76,-0.61 c -0.76,-14.332 -0.86,-39.883 -0.86,-50.195 0,-15.969 0.43,-23.594 0.86,-30.707 l -0.54,-0.723 c -4.82,0 -6.12,-0.097 -11.15,-0.308 l -0.78,0.621 0.22,3.808 c -2.62,-1.851 -7.1,-5.148 -15.08,-5.148 -14.55,0 -24.6,10.82 -24.6,26.48 0,11.235 5.03,18.352 9.62,22.157 7.99,6.804 18.37,7.117 24.05,7.117 2.3,0 3.39,0 6.35,-0.211 0.11,12.777 -0.45,18.965 -0.99,24.941 l 0.54,0.621" /><path
id="path162"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1966.56,155.031 c 3.5,0 6.99,-0.101 10.5,-0.101 3.71,0 7.65,0.101 11.48,0.101 l -10.49,34.836 -11.49,-34.836 z m 21.64,40.094 c 3.63,-11.332 7.78,-24.117 11.06,-33.906 3.38,-9.891 8.86,-25.762 12.14,-35.66 l -0.43,-0.821 c -5.71,-0.105 -8.12,-0.207 -12.7,-0.414 l -0.78,0.727 c -2.72,9.683 -3.59,12.461 -6.44,21.746 -4.36,0 -8.64,0.101 -13,0.101 -4.84,0 -9.85,-0.101 -14.21,-0.101 -3.2,-9.695 -3.85,-12.16 -6.48,-21.332 l -0.74,-0.727 c -4.71,0 -5.82,0 -11.27,-0.304 l -0.44,0.714 c 0.31,1.133 0.74,2.165 1.21,3.2 4.15,11.125 8.18,22.257 12.14,33.39 6.53,18.235 8.95,24.934 12.11,34.828 l 0.9,0.727 c 7.65,0.098 8.63,0.098 15.63,0.41 l 0.75,-0.723 0.55,-1.855" /><path
id="path164"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2049.05,167.402 c -1.11,0.414 -2.54,0.934 -4.39,0.934 -2.08,0 -3.6,-0.727 -4.59,-1.344 -4.49,-2.988 -4.49,-7.519 -4.49,-18.242 0,-11.648 0.34,-17.723 0.78,-23.496 l -0.56,-0.723 c -5.15,0 -6.32,-0.097 -11.58,-0.308 l -0.56,0.621 c 0.12,7.832 0.25,14.941 0.25,24.519 0,16.496 -0.35,20.719 -0.99,26.696 l 0.64,0.718 c 4.15,0.731 6.79,1.239 11.37,2.071 l 0.65,-0.621 -0.52,-8.766 c 1.3,3.301 4.02,9.894 13.34,9.894 1.39,0 2.17,-0.097 3.04,-0.308 l 0.45,-0.621 c -1.11,-4.946 -1.32,-5.977 -2.1,-10.504 l -0.74,-0.52" /><path
id="path166"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2093.83,132.676 c -0.34,-3.406 -0.34,-4.129 -0.47,-7.117 l -0.53,-0.614 c -2.28,-0.511 -4.15,-0.933 -8.2,-0.933 -2.63,0 -9.5,0 -12.91,5.367 -1.95,2.988 -1.95,5.461 -1.95,17.617 l 0.21,22.676 c -3.84,0 -3.93,-0.102 -7.86,-0.211 l -0.47,0.621 c 0.22,3.297 0.22,4.125 0.22,7.426 l 0.68,0.609 c 2.38,0 3.81,-0.101 7.43,0 -0.12,2.168 -0.12,4.434 -0.12,6.598 -0.09,1.957 -0.22,3.918 -0.31,5.875 l 0.53,0.719 c 4.92,1.136 6.13,1.449 11.14,2.89 l 0.78,-0.515 c -0.31,-6.801 -0.44,-8.145 -0.44,-15.668 4.58,0.101 5.92,0.101 12.14,0.312 l 0.56,-0.617 c -0.22,-2.684 -0.34,-3.813 -0.34,-7.32 l -0.56,-0.618 c -5.45,0.11 -6.09,0.207 -11.89,0.207 l -0.25,-19.167 c 0.13,-1.239 0.13,-7.114 0.13,-8.555 0,-7.524 0.98,-9.891 6.43,-9.891 2.33,0 4.07,0.512 5.28,0.93 l 0.77,-0.621" /><path
id="path168"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2132.6,155.863 c 4.36,-1.343 14.3,-4.535 14.3,-15.461 0,-4.121 -1.64,-8.754 -6.13,-12.16 -5.79,-4.64 -13.56,-4.945 -17.5,-4.945 -5.88,0 -10.8,1.027 -14.95,2.574 -0.56,0.211 -1.11,0.41 -1.64,0.621 l -0.56,0.93 c 0.43,4.016 0.43,4.523 0.65,8.652 l 1.08,0.313 c 1.98,-1.442 6.79,-4.949 15.21,-4.949 8.64,0 11.82,4.539 11.82,7.726 0,4.746 -4.7,6.285 -11.39,8.356 l -3.5,1.125 c -4.45,1.339 -14.31,4.328 -14.31,14.945 0,10.617 9.86,15.875 22.08,15.875 8.09,0 13.78,-2.168 15.77,-2.891 l 0.52,-0.715 c -0.44,-3.82 -0.52,-4.23 -0.87,-8.144 l -0.98,-0.41 c -2.73,1.648 -7,4.117 -14.09,4.117 -1.56,0 -3.07,-0.102 -4.71,-0.512 -3.28,-0.828 -6.01,-2.988 -6.01,-6.183 0,-4.434 4.46,-5.778 11.24,-7.735 l 3.97,-1.129" /><path
id="path170"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 139.504,196.875 c -0.227,-9.375 -0.332,-11.852 -0.332,-19.988 0,-4.438 0,-7.735 0.105,-15.457 l 0.118,-9.278 c 0,-6.187 0,-15.05 -6.348,-21.543 -5.25,-5.355 -13.66,-7.621 -22.52,-7.621 -14.1012,0 -21.1051,5.36 -23.9489,8.348 -5.8984,6.387 -5.8984,12.574 -5.8984,24.625 l 0,10.512 c 0,14.941 0,16.699 -0.332,30.093 l 0.7656,0.727 c 6.0117,0.098 6.7773,0.098 12.2461,0.309 l 0.5469,-0.727 c -0.4375,-10.715 -0.4375,-29.371 -0.4375,-39.367 0,-10.301 0.2109,-16.586 4.0468,-20.817 1.8594,-2.168 6.1214,-5.043 13.6604,-5.043 2.738,0 11.375,0.2 15.535,7.825 2.406,4.328 2.406,10.203 2.406,18.246 0,11.953 -0.113,27.105 -0.875,38.847 l 0.535,0.727 c 5.036,0.098 5.696,0.098 10.071,0.309 l 0.656,-0.727" /><path
id="path172"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 208.832,124.633 c -5.246,-0.102 -5.902,-0.102 -10.926,-0.41 l -0.765,0.722 c 0,1.137 0.105,2.266 0.105,3.403 0.109,5.05 0.109,10.097 0.109,15.152 0,15.867 -0.109,16.898 -0.66,19.059 -2.078,7.832 -8.304,7.832 -9.84,7.832 -6.562,0 -11.585,-3.606 -14.546,-5.77 -0.106,-17.933 0.117,-27.308 0.875,-39.367 l -0.649,-0.621 c -5.355,-0.102 -6.242,-0.102 -11.488,-0.41 l -0.539,0.722 c 0.105,5.77 0.32,11.336 0.32,18.965 0,16.488 -0.765,25.242 -1.308,32.149 l 0.66,0.718 c 5.465,0.934 6.453,1.141 11.59,2.071 l 0.765,-0.731 -0.109,-5.355 c 2.844,1.855 9.613,6.39 19.246,6.39 2.73,0 6.117,-0.414 9.07,-1.957 2.844,-1.547 5.141,-3.914 6.344,-6.703 1.426,-3.09 1.531,-6.176 1.641,-12.574 l 0,-12.051 c 0.328,-12.058 0.437,-16.699 0.765,-20.613 l -0.66,-0.621" /><path
id="path174"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 241.355,193.168 c -5.585,-0.199 -6.781,-0.313 -12.136,-0.82 l -0.66,0.621 c 0.109,1.336 0.109,2.777 0.109,4.117 0,1.859 -0.109,3.504 -0.215,5.562 l 0.766,0.622 c 5.679,0.41 6.664,0.507 12.136,1.031 l 0.653,-0.621 c -0.11,-4.227 -0.11,-5.258 0,-9.793 l -0.653,-0.719 z m -0.109,-68.535 c -5.687,-0.102 -6.562,-0.102 -11.922,-0.41 l -0.551,0.722 c 0.332,5.465 0.661,10.2 0.661,21.641 0,19.687 -0.329,23.394 -1.094,29.473 l 0.547,0.718 c 4.703,0.731 6.347,0.934 11.812,2.071 l 1.086,-0.621 c -0.32,-5.356 -0.652,-10.922 -0.652,-24.223 0,-19.164 0.222,-21.746 0.652,-28.75 l -0.539,-0.621" /><path
id="path176"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 285.648,124.633 c -6.121,-0.102 -7.644,-0.102 -13.992,-0.41 l -0.648,0.722 c -5.367,17.516 -11.051,34.938 -17.496,52.145 l 0.429,0.828 c 5.36,0.309 6.567,0.41 11.922,0.93 l 0.875,-0.52 c 4.043,-15.254 8.528,-30.504 13.012,-45.652 1.094,3.711 6.559,21.64 7.762,25.652 3.605,11.856 4.597,16.078 5.472,19.59 l 0.766,0.508 c 5.133,-0.199 6.008,-0.098 10.273,0 l 0.547,-0.715 c -6.675,-17.313 -12.574,-34.832 -18.261,-52.457 l -0.661,-0.621" /><path
id="path178"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 351.992,164.004 c -2.187,5.668 -6.996,8.035 -11.918,8.035 -6.125,0 -13.34,-3.914 -14.429,-14.219 13.226,-0.101 17.382,0 27.441,0.098 -0.106,1.449 -0.219,3.711 -1.094,6.086 z m 10.176,-26.902 c -0.551,-4.114 -0.66,-5.157 -0.879,-9.172 l -0.652,-0.719 c -1.864,-0.93 -7.77,-3.914 -17.496,-3.914 -17.942,0 -29.196,9.691 -29.196,27.621 0,19.164 12.246,28.547 26.567,28.547 8.636,0 14.656,-3.406 17.929,-7.113 6.243,-7.008 6.016,-17.211 5.911,-21.747 l -0.766,-0.621 c -17.059,0.114 -20.016,0.114 -37.941,0 0.109,-3.601 0.429,-8.652 4.156,-12.882 4.48,-5.043 10.711,-5.567 14.105,-5.567 3.164,0 6.446,0.524 9.512,1.551 4.043,1.551 6.449,3.398 7.871,4.539 l 0.879,-0.523" /><path
id="path180"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 406.605,167.402 c -1.085,0.414 -2.511,0.934 -4.371,0.934 -2.082,0 -3.605,-0.727 -4.593,-1.344 -4.489,-2.988 -4.489,-7.519 -4.489,-18.242 0,-11.648 0.332,-17.723 0.77,-23.496 l -0.543,-0.723 c -5.141,0 -6.344,-0.097 -11.594,-0.308 l -0.547,0.621 c 0.11,7.832 0.215,14.941 0.215,24.519 0,16.496 -0.32,20.719 -0.98,26.696 l 0.66,0.718 c 4.156,0.731 6.773,1.239 11.371,2.071 l 0.648,-0.621 -0.539,-8.766 c 1.309,3.301 4.035,9.894 13.34,9.894 1.418,0 2.188,-0.097 3.063,-0.308 l 0.433,-0.621 c -1.09,-4.946 -1.308,-5.977 -2.078,-10.504 l -0.766,-0.52" /><path
id="path182"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 445.668,155.863 C 450.043,154.52 460,151.328 460,140.402 c 0,-4.121 -1.641,-8.754 -6.133,-12.16 -5.793,-4.64 -13.554,-4.945 -17.496,-4.945 -5.898,0 -10.82,1.027 -14.976,2.574 -0.543,0.211 -1.09,0.41 -1.633,0.621 l -0.551,0.93 c 0.434,4.016 0.434,4.523 0.656,8.652 l 1.094,0.313 c 1.965,-1.442 6.781,-4.949 15.195,-4.949 8.641,0 11.813,4.539 11.813,7.726 0,4.746 -4.707,6.285 -11.371,8.356 l -3.496,1.125 c -4.485,1.339 -14.332,4.328 -14.332,14.945 0,10.617 9.847,15.875 22.093,15.875 8.09,0 13.77,-2.168 15.746,-2.891 l 0.539,-0.715 c -0.429,-3.82 -0.539,-4.23 -0.875,-8.144 l -0.98,-0.41 c -2.734,1.648 -6.996,4.117 -14.105,4.117 -1.532,0 -3.063,-0.102 -4.7,-0.512 -3.281,-0.828 -6.015,-2.988 -6.015,-6.183 0,-4.434 4.484,-5.778 11.265,-7.735 l 3.93,-1.129" /><path
id="path184"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 487.559,193.168 c -5.582,-0.199 -6.782,-0.313 -12.137,-0.82 l -0.66,0.621 c 0.109,1.336 0.109,2.777 0.109,4.117 0,1.859 -0.109,3.504 -0.219,5.562 l 0.77,0.622 c 5.683,0.41 6.664,0.507 12.137,1.031 l 0.648,-0.621 c -0.105,-4.227 -0.105,-5.258 0,-9.793 l -0.648,-0.719 z m -0.11,-68.535 c -5.687,-0.102 -6.566,-0.102 -11.922,-0.41 l -0.547,0.722 c 0.333,5.465 0.657,10.2 0.657,21.641 0,19.687 -0.324,23.394 -1.09,29.473 l 0.543,0.718 c 4.707,0.731 6.348,0.934 11.808,2.071 l 1.094,-0.621 c -0.324,-5.356 -0.656,-10.922 -0.656,-24.223 0,-19.164 0.223,-21.746 0.656,-28.75 l -0.543,-0.621" /><path
id="path186"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 532.832,132.676 c -0.328,-3.406 -0.328,-4.129 -0.434,-7.117 l -0.55,-0.614 c -2.293,-0.511 -4.157,-0.933 -8.2,-0.933 -2.625,0 -9.511,0 -12.906,5.367 -1.965,2.988 -1.965,5.461 -1.965,17.617 l 0.215,22.676 c -3.82,0 -3.929,-0.102 -7.871,-0.211 l -0.433,0.621 c 0.214,3.297 0.214,4.125 0.214,7.426 l 0.661,0.609 c 2.402,0 3.824,-0.101 7.429,0 -0.105,2.168 -0.105,4.434 -0.105,6.598 -0.11,1.957 -0.219,3.918 -0.328,5.875 l 0.543,0.719 c 4.925,1.136 6.125,1.449 11.156,2.89 l 0.765,-0.515 c -0.332,-6.801 -0.441,-8.145 -0.441,-15.668 4.598,0.101 5.906,0.101 12.137,0.312 l 0.551,-0.617 c -0.211,-2.684 -0.332,-3.813 -0.332,-7.32 l -0.54,-0.618 c -5.468,0.11 -6.125,0.207 -11.925,0.207 l -0.215,-19.167 c 0.109,-1.239 0.109,-7.114 0.109,-8.555 0,-7.524 0.981,-9.891 6.453,-9.891 2.289,0 4.043,0.512 5.25,0.93 l 0.762,-0.621" /><path
id="path188"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 589.988,177.508 c -6.226,-14.531 -16.726,-41.742 -19.461,-48.961 -3.386,-9.375 -6.672,-18.758 -8.961,-28.336 l -0.992,-0.8204 c -5.469,-0.1093 -6.449,-0.1093 -11.59,-0.3125 l -0.429,0.7227 0.429,0.7192 c 1.977,3.808 3.61,7.832 5.473,11.851 1.527,3.399 3.387,6.695 4.59,10.305 0.113,0.207 0.223,0.515 0.328,0.828 0,1.234 -16.293,42.769 -20.996,53.273 l 0.445,0.934 c 5.461,0.406 6.551,0.406 12.137,1.027 l 0.648,-0.621 c 2.957,-9.277 4.375,-13.601 6.786,-20.297 l 6.886,-19.687 6.235,18.14 c 2.297,7.114 5.027,15.555 6.781,21.438 l 0.766,0.617 c 2.73,0 5.679,0 10.605,0.098 l 0.32,-0.918" /><path
id="path190"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 675.414,165.758 c -2.074,3.195 -5.57,5.871 -11.691,5.871 -2.086,0 -8.211,-0.207 -12.035,-5.977 -2.95,-4.222 -3.282,-10.199 -3.282,-14.531 0,-4.125 0.11,-14.527 8.746,-18.652 1.981,-0.934 4.27,-1.34 6.457,-1.34 4.043,0 9.289,1.238 12.465,6.906 2.516,4.637 2.621,11.539 2.516,13.703 0,2.578 -0.442,9.481 -3.176,14.02 z m 14.106,-23.606 c -1.2,-5.05 -3.5,-9.066 -7.11,-12.464 -4.805,-4.54 -11.258,-6.286 -18.914,-6.286 -9.84,0 -16.074,3.5 -19.57,6.903 -7.434,7.109 -7.539,17.625 -7.539,21.023 0,3.914 0.215,14.016 7.539,20.922 3.066,2.988 9.402,7.215 20.336,7.215 7.437,0 14.761,-2.27 19.578,-7.426 5.031,-5.457 6.449,-12.672 6.664,-19.887 0,-3.507 -0.215,-6.906 -0.984,-10" /><path
id="path192"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 721.063,124.531 c -5.028,0 -6.012,0 -11.809,-0.308 l -0.555,0.722 c 0.555,10.821 0.555,21.953 0.555,32.875 0,5.465 0,7.317 -0.109,11.852 -2.735,-0.102 -5.461,-0.102 -7.657,-0.102 l -0.648,0.614 c 0.215,2.886 0.32,3.918 0.43,7.421 l 0.66,0.622 c 3.273,-0.11 5.468,-0.211 6.996,-0.211 l -0.11,6.808 c 0,5.145 0,6.387 0.329,8.242 2.515,11.954 16.07,11.954 19.136,11.954 1.641,0 2.735,-0.098 4.157,-0.211 l 0.542,-0.719 c -0.429,-2.891 -0.542,-4.227 -0.769,-7.418 l -0.766,-0.516 c -0.98,0.211 -1.75,0.41 -2.949,0.41 -2.297,0 -4.805,-0.41 -6.555,-3.089 -1.75,-2.579 -1.75,-5.465 -1.644,-12.364 l 0,-3.097 c 0.223,0 9.73,0.211 10.824,0.211 l 0.551,-0.622 c -0.227,-3.296 -0.332,-4.125 -0.442,-7.312 l -0.648,-0.621 c -4.707,0.101 -5.687,0.101 -10.062,0.101 0,-13.699 0.105,-27.515 0.871,-41.226 0,-1.027 0.109,-2.156 0.214,-3.293 l -0.542,-0.723" /><path
id="path194"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 795.906,155.031 c 3.504,0 7,-0.101 10.5,-0.101 3.715,0 7.649,0.101 11.481,0.101 l -10.5,34.836 -11.481,-34.836 z m 21.649,40.094 c 3.613,-11.332 7.761,-24.117 11.043,-33.906 3.394,-9.891 8.859,-25.762 12.14,-35.66 l -0.441,-0.821 c -5.684,-0.105 -8.09,-0.207 -12.68,-0.414 l -0.765,0.727 c -2.735,9.683 -3.61,12.461 -6.454,21.746 -4.367,0 -8.636,0.101 -13.011,0.101 -4.813,0 -9.844,-0.101 -14.211,-0.101 -3.176,-9.695 -3.828,-12.16 -6.457,-21.332 l -0.766,-0.727 c -4.699,0 -5.793,0 -11.262,-0.304 l -0.433,0.714 c 0.32,1.133 0.765,2.165 1.203,3.2 4.152,11.125 8.199,22.257 12.133,33.39 6.566,18.235 8.965,24.934 12.136,34.828 l 0.875,0.727 c 7.657,0.098 8.641,0.098 15.641,0.41 l 0.766,-0.723 0.543,-1.855" /><path
id="path196"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 869.723,132.156 c 14.425,0 22.742,8.657 22.742,21.34 0,10.711 -6.016,17.305 -14.762,17.305 -5.906,0 -10.062,-2.676 -12.582,-4.328 -0.105,-5.356 -0.215,-10.61 -0.215,-15.868 0,-6.074 0.11,-12.16 0.215,-18.136 1.426,-0.102 2.746,-0.313 4.602,-0.313 z m -4.817,41.742 c 2.196,1.649 7.438,5.567 15.961,5.567 13.891,0 23.621,-10.723 23.621,-25.25 0,-15.973 -11.265,-29.684 -34.332,-29.684 -2.074,0 -3.394,0.102 -4.922,0.207 0.114,-12.367 0.332,-15.047 0.879,-24.726 l -0.652,-0.6214 c -3.836,-0.1093 -7.656,-0.2109 -11.484,-0.3125 l -0.547,0.6211 c 0.215,6.2808 0.437,12.7698 0.437,23.2888 0,6.082 -0.117,12.157 -0.117,18.242 -0.105,15.969 -0.105,23.188 -1.414,34.934 l 0.539,0.613 c 5.355,0.828 6.566,1.141 11.488,2.071 l 0.758,-0.621 -0.215,-4.329" /><path
id="path198"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 938.633,132.156 c 14.433,0 22.746,8.657 22.746,21.34 0,10.711 -6.02,17.305 -14.762,17.305 -5.91,0 -10.062,-2.676 -12.578,-4.328 -0.113,-5.356 -0.223,-10.61 -0.223,-15.868 0,-6.074 0.11,-12.16 0.223,-18.136 1.422,-0.102 2.738,-0.313 4.594,-0.313 z m -4.817,41.742 c 2.196,1.649 7.446,5.567 15.965,5.567 13.891,0 23.617,-10.723 23.617,-25.25 0,-15.973 -11.257,-29.684 -34.332,-29.684 -2.074,0 -3.386,0.102 -4.921,0.207 0.117,-12.367 0.332,-15.047 0.882,-24.726 l -0.656,-0.6214 c -3.836,-0.1093 -7.656,-0.2109 -11.48,-0.3125 l -0.551,0.6211 c 0.219,6.2808 0.441,12.7698 0.441,23.2888 0,6.082 -0.113,12.157 -0.113,18.242 -0.109,15.969 -0.109,23.188 -1.418,34.934 l 0.543,0.613 c 5.355,0.828 6.562,1.141 11.484,2.071 l 0.762,-0.621 -0.223,-4.329" /><path
id="path200"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1002.7,124.633 c -5.255,-0.102 -6.348,-0.199 -11.489,-0.41 l -0.535,0.722 c 0.215,7.313 0.535,16.598 0.535,36.383 0,14.219 0,29.473 -1.09,42.66 l 0.555,0.621 c 5.355,0.821 6.441,1.028 11.914,2.157 l 0.65,-0.719 c -0.76,-13.5 -0.76,-27.102 -0.76,-40.598 0,-22.57 0.32,-30.402 0.87,-40.195 l -0.65,-0.621" /><path
id="path202"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1035.38,193.168 c -5.59,-0.199 -6.79,-0.313 -12.14,-0.82 l -0.66,0.621 c 0.11,1.336 0.11,2.777 0.11,4.117 0,1.859 -0.11,3.504 -0.22,5.562 l 0.77,0.622 c 5.68,0.41 6.66,0.507 12.14,1.031 l 0.65,-0.621 c -0.11,-4.227 -0.11,-5.258 0,-9.793 l -0.65,-0.719 z m -0.12,-68.535 c -5.68,-0.102 -6.55,-0.102 -11.91,-0.41 l -0.55,0.722 c 0.33,5.465 0.66,10.2 0.66,21.641 0,19.687 -0.33,23.394 -1.1,29.473 l 0.55,0.718 c 4.7,0.731 6.34,0.934 11.81,2.071 l 1.09,-0.621 c -0.32,-5.356 -0.66,-10.922 -0.66,-24.223 0,-19.164 0.23,-21.746 0.66,-28.75 l -0.55,-0.621" /><path
id="path204"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1090.83,164.004 c -2.18,5.668 -6.99,8.035 -11.91,8.035 -6.12,0 -13.33,-3.914 -14.43,-14.219 13.23,-0.101 17.38,0 27.44,0.098 -0.1,1.449 -0.21,3.711 -1.1,6.086 z m 10.18,-26.902 c -0.55,-4.114 -0.65,-5.157 -0.87,-9.172 l -0.67,-0.719 c -1.85,-0.93 -7.75,-3.914 -17.49,-3.914 -17.93,0 -29.19,9.691 -29.19,27.621 0,19.164 12.25,28.547 26.58,28.547 8.63,0 14.64,-3.406 17.92,-7.113 6.24,-7.008 6.03,-17.211 5.92,-21.747 l -0.78,-0.621 c -17.06,0.114 -20,0.114 -37.94,0 0.11,-3.601 0.44,-8.652 4.16,-12.882 4.48,-5.043 10.72,-5.567 14.1,-5.567 3.18,0 6.46,0.524 9.51,1.551 4.06,1.551 6.46,3.398 7.88,4.539 l 0.87,-0.523" /><path
id="path206"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1156.76,170.703 c -1.86,0.098 -3.16,0.305 -5.47,0.305 -3.38,0 -10.6,-0.207 -15.85,-4.844 -2.4,-2.16 -6.33,-7.004 -6.33,-16.18 0,-5.875 1.75,-10.093 4.04,-12.671 1.97,-2.168 5.58,-4.637 11.25,-4.637 6.68,0 10.72,3.301 12.25,4.531 0.22,13.5 0.22,16.594 0.11,33.496 z m -0.11,33.906 c 5.59,0.926 6.68,1.133 11.6,2.157 l 0.76,-0.61 c -0.76,-14.332 -0.87,-39.883 -0.87,-50.195 0,-15.969 0.43,-23.594 0.87,-30.707 l -0.54,-0.723 c -4.82,0 -6.12,-0.097 -11.15,-0.308 l -0.78,0.621 0.22,3.808 c -2.61,-1.851 -7.11,-5.148 -15.08,-5.148 -14.55,0 -24.6,10.82 -24.6,26.48 0,11.235 5.03,18.352 9.61,22.157 7.99,6.804 18.38,7.117 24.06,7.117 2.3,0 3.4,0 6.35,-0.211 0.11,12.777 -0.45,18.965 -0.99,24.941 l 0.54,0.621" /><path
id="path208"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1254.52,165.758 c 7.96,-3.297 18.58,-7.629 18.58,-20.817 0,-11.543 -9.08,-21.953 -28.12,-21.953 -11.58,0 -19.01,3.293 -21.65,4.532 l -0.43,0.722 c 0.43,3.606 0.56,5.567 0.87,9.481 l 1.11,0.41 c 2.73,-1.746 9.08,-6.074 19.23,-6.074 11.28,0 15.98,5.453 15.98,11.64 0,7.219 -6.34,9.996 -13.47,12.574 l -5.45,2.266 c -7.77,3.399 -18.14,7.836 -18.14,20.406 0,3.817 1.08,7.727 3.37,10.825 5.05,6.796 14.12,9.062 22.98,9.062 8.64,0 13.87,-1.539 19.66,-3.297 l 0.56,-0.82 c -0.43,-3.914 -0.56,-5.356 -0.87,-9.07 l -0.9,-0.411 c -4.68,2.266 -9.81,4.735 -18.02,4.735 -9.07,0 -14.77,-4.02 -14.77,-10.09 0,-4.641 3.28,-6.809 5.58,-8.149 1.42,-0.82 1.85,-1.027 8.42,-3.71 l 5.48,-2.262" /><path
id="path210"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1331.34,136.797 c -0.43,-4.43 -0.54,-4.949 -0.88,-9.176 l -0.76,-0.719 c -3.17,-1.437 -7.43,-3.5 -15.1,-3.5 -16.5,0 -27.21,11.235 -27.21,27.305 0,16.387 10.5,28.758 27.43,28.758 7.11,0 12.14,-2.168 14.99,-3.301 l 0.43,-0.726 c -0.43,-3.708 -0.54,-5.047 -0.76,-8.133 l -0.88,-0.422 c -3.6,2.48 -7.76,4.027 -12.14,4.027 -9.07,0 -17.05,-6.594 -17.05,-19.789 0,-14.019 8.41,-19.062 16.94,-19.062 7.45,0 12.03,3.605 14.11,5.148 l 0.88,-0.41" /><path
id="path212"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1357.48,193.168 c -5.58,-0.199 -6.79,-0.313 -12.14,-0.82 l -0.65,0.621 c 0.09,1.336 0.09,2.777 0.09,4.117 0,1.859 -0.09,3.504 -0.21,5.562 l 0.77,0.622 c 5.7,0.41 6.66,0.507 12.14,1.031 l 0.65,-0.621 c -0.1,-4.227 -0.1,-5.258 0,-9.793 l -0.65,-0.719 z m -0.13,-68.535 c -5.67,-0.102 -6.56,-0.102 -11.92,-0.41 l -0.53,0.722 c 0.31,5.465 0.66,10.2 0.66,21.641 0,19.687 -0.35,23.394 -1.09,29.473 l 0.53,0.718 c 4.7,0.731 6.35,0.934 11.83,2.071 l 1.08,-0.621 c -0.34,-5.356 -0.65,-10.922 -0.65,-24.223 0,-19.164 0.22,-21.746 0.65,-28.75 l -0.56,-0.621" /><path
id="path214"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1412.96,164.004 c -2.19,5.668 -6.99,8.035 -11.92,8.035 -6.13,0 -13.34,-3.914 -14.42,-14.219 13.21,-0.101 17.36,0 27.43,0.098 -0.09,1.449 -0.22,3.711 -1.09,6.086 z m 10.16,-26.902 c -0.52,-4.114 -0.65,-5.157 -0.86,-9.172 l -0.65,-0.719 c -1.86,-0.93 -7.78,-3.914 -17.5,-3.914 -17.93,0 -29.2,9.691 -29.2,27.621 0,19.164 12.26,28.547 26.57,28.547 8.64,0 14.64,-3.406 17.92,-7.113 6.26,-7.008 6.04,-17.211 5.92,-21.747 l -0.77,-0.621 c -17.06,0.114 -20.01,0.114 -37.93,0 0.12,-3.601 0.43,-8.652 4.14,-12.882 4.49,-5.043 10.72,-5.567 14.12,-5.567 3.16,0 6.44,0.524 9.51,1.551 4.06,1.551 6.44,3.398 7.87,4.539 l 0.86,-0.523" /><path
id="path216"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1490.58,124.633 c -5.25,-0.102 -5.9,-0.102 -10.93,-0.41 l -0.77,0.722 c 0,1.137 0.1,2.266 0.1,3.403 0.11,5.05 0.11,10.097 0.11,15.152 0,15.867 -0.11,16.898 -0.65,19.059 -2.07,7.832 -8.31,7.832 -9.85,7.832 -6.54,0 -11.58,-3.606 -14.53,-5.77 -0.11,-17.933 0.11,-27.308 0.88,-39.367 l -0.67,-0.621 c -5.35,-0.102 -6.22,-0.102 -11.47,-0.41 l -0.56,0.722 c 0.13,5.77 0.34,11.336 0.34,18.965 0,16.488 -0.77,25.242 -1.31,32.149 l 0.65,0.718 c 5.46,0.934 6.45,1.141 11.6,2.071 l 0.75,-0.731 -0.1,-5.355 c 2.84,1.855 9.62,6.39 19.24,6.39 2.74,0 6.13,-0.414 9.07,-1.957 2.85,-1.547 5.14,-3.914 6.35,-6.703 1.42,-3.09 1.53,-6.176 1.64,-12.574 l 0,-12.051 c 0.33,-12.058 0.43,-16.699 0.76,-20.613 l -0.65,-0.621" /><path
id="path218"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1552.09,136.797 c -0.43,-4.43 -0.53,-4.949 -0.87,-9.176 l -0.77,-0.719 c -3.16,-1.437 -7.43,-3.5 -15.08,-3.5 -16.5,0 -27.22,11.235 -27.22,27.305 0,16.387 10.5,28.758 27.44,28.758 7.09,0 12.13,-2.168 14.99,-3.301 l 0.43,-0.726 c -0.43,-3.708 -0.56,-5.047 -0.78,-8.133 l -0.86,-0.422 c -3.63,2.48 -7.78,4.027 -12.14,4.027 -9.08,0 -17.06,-6.594 -17.06,-19.789 0,-14.019 8.42,-19.062 16.93,-19.062 7.47,0 12.05,3.605 14.12,5.148 l 0.87,-0.41" /><path
id="path220"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1601.36,164.004 c -2.17,5.668 -7,8.035 -11.9,8.035 -6.12,0 -13.34,-3.914 -14.45,-14.219 13.25,-0.101 17.4,0 27.46,0.098 -0.13,1.449 -0.21,3.711 -1.11,6.086 z m 10.18,-26.902 c -0.55,-4.114 -0.64,-5.157 -0.87,-9.172 l -0.67,-0.719 c -1.87,-0.93 -7.74,-3.914 -17.5,-3.914 -17.93,0 -29.17,9.691 -29.17,27.621 0,19.164 12.24,28.547 26.57,28.547 8.64,0 14.65,-3.406 17.93,-7.113 6.22,-7.008 6.01,-17.211 5.91,-21.747 l -0.77,-0.621 c -17.06,0.114 -20,0.114 -37.96,0 0.12,-3.601 0.46,-8.652 4.18,-12.882 4.45,-5.043 10.71,-5.567 14.08,-5.567 3.19,0 6.48,0.524 9.51,1.551 4.06,1.551 6.48,3.398 7.89,4.539 l 0.87,-0.523" /><path
id="path222"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1653.61,155.863 c 4.37,-1.343 14.32,-4.535 14.32,-15.461 0,-4.121 -1.64,-8.754 -6.13,-12.16 -5.79,-4.64 -13.55,-4.945 -17.49,-4.945 -5.9,0 -10.82,1.027 -14.97,2.574 -0.56,0.211 -1.11,0.41 -1.64,0.621 l -0.56,0.93 c 0.45,4.016 0.45,4.523 0.66,8.652 l 1.09,0.313 c 1.98,-1.442 6.77,-4.949 15.2,-4.949 8.63,0 11.81,4.539 11.81,7.726 0,4.746 -4.71,6.285 -11.38,8.356 l -3.49,1.125 c -4.48,1.339 -14.33,4.328 -14.33,14.945 0,10.617 9.85,15.875 22.1,15.875 8.08,0 13.78,-2.168 15.74,-2.891 l 0.55,-0.715 c -0.44,-3.82 -0.55,-4.23 -0.87,-8.144 l -1,-0.41 c -2.73,1.648 -6.99,4.117 -14.1,4.117 -1.53,0 -3.07,-0.102 -4.71,-0.512 -3.28,-0.828 -6,-2.988 -6,-6.183 0,-4.434 4.47,-5.778 11.25,-7.735 l 3.95,-1.129" /><path
id="path224"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1150.8,1.55078 c -7.43,0 -8.53,0 -15.75,-0.3125 l -0.75,0.72266 c -1.76,10.30076 -2.42,13.28906 -3.95,20.80856 l -8.97,44.4219 -9.07,-42.043 c -0.54,-2.789 -1.08,-5.6796 -1.75,-8.4492 -0.87,-4.4375 -2.51,-11.96092 -2.94,-14.43748 l -0.67,-0.71094 c -7.86,0 -8.31,-0.10937 -15.85,-0.3125 l -0.76,0.72266 c -1.98,9.26956 -11.05,48.32816 -16.95,71.61716 l 0.54,0.7305 c 6.13,0 7.11,0.1016 12.46,0.3125 l 0.67,-0.7305 c 0.65,-3.6093 1.3,-6.9023 2.29,-12.0625 0.88,-4.6289 1.75,-9.1679 2.63,-13.707 l 7.98,-39.35938 9.18,45.64848 c 1.53,7.5312 1.74,8.7617 3.71,19.1679 l 0.67,0.7305 c 8.31,0.1016 9.72,0.1016 17.38,0.3125 l 0.65,-0.7305 c 0.12,-0.8203 0.22,-1.6523 0.33,-2.5703 0.45,-2.6914 2.96,-15.8789 3.61,-19.3789 l 8.64,-43.48046 8.53,40.68746 c 4.05,19.9024 4.16,20.3125 4.7,24.4297 l 0.65,0.7305 c 5.04,0 6.14,0.1016 10.72,0.3125 l 0.56,-0.7305 c -2.53,-8.039 -3.18,-10.8203 -9.19,-35.8593 -2.74,-11.2305 -5.69,-22.3711 -8.09,-33.60161 -0.11,-0.71875 -0.33,-1.44141 -0.44,-2.16797 l -0.77,-0.71094" /><path
id="path226"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1215.16,41.0195 c -2.17,5.6719 -7,8.0391 -11.89,8.0391 -6.13,0 -13.35,-3.918 -14.46,-14.2305 13.25,-0.0976 17.4,0 27.46,0.1133 -0.12,1.4492 -0.21,3.6992 -1.11,6.0781 z m 10.19,-26.8984 C 1224.79,10 1224.7,8.96094 1224.48,4.94922 l -0.68,-0.71875 c -1.86,-0.92969 -7.74,-3.921876 -17.5,-3.921876 -17.93,0 -29.17,9.691406 -29.17,27.621106 0,19.1719 12.24,28.5508 26.57,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.23,-7 6.01,-17.1992 5.92,-21.7383 L 1226.77,27 c -17.06,0.1094 -20,0.1094 -37.96,0 0.13,-3.6016 0.46,-8.6484 4.18,-12.8789 4.46,-5.05079 10.71,-5.57032 14.09,-5.57032 3.19,0 6.47,0.51953 9.51,1.55082 4.05,1.5468 6.47,3.3867 7.89,4.539 l 0.87,-0.5195" /><path
id="path228"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1267.4,32.8711 c 4.36,-1.332 14.33,-4.5313 14.33,-15.4492 0,-4.1211 -1.64,-8.76174 -6.12,-12.1719 -5.8,-4.640625 -13.57,-4.941406 -17.5,-4.941406 -5.91,0 -10.84,1.031246 -14.99,2.582036 -0.56,0.19921 -1.08,0.41015 -1.64,0.60937 l -0.56,0.92969 c 0.47,4.03125 0.47,4.53125 0.69,8.64841 l 1.08,0.3203 c 1.98,-1.4375 6.78,-4.93746 15.2,-4.93746 8.64,0 11.8,4.52736 11.8,7.71876 0,4.75 -4.7,6.2812 -11.36,8.3516 l -3.5,1.1289 c -4.49,1.3398 -14.34,4.3281 -14.34,14.9414 0,10.6172 9.85,15.8789 22.11,15.8789 8.08,0 13.78,-2.1719 15.73,-2.8907 l 0.56,-0.7187 c -0.44,-3.8125 -0.56,-4.2227 -0.87,-8.1406 l -0.99,-0.4102 c -2.73,1.6485 -7,4.1211 -14.12,4.1211 -1.52,0 -3.07,-0.1133 -4.71,-0.5195 -3.28,-0.8203 -6,-2.9805 -6,-6.1836 0,-4.4375 4.48,-5.7695 11.27,-7.7266 l 3.93,-1.1406" /><path
id="path230"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1322.22,9.69141 c -0.34,-3.40235 -0.34,-4.1211 -0.45,-7.11328 l -0.54,-0.61719 c -2.29,-0.51953 -4.15,-0.94141 -8.2,-0.94141 -2.62,0 -9.51,0 -12.9,5.37891 -1.97,2.98047 -1.97,5.45316 -1.97,17.61326 l 0.22,22.6797 c -3.82,0 -3.93,-0.1016 -7.87,-0.2109 l -0.45,0.6211 c 0.22,3.289 0.22,4.1172 0.22,7.4179 l 0.67,0.6094 c 2.4,0 3.82,-0.0976 7.43,0 -0.11,2.1719 -0.11,4.4414 -0.11,6.6016 -0.11,1.9609 -0.21,3.9101 -0.33,5.8711 l 0.55,0.7187 c 4.92,1.1406 6.13,1.4492 11.16,2.8906 l 0.76,-0.5117 c -0.33,-6.8008 -0.43,-8.1406 -0.43,-15.6679 4.58,0.0976 5.89,0.0976 12.13,0.3085 l 0.55,-0.621 c -0.22,-2.6797 -0.33,-3.8086 -0.33,-7.3086 l -0.56,-0.6211 C 1316.31,46.8906 1315.66,47 1309.87,47 l -0.22,-19.1719 c 0.11,-1.2383 0.11,-7.1172 0.11,-8.5468 0,-7.5313 0.97,-9.90239 6.44,-9.90239 2.31,0 4.05,0.51172 5.25,0.92969 l 0.77,-0.61719" /><path
id="path232"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1371.69,41.0195 c -2.2,5.6719 -7,8.0391 -11.92,8.0391 -6.13,0 -13.35,-3.918 -14.46,-14.2305 13.25,-0.0976 17.4,0 27.46,0.1133 -0.12,1.4492 -0.21,3.6992 -1.08,6.0781 z m 10.16,-26.8984 C 1381.29,10 1381.2,8.96094 1380.98,4.94922 l -0.68,-0.71875 c -1.86,-0.92969 -7.74,-3.921876 -17.5,-3.921876 -17.93,0 -29.17,9.691406 -29.17,27.621106 0,19.1719 12.23,28.5508 26.57,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.23,-7 6.01,-17.1992 5.91,-21.7383 L 1383.27,27 c -17.06,0.1094 -20,0.1094 -37.96,0 0.12,-3.6016 0.46,-8.6484 4.18,-12.8789 4.46,-5.05079 10.71,-5.57032 14.08,-5.57032 3.2,0 6.48,0.51953 9.51,1.55082 4.06,1.5468 6.48,3.3867 7.9,4.539 l 0.87,-0.5195" /><path
id="path234"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1426.31,44.4219 c -1.11,0.4062 -2.54,0.9297 -4.4,0.9297 -2.07,0 -3.59,-0.7227 -4.58,-1.3399 -4.49,-2.9922 -4.49,-7.5312 -4.49,-18.25 0,-11.6406 0.34,-17.71092 0.77,-23.49998 l -0.55,-0.71094 c -5.14,0 -6.32,-0.10937 -11.58,-0.3125 l -0.56,0.61328 c 0.12,7.83985 0.25,14.94924 0.25,24.52734 0,16.4922 -0.34,20.7227 -0.99,26.6914 l 0.65,0.7188 c 4.15,0.7304 6.78,1.2422 11.36,2.0703 l 0.65,-0.6211 -0.53,-8.7578 c 1.3,3.289 4.03,9.8906 13.35,9.8906 1.4,0 2.17,-0.1016 3.04,-0.3125 l 0.46,-0.6172 c -1.11,-4.9414 -1.33,-5.9726 -2.1,-10.5 l -0.75,-0.5195" /><path
id="path236"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1490.75,1.64844 c -5.23,-0.09766 -5.88,-0.09766 -10.93,-0.41016 l -0.78,0.72266 c 0,1.1289 0.13,2.26953 0.13,3.39844 0.09,5.05082 0.09,10.10152 0.09,15.16012 0,15.8711 -0.09,16.8907 -0.65,19.0508 -2.07,7.8399 -8.3,7.8399 -9.85,7.8399 -6.53,0 -11.58,-3.6094 -14.52,-5.7696 -0.12,-17.9414 0.1,-27.3203 0.87,-39.37888 l -0.65,-0.61328 c -5.36,-0.09766 -6.23,-0.09766 -11.49,-0.41016 l -0.56,0.72266 c 0.13,5.76953 0.34,11.33986 0.34,18.96876 0,16.4805 -0.77,25.2422 -1.29,32.1406 l 0.64,0.7188 c 5.45,0.9297 6.44,1.1406 11.59,2.0703 l 0.77,-0.7305 -0.12,-5.3594 c 2.84,1.8594 9.62,6.4024 19.25,6.4024 2.73,0 6.14,-0.4219 9.08,-1.961 2.85,-1.5507 5.14,-3.9218 6.34,-6.6992 1.43,-3.0898 1.52,-6.1836 1.65,-12.5703 l 0,-12.0625 c 0.31,-12.0586 0.43,-16.69921 0.74,-20.61718 l -0.65,-0.61328" /><path
id="path238"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1576.81,42.7695 c 7.95,-3.3007 18.57,-7.6211 18.57,-20.8203 C 1595.38,10.4102 1586.31,0 1567.27,0 c -11.59,0 -19.02,3.30078 -21.65,4.53125 L 1545.19,5.25 c 0.43,3.62109 0.55,5.5703 0.86,9.4805 l 1.12,0.4179 c 2.72,-1.75 9.07,-6.07809 19.23,-6.07809 11.27,0 15.97,5.46099 15.97,11.64059 0,7.2188 -6.34,10 -13.46,12.5704 l -5.45,2.2773 c -7.78,3.3906 -18.15,7.832 -18.15,20.4023 0,3.8204 1.09,7.7305 3.37,10.8204 5.05,6.7968 14.12,9.0703 22.98,9.0703 8.64,0 13.88,-1.543 19.67,-3.3008 l 0.55,-0.8203 c -0.43,-3.9219 -0.55,-5.3594 -0.86,-9.0821 l -0.9,-0.4101 c -4.68,2.2812 -9.82,4.75 -18.02,4.75 -9.08,0 -14.78,-4.0195 -14.78,-10.0977 0,-4.6406 3.29,-6.8008 5.58,-8.1523 1.43,-0.8164 1.86,-1.0274 8.42,-3.6992 l 5.49,-2.2696" /><path
id="path240"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1675.09,1.64844 c -7.32,-0.09766 -8.21,-0.09766 -14.87,-0.41016 l -0.78,0.72266 c -1.3,6.27734 -3.37,14.64066 -5.22,21.94926 l -6.35,24.7382 -6.44,-25.3593 c -3.29,-12.4688 -4.4,-16.48051 -5.37,-21.02738 l -0.67,-0.61328 c -7.65,-0.09766 -8.17,-0.09766 -15.09,-0.41016 l -0.64,0.72266 c -4.81,18.44926 -13.01,45.44926 -15.29,52.24996 l 0.42,0.7188 c 5.24,0.3086 6.67,0.3086 11.93,0.8203 l 0.64,-0.6211 c 0.66,-3.3984 1.43,-6.5976 6.14,-25.6484 l 5.23,-21.24222 7.12,27.73052 c 3.28,13.7109 3.51,15.0429 4.15,18.3398 l 0.74,0.7227 c 6.48,0 8.33,0 15.55,0.3085 l 0.65,-0.7187 c 1.55,-7.1094 4.14,-17 6.13,-24.832 l 5.79,-21.85941 6.13,24.01951 c 0.87,3.6094 1.74,7.211 2.64,10.8203 1.85,7 2.07,7.8321 2.72,11.75 l 0.77,0.6094 c 1.74,0 3.6,-0.0976 5.36,-0.0976 1.65,0 3.26,0.0976 4.9,0.0976 l 0.67,-0.6094 c -2.07,-5.8711 -11.7,-34.6289 -16.19,-52.25778 l -0.77,-0.61328" /><path
id="path242"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1716.4,70.1797 c -5.58,-0.1992 -6.79,-0.3086 -12.14,-0.8203 l -0.66,0.6211 c 0.11,1.3398 0.11,2.7812 0.11,4.1211 0,1.8593 -0.11,3.5078 -0.21,5.5703 l 0.76,0.6094 c 5.69,0.4101 6.67,0.5078 12.14,1.0273 l 0.66,-0.6172 c -0.11,-4.2226 -0.11,-5.25 0,-9.793 l -0.66,-0.7187 z m -0.12,-68.53126 c -5.67,-0.09766 -6.56,-0.09766 -11.91,-0.41016 l -0.55,0.72266 c 0.33,5.46094 0.66,10.19926 0.66,21.64066 0,19.6875 -0.33,23.3984 -1.09,29.4687 l 0.54,0.7188 c 4.7,0.7304 6.34,0.9297 11.81,2.0703 l 1.11,-0.6211 c -0.35,-5.3594 -0.68,-10.918 -0.68,-24.2188 0,-19.1679 0.23,-21.73825 0.68,-28.75778 l -0.57,-0.61328" /><path
id="path244"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1761.66,9.69141 c -0.3,-3.40235 -0.3,-4.1211 -0.43,-7.11328 l -0.56,-0.61719 c -2.29,-0.51953 -4.15,-0.94141 -8.2,-0.94141 -2.61,0 -9.51,0 -12.88,5.37891 -1.98,2.98047 -1.98,5.45316 -1.98,17.61326 l 0.21,22.6797 c -3.81,0 -3.93,-0.1016 -7.87,-0.2109 l -0.43,0.6211 c 0.22,3.289 0.22,4.1172 0.22,7.4179 l 0.65,0.6094 c 2.41,0 3.84,-0.0976 7.43,0 -0.1,2.1719 -0.1,4.4414 -0.1,6.6016 -0.11,1.9609 -0.21,3.9101 -0.34,5.8711 l 0.56,0.7187 c 4.93,1.1406 6.13,1.4492 11.15,2.8906 l 0.77,-0.5117 c -0.34,-6.8008 -0.43,-8.1406 -0.43,-15.6679 4.58,0.0976 5.88,0.0976 12.14,0.3085 l 0.53,-0.621 c -0.22,-2.6797 -0.31,-3.8086 -0.31,-7.3086 l -0.56,-0.6211 C 1755.75,46.8906 1755.1,47 1749.31,47 l -0.22,-19.1719 c 0.13,-1.2383 0.13,-7.1172 0.13,-8.5468 0,-7.5313 0.96,-9.90239 6.43,-9.90239 2.3,0 4.07,0.51172 5.24,0.92969 l 0.77,-0.61719" /><path
id="path246"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1812.41,1.55078 c -3.03,0 -18.02,-0.10937 -21.42,-0.10937 -12.79,0 -14.21,0 -20.87,-0.20313 l -0.43,0.9336 c 8.29,12.97652 21.51,35.03902 27.09,44.92972 C 1782.34,47 1779.75,47 1772.74,46.6914 l -0.55,0.6094 c 0.44,3.3984 0.55,4.2305 0.78,7.1094 l 0.64,0.6211 c 18.37,0 20.44,0 39.49,0.3085 l 0.52,-0.8203 C 1803.9,39.4688 1790,14.9492 1787.05,9.69141 c 9.41,0.09765 18.83,0.30859 26.26,0.61719 l 0.53,-0.61719 c -0.43,-3.20313 -0.53,-4.54297 -0.74,-7.6211 l -0.69,-0.51953" /><path
id="path248"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1863.98,41.0195 c -2.17,5.6719 -6.99,8.0391 -11.9,8.0391 -6.13,0 -13.34,-3.918 -14.44,-14.2305 13.23,-0.0976 17.38,0 27.45,0.1133 -0.11,1.4492 -0.22,3.6992 -1.11,6.0781 z m 10.18,-26.8984 C 1873.61,10 1873.51,8.96094 1873.29,4.94922 l -0.66,-0.71875 c -1.86,-0.92969 -7.76,-3.921876 -17.5,-3.921876 -17.92,0 -29.18,9.691406 -29.18,27.621106 0,19.1719 12.24,28.5508 26.56,28.5508 8.64,0 14.65,-3.4102 17.93,-7.1211 6.24,-7 6.02,-17.1992 5.92,-21.7383 L 1875.59,27 c -17.06,0.1094 -20.01,0.1094 -37.95,0 0.12,-3.6016 0.45,-8.6484 4.16,-12.8789 4.48,-5.05079 10.71,-5.57032 14.11,-5.57032 3.17,0 6.45,0.51953 9.5,1.55082 4.06,1.5468 6.46,3.3867 7.88,4.539 l 0.87,-0.5195" /><path
id="path250"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1918.62,44.4219 c -1.11,0.4062 -2.51,0.9297 -4.39,0.9297 -2.07,0 -3.6,-0.7227 -4.58,-1.3399 -4.49,-2.9922 -4.49,-7.5312 -4.49,-18.25 0,-11.6406 0.34,-17.71092 0.77,-23.49998 l -0.56,-0.71094 c -5.14,0 -6.32,-0.10937 -11.58,-0.3125 l -0.56,0.61328 c 0.13,7.83985 0.26,14.94924 0.26,24.52734 0,16.4922 -0.35,20.7227 -1,26.6914 l 0.65,0.7188 c 4.15,0.7304 6.78,1.2422 11.36,2.0703 l 0.66,-0.6211 -0.53,-8.7578 c 1.3,3.289 4.02,9.8906 13.35,9.8906 1.39,0 2.17,-0.1016 3.03,-0.3125 l 0.46,-0.6172 c -1.11,-4.9414 -1.32,-5.9726 -2.1,-10.5 l -0.75,-0.5195" /><path
id="path252"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1946.37,1.64844 c -5.24,-0.09766 -6.32,-0.20703 -11.46,-0.41016 l -0.55,0.72266 c 0.21,7.32031 0.55,16.58986 0.55,36.37886 0,14.2188 0,29.4688 -1.11,42.6602 l 0.56,0.6211 c 5.36,0.8203 6.44,1.0273 11.92,2.1602 l 0.64,-0.711 c -0.77,-13.5117 -0.77,-27.1094 -0.77,-40.6094 0,-22.5703 0.34,-30.4023 0.9,-40.19918 l -0.68,-0.61328" /><path
id="path254"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 1996.48,30.3008 c -11.03,-1.5508 -21.31,-2.9922 -21.31,-12.1719 0,-0.5 0,-9.36718 10.39,-9.36718 6.77,0 10.71,3.49998 11.92,4.53908 l 0,17.2109 -1,-0.2109 z m 12.25,-7.5313 c 0,-12.7695 0.11,-13.89841 0.67,-20.59762 l -0.56,-0.52344 c -5.14,-0.09766 -6.01,-0.20703 -11.04,-0.41016 l -0.43,0.61328 0.11,3.71875 c -2.08,-1.55078 -7,-5.261716 -15.31,-5.261716 -10.94,0 -18.6,7.011716 -18.6,17.210906 0,13.8086 12.25,18.25 31.94,20.4024 l 1.86,0.207 c 0,2.7813 0,4.7422 -0.99,6.3906 -1.09,1.8594 -3.61,3.8086 -9.08,3.8086 -7.1,0 -12.03,-2.0468 -16.61,-3.9062 l -0.88,0.5195 c 0.22,4.7383 0.22,5.3477 0.33,7.5078 l 0.66,0.6211 c 6.11,2.0586 12.46,3.4102 18.91,3.4102 8.09,0 15.97,-2.5821 18.27,-10.6211 0.75,-2.8789 0.75,-8.5586 0.75,-12.8789 l 0,-10.211" /><path
id="path256"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2077.51,1.64844 c -5.25,-0.09766 -5.9,-0.09766 -10.94,-0.41016 l -0.77,0.72266 c 0,1.1289 0.11,2.26953 0.11,3.39844 0.13,5.05082 0.13,10.10152 0.13,15.16012 0,15.8711 -0.13,16.8907 -0.67,19.0508 -2.08,7.8399 -8.32,7.8399 -9.83,7.8399 -6.57,0 -11.59,-3.6094 -14.55,-5.7696 -0.11,-17.9414 0.1,-27.3203 0.88,-39.37888 l -0.67,-0.61328 c -5.36,-0.09766 -6.22,-0.09766 -11.47,-0.41016 l -0.56,0.72266 c 0.11,5.76953 0.34,11.33986 0.34,18.96876 0,16.4805 -0.77,25.2422 -1.32,32.1406 l 0.66,0.7188 c 5.46,0.9297 6.45,1.1406 11.59,2.0703 l 0.76,-0.7305 -0.11,-5.3594 c 2.86,1.8594 9.63,6.4024 19.25,6.4024 2.74,0 6.12,-0.4219 9.07,-1.961 2.85,-1.5507 5.14,-3.9218 6.35,-6.6992 1.42,-3.0898 1.53,-6.1836 1.64,-12.5703 l 0,-12.0625 c 0.32,-12.0586 0.43,-16.69921 0.75,-20.61718 l -0.64,-0.61328" /><path
id="path258"
style="fill:#aa9f93;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 2134.67,47.7109 c -1.86,0.1094 -3.16,0.3204 -5.48,0.3204 -3.38,0 -10.6,-0.211 -15.86,-4.8516 -2.38,-2.1602 -6.31,-7 -6.31,-16.1797 0,-5.8789 1.73,-10.1016 4.02,-12.6797 1.99,-2.1601 5.57,-4.62889 11.27,-4.62889 6.66,0 10.72,3.29689 12.23,4.52739 0.23,13.5 0.23,16.6015 0.13,33.4921 z m -0.13,33.9102 c 5.61,0.9297 6.69,1.1289 11.61,2.1602 l 0.75,-0.6094 c -0.75,-14.3321 -0.86,-39.8828 -0.86,-50.1914 0,-15.9688 0.42,-23.60159 0.86,-30.71878 l -0.52,-0.71094 c -4.84,0 -6.14,-0.10937 -11.16,-0.3125 l -0.77,0.61328 0.22,3.8086 c -2.63,-1.83985 -7.12,-5.140629 -15.08,-5.140629 -14.55,0 -24.62,10.820269 -24.62,26.480469 0,11.2305 5.05,18.3516 9.63,22.1484 7.99,6.8125 18.36,7.1211 24.06,7.1211 2.3,0 3.38,0 6.35,-0.2109 0.1,12.7812 -0.47,18.9727 -1,24.9414 l 0.53,0.6211" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.1 KiB

-14
View File
@@ -1,14 +0,0 @@
---
BasedOnStyle: Google
IndentWidth: 4
---
Language: Cpp
ColumnLimit: 80
BreakBeforeBraces: Custom
AlignConsecutiveAssignments: true
DerivePointerAlignment: false
PointerAlignment: Left
BinPackArguments: false
BinPackParameters: false
BraceWrapping:
AfterFunction: true
-20
View File
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(backtrace)
include(../../nanopi.cmake)
add_executable(backtrace main.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-32
View File
@@ -1,32 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
},
{
"name": "(gdb) debug Core Dumped",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb",
"coreDumpPath": "${workspaceFolder}/core"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(core-dumps)
include(../../nanopi.cmake)
add_executable(core-dumps core_dumps.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-20
View File
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(daemon)
include(../../nanopi.cmake)
add_executable(daemon daemon.c)
-5
View File
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1 +0,0 @@
fibonacci
-20
View File
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app 2'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(fibonacci)
include(../../nanopi.cmake)
add_executable(fibonacci fibonacci.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-9
View File
@@ -1,9 +0,0 @@
build-all:
#!/bin/bash
for i in $(dirname */CMAkeLists.txt); do
cd $i && just build && cd ..
done
clean-all:
rm -Rf */build
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(memory-leaks)
include(../../nanopi.cmake)
add_executable(memory-leaks mem_leaks.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-20
View File
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(process)
include(../../nanopi.cmake)
add_executable(process process.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,5 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project("system-calls")
include(../../nanopi.cmake)
add_executable("system-calls" syscall.c)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-20
View File
@@ -1,20 +0,0 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/app",
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerServerAddress": "192.168.53.14:1234",
"miDebuggerPath": "/buildroot/output/host/bin/aarch64-linux-gdb"
}
]
}
-15
View File
@@ -1,15 +0,0 @@
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "gdbserver",
"type": "shell",
"command": [
"ssh -t root@192.168.53.14 '/usr/bin/gdbserver :1234",
"${workspaceFolder}/app'"
]
}
]
}
@@ -1,9 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(tracing)
include(../../nanopi.cmake)
add_executable(fibonacci fibonacci.c)
add_executable(fibonacci-debug fibonacci.c)
target_compile_definitions(fibonacci-debug PRIVATE DEBUG)
@@ -1,5 +0,0 @@
build:
cmake -S . -B build && cmake --build build
clean:
rm -rf build
-33
View File
@@ -1,33 +0,0 @@
CompileFlags:
Add:
# Architecture and cross-compilation
- "--target=aarch64-linux-gnu"
# Exclude standard library
- "-nostdinc"
# Mandatory kernel definitions
- "-D__KERNEL__"
- "-DMODULE"
- "-DCONFIG_CC_HAS_K_CONSTRAINT=1"
# Force-included files
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler-version.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/kconfig.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler_types.h"
# Kernel include paths
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated"
- "-I/buildroot/output/build/linux-5.15.148/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/generated/uapi"
# GCC compiler system include path
- "-isystem"
- "/buildroot/output/host/lib/gcc/aarch64-buildroot-linux-gnu/11.3.0/include"
-4
View File
@@ -1,4 +0,0 @@
cmake_minimum_required(VERSION 3.28)
project(ex7-app)
add_executable(silly_led_control silly_led_control.c)
-20
View File
@@ -1,20 +0,0 @@
# Makefile for CMake project with intelligent configuration
# Default target
all: build/build.ninja
cmake --build build
# Create build directory and generate build files if needed
build/build.ninja : CMakeLists.txt
cmake -S . -B build -G "Ninja" -DCMAKE_TOOLCHAIN_FILE=../../nanopi.cmake
# Clean build directory
clean:
rm -rf build
# Rebuild from scratch
rebuild: clean all
# Phony targets (targets that don't represent files)
.PHONY: all clean rebuild
@@ -1,103 +0,0 @@
/**
* Copyright 2018 University of Applied Sciences Western Switzerland / Fribourg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* Project: HEIA-FR / HES-SO MSE - MA-CSEL1 Laboratory
*
* Abstract: System programming - file system
*
* Purpose: NanoPi silly status led control system
*
* Autĥor: Daniel Gachet
* Date: 07.11.2018
*/
#include <errno.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
/*
* status led - gpioa.10 --> gpio10
* power led - gpiol.10 --> gpio362
*/
#define GPIO_EXPORT "/sys/class/gpio/export"
#define GPIO_UNEXPORT "/sys/class/gpio/unexport"
#define GPIO_LED "/sys/class/gpio/gpio10"
#define LED "10"
static int open_led()
{
// unexport pin out of sysfs (reinitialization)
int f = open(GPIO_UNEXPORT, O_WRONLY);
write(f, LED, strlen(LED));
close(f);
// export pin to sysfs
f = open(GPIO_EXPORT, O_WRONLY);
write(f, LED, strlen(LED));
close(f);
// config pin
f = open(GPIO_LED "/direction", O_WRONLY);
write(f, "out", 3);
close(f);
// open gpio value attribute
f = open(GPIO_LED "/value", O_RDWR);
return f;
}
int main(int argc, char* argv[])
{
long duty = 2; // %
long period = 1000; // ms
if (argc >= 2) period = atoi(argv[1]);
period *= 1000000; // in ns
// compute duty period...
long p1 = period / 100 * duty;
long p2 = period - p1;
int led = open_led();
pwrite(led, "1", sizeof("1"), 0);
struct timespec t1;
clock_gettime(CLOCK_MONOTONIC, &t1);
int k = 0;
while (1) {
struct timespec t2;
clock_gettime(CLOCK_MONOTONIC, &t2);
long delta =
(t2.tv_sec - t1.tv_sec) * 1000000000 + (t2.tv_nsec - t1.tv_nsec);
int toggle = ((k == 0) && (delta >= p1)) | ((k == 1) && (delta >= p2));
if (toggle) {
t1 = t2;
k = (k + 1) % 2;
if (k == 0)
pwrite(led, "1", sizeof("1"), 0);
else
pwrite(led, "0", sizeof("0"), 0);
}
}
return 0;
}
-5
View File
@@ -1,5 +0,0 @@
export PATH := /buildroot/output/host/usr/sbin$\
:/buildroot/output/host/usr/bin/$\
:/buildroot/output/host/sbin$\
:/buildroot/output/host/bin/$\
:$(PATH)
-8
View File
@@ -1,8 +0,0 @@
CVER := aarch64-buildroot-linux-gnu-
KVER := 5.15.148
CPU := arm64
KDIR := /buildroot/output/build/linux-$(KVER)/
TOOLS := /buildroot/output/host/usr/bin/$(CVER)
MODPATH := /rootfs
#MODPATH := /buildroot/output/target
-14
View File
@@ -1,14 +0,0 @@
set(CMAKE_SYSTEM_NAME Linux)
find_program(CMAKE_C_COMPILER aarch64-linux-gcc)
find_program(CMAKE_CXX_COMPILER aarch64-linux-g++)
set(CMAKE_FIND_ROOT_PATH /buildroot/output/host)
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_C_FLAGS "-Wall -Wextra -g -O0 -MD -std=gnu17")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=cortex-a53 -funwind-tables")
set(CMAKE_CXX_FLAGS "-Wall -Wextra -g -O0 -MD -std=gnu++17")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mcpu=cortex-a53 -funwind-tables")
-5
View File
@@ -1,5 +0,0 @@
export PATH := /buildroot/output/host/usr/sbin$\
:/buildroot/output/host/usr/bin/$\
:/buildroot/output/host/sbin$\
:/buildroot/output/host/bin/$\
:$(PATH)
-33
View File
@@ -1,33 +0,0 @@
CompileFlags:
Add:
# Architecture and cross-compilation
- "--target=aarch64-linux-gnu"
# Exclude standard library
- "-nostdinc"
# Mandatory kernel definitions
- "-D__KERNEL__"
- "-DMODULE"
- "-DCONFIG_CC_HAS_K_CONSTRAINT=1"
# Force-included files
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler-version.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/kconfig.h"
- "-include"
- "/buildroot/output/build/linux-5.15.148/include/linux/compiler_types.h"
# Kernel include paths
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated"
- "-I/buildroot/output/build/linux-5.15.148/include"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/arch/arm64/include/generated/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/uapi"
- "-I/buildroot/output/build/linux-5.15.148/include/generated/uapi"
# GCC compiler system include path
- "-isystem"
- "/buildroot/output/host/lib/gcc/aarch64-buildroot-linux-gnu/11.3.0/include"
-34
View File
@@ -1,34 +0,0 @@
export PATH := /buildroot/output/host/usr/sbin$\
:/buildroot/output/host/usr/bin/$\
:/buildroot/output/host/sbin$\
:/buildroot/output/host/bin/$\
:$(PATH)
MODULE := mymodule
SOURCE := skeleton
# Part executed when called from kernel build system:
ifneq ($(KERNELRELEASE),)
obj-m += $(MODULE).o ## name of the generated module
$(MODULE)-objs := $(SOURCE).o ## list of objects needed for that module
CFLAGS_$(SOURCE).o := -DDEBUG
# Part executed when called from standard make in module source directory:
else
include ../kernel_settings
PWD := $(shell pwd)
all:
$(MAKE) -C $(KDIR) M=$(PWD) ARCH=$(CPU) CROSS_COMPILE=$(TOOLS) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
echo $(PATH)
install:
$(MAKE) -C $(KDIR) M=$(PWD) INSTALL_MOD_PATH=$(MODPATH) modules_install
install -D -m 0644 $(SOURCE).conf $(MODPATH)/etc/modprobe.d/$(SOURCE).conf
endif
@@ -1,15 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/moduleparam.h>
static char* text = "dummy text";
module_param(text, charp, 0664);
static int elements = 1;
module_param(elements, int, 0);
void parameters_print(void) {
pr_debug("text: %s\n", text);
pr_debug("elements: %d\n", elements);
}
@@ -1,58 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/slab.h> // dynamic memory allocation
#include <linux/list.h> // linked list
#include <linux/string.h>
#define TEXT_LENGTH_MAX 255
struct element {
char text[TEXT_LENGTH_MAX];
int32_t unique_number;
struct list_head node;
};
static LIST_HEAD (list_unique_elements);
void dynAlloc_init(void) {
pr_info("Initialize dynamic allocation and linked list\n");
struct element* element_ptr = kcalloc(elements, sizeof(struct element), GFP_KERNEL);
if (element_ptr == 0) {
pr_err("Failed to allocate memory for %d elements\n", elements);
return;
}
uint8_t i;
const uint8_t length = TEXT_LENGTH_MAX - 1;
for (i = 0; i < elements; i++) {
struct element* e = element_ptr + i;
if (e != 0) {
strncpy(e->text, text, length);
e->unique_number = i;
list_add_tail(&e->node, &list_unique_elements);
pr_info ("add element %d: %s\n", e->unique_number, e->text);
}
}
pr_info("Dynamic allocation and linked list initialized\n");
}
void dynAlloc_exit(void) {
pr_info("Free memory allocated for dynamic allocation and linked list\n");
struct element* e;
while (!list_empty(&list_unique_elements)) {
e = list_entry(list_unique_elements.next, struct element, node);
pr_info ("delete element %d: %s\n", e->unique_number, e->text);
list_del(&e->node);
if (e != 0) {
kfree(e);
}
}
pr_info("Memory allocated for dynamic allocation and linked list freed\n");
}
@@ -1,105 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/ioport.h>
#include <linux/io.h>
#define CHIP_ID_BASE_ADDR 0x01c14000
#define TEMPERATURE_SENSOR_BASE_ADDR 0x01C25000
#define ETHERNET_CONTROLLER_BASE_ADDR 0x01C30000
static struct resource* resources[3] = {[0] = 0,};
void ioMemoryMapped_init(void) {
pr_info("Initialize memory-mapped I/O\n");
// Declare variables
unsigned char* registers[3] = {[0] = 0,};
uint32_t chipid[4] = {[0] = 0,};
uint32_t temperature = 0;
uint32_t mac_address[2] = {[0] = 0,};
// Request memory
resources[0] = request_mem_region(CHIP_ID_BASE_ADDR, 0x1000, "nanopi - chip ID");
if (resources[0] == 0) {
pr_info("Failed to reserve memory region for chip ID\n");
}
resources[1] = request_mem_region(TEMPERATURE_SENSOR_BASE_ADDR, 0x1000, "nanopi - temperature sensor");
if (resources[1] == 0) {
pr_info("Failed to reserve memory region for temperature sensor\n");
}
resources[2] = request_mem_region(ETHERNET_CONTROLLER_BASE_ADDR, 0x1000, "nanopi - Ethernet controller");
if (resources[2] == 0) {
pr_info("Failed to reserve memory region for Ethernet controller\n");
}
// Map memory
registers[0] = ioremap(CHIP_ID_BASE_ADDR, 0x1000);
if (registers[0] == 0) {
pr_err("Failed to map processor registers for chip ID\n");
return;
}
registers[1] = ioremap(TEMPERATURE_SENSOR_BASE_ADDR, 0x1000);
if (registers[1] == 0) {
pr_err("Failed to map processor registers for temperature sensor\n");
return;
}
registers[2] = ioremap(ETHERNET_CONTROLLER_BASE_ADDR, 0x1000);
if (registers[2] == 0) {
pr_err("Failed to map processor registers for Ethernet controller\n");
return;
}
// Read values - Chip ID
chipid[0] = ioread32(registers[0] + 0x200);
chipid[1] = ioread32(registers[0] + 0x204);
chipid[2] = ioread32(registers[0] + 0x208);
chipid[3] = ioread32(registers[0] + 0x20c);
pr_info(
"chipid=%08x'%08x'%08x'%08x\n",
chipid[0], chipid[1], chipid[2], chipid[3]
);
// Read values - Temperature
temperature = -1191 * (int32_t) ioread32(registers[1] + 0x80) / 10 + 223000;
pr_info(
"temperature=%d (register value: %d)\n",
temperature, ioread32(registers[1] + 0x80)
);
// Read values - MAC address
mac_address[0] = ioread32(registers[2] + 0x50);
mac_address[1] = ioread32(registers[2] + 0x54);
pr_info(
"mac-addr=%02x:%02x:%02x:%02x:%02x:%02x\n",
(mac_address[1] >> 0) & 0xff,
(mac_address[1] >> 8) & 0xff,
(mac_address[1] >> 16) & 0xff,
(mac_address[1] >> 24) & 0xff,
(mac_address[0] >> 0) & 0xff,
(mac_address[0] >> 8) & 0xff
);
// Unmap memory
iounmap(registers[0]);
iounmap(registers[1]);
iounmap(registers[2]);
pr_info("Memory-mapped I/O initialized\n");
}
void ioMemoryMapped_exit(void) {
pr_info("Free memory-mapped I/O\n");
// Release memory
if (resources[0] != 0) release_mem_region(CHIP_ID_BASE_ADDR, 0x1000);
if (resources[1] != 0) release_mem_region(TEMPERATURE_SENSOR_BASE_ADDR, 0x1000);
if (resources[2] != 0) release_mem_region(ETHERNET_CONTROLLER_BASE_ADDR, 0x1000);
}
@@ -1,42 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/kthread.h>
#include <linux/delay.h>
static struct task_struct* sample_thread;
#define DELAY_S 5
int thread_skeletonThread (void* data) {
pr_info("Thread started\n");
while (!kthread_should_stop()) {
pr_info("PING!\n");
ssleep(DELAY_S);
}
return 0;
}
void thread_init(void) {
pr_info("Initialize kernel thread\n");
sample_thread = kthread_run(thread_skeletonThread, NULL, "The Machine that goes");
if (IS_ERR(sample_thread)) {
pr_err("Failed to create kernel thread\n");
return;
}
pr_info("Kernel thread initialized\n");
}
void thread_exit(void) {
pr_info("Exiting kernel thread\n");
kthread_stop(sample_thread);
pr_info("Kernel thread exited\n");
}
@@ -1,90 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/kthread.h>
#include <linux/delay.h>
#include <linux/wait.h>
#include <linux/atomic.h>
#define TIMEOUT_S 5
DECLARE_WAIT_QUEUE_HEAD(queue_1);
DECLARE_WAIT_QUEUE_HEAD(queue_2);
static struct task_struct* thread_1;
static struct task_struct* thread_2;
static atomic_t trigger = ATOMIC_INIT(0);
int thread_skeleton_1(void* data) {
// must wait 5 seconds and start thread 2
pr_info("Thread 1 started\n");
while (!kthread_should_stop()) {
pr_info("Thread 1 wakes up\n");
ssleep(TIMEOUT_S);
// Setup trigger for condition of the thread 2
atomic_set(&trigger, 1);
// Wake up thread 2
wake_up_interruptible(&queue_2);
// Wait until thread 2 has reset the trigger
wait_event_interruptible(queue_1, atomic_read(&trigger) == 0 || kthread_should_stop());
}
return 0;
}
int thread_skeleton_2(void* data) {
// have to PING when wakes up
pr_info("Thread 2 started\n");
while (!kthread_should_stop()) {
// wait until trigger is set up
wait_event_interruptible(queue_2, atomic_read(&trigger) == 1 || kthread_should_stop());
pr_info("Thread 2 wakes up\n");
// reset trigger
atomic_set(&trigger, 0);
// wake up thread 1
wake_up_interruptible(&queue_1);
}
return 0;
}
void sleeping_init(void) {
pr_info("Initialize kernel thread\n");
atomic_set(&trigger, 0);
thread_1 = kthread_run(thread_skeleton_1, NULL, "Thread 1 - sleeping");
if (IS_ERR(thread_1)) {
pr_err("Failed to create kernel thread 1\n");
return;
}
thread_2 = kthread_run(thread_skeleton_2, NULL, "Thread 2 - sleeping");
if (IS_ERR(thread_2)) {
pr_err("Failed to create kernel thread 1\n");
return;
}
pr_info("Kernel thread sleeping initialized\n");
}
void sleeping_exit(void) {
pr_info("Exiting kernel sleeping thread\n");
kthread_stop(thread_1);
kthread_stop(thread_2);
pr_info("Kernel thread sleeping exited\n");
}
@@ -1,80 +0,0 @@
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include <linux/interrupt.h>
#include <linux/gpio.h>
#include "linux/printk.h"
struct gpio_nanopi {
int id;
char* name;
};
static struct gpio_nanopi switchK1 = {0, "K1: GPIOA.0"};
static struct gpio_nanopi switchK2 = {2, "K2: GPIOA.2"};
static struct gpio_nanopi switchK3 = {3, "K3: GPIOA.3"};
irqreturn_t isrGPIO(int irq, void* gpio_struct) {
struct gpio_nanopi *gpio = (struct gpio_nanopi *)gpio_struct;
pr_info("GPIO pressed: %s\n", gpio->name);
return IRQ_HANDLED;
}
void interrupt_init(void) {
pr_info("Initializing interrupts\n");
int status = 0;
// Switch k1
if (gpio_request(switchK1.id, switchK1.name) == 0) {
status = request_irq(
gpio_to_irq(switchK1.id),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK1.name,
&switchK1
);
}
// Switch k2
if (gpio_request(switchK2.id, switchK2.name) == 0) {
status = request_irq(
gpio_to_irq(switchK2.id),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK2.name,
&switchK2
);
}
// Switch k3
if (gpio_request(switchK3.id, switchK3.name) == 0) {
status = request_irq(
gpio_to_irq(switchK3.id),
isrGPIO,
IRQF_TRIGGER_FALLING | IRQF_SHARED,
switchK3.name,
&switchK3
);
}
pr_info("Interrupt initialized\n");
}
void interrupt_exit(void) {
pr_info("Exiting interrupts\n");
gpio_free(switchK1.id);
free_irq(gpio_to_irq(switchK1.id), &switchK1);
gpio_free(switchK2.id);
free_irq(gpio_to_irq(switchK2.id), &switchK2);
gpio_free(switchK3.id);
free_irq(gpio_to_irq(switchK3.id), &switchK3);
pr_info ("Interrupt exited\n");
}
-114
View File
@@ -1,114 +0,0 @@
// skeleton.c
#include <linux/module.h> // needed by all modules
#include <linux/init.h> // needed for macros
#include <linux/kernel.h> // needed for debugging
#include "linux/printk.h"
#include "kernel-module/s02e02-parameters.c"
// #define PARAMETERS
#include "kernel-module/s02e04-dynamic_allocation.c"
// #define DYNAMIC_ALLOCATION
#include "kernel-module/s02e05-io_memory_mapped.c"
// #define IO_MEMORY_MAPPED
#include "kernel-module/s02e06-thread.c"
// #define THREAD
#include "kernel-module/s02e07-sleeping.c"
// #define SLEEPING
#include "kernel-module/s02e08-interrupt.c"
#define INTERRUPT
static int __init skeleton_init(void) {
pr_info("Linux module skeleton ex05 loading...\n");
// Lab02 - Exercise 2: Parameters
#ifdef PARAMETERS
pr_info("--------------------\n");
parameters_print();
#endif
// Lab02 - Exercise 4: Dynamic memory allocation and linked list
#ifdef DYNAMIC_ALLOCATION
pr_info("--------------------\n");
Alloc_init();
#endif
// Lab02 - Exercise 5: Memory-mapped I/O
#ifdef IO_MEMORY_MAPPED
pr_info("--------------------\n");
ioMemoryMapped_init();
#endif
// Lab02 - Exercise 6: Kernel thread
#ifdef THREAD
pr_info("--------------------\n");
thread_init();
#endif
// Lab02 - Exercise 7: Sleeping
#ifdef SLEEPING
pr_info("--------------------\n");
sleeping_init();
#endif
// Lab02 - Exercise 8: Interrupt
#ifdef INTERRUPT
pr_info("--------------------\n");
interrupt_init();
#endif
pr_info("--------------------\n");
pr_info("Linux module skeleton loaded\n");
return 0;
}
static void __exit skeleton_exit(void) {
pr_info("Linux module skeleton unloading...\n");
// Lab02 - Exercise 4: Dynamic memory allocation and linked list
#ifdef DYNAMIC_ALLOCATION
pr_info("--------------------\n");
dynAlloc_exit();
#endif
// Lab02 - Exercise 5: Memory-mapped I/O
#ifdef IO_MEMORY_MAPPED
pr_info("--------------------\n");
ioMemoryMapped_exit();
#endif
// Lab02 - Exercise 6: Kernel thread
#ifdef THREAD
pr_info("--------------------\n");
thread_exit();
#endif
// Lab02 - Exercise 7: Sleeping
#ifdef SLEEPING
pr_info("--------------------\n");
sleeping_exit();
#endif
// Lab02 - Exercise 8: Interrupt
#ifdef INTERRUPT
pr_info("--------------------\n");
interrupt_exit();
#endif
pr_info("--------------------\n");
pr_info ("Linux module skeleton unloaded\n");
}
module_init(skeleton_init);
module_exit(skeleton_exit);
MODULE_AUTHOR("Fastium <fastium.pro@proton.me>");
MODULE_AUTHOR("Klagarge <remi@heredero.ch>");
MODULE_DESCRIPTION("Module skeleton");
MODULE_LICENSE("GPL");
-1
View File
@@ -1 +0,0 @@
options mymodule elements=5 text="Some element"

Some files were not shown because too many files have changed in this diff Show More