Merge ~kzapalowicz/snappy-hwe-snaps/+git/network-manager:feature/use-create-image-scripts-repo into ~snappy-hwe-team/snappy-hwe-snaps/+git/pulseaudio:master

Proposed by Konrad Zapałowicz
Status: Superseded
Proposed branch: ~kzapalowicz/snappy-hwe-snaps/+git/network-manager:feature/use-create-image-scripts-repo
Merge into: ~snappy-hwe-team/snappy-hwe-snaps/+git/pulseaudio:master
Diff against target: 4709 lines (+4319/-0) (has conflicts)
38 files modified
ChangeLog (+107/-0)
MAINTAINERS (+7/-0)
README.md (+142/-0)
bin/dhcp-lease-mover (+26/-0)
bin/networkmanager (+83/-0)
conf/NetworkManager.conf (+17/-0)
data/copyright (+77/-0)
docs/index.md (+17/-0)
docs/metadata.yaml (+11/-0)
docs/reference/configuration/wowlan.md (+123/-0)
hooks/configure (+98/-0)
run-tests.sh (+63/-0)
setup/gui/icon.svg (+2466/-0)
snapcraft.yaml (+244/-0)
spread.yaml (+50/-0)
startup-hooks/99-wol-by-default.sh (+13/-0)
tests/full/correct-dns-setup/task.yaml (+47/-0)
tests/full/dhcp-leases-are-moved/task.yaml (+35/-0)
tests/full/immutable-netplan-config/task.yaml (+9/-0)
tests/full/ipv6-address-assignment/task.yaml (+27/-0)
tests/full/ipv6-router-advertisements/task.yaml (+70/-0)
tests/full/no-netplan-default-config/task.yaml (+41/-0)
tests/full/system-network-is-active/task.yaml (+9/-0)
tests/full/wol-enabled-by-default/task.yaml (+59/-0)
tests/lib/prepare-all.sh (+24/-0)
tests/lib/prepare.sh (+26/-0)
tests/lib/restore-each.sh (+27/-0)
tests/lib/utilities.sh (+62/-0)
tests/main/aliases/task.yaml (+13/-0)
tests/main/ethernet-managed-by-networkd/task.yaml (+7/-0)
tests/main/installation/task.yaml (+16/-0)
tests/main/set-hostname/task.yaml (+13/-0)
tests/main/static-ip-configuration/task.yaml (+49/-0)
tests/main/suspend-resume/task.yaml (+80/-0)
tests/main/switch-netplan-renderer/task.yaml (+40/-0)
tests/main/wifi-connect-secured-ap/task.yaml (+38/-0)
tests/main/wifi-powersave-config-option/task.yaml (+28/-0)
tests/main/wifi-wowlan-config-option/task.yaml (+55/-0)
Conflict in MAINTAINERS
Conflict in README.md
Conflict in data/copyright
Conflict in run-tests.sh
Conflict in snapcraft.yaml
Conflict in spread.yaml
Conflict in tests/lib/prepare-all.sh
Conflict in tests/lib/prepare.sh
Conflict in tests/lib/restore-each.sh
Conflict in tests/lib/utilities.sh
Conflict in tests/main/installation/task.yaml
Reviewer Review Type Date Requested Status
System Enablement Bot continuous-integration Needs Fixing
Review via email: mp+315454@code.launchpad.net

This proposal has been superseded by a proposal from 2017-01-24.

Description of the change

tests: use the tests-extras repository

The tests-extras repository contains the tests-runner as well
as image creating scripts. This commit changes the run-tests.sh
script in a way that it fetches the tests-extras and uses it for
test execution.

See: https://code.launchpad.net/~kzapalowicz/snappy-hwe-snaps/+git/tests-extras/+merge/315453

To post a comment you must log in.
Revision history for this message
System Enablement Bot (system-enablement-ci-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
Matteo Croce (teknoraver) :

Unmerged commits

4fcd29e... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

docs: update the README

Make sure it reflects the changes done to the testing infrastructure

537dda1... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

tests: fetch the remote repository and execute tests runner

The run-tests.sh script now delegates the tests execution to the test runner
which is in the tests-extras repository passing arguments there as-is.

0dccd22... by =?utf-8?q?Konrad_Zapa=C5=82owicz?= <email address hidden>

tests: use remote image creation script

Switch to shared, remote image creation script instead having it
embedded in the repository. Also add --snap option to make sure
that all of the image creation script functionalities are
exposed.

64ea63d... by Simon Fels

docs: wowlan: minor fixes

9e61cbb... by Simon Fels

tests: bring wowlan config test back inline with implementation

b3d9e46... by Simon Fels

docs: respect review comments for wowlan documentation

2d81063... by Simon Fels

Drop note about unfinished support for hooks in snapcraft

snapcraft supports hook with version 2.25

397c311... by Simon Fels

Add short paragraph about documentation in our README

4676251... by Simon Fels

hooks: bring wifi.wake-on-wlan config option inline with documentation

1b78869... by Simon Fels

docs: add documentation for wake-on-wlan support

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/ChangeLog b/ChangeLog
0new file mode 1006440new file mode 100644
index 0000000..e1f5f10
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,107 @@
12016-11-28 Simon Fels <simon.fels@canonical.com> - 1.2.2-10
2
3 * Rename hooks to startup-hooks to make clear they are different from snap hooks
4 * Make wake-on-lan hook executable
5 * Respect review comments
6 * Delete unwanted temporary file
7 * Add spread test for WoL enablement
8 * Move WoL enablement into a startup hook
9 * Add conf file to enable WoL by default for all ethernet connections
10 * Use absolute path for wifi-ap executables
11 * Wait for NetworkManager to be fully up and running
12 * Make DHCP lease mover test a bit more robust
13 * Let the assertion do the slot/plug connections
14 * tests: use prebuilt snap if available
15 * Bump network-manager version
16 * Respect review comments
17 * Add hostname test case
18 * Respect review comments
19 * Use absolute path for all snap binaries as spread removes /snap/bin from PATH
20 * Explain the difference between our different test suites
21 * Add IPv6 router advertisement test case
22 * Ensure NetworkManager has started when we start testing the DNS setup
23 * Add test case to verify static IP configuration
24 * Add test case to verify immutable netplan configuration files
25 * Add DNS setup verification test
26 * Add first test case to verify basic IPv6 address assignment
27 * Extend README to explain how to run an entire suite via spread
28 * Create static netplan configuration file as part of our image
29 * Fix testing for a channel
30 * Extend README and correct formatting
31 * Fix failing test cases
32 * Stop prepare/restore steps after first reboot
33 * Drop useless comments
34 * Use correct path for snap we install
35 * Bring back netplan renderer switch test
36 * Rework test setup so we have two different suites
37 * Move dhcp lease files back into SNAP_DATA but keep a copy of them in /run
38
392016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-9
40
41 * One more review change
42 * Changes according to review comments
43 * Correctly check if a file is empty or not
44 * Use correct indentation via spaces
45 * Work when /usr/lib/snapd/generate-network-conf exists or not
46 * Remove guard to prevent automatic ethernet configuration for no-netplan scenario
47 * Explain how to test a snap from a specific channel of the store
48 * Extend run-tests command documentation
49 * Move wait-for-nm code into a common utility function
50 * Add missing utilities.sh file
51 * Extend no-netplan-default-config test and name file correctly
52 * Build snap on suite preparation
53 * Switch per test to network-manager as default netplan renderer
54 * Check continously for network-manager service until it comes up
55 * Correctly test for no default netplan configuration
56 * Extend test infrastructure to run local snap
57 * Test system without default netplan config
58 * Manage ethernet connections automatically when netplan does not
59 * (morphis/spread-tests, spread-tests) Fix spread qemu path
60 * Split out actual snap name as variable
61 * Add small timeout before checking NetworkManager status
62 * Drop executable bits from sourced shell scripts
63 * Detect which spread version we're running
64 * Add test case to verify netplan renderer switch works
65 * Preserve netplan configuration as well accross test runs
66 * Add chapter to README explaining how to use the tests
67 * Address more review comments
68 * Respect review comments
69 * Add tests to verifiy WiFi connection to WPA2 secured AP
70 * Don't remove network-manager snap from the image on restore
71 * Add initial spread testing infrastructure
72
732016-10-27 Simon Fels <simon.fels@canonical.com> - 1.2.2-8
74
75 * Allow people to get ethernet managed back by NetworkManager
76
772016-10-20 Simon Fels <simon.fels@canonical.com> - 1.2.2-7
78
79 * Create state directory on startup if not present
80 * [SNAPPY] Print out correct path for the secret key
81
822016-10-04 Simon Fels <simon.fels@canonical.com> - 1.2.2-6
83
84 * Refine comment about not auto configuring ethernet ports
85 * Set grade property to stable
86 * Prevent ethernet ports from being auto configured when netplan is used
87 * Use new network-setup-observe interface
88 * Fix netplan nm renderer detection
89 * Ignore ethernet devices conditionally
90 * Do not copy default configuration in place but use one conditionally
91 * Don't ignore ethernet devices
92 * Look into directory netplan puts configuration files in too
93 * bin/networkmanager: create DHCP lease directory at startup
94 * Strip MAINTAINERS .snap suffix
95 * Add MAINTAINERS.snap
96 * Drop superflous character
97 * Cleanup after review comments
98 * conf: add rc-manager=resolvconf
99 * Add libnm* back
100 * Also drop libsoup from stage/build packages
101 * Explain why we don't want libsoup included
102 * Drop support for libsoupd which brings in libicudata
103 * We can't strip libicudata out
104 * Drop unneeded alias for modem-manager/ppp plugs
105 * Disable certain features we don't need and remove unwanted things from the snap
106 * Update config parameters
107 * Change --log-level to INFO (LP: #1602439)
diff --git a/MAINTAINERS b/MAINTAINERS
index a752dca..e50ea74 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1,2 +1,9 @@
1<<<<<<< MAINTAINERS
1Jim Hodapp <jim.hodapp@canonical.com>2Jim Hodapp <jim.hodapp@canonical.com>
2Simon Fels <simon.fels@canonical.com>3Simon Fels <simon.fels@canonical.com>
4=======
5Simon Fels <simon.fels@canonical.com>
6Tony Espy <espy@canonical.com>
7Alfonso Sanchez-Beato <alfonso.sanchez-beato@canonical.com>
8
9>>>>>>> MAINTAINERS
diff --git a/README.md b/README.md
index 73c1615..d52d3e9 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,145 @@
1<<<<<<< README.md
1# PulseAudio2# PulseAudio
23
3This is the snap to package the PulseAudio management service.4This is the snap to package the PulseAudio management service.
5=======
6# NetworkManager
7
8This is the snap to package the NetworkManager management service.
9
10## Hook support
11
12All implemented hooks are stored inside the hooks directory.
13
14## Running tests
15
16We have a set of spread (https://github.com/snapcore/spread) tests which
17can be executed on a virtual machine or real hardware.
18
19In order to run those tests you need the follow things
20
21 * ubuntu-image
22 * spread
23
24 You can install both as a snap
25
26```
27 $ snap install --edge --devmode ubuntu-image
28 $ snap install --devmode spread
29```
30
31NOTE: As of today (27/10/2016) the version of spread in the store misses
32some important bug fixes so you have to build your own one for now:
33
34```
35 $ WORKDIR=`mktemp -d`
36 $ export GOPATH=$WORKDIR
37 $ go get -d -v github.com/snapcore/spread/...
38 $ go build github.com/snapcore/spread/cmd/spread
39 $ sudo cp spread /usr/local/bin
40```
41
42Make sure /usr/local/bin is in your path and is used as default:
43
44```
45 $ which spread
46 /usr/local/bin/spread
47```
48
49Now you have everything to run the test suite.
50
51```
52 $ ./run-tests
53```
54
55The script will reach out to tests-extras repository and download the helper
56scripts: image creator and test runner. Next it will execute the test runner
57passing the arguments as-is.
58
59The helper scripts are tracked here:
60https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/tests-extras
61
62The test runner script will create an image via ubuntu-image and make it available
63to spread by copying it to ~/.spread/qemu or ~/snap/spread/<version>/.spread/qemu
64depending on if you're using a local spread version or the one from the
65snap.
66
67If you want to see more verbose debugging output of spread run
68
69```
70 $ ./run-tests --debug
71```
72
73If you do not want to build the network-manager snap from source but test one
74from a specific channel start testing with
75
76```
77 $ ./run-tests --channel=beta --test-from-channel
78```
79
80You can also run spread directly which allows you run just specific tests
81
82```
83 $ spread tests/main/installation
84```
85
86This will by default build the network-manager snap from source. If you
87want it to test it from a specific channel run
88
89```
90 $ SNAP_CHANNEL=candidate spread tests/main/installation
91```
92
93And if you want to run an entire suite
94
95```
96 $ spread tests/main/
97```
98
99## Available test suites
100
101Currently we have two test suites
102
103 * main
104 * full
105
106The 'main' suite covers testing of network-manager when its installed on
107any Ubuntu Core device from the store without configuring the system
108further to allow NetworkManager to control also all ethernet connections.
109
110The 'full' suite configures netplan in the prepare part to use NetworkManager
111as default backend so that it becomes the only network connection
112management service in the system.
113
114Depending on the nature of a test case the right test suite should be
115picked.
116
117## Documentation
118
119All documentation is available in the docs/ subdirectory. It uses markdown
120and the documentation-builder (<https://github.com/CanonicalLtd/documentation-builder>)
121to generate HTML-based documentation.
122
123To generate the HTML pages install the documentation-builder snap first
124
125```
126 $ snap install documentation-builder
127 $ snap connect documentation-builder:home core
128```
129
130then enter the docs/ subdirectory and run the builder
131
132```
133 $ cd docs
134 $ documentation-builder
135```
136
137It will generate all documentation as HTML in the build/ subdirectory. Open
138it via
139
140```
141 $ google-chrome build/index.html
142```
143
144for example.
145>>>>>>> README.md
diff --git a/bin/dhcp-lease-mover b/bin/dhcp-lease-mover
4new file mode 100755146new file mode 100755
index 0000000..c54aeb0
--- /dev/null
+++ b/bin/dhcp-lease-mover
@@ -0,0 +1,26 @@
1#!/bin/sh
2set -x
3
4lease_path=$SNAP_DATA/state/dhcp
5public_lease_path=/run/NetworkManager/dhcp/
6
7if [ ! -e $public_lease_path ] ; then
8 mkdir -p $public_lease_path
9fi
10
11if [ ! -e $lease_path ] ; then
12 mkdir -p $lease_path
13fi
14
15# Copy all leases when we start to make sure we're in sync
16rm -f $public_lease_path/*
17cp $lease_path/* $public_lease_path
18
19# Now we wait until a lease changes, gets added or removed and when
20# that happened we simply just move all leases files into the public
21# location.
22while $SNAP/usr/bin/inotifywait -e create,modify,delete,move $lease_path ; do
23 sleep 1
24 rm -f $public_lease_path/*
25 cp $lease_path/* $public_lease_path
26done
diff --git a/bin/networkmanager b/bin/networkmanager
0new file mode 10075527new file mode 100755
index 0000000..eab3b7e
--- /dev/null
+++ b/bin/networkmanager
@@ -0,0 +1,83 @@
1#!/bin/sh
2set -ex
3
4# Create all necessary directories we need at runtime
5mkdir -p $SNAP_DATA/conf/system-connections
6mkdir -p $SNAP_DATA/run
7
8# Create DHCP lease directory
9mkdir -p /run/NetworkManager/dhcp
10
11# Select which config we're going to use. We offer our users
12# to provide their own configuration file in $SNAP_DATA but
13# will fallback if no one exists to the default one we ship
14# in $SNAP
15NM_CONF="$SNAP/etc/NetworkManager/NetworkManager.conf"
16if [ -e $SNAP_DATA/NetworkManager.conf ]; then
17 NM_CONF="$SNAP_DATA/NetworkManager.conf"
18fi
19
20# A directory where users can place any additional configuration
21# files for NetworkManager
22mkdir -p $SNAP_DATA/conf.d
23
24# State dir where network-manager stores several things like the
25# secret key used for IPv6
26mkdir -p $SNAP_DATA/state
27mkdir -p $SNAP_DATA/state/dhcp
28
29# If netplan is not configured to render by default to NetworkManager
30# configuration files we disable management of any ethernet device
31# as this will clash with any configuration netplan puts in place
32# for networkd.
33if [ ! -e "/etc/netplan/00-default-nm-renderer.yaml" ] ; then
34 if [ ! -e "$SNAP_DATA/conf.d/disable-ethernet.conf" ] ; then
35 echo "[keyfile]" > $SNAP_DATA/conf.d/disable-ethernet.conf
36 echo "unmanaged-devices+=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/disable-ethernet.conf
37 fi
38else
39 # Enable ethernet management again if the user switched the netplan
40 # backend and wants us to manage ethernet
41 if [ -e $SNAP_DATA/conf.d/disable-ethernet.conf ] ; then
42 rm -f $SNAP_DATA/conf.d/disable-ethernet.conf
43 fi
44
45 # If the snapd configuration for netplan is not present or empty
46 # we will start managing all ethernet ports automatically. Because
47 # of that we need to remove any previously created configuration files
48 # which prevented us from doing that.
49 if [ ! -e /etc/netplan/00-snapd-config.yaml ] || [ -s /etc/netplan/00-snapd-config.yaml ] ; then
50 rm -f $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
51 else
52 if [ ! -e "$SNAP_DATA/conf.d/no-auto-default-ethernet.conf" ] ; then
53 # If we're running as the only network management service
54 # and are configured via netplan on first boot then we should
55 # not try to auto configure ethernet ports as this is up to
56 # netplan and will be the same for networkd.
57 echo "[main]" > $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
58 echo "no-auto-default=interface-name:eth*,interface-name:enx*" >> $SNAP_DATA/conf.d/no-auto-default-ethernet.conf
59 fi
60 fi
61fi
62
63# HACK: Until we've fixed probert to look in $SNAP_DATA/state/dhcp or
64# somewhere else for our lease files we use inotifywatch to monitor
65# our lease files and copy all over when something has changed. This
66# background process gets stopped when our systemd service unit gets
67# stopped.
68$SNAP/bin/dhcp-lease-mover &
69
70# Run available startup hooks to have a point to store custom
71# logic outside of this script. More of the things from above
72# should be moved into these.
73for hook in $SNAP/startup-hooks/* ; do
74 [ -x "$hook" ] && /bin/sh -x "$hook"
75done
76
77export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$SNAP/usr/lib/NetworkManager"
78
79$SNAP/usr/sbin/NetworkManager \
80 --config-dir=$SNAP_DATA/conf.d/ \
81 --config=$NM_CONF \
82 --log-level=INFO \
83 --no-daemon
diff --git a/conf/NetworkManager.conf b/conf/NetworkManager.conf
0new file mode 10064484new file mode 100644
index 0000000..1950212
--- /dev/null
+++ b/conf/NetworkManager.conf
@@ -0,0 +1,17 @@
1[main]
2plugins=ifupdown,keyfile
3# Not using dnsmasq yet. Need to get it properly integrated
4# into the snap or reuse the one shiped with the OS snap.
5# rc-manager=resolvconf directs NM to use the resolvconf
6# binary to update resolv.conf, which is necessary as there's
7# more than one network management stack on core devices.
8dns=default
9rc-manager=resolvconf
10
11# Use internal DHCP stack which is based on the systemd
12# implementation and is enough for our purpose until we
13# need something more complex.
14dhcp=internal
15
16[ifupdown]
17managed=false
diff --git a/data/copyright b/data/copyright
index 970053b..28e111b 100644
--- a/data/copyright
+++ b/data/copyright
@@ -1,3 +1,4 @@
1<<<<<<< data/copyright
1This package was debianized by CJ van den Berg <cj@vdbonline.com> on2This package was debianized by CJ van den Berg <cj@vdbonline.com> on
2Thu, 10 Aug 2006 15:59:43 +0200.3Thu, 10 Aug 2006 15:59:43 +0200.
34
@@ -602,3 +603,79 @@ Copyright:
602License: LGPL-2.1+603License: LGPL-2.1+
603 On Debian systems, the complete text of the LGPL-2.1 can be found in604 On Debian systems, the complete text of the LGPL-2.1 can be found in
604 /usr/share/common-licenses/LGPL-2.1.605 /usr/share/common-licenses/LGPL-2.1.
606=======
607Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
608Upstream-Name: NetworkManager
609Source: http://ftp.gnome.org/pub/GNOME/sources/NetworkManager/
610
611Files: *
612Copyright: 2004 - 2014 Red Hat, Inc.
613 2005 - 2009 Novell, Inc.
614License: GPL-2+
615
616Files: libnm-util/*
617 libnm-glib/*
618 libnm-core/*
619 libnm/*
620Copyright: 2005 - 2014 Red Hat, Inc.
621 2005 - 2009 Novell, Inc.
622License: LGPL-2+
623
624Files: src/systemd/*
625Copyright: 2013 - 2015 Tom Gundersen
626 2014 Susant Sahani
627 2014 - 2015 Intel Corporation. All rights reserved.
628License: LGPL-2.1+
629
630License: GPL-2+
631 This package is free software; you can redistribute it and/or modify
632 it under the terms of the GNU General Public License as published by
633 the Free Software Foundation; either version 2 of the License, or
634 (at your option) any later version.
635 .
636 This package is distributed in the hope that it will be useful,
637 but WITHOUT ANY WARRANTY; without even the implied warranty of
638 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
639 GNU General Public License for more details.
640 .
641 You should have received a copy of the GNU General Public License
642 along with this program. If not, see <http://www.gnu.org/licenses/>
643 .
644 On Debian systems, the complete text of the GNU General Public
645 License version 2 can be found in "/usr/share/common-licenses/GPL-2".
646
647License: LGPL-2+
648 This package is free software; you can redistribute it and/or
649 modify it under the terms of the GNU Lesser General Public
650 License as published by the Free Software Foundation; either
651 version 2 of the License, or (at your option) any later version.
652 .
653 This package is distributed in the hope that it will be useful,
654 but WITHOUT ANY WARRANTY; without even the implied warranty of
655 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
656 Lesser General Public License for more details.
657 .
658 You should have received a copy of the GNU General Public License
659 along with this program. If not, see <http://www.gnu.org/licenses/>.
660 .
661 On Debian systems, the complete text of the GNU Lesser General
662 Public License can be found in "/usr/share/common-licenses/LGPL-2".
663
664License: LGPL-2.1+
665 This package is free software; you can redistribute it and/or
666 modify it under the terms of the GNU Lesser General Public
667 License as published by the Free Software Foundation; either
668 version 2.1 of the License, or (at your option) any later version.
669 .
670 This package is distributed in the hope that it will be useful,
671 but WITHOUT ANY WARRANTY; without even the implied warranty of
672 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
673 Lesser General Public License for more details.
674 .
675 You should have received a copy of the GNU General Public License
676 along with this program. If not, see <http://www.gnu.org/licenses/>.
677 .
678 On Debian systems, the complete text of the GNU Lesser General
679 Public License can be found in "/usr/share/common-licenses/LGPL-2.1".
680
681>>>>>>> data/copyright
diff --git a/docs/index.md b/docs/index.md
605new file mode 100644682new file mode 100644
index 0000000..4d539c6
--- /dev/null
+++ b/docs/index.md
@@ -0,0 +1,17 @@
1---
2title: "NetworkManager"
3table_of_contents: True
4---
5
6# About NetworkManager
7
8NetworkManager is a system network service that manages your network
9devices and connections, attempts to keep network connectivity active
10when available. It manages ethernet, WiFi, mobile broadband (WWAN) and
11PPPoE devices while also providing VPN integration with a variety of
12different VPN serivces.
13
14## Upstream documentation
15
16Existing documentation from the upstream project can be found
17[here](https://wiki.gnome.org/Projects/NetworkManager).
diff --git a/docs/metadata.yaml b/docs/metadata.yaml
0new file mode 10064418new file mode 100644
index 0000000..d04aaac
--- /dev/null
+++ b/docs/metadata.yaml
@@ -0,0 +1,11 @@
1navigation:
2 - title: Introduction
3 children:
4 - title: About NetworkManager
5 location: index.md
6 - title: Reference
7 children:
8 - title: Configuration
9 children:
10 - title: Wake on WLAN
11 location: reference/configuration/wowlan.md
diff --git a/docs/reference/configuration/wowlan.md b/docs/reference/configuration/wowlan.md
0new file mode 10064412new file mode 100644
index 0000000..29be8fc
--- /dev/null
+++ b/docs/reference/configuration/wowlan.md
@@ -0,0 +1,123 @@
1---
2title: Wake on WLAN
3table_of_contents: true
4---
5
6# Wake on WLAN
7
8Wake on WLAN (called WoWLAN in the following) is a feature which allows a device
9to be woken up from standby power states to faciliate device management. It is based
10on the well established standard for Wake on LAN. The functionality is not entirely
11equivalent to Wake on LAN and there are some limitations.
12
13The NetworkManager snap allows its users to configure one or more triggers to allow
14the device it operates on to be woken up remotely.
15
16An important precondition for WoWLAN to work is that your kernel WiFi driver has
17support for it.
18
19You can read more about the kernel side implementation on the following sites:
20
21 * <https://wireless.wiki.kernel.org/en/users/documentation/wowlan>
22
23## Enable Wake on WLAN Globally
24
25To allow users to enable or disable WoWLAN, the snap provides two configuration
26options:
27
28 * **wifi.wake-on-wlan**
29 * **wifi.wake-on-wlan-password**
30
31Both options can be set via the configuration API snap provide. See
32<https://docs.ubuntu.com/core/en/guides/build-device/config-hooks> for more
33details.
34
35Both configuration options will affect all wireless network devices. If you
36want to change it just for a single wireless connection please have a look at
37the chapter [Per Connection Configuration](#per-connection-configuration) below.
38
39
40### wifi.wake-on-wlan
41
42This configuration option accepts the following values
43
44 * **disabled (default):** Wake on WLAN is disabled for all wireless network devices.
45 * **any:** Wake on WLAN is enabled and any possible trigger will cause the system to wake up.
46 * **disconnect:** If a connection to a station gets disconnected the device will be woken up.
47 * **magic:** Wake on WLAN is enabled and only a received magic packet will cause the
48 system to wake up. The magic packet has the same structure as the one
49 used for Wake on LAN. For more details see <https://en.wikipedia.org/wiki/Wake-on-LAN#Magic_packet>
50 The content of the magic packet can be extended with the
51 wifi.wake-on-wlan-password option to require the client to send a
52 specific byte sequence functioning as a password so that not anyone
53 unpriviledged can wake up the system.
54 * **gtk-rekey-failure:** A failure of a GTK rekey operation will cause the device to wake up.
55 * **4way-handshake:** Reiteration of the 4way handshake will cause the device to wake up.
56 * **rfkill-release:** Release of a rfkill will cause the device to wake up.
57 * **tcp:** Any incoming TCP packet will cause the device to wake up.
58
59Example:
60
61```
62 $ snap set network-manager wifi.wake-on-wlan=magic
63```
64
65### wifi.wake-on-wlan-password
66
67This configuration option accepts a textual value. If specified, the value will
68be used in addition to the wireless device MAC address to function as a password
69that disallows unpriviledged actors to wake up the device.
70
71Example:
72
73```
74 $ snap set network-manager wifi.wake-on-wlan-password=MyPassword
75```
76
77## Per Connection Configuration
78
79To configure WoWLAN per connection you have to use the *nmcli* utility which comes
80with the NetworkManager snap. It allows you to configure the same two options
81as the snap accepts. However, the *wifi.wake-on-wlan* option takes a numeric value
82instead of a textual one.
83
84The *wifi.wake-on-wlan* option accepts the following values (see above for a detailed
85description of each value)
86
87 * **0:** disabled
88 * **1:** Use global default configuration
89 * **2:** any
90 * **4:** disconnect
91 * **8:** magic
92 * **16:** gtk-rekey-failure
93 * **32:** 4way-handshake
94 * **128:** rfkill-release
95 * **256:** tcp
96
97The *wifi.wake-on-wlan-password* option accepts the same values as the snap
98configuration option.
99
100Example:
101
102```
103 $ nmcli c modify my-connection wifi.wake-on-wlan 2
104 $ nmcli c modify my-connection wifi.wake-on-wlan-password Test1234
105```
106
107## Verify WoWLAN Configuration
108
109NetworkManager will use the kernel to configure WoWLAN on the hardware level.
110The *iw* utility provides a simple way to verify the right option is configured.
111
112If you don't have the *iw* utility on your system you can install it with the
113*wireless-tools* snap.
114
115```
116 $ snap install --devmode wireless-tools
117 $ sudo wireless-tools.iw phy phy0 wowlan show
118 WoWLAN is enabled:
119 * wake up on magic packet
120```
121
122See the help output of the *iw* command for more documentation and available
123options.
diff --git a/hooks/configure b/hooks/configure
0new file mode 100755124new file mode 100755
index 0000000..711ff60
--- /dev/null
+++ b/hooks/configure
@@ -0,0 +1,98 @@
1#!/bin/bash
2
3switch_wifi_powersave() {
4 path=$SNAP_DATA/conf.d/wifi-powersave.conf
5 # See https://developer.gnome.org/libnm/stable/NMSettingWireless.html#NMSettingWirelessPowersave
6 # for the meaning of the different values for the wifi.powersave option.
7 case $1 in
8 enabled)
9 cat <<EOF > $path
10[connection]
11wifi.powersave = 3
12EOF
13 ;;
14 disabled)
15 cat <<EOF > $path
16[connection]
17wifi.powersave = 2
18EOF
19 ;;
20 *)
21 echo "WARNING: invalid value '$1' supplied for wifi.powersave configuration option"
22 exit 1
23 ;;
24 esac
25}
26
27switch_wifi_wake_on_wlan() {
28 value=0
29 # See `man nm-settings` for details about those values. They
30 # correspond to the enum NMSettingWirelessWakeOnWLan defined
31 # in libnm-core. NetworkManager only allows us to set integer
32 # values here.
33 case "$1" in
34 disabled)
35 value=0
36 ;;
37 any)
38 value=2
39 ;;
40 disconnect)
41 value=4
42 ;;
43 magic)
44 value=8
45 ;;
46 gtk-rekey-failure)
47 value=16
48 ;;
49 eap-identity-request)
50 value=32
51 ;;
52 4way-handshake)
53 value=64
54 ;;
55 rfkill-release)
56 value=128
57 ;;
58 tcp)
59 value=256
60 ;;
61 *)
62 echo "ERROR: Invalid value provided for wifi.wake-on-wlan"
63 exit 1
64 ;;
65 esac
66 password=$2
67 path=$SNAP_DATA/conf.d/wifi-wowlan.conf
68
69 echo "[connection]" > $path
70 # If we don't get a value provided there is no one set in the snap
71 # configuration and we can simply leave it out here and let
72 # NetworkManager take its default one.
73 if [ -n "$value" ]; then
74 echo "wifi.wake-on-wlan=$value" >> $path
75 fi
76 if [ -n "$password" ]; then
77 echo "wifi.wake-on-wlan-password=$password" >> $path
78 fi
79}
80
81value="`snapctl get wifi.powersave`"
82if [ -n "$value" ]; then
83 switch_wifi_powersave $value
84else
85 default="disabled"
86 snapctl set wifi.powersave=$default
87 switch_wifi_powersave $default
88fi
89
90value=`snapctl get wifi.wake-on-wlan`
91password=`snapctl get wifi.wake-on-wlan-password`
92if [ -n "$value" ] || [ -n "$password" ]; then
93 switch_wifi_wake_on_wlan $value "$password"
94else
95 snapctl set wifi.wake-on-wlan=disabled
96 snapctl set wifi.wake-on-wlan-password=
97 switch_wifi_wake_on_wlan disabled ""
98fi
diff --git a/run-tests.sh b/run-tests.sh
index b4ce91b..ff36c9b 100755
--- a/run-tests.sh
+++ b/run-tests.sh
@@ -1,4 +1,8 @@
1<<<<<<< run-tests.sh
1#!/bin/sh2#!/bin/sh
3=======
4#!/bin/bash
5>>>>>>> run-tests.sh
2#6#
3# Copyright (C) 2016 Canonical Ltd7# Copyright (C) 2016 Canonical Ltd
4#8#
@@ -14,6 +18,7 @@
14# You should have received a copy of the GNU General Public License18# You should have received a copy of the GNU General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.19# along with this program. If not, see <http://www.gnu.org/licenses/>.
1620
21<<<<<<< run-tests.sh
17set -ex22set -ex
1823
19image_name=ubuntu-core-16.img24image_name=ubuntu-core-16.img
@@ -21,10 +26,18 @@ channel=stable
21spread_opts=26spread_opts=
22force_new_image=027force_new_image=0
23test_from_channel=028test_from_channel=0
29=======
30set -e
31
32# ==============================================================================
33# This has to be in sync with the tests-extras/run-tests.sh script
34# functionalities.
35>>>>>>> run-tests.sh
2436
25show_help() {37show_help() {
26 echo "Usage: run-tests.sh [OPTIONS]"38 echo "Usage: run-tests.sh [OPTIONS]"
27 echo39 echo
40<<<<<<< run-tests.sh
28 echo "optional arguments:"41 echo "optional arguments:"
29 echo " --help Show this help message and exit"42 echo " --help Show this help message and exit"
30 echo " --channel=<channel> Select another channel to build the base image from (default: $channel)"43 echo " --channel=<channel> Select another channel to build the base image from (default: $channel)"
@@ -82,3 +95,53 @@ if [ $test_from_channel -eq 1 ] ; then
82 export SNAP_CHANNEL=$channel95 export SNAP_CHANNEL=$channel
83fi96fi
84spread $spread_opts97spread $spread_opts
98=======
99 echo "This is fetch & forget script and what it does is to fetch the"
100 echo "tests-extras repository and execute the run-tests.sh script from"
101 echo "there passing arguments as-is."
102 echo
103 echo "optional arguments:"
104 echo " --help Show this help message and exit"
105 echo " --channel Select another channel to build the base image from (default: stable)"
106 echo " --snap Extra snap to install"
107 echo " --debug Enable verbose debugging output"
108 echo " --test-from-channel Pull network-manager snap from the specified channel instead of building it from source"
109 echo " --force-new-image Force generating a new image used for testing"
110}
111
112# ==============================================================================
113# This is fetch & forget script and what it does is to fetch the tests-extras
114# repo and execute the run-tests.sh script from there passing arguments as-is.
115
116# 0. Display help w/o fetching anything
117
118if [ "$1" == "--help" ]; then
119 show_help
120 exit 0
121fi
122
123# 1. Fetch
124
125TESTS_EXTRAS_URL="https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/tests-extras"
126TESTS_EXTRAS_PATH="tests-extras"
127
128# delete the fetched content on ctrl-c
129trap 'cd .. && if [ -d "$TESTS_EXTRAS_PATH" ]; then rm -rf $TESTS_EXTRAS_PATH; fi' INT TERM EXIT
130
131if [ -d "$TESTS_EXTRAS_PATH" ]; then
132 rm -rf $TESTS_EXTRAS_PATH
133fi
134
135echo "INFO: Fetching tests-extras scripts into $TESTS_EXTRAS_PATH ..."
136(git clone -b master $TESTS_EXTRAS_URL $TESTS_EXTRAS_PATH >/dev/null 2>&1)
137if [ $? -ne 0 ]; then
138 echo "ERROR: Failed to fetch the $TESTS_EXTRAS_URL repo, exiting.."
139 exit 1
140fi
141
142# 2. Execute
143cd $TESTS_EXTRAS_PATH && ./tests-runner.sh $@
144
145# 3. Done; clean-up
146cd .. && if [ -d "$TESTS_EXTRAS_PATH" ]; then rm -rf $TESTS_EXTRAS_PATH; fi
147>>>>>>> run-tests.sh
diff --git a/setup/gui/icon.svg b/setup/gui/icon.svg
85new file mode 100644148new file mode 100644
index 0000000..019ffb2
--- /dev/null
+++ b/setup/gui/icon.svg
@@ -0,0 +1,2466 @@
1<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2<!-- Created with Inkscape (http://www.inkscape.org/) -->
3<svg
4 xmlns:dc="http://purl.org/dc/elements/1.1/"
5 xmlns:cc="http://web.resource.org/cc/"
6 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
7 xmlns:svg="http://www.w3.org/2000/svg"
8 xmlns="http://www.w3.org/2000/svg"
9 xmlns:xlink="http://www.w3.org/1999/xlink"
10 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
11 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
12 width="48.000000px"
13 height="48.000000px"
14 id="svg2327"
15 sodipodi:version="0.32"
16 inkscape:version="0.45"
17 sodipodi:docbase="/home/dobey/Projects/gnome-icon-theme/scalable/status"
18 sodipodi:docname="network-idle.svg"
19 inkscape:output_extension="org.inkscape.output.svg.inkscape">
20 <defs
21 id="defs3">
22 <linearGradient
23 id="linearGradient7670">
24 <stop
25 style="stop-color:#3465a4;stop-opacity:1"
26 offset="0"
27 id="stop7672" />
28 <stop
29 style="stop-color:#204a87;stop-opacity:1"
30 offset="1"
31 id="stop7674" />
32 </linearGradient>
33 <linearGradient
34 inkscape:collect="always"
35 id="linearGradient2307">
36 <stop
37 style="stop-color:#5a7aa4;stop-opacity:1;"
38 offset="0"
39 id="stop2309" />
40 <stop
41 style="stop-color:#5a7aa4;stop-opacity:0;"
42 offset="1"
43 id="stop2311" />
44 </linearGradient>
45 <linearGradient
46 id="linearGradient11400">
47 <stop
48 id="stop11402"
49 offset="0"
50 style="stop-color:#000000;stop-opacity:1;" />
51 <stop
52 id="stop11404"
53 offset="1"
54 style="stop-color:#000000;stop-opacity:0;" />
55 </linearGradient>
56 <linearGradient
57 id="linearGradient6240"
58 inkscape:collect="always">
59 <stop
60 id="stop6242"
61 offset="0"
62 style="stop-color:#ffffff;stop-opacity:1;" />
63 <stop
64 id="stop6244"
65 offset="1"
66 style="stop-color:#ffffff;stop-opacity:0;" />
67 </linearGradient>
68 <linearGradient
69 id="linearGradient5137">
70 <stop
71 id="stop5139"
72 offset="0"
73 style="stop-color:#eeeeec;stop-opacity:1;" />
74 <stop
75 id="stop5141"
76 offset="1"
77 style="stop-color:#e6e6e3;stop-opacity:1;" />
78 </linearGradient>
79 <linearGradient
80 id="linearGradient5225"
81 inkscape:collect="always">
82 <stop
83 id="stop5227"
84 offset="0"
85 style="stop-color:black;stop-opacity:1;" />
86 <stop
87 id="stop5229"
88 offset="1"
89 style="stop-color:black;stop-opacity:0;" />
90 </linearGradient>
91 <linearGradient
92 id="linearGradient3899"
93 inkscape:collect="always">
94 <stop
95 id="stop3901"
96 offset="0"
97 style="stop-color:#eeeeec" />
98 <stop
99 id="stop3903"
100 offset="1"
101 style="stop-color:#d3d7cf" />
102 </linearGradient>
103 <linearGradient
104 id="linearGradient3907">
105 <stop
106 id="stop3909"
107 offset="0"
108 style="stop-color:#ffffff;stop-opacity:1;" />
109 <stop
110 id="stop3911"
111 offset="1"
112 style="stop-color:#ffffff;stop-opacity:0;" />
113 </linearGradient>
114 <linearGradient
115 id="linearGradient4196">
116 <stop
117 id="stop4198"
118 offset="0"
119 style="stop-color:black;stop-opacity:1;" />
120 <stop
121 id="stop4200"
122 offset="1"
123 style="stop-color:black;stop-opacity:0;" />
124 </linearGradient>
125 <linearGradient
126 inkscape:collect="always"
127 id="linearGradient5060">
128 <stop
129 style="stop-color:black;stop-opacity:1;"
130 offset="0"
131 id="stop5062" />
132 <stop
133 style="stop-color:black;stop-opacity:0;"
134 offset="1"
135 id="stop5064" />
136 </linearGradient>
137 <radialGradient
138 r="19.5"
139 fy="47.045319"
140 fx="20.913568"
141 cy="47.045319"
142 cx="20.913568"
143 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
144 gradientUnits="userSpaceOnUse"
145 id="radialGradient3304"
146 xlink:href="#linearGradient3907"
147 inkscape:collect="always" />
148 <radialGradient
149 r="19.5"
150 fy="47.045319"
151 fx="20.913568"
152 cy="47.045319"
153 cx="20.913568"
154 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
155 gradientUnits="userSpaceOnUse"
156 id="radialGradient3302"
157 xlink:href="#linearGradient3907"
158 inkscape:collect="always" />
159 <radialGradient
160 r="19.5"
161 fy="47.045319"
162 fx="20.913568"
163 cy="47.045319"
164 cx="20.913568"
165 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
166 gradientUnits="userSpaceOnUse"
167 id="radialGradient3300"
168 xlink:href="#linearGradient3907"
169 inkscape:collect="always" />
170 <radialGradient
171 r="19.5"
172 fy="47.045319"
173 fx="20.913568"
174 cy="47.045319"
175 cx="20.913568"
176 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
177 gradientUnits="userSpaceOnUse"
178 id="radialGradient3298"
179 xlink:href="#linearGradient3907"
180 inkscape:collect="always" />
181 <radialGradient
182 r="19.5"
183 fy="47.045319"
184 fx="20.913568"
185 cy="47.045319"
186 cx="20.913568"
187 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
188 gradientUnits="userSpaceOnUse"
189 id="radialGradient3296"
190 xlink:href="#linearGradient3907"
191 inkscape:collect="always" />
192 <radialGradient
193 r="19.5"
194 fy="47.045319"
195 fx="20.913568"
196 cy="47.045319"
197 cx="20.913568"
198 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
199 gradientUnits="userSpaceOnUse"
200 id="radialGradient3294"
201 xlink:href="#linearGradient3907"
202 inkscape:collect="always" />
203 <radialGradient
204 r="19.5"
205 fy="47.045319"
206 fx="20.913568"
207 cy="47.045319"
208 cx="20.913568"
209 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
210 gradientUnits="userSpaceOnUse"
211 id="radialGradient3292"
212 xlink:href="#linearGradient3907"
213 inkscape:collect="always" />
214 <radialGradient
215 r="19.5"
216 fy="47.045319"
217 fx="20.913568"
218 cy="47.045319"
219 cx="20.913568"
220 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
221 gradientUnits="userSpaceOnUse"
222 id="radialGradient3276"
223 xlink:href="#linearGradient3907"
224 inkscape:collect="always" />
225 <radialGradient
226 r="19.5"
227 fy="47.045319"
228 fx="20.913568"
229 cy="47.045319"
230 cx="20.913568"
231 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
232 gradientUnits="userSpaceOnUse"
233 id="radialGradient3274"
234 xlink:href="#linearGradient3907"
235 inkscape:collect="always" />
236 <radialGradient
237 r="19.5"
238 fy="47.045319"
239 fx="20.913568"
240 cy="47.045319"
241 cx="20.913568"
242 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
243 gradientUnits="userSpaceOnUse"
244 id="radialGradient3272"
245 xlink:href="#linearGradient3907"
246 inkscape:collect="always" />
247 <radialGradient
248 r="19.5"
249 fy="47.045319"
250 fx="20.913568"
251 cy="47.045319"
252 cx="20.913568"
253 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
254 gradientUnits="userSpaceOnUse"
255 id="radialGradient3270"
256 xlink:href="#linearGradient3907"
257 inkscape:collect="always" />
258 <radialGradient
259 r="19.5"
260 fy="47.045319"
261 fx="20.913568"
262 cy="47.045319"
263 cx="20.913568"
264 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
265 gradientUnits="userSpaceOnUse"
266 id="radialGradient3268"
267 xlink:href="#linearGradient3907"
268 inkscape:collect="always" />
269 <radialGradient
270 r="19.5"
271 fy="47.045319"
272 fx="20.913568"
273 cy="47.045319"
274 cx="20.913568"
275 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
276 gradientUnits="userSpaceOnUse"
277 id="radialGradient3266"
278 xlink:href="#linearGradient3907"
279 inkscape:collect="always" />
280 <radialGradient
281 r="19.5"
282 fy="47.045319"
283 fx="20.913568"
284 cy="47.045319"
285 cx="20.913568"
286 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
287 gradientUnits="userSpaceOnUse"
288 id="radialGradient3264"
289 xlink:href="#linearGradient3907"
290 inkscape:collect="always" />
291 <radialGradient
292 r="19.5"
293 fy="47.045319"
294 fx="20.913568"
295 cy="47.045319"
296 cx="20.913568"
297 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
298 gradientUnits="userSpaceOnUse"
299 id="radialGradient3155"
300 xlink:href="#linearGradient3907"
301 inkscape:collect="always" />
302 <radialGradient
303 r="19.5"
304 fy="47.045319"
305 fx="20.913568"
306 cy="47.045319"
307 cx="20.913568"
308 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
309 gradientUnits="userSpaceOnUse"
310 id="radialGradient3158"
311 xlink:href="#linearGradient3907"
312 inkscape:collect="always" />
313 <radialGradient
314 r="19.5"
315 fy="47.045319"
316 fx="20.913568"
317 cy="47.045319"
318 cx="20.913568"
319 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
320 gradientUnits="userSpaceOnUse"
321 id="radialGradient3161"
322 xlink:href="#linearGradient3907"
323 inkscape:collect="always" />
324 <radialGradient
325 r="19.5"
326 fy="47.045319"
327 fx="20.913568"
328 cy="47.045319"
329 cx="20.913568"
330 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
331 gradientUnits="userSpaceOnUse"
332 id="radialGradient3164"
333 xlink:href="#linearGradient3907"
334 inkscape:collect="always" />
335 <radialGradient
336 r="19.5"
337 fy="47.045319"
338 fx="20.913568"
339 cy="47.045319"
340 cx="20.913568"
341 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
342 gradientUnits="userSpaceOnUse"
343 id="radialGradient3167"
344 xlink:href="#linearGradient3907"
345 inkscape:collect="always" />
346 <radialGradient
347 r="19.5"
348 fy="47.045319"
349 fx="20.913568"
350 cy="47.045319"
351 cx="20.913568"
352 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
353 gradientUnits="userSpaceOnUse"
354 id="radialGradient3170"
355 xlink:href="#linearGradient3907"
356 inkscape:collect="always" />
357 <radialGradient
358 r="19.5"
359 fy="47.045319"
360 fx="20.913568"
361 cy="47.045319"
362 cx="20.913568"
363 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
364 gradientUnits="userSpaceOnUse"
365 id="radialGradient3173"
366 xlink:href="#linearGradient3907"
367 inkscape:collect="always" />
368 <radialGradient
369 r="19.5"
370 fy="47.045319"
371 fx="20.913568"
372 cy="47.045319"
373 cx="20.913568"
374 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
375 gradientUnits="userSpaceOnUse"
376 id="radialGradient3176"
377 xlink:href="#linearGradient3907"
378 inkscape:collect="always" />
379 <radialGradient
380 r="19.5"
381 fy="47.045319"
382 fx="20.913568"
383 cy="47.045319"
384 cx="20.913568"
385 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
386 gradientUnits="userSpaceOnUse"
387 id="radialGradient3182"
388 xlink:href="#linearGradient3907"
389 inkscape:collect="always" />
390 <radialGradient
391 r="19.5"
392 fy="47.045319"
393 fx="20.913568"
394 cy="47.045319"
395 cx="20.913568"
396 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
397 gradientUnits="userSpaceOnUse"
398 id="radialGradient3185"
399 xlink:href="#linearGradient3907"
400 inkscape:collect="always" />
401 <radialGradient
402 r="19.5"
403 fy="47.045319"
404 fx="20.913568"
405 cy="47.045319"
406 cx="20.913568"
407 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
408 gradientUnits="userSpaceOnUse"
409 id="radialGradient3188"
410 xlink:href="#linearGradient3907"
411 inkscape:collect="always" />
412 <radialGradient
413 r="19.5"
414 fy="47.045319"
415 fx="20.913568"
416 cy="47.045319"
417 cx="20.913568"
418 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
419 gradientUnits="userSpaceOnUse"
420 id="radialGradient3191"
421 xlink:href="#linearGradient3907"
422 inkscape:collect="always" />
423 <radialGradient
424 r="19.5"
425 fy="47.045319"
426 fx="20.913568"
427 cy="47.045319"
428 cx="20.913568"
429 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
430 gradientUnits="userSpaceOnUse"
431 id="radialGradient3194"
432 xlink:href="#linearGradient3907"
433 inkscape:collect="always" />
434 <radialGradient
435 r="19.5"
436 fy="47.045319"
437 fx="20.913568"
438 cy="47.045319"
439 cx="20.913568"
440 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
441 gradientUnits="userSpaceOnUse"
442 id="radialGradient3197"
443 xlink:href="#linearGradient3907"
444 inkscape:collect="always" />
445 <radialGradient
446 r="19.5"
447 fy="47.045319"
448 fx="20.913568"
449 cy="47.045319"
450 cx="20.913568"
451 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
452 gradientUnits="userSpaceOnUse"
453 id="radialGradient3200"
454 xlink:href="#linearGradient3907"
455 inkscape:collect="always" />
456 <radialGradient
457 r="19.5"
458 fy="47.045319"
459 fx="20.913568"
460 cy="47.045319"
461 cx="20.913568"
462 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
463 gradientUnits="userSpaceOnUse"
464 id="radialGradient3203"
465 xlink:href="#linearGradient3907"
466 inkscape:collect="always" />
467 <radialGradient
468 r="19.5"
469 fy="47.045319"
470 fx="20.913568"
471 cy="47.045319"
472 cx="20.913568"
473 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
474 gradientUnits="userSpaceOnUse"
475 id="radialGradient3206"
476 xlink:href="#linearGradient3907"
477 inkscape:collect="always" />
478 <radialGradient
479 r="19.5"
480 fy="47.045319"
481 fx="20.913568"
482 cy="47.045319"
483 cx="20.913568"
484 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
485 gradientUnits="userSpaceOnUse"
486 id="radialGradient3209"
487 xlink:href="#linearGradient3907"
488 inkscape:collect="always" />
489 <radialGradient
490 r="19.5"
491 fy="47.045319"
492 fx="20.913568"
493 cy="47.045319"
494 cx="20.913568"
495 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
496 gradientUnits="userSpaceOnUse"
497 id="radialGradient3212"
498 xlink:href="#linearGradient3907"
499 inkscape:collect="always" />
500 <radialGradient
501 r="19.5"
502 fy="47.045319"
503 fx="20.913568"
504 cy="47.045319"
505 cx="20.913568"
506 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
507 gradientUnits="userSpaceOnUse"
508 id="radialGradient3215"
509 xlink:href="#linearGradient3907"
510 inkscape:collect="always" />
511 <radialGradient
512 r="19.5"
513 fy="47.045319"
514 fx="20.913568"
515 cy="47.045319"
516 cx="20.913568"
517 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
518 gradientUnits="userSpaceOnUse"
519 id="radialGradient3218"
520 xlink:href="#linearGradient3907"
521 inkscape:collect="always" />
522 <radialGradient
523 r="19.5"
524 fy="47.045319"
525 fx="20.913568"
526 cy="47.045319"
527 cx="20.913568"
528 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
529 gradientUnits="userSpaceOnUse"
530 id="radialGradient3221"
531 xlink:href="#linearGradient3907"
532 inkscape:collect="always" />
533 <radialGradient
534 r="19.5"
535 fy="47.045319"
536 fx="20.913568"
537 cy="47.045319"
538 cx="20.913568"
539 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
540 gradientUnits="userSpaceOnUse"
541 id="radialGradient3224"
542 xlink:href="#linearGradient3907"
543 inkscape:collect="always" />
544 <radialGradient
545 r="19.5"
546 fy="47.045319"
547 fx="20.913568"
548 cy="47.045319"
549 cx="20.913568"
550 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
551 gradientUnits="userSpaceOnUse"
552 id="radialGradient3230"
553 xlink:href="#linearGradient3907"
554 inkscape:collect="always" />
555 <radialGradient
556 r="19.5"
557 fy="47.045319"
558 fx="20.913568"
559 cy="47.045319"
560 cx="20.913568"
561 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
562 gradientUnits="userSpaceOnUse"
563 id="radialGradient3233"
564 xlink:href="#linearGradient3907"
565 inkscape:collect="always" />
566 <radialGradient
567 r="19.5"
568 fy="47.045319"
569 fx="20.913568"
570 cy="47.045319"
571 cx="20.913568"
572 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
573 gradientUnits="userSpaceOnUse"
574 id="radialGradient3236"
575 xlink:href="#linearGradient3907"
576 inkscape:collect="always" />
577 <radialGradient
578 r="19.5"
579 fy="47.045319"
580 fx="20.913568"
581 cy="47.045319"
582 cx="20.913568"
583 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
584 gradientUnits="userSpaceOnUse"
585 id="radialGradient3239"
586 xlink:href="#linearGradient3907"
587 inkscape:collect="always" />
588 <radialGradient
589 r="19.5"
590 fy="47.045319"
591 fx="20.913568"
592 cy="47.045319"
593 cx="20.913568"
594 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
595 gradientUnits="userSpaceOnUse"
596 id="radialGradient3242"
597 xlink:href="#linearGradient3907"
598 inkscape:collect="always" />
599 <radialGradient
600 r="19.5"
601 fy="47.045319"
602 fx="20.913568"
603 cy="47.045319"
604 cx="20.913568"
605 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
606 gradientUnits="userSpaceOnUse"
607 id="radialGradient3245"
608 xlink:href="#linearGradient3907"
609 inkscape:collect="always" />
610 <radialGradient
611 r="19.5"
612 fy="47.045319"
613 fx="20.913568"
614 cy="47.045319"
615 cx="20.913568"
616 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
617 gradientUnits="userSpaceOnUse"
618 id="radialGradient3248"
619 xlink:href="#linearGradient3907"
620 inkscape:collect="always" />
621 <linearGradient
622 gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
623 gradientUnits="userSpaceOnUse"
624 y2="37.9375"
625 x2="29.125"
626 y1="46.029419"
627 x1="29.5"
628 id="linearGradient3905"
629 xlink:href="#linearGradient3899"
630 inkscape:collect="always" />
631 <radialGradient
632 r="117.14286"
633 fy="486.64789"
634 fx="605.71429"
635 cy="486.64789"
636 cx="605.71429"
637 gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
638 gradientUnits="userSpaceOnUse"
639 id="radialGradient2309"
640 xlink:href="#linearGradient5060"
641 inkscape:collect="always" />
642 <radialGradient
643 r="117.14286"
644 fy="486.64789"
645 fx="605.71429"
646 cy="486.64789"
647 cx="605.71429"
648 gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
649 gradientUnits="userSpaceOnUse"
650 id="radialGradient2311"
651 xlink:href="#linearGradient5060"
652 inkscape:collect="always" />
653 <linearGradient
654 gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
655 gradientUnits="userSpaceOnUse"
656 y2="26.039215"
657 x2="20.156862"
658 y1="5.0996137"
659 x1="20.156862"
660 id="linearGradient6246"
661 xlink:href="#linearGradient6240"
662 inkscape:collect="always" />
663 <radialGradient
664 gradientUnits="userSpaceOnUse"
665 gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
666 r="19.00016"
667 fy="32.997028"
668 fx="24.006104"
669 cy="32.997028"
670 cx="24.006104"
671 id="radialGradient5239"
672 xlink:href="#linearGradient7670"
673 inkscape:collect="always" />
674 <linearGradient
675 gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
676 y2="38.876041"
677 x2="39.904388"
678 y1="6.3760414"
679 x1="17.247635"
680 gradientUnits="userSpaceOnUse"
681 id="linearGradient5147"
682 xlink:href="#linearGradient5137"
683 inkscape:collect="always" />
684 <linearGradient
685 y2="43.82579"
686 x2="31.86105"
687 y1="37.842293"
688 x1="31.743324"
689 gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
690 gradientUnits="userSpaceOnUse"
691 id="linearGradient2308"
692 xlink:href="#linearGradient5137"
693 inkscape:collect="always" />
694 <linearGradient
695 y2="40.219608"
696 x2="23.529411"
697 y1="34.572548"
698 x1="23.154902"
699 gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
700 gradientUnits="userSpaceOnUse"
701 id="linearGradient2310"
702 xlink:href="#linearGradient11400"
703 inkscape:collect="always" />
704 <linearGradient
705 gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
706 gradientUnits="userSpaceOnUse"
707 y2="33.637787"
708 x2="37.295498"
709 y1="38.267769"
710 x1="37.484837"
711 id="linearGradient4202"
712 xlink:href="#linearGradient4196"
713 inkscape:collect="always" />
714 <radialGradient
715 r="23.75956"
716 fy="42.6875"
717 fx="23.9375"
718 cy="42.6875"
719 cx="23.9375"
720 gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
721 gradientUnits="userSpaceOnUse"
722 id="radialGradient2313"
723 xlink:href="#linearGradient5225"
724 inkscape:collect="always" />
725 <linearGradient
726 inkscape:collect="always"
727 xlink:href="#linearGradient2307"
728 id="linearGradient5478"
729 gradientTransform="scale(1.673466,0.597562)"
730 x1="-931.7503"
731 y1="148.07116"
732 x2="-131.23588"
733 y2="148.07116"
734 gradientUnits="userSpaceOnUse" />
735 <radialGradient
736 inkscape:collect="always"
737 xlink:href="#linearGradient5225"
738 id="radialGradient5620"
739 gradientUnits="userSpaceOnUse"
740 gradientTransform="matrix(1,0,0,0.24763,0,32.1168)"
741 cx="23.9375"
742 cy="42.6875"
743 fx="23.9375"
744 fy="42.6875"
745 r="23.75956" />
746 <linearGradient
747 inkscape:collect="always"
748 xlink:href="#linearGradient4196"
749 id="linearGradient5622"
750 gradientUnits="userSpaceOnUse"
751 gradientTransform="matrix(0.654255,0,0,0.654672,-0.481383,0.690637)"
752 x1="37.484837"
753 y1="38.267769"
754 x2="37.295498"
755 y2="33.637787" />
756 <linearGradient
757 inkscape:collect="always"
758 xlink:href="#linearGradient5137"
759 id="linearGradient5624"
760 gradientUnits="userSpaceOnUse"
761 gradientTransform="matrix(1,0,0,0.992781,0,-2.718035)"
762 x1="31.743324"
763 y1="37.842293"
764 x2="31.86105"
765 y2="43.82579" />
766 <linearGradient
767 inkscape:collect="always"
768 xlink:href="#linearGradient11400"
769 id="linearGradient5626"
770 gradientUnits="userSpaceOnUse"
771 gradientTransform="matrix(1.004187,0,0,1,-0.12454,-3.011765)"
772 x1="23.154902"
773 y1="34.572548"
774 x2="23.529411"
775 y2="40.219608" />
776 <linearGradient
777 inkscape:collect="always"
778 xlink:href="#linearGradient5137"
779 id="linearGradient5628"
780 gradientUnits="userSpaceOnUse"
781 gradientTransform="matrix(0.648248,0,0,0.644253,0.433189,-0.740991)"
782 x1="17.247635"
783 y1="6.3760414"
784 x2="39.904388"
785 y2="38.876041" />
786 <radialGradient
787 inkscape:collect="always"
788 xlink:href="#linearGradient7670"
789 id="radialGradient5630"
790 gradientUnits="userSpaceOnUse"
791 gradientTransform="matrix(0.836315,0,0,0.514216,-4.024721,-3.259613e-2)"
792 cx="24.006104"
793 cy="32.997028"
794 fx="24.006104"
795 fy="32.997028"
796 r="19.00016" />
797 <linearGradient
798 inkscape:collect="always"
799 xlink:href="#linearGradient6240"
800 id="linearGradient5632"
801 gradientUnits="userSpaceOnUse"
802 gradientTransform="matrix(0.664512,0,0,0.651253,9.569506e-2,-1.210023)"
803 x1="20.156862"
804 y1="5.0996137"
805 x2="20.156862"
806 y2="26.039215" />
807 <linearGradient
808 inkscape:collect="always"
809 xlink:href="#linearGradient2307"
810 id="linearGradient5634"
811 gradientUnits="userSpaceOnUse"
812 gradientTransform="scale(1.673466,0.597562)"
813 x1="-931.7503"
814 y1="148.07116"
815 x2="-131.23588"
816 y2="148.07116" />
817 <radialGradient
818 inkscape:collect="always"
819 xlink:href="#linearGradient5060"
820 id="radialGradient5636"
821 gradientUnits="userSpaceOnUse"
822 gradientTransform="matrix(2.774389,0,0,1.969706,-1891.633,-872.8854)"
823 cx="605.71429"
824 cy="486.64789"
825 fx="605.71429"
826 fy="486.64789"
827 r="117.14286" />
828 <radialGradient
829 inkscape:collect="always"
830 xlink:href="#linearGradient5060"
831 id="radialGradient5638"
832 gradientUnits="userSpaceOnUse"
833 gradientTransform="matrix(-2.774389,0,0,1.969706,112.7623,-872.8854)"
834 cx="605.71429"
835 cy="486.64789"
836 fx="605.71429"
837 fy="486.64789"
838 r="117.14286" />
839 <linearGradient
840 inkscape:collect="always"
841 xlink:href="#linearGradient3899"
842 id="linearGradient5640"
843 gradientUnits="userSpaceOnUse"
844 gradientTransform="matrix(0.647995,0,0,0.707655,0.734249,-1.447571)"
845 x1="29.5"
846 y1="46.029419"
847 x2="29.125"
848 y2="37.9375" />
849 <radialGradient
850 inkscape:collect="always"
851 xlink:href="#linearGradient3907"
852 id="radialGradient5642"
853 gradientUnits="userSpaceOnUse"
854 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
855 cx="20.913568"
856 cy="47.045319"
857 fx="20.913568"
858 fy="47.045319"
859 r="19.5" />
860 <radialGradient
861 inkscape:collect="always"
862 xlink:href="#linearGradient3907"
863 id="radialGradient5644"
864 gradientUnits="userSpaceOnUse"
865 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
866 cx="20.913568"
867 cy="47.045319"
868 fx="20.913568"
869 fy="47.045319"
870 r="19.5" />
871 <radialGradient
872 inkscape:collect="always"
873 xlink:href="#linearGradient3907"
874 id="radialGradient5646"
875 gradientUnits="userSpaceOnUse"
876 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
877 cx="20.913568"
878 cy="47.045319"
879 fx="20.913568"
880 fy="47.045319"
881 r="19.5" />
882 <radialGradient
883 inkscape:collect="always"
884 xlink:href="#linearGradient3907"
885 id="radialGradient5648"
886 gradientUnits="userSpaceOnUse"
887 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
888 cx="20.913568"
889 cy="47.045319"
890 fx="20.913568"
891 fy="47.045319"
892 r="19.5" />
893 <radialGradient
894 inkscape:collect="always"
895 xlink:href="#linearGradient3907"
896 id="radialGradient5650"
897 gradientUnits="userSpaceOnUse"
898 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
899 cx="20.913568"
900 cy="47.045319"
901 fx="20.913568"
902 fy="47.045319"
903 r="19.5" />
904 <radialGradient
905 inkscape:collect="always"
906 xlink:href="#linearGradient3907"
907 id="radialGradient5652"
908 gradientUnits="userSpaceOnUse"
909 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
910 cx="20.913568"
911 cy="47.045319"
912 fx="20.913568"
913 fy="47.045319"
914 r="19.5" />
915 <radialGradient
916 inkscape:collect="always"
917 xlink:href="#linearGradient3907"
918 id="radialGradient5654"
919 gradientUnits="userSpaceOnUse"
920 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
921 cx="20.913568"
922 cy="47.045319"
923 fx="20.913568"
924 fy="47.045319"
925 r="19.5" />
926 <radialGradient
927 inkscape:collect="always"
928 xlink:href="#linearGradient3907"
929 id="radialGradient5656"
930 gradientUnits="userSpaceOnUse"
931 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
932 cx="20.913568"
933 cy="47.045319"
934 fx="20.913568"
935 fy="47.045319"
936 r="19.5" />
937 <radialGradient
938 inkscape:collect="always"
939 xlink:href="#linearGradient3907"
940 id="radialGradient5658"
941 gradientUnits="userSpaceOnUse"
942 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
943 cx="20.913568"
944 cy="47.045319"
945 fx="20.913568"
946 fy="47.045319"
947 r="19.5" />
948 <radialGradient
949 inkscape:collect="always"
950 xlink:href="#linearGradient3907"
951 id="radialGradient5660"
952 gradientUnits="userSpaceOnUse"
953 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
954 cx="20.913568"
955 cy="47.045319"
956 fx="20.913568"
957 fy="47.045319"
958 r="19.5" />
959 <radialGradient
960 inkscape:collect="always"
961 xlink:href="#linearGradient3907"
962 id="radialGradient5662"
963 gradientUnits="userSpaceOnUse"
964 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
965 cx="20.913568"
966 cy="47.045319"
967 fx="20.913568"
968 fy="47.045319"
969 r="19.5" />
970 <radialGradient
971 inkscape:collect="always"
972 xlink:href="#linearGradient3907"
973 id="radialGradient5664"
974 gradientUnits="userSpaceOnUse"
975 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
976 cx="20.913568"
977 cy="47.045319"
978 fx="20.913568"
979 fy="47.045319"
980 r="19.5" />
981 <radialGradient
982 inkscape:collect="always"
983 xlink:href="#linearGradient3907"
984 id="radialGradient5666"
985 gradientUnits="userSpaceOnUse"
986 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
987 cx="20.913568"
988 cy="47.045319"
989 fx="20.913568"
990 fy="47.045319"
991 r="19.5" />
992 <radialGradient
993 inkscape:collect="always"
994 xlink:href="#linearGradient3907"
995 id="radialGradient5668"
996 gradientUnits="userSpaceOnUse"
997 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
998 cx="20.913568"
999 cy="47.045319"
1000 fx="20.913568"
1001 fy="47.045319"
1002 r="19.5" />
1003 <radialGradient
1004 inkscape:collect="always"
1005 xlink:href="#linearGradient3907"
1006 id="radialGradient5670"
1007 gradientUnits="userSpaceOnUse"
1008 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1009 cx="20.913568"
1010 cy="47.045319"
1011 fx="20.913568"
1012 fy="47.045319"
1013 r="19.5" />
1014 <radialGradient
1015 inkscape:collect="always"
1016 xlink:href="#linearGradient3907"
1017 id="radialGradient5672"
1018 gradientUnits="userSpaceOnUse"
1019 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1020 cx="20.913568"
1021 cy="47.045319"
1022 fx="20.913568"
1023 fy="47.045319"
1024 r="19.5" />
1025 <radialGradient
1026 inkscape:collect="always"
1027 xlink:href="#linearGradient3907"
1028 id="radialGradient5674"
1029 gradientUnits="userSpaceOnUse"
1030 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1031 cx="20.913568"
1032 cy="47.045319"
1033 fx="20.913568"
1034 fy="47.045319"
1035 r="19.5" />
1036 <radialGradient
1037 inkscape:collect="always"
1038 xlink:href="#linearGradient3907"
1039 id="radialGradient5676"
1040 gradientUnits="userSpaceOnUse"
1041 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1042 cx="20.913568"
1043 cy="47.045319"
1044 fx="20.913568"
1045 fy="47.045319"
1046 r="19.5" />
1047 <radialGradient
1048 inkscape:collect="always"
1049 xlink:href="#linearGradient3907"
1050 id="radialGradient5678"
1051 gradientUnits="userSpaceOnUse"
1052 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1053 cx="20.913568"
1054 cy="47.045319"
1055 fx="20.913568"
1056 fy="47.045319"
1057 r="19.5" />
1058 <radialGradient
1059 inkscape:collect="always"
1060 xlink:href="#linearGradient3907"
1061 id="radialGradient5680"
1062 gradientUnits="userSpaceOnUse"
1063 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1064 cx="20.913568"
1065 cy="47.045319"
1066 fx="20.913568"
1067 fy="47.045319"
1068 r="19.5" />
1069 <radialGradient
1070 inkscape:collect="always"
1071 xlink:href="#linearGradient3907"
1072 id="radialGradient5682"
1073 gradientUnits="userSpaceOnUse"
1074 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1075 cx="20.913568"
1076 cy="47.045319"
1077 fx="20.913568"
1078 fy="47.045319"
1079 r="19.5" />
1080 <radialGradient
1081 inkscape:collect="always"
1082 xlink:href="#linearGradient3907"
1083 id="radialGradient5684"
1084 gradientUnits="userSpaceOnUse"
1085 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1086 cx="20.913568"
1087 cy="47.045319"
1088 fx="20.913568"
1089 fy="47.045319"
1090 r="19.5" />
1091 <radialGradient
1092 inkscape:collect="always"
1093 xlink:href="#linearGradient3907"
1094 id="radialGradient5686"
1095 gradientUnits="userSpaceOnUse"
1096 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1097 cx="20.913568"
1098 cy="47.045319"
1099 fx="20.913568"
1100 fy="47.045319"
1101 r="19.5" />
1102 <radialGradient
1103 inkscape:collect="always"
1104 xlink:href="#linearGradient3907"
1105 id="radialGradient5688"
1106 gradientUnits="userSpaceOnUse"
1107 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1108 cx="20.913568"
1109 cy="47.045319"
1110 fx="20.913568"
1111 fy="47.045319"
1112 r="19.5" />
1113 <radialGradient
1114 inkscape:collect="always"
1115 xlink:href="#linearGradient3907"
1116 id="radialGradient5690"
1117 gradientUnits="userSpaceOnUse"
1118 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1119 cx="20.913568"
1120 cy="47.045319"
1121 fx="20.913568"
1122 fy="47.045319"
1123 r="19.5" />
1124 <radialGradient
1125 inkscape:collect="always"
1126 xlink:href="#linearGradient3907"
1127 id="radialGradient5692"
1128 gradientUnits="userSpaceOnUse"
1129 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1130 cx="20.913568"
1131 cy="47.045319"
1132 fx="20.913568"
1133 fy="47.045319"
1134 r="19.5" />
1135 <radialGradient
1136 inkscape:collect="always"
1137 xlink:href="#linearGradient3907"
1138 id="radialGradient5694"
1139 gradientUnits="userSpaceOnUse"
1140 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1141 cx="20.913568"
1142 cy="47.045319"
1143 fx="20.913568"
1144 fy="47.045319"
1145 r="19.5" />
1146 <radialGradient
1147 inkscape:collect="always"
1148 xlink:href="#linearGradient3907"
1149 id="radialGradient5696"
1150 gradientUnits="userSpaceOnUse"
1151 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1152 cx="20.913568"
1153 cy="47.045319"
1154 fx="20.913568"
1155 fy="47.045319"
1156 r="19.5" />
1157 <radialGradient
1158 inkscape:collect="always"
1159 xlink:href="#linearGradient3907"
1160 id="radialGradient5698"
1161 gradientUnits="userSpaceOnUse"
1162 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1163 cx="20.913568"
1164 cy="47.045319"
1165 fx="20.913568"
1166 fy="47.045319"
1167 r="19.5" />
1168 <radialGradient
1169 inkscape:collect="always"
1170 xlink:href="#linearGradient3907"
1171 id="radialGradient5700"
1172 gradientUnits="userSpaceOnUse"
1173 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-8.729684,21.0972)"
1174 cx="20.913568"
1175 cy="47.045319"
1176 fx="20.913568"
1177 fy="47.045319"
1178 r="19.5" />
1179 <radialGradient
1180 inkscape:collect="always"
1181 xlink:href="#linearGradient3907"
1182 id="radialGradient5702"
1183 gradientUnits="userSpaceOnUse"
1184 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1185 cx="20.913568"
1186 cy="47.045319"
1187 fx="20.913568"
1188 fy="47.045319"
1189 r="19.5" />
1190 <radialGradient
1191 inkscape:collect="always"
1192 xlink:href="#linearGradient3907"
1193 id="radialGradient5704"
1194 gradientUnits="userSpaceOnUse"
1195 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1196 cx="20.913568"
1197 cy="47.045319"
1198 fx="20.913568"
1199 fy="47.045319"
1200 r="19.5" />
1201 <radialGradient
1202 inkscape:collect="always"
1203 xlink:href="#linearGradient3907"
1204 id="radialGradient5706"
1205 gradientUnits="userSpaceOnUse"
1206 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1207 cx="20.913568"
1208 cy="47.045319"
1209 fx="20.913568"
1210 fy="47.045319"
1211 r="19.5" />
1212 <radialGradient
1213 inkscape:collect="always"
1214 xlink:href="#linearGradient3907"
1215 id="radialGradient5708"
1216 gradientUnits="userSpaceOnUse"
1217 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1218 cx="20.913568"
1219 cy="47.045319"
1220 fx="20.913568"
1221 fy="47.045319"
1222 r="19.5" />
1223 <radialGradient
1224 inkscape:collect="always"
1225 xlink:href="#linearGradient3907"
1226 id="radialGradient5710"
1227 gradientUnits="userSpaceOnUse"
1228 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1229 cx="20.913568"
1230 cy="47.045319"
1231 fx="20.913568"
1232 fy="47.045319"
1233 r="19.5" />
1234 <radialGradient
1235 inkscape:collect="always"
1236 xlink:href="#linearGradient3907"
1237 id="radialGradient5712"
1238 gradientUnits="userSpaceOnUse"
1239 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1240 cx="20.913568"
1241 cy="47.045319"
1242 fx="20.913568"
1243 fy="47.045319"
1244 r="19.5" />
1245 <radialGradient
1246 inkscape:collect="always"
1247 xlink:href="#linearGradient3907"
1248 id="radialGradient5714"
1249 gradientUnits="userSpaceOnUse"
1250 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,-0.72968,21.0972)"
1251 cx="20.913568"
1252 cy="47.045319"
1253 fx="20.913568"
1254 fy="47.045319"
1255 r="19.5" />
1256 <radialGradient
1257 inkscape:collect="always"
1258 xlink:href="#linearGradient3907"
1259 id="radialGradient5716"
1260 gradientUnits="userSpaceOnUse"
1261 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1262 cx="20.913568"
1263 cy="47.045319"
1264 fx="20.913568"
1265 fy="47.045319"
1266 r="19.5" />
1267 <radialGradient
1268 inkscape:collect="always"
1269 xlink:href="#linearGradient3907"
1270 id="radialGradient5718"
1271 gradientUnits="userSpaceOnUse"
1272 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1273 cx="20.913568"
1274 cy="47.045319"
1275 fx="20.913568"
1276 fy="47.045319"
1277 r="19.5" />
1278 <radialGradient
1279 inkscape:collect="always"
1280 xlink:href="#linearGradient3907"
1281 id="radialGradient5720"
1282 gradientUnits="userSpaceOnUse"
1283 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1284 cx="20.913568"
1285 cy="47.045319"
1286 fx="20.913568"
1287 fy="47.045319"
1288 r="19.5" />
1289 <radialGradient
1290 inkscape:collect="always"
1291 xlink:href="#linearGradient3907"
1292 id="radialGradient5722"
1293 gradientUnits="userSpaceOnUse"
1294 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1295 cx="20.913568"
1296 cy="47.045319"
1297 fx="20.913568"
1298 fy="47.045319"
1299 r="19.5" />
1300 <radialGradient
1301 inkscape:collect="always"
1302 xlink:href="#linearGradient3907"
1303 id="radialGradient5724"
1304 gradientUnits="userSpaceOnUse"
1305 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1306 cx="20.913568"
1307 cy="47.045319"
1308 fx="20.913568"
1309 fy="47.045319"
1310 r="19.5" />
1311 <radialGradient
1312 inkscape:collect="always"
1313 xlink:href="#linearGradient3907"
1314 id="radialGradient5726"
1315 gradientUnits="userSpaceOnUse"
1316 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1317 cx="20.913568"
1318 cy="47.045319"
1319 fx="20.913568"
1320 fy="47.045319"
1321 r="19.5" />
1322 <radialGradient
1323 inkscape:collect="always"
1324 xlink:href="#linearGradient3907"
1325 id="radialGradient5728"
1326 gradientUnits="userSpaceOnUse"
1327 gradientTransform="matrix(1.382603,3.581398e-5,0,0.171503,4.270316,21.0972)"
1328 cx="20.913568"
1329 cy="47.045319"
1330 fx="20.913568"
1331 fy="47.045319"
1332 r="19.5" />
1333 </defs>
1334 <sodipodi:namedview
1335 id="base"
1336 pagecolor="#ffffff"
1337 bordercolor="#666"
1338 borderopacity="1"
1339 inkscape:pageopacity="0.0"
1340 inkscape:pageshadow="2"
1341 inkscape:zoom="1"
1342 inkscape:cx="47.587693"
1343 inkscape:cy="-3.0466105"
1344 inkscape:current-layer="layer1"
1345 showgrid="false"
1346 inkscape:grid-bbox="true"
1347 inkscape:document-units="px"
1348 inkscape:window-width="1051"
1349 inkscape:window-height="885"
1350 inkscape:window-x="0"
1351 inkscape:window-y="89"
1352 inkscape:showpageshadow="false"
1353 inkscape:grid-points="false"
1354 showborder="false" />
1355 <metadata
1356 id="metadata4">
1357 <rdf:RDF>
1358 <cc:Work
1359 rdf:about="">
1360 <dc:format>image/svg+xml</dc:format>
1361 <dc:type
1362 rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
1363 <dc:title>Network</dc:title>
1364 <dc:date>2005-03-08</dc:date>
1365 <dc:creator>
1366 <cc:Agent>
1367 <dc:title>Lapo Calamandrei</dc:title>
1368 </cc:Agent>
1369 </dc:creator>
1370 <dc:subject>
1371 <rdf:Bag />
1372 </dc:subject>
1373 <cc:license
1374 rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" />
1375 <dc:source />
1376 <dc:contributor>
1377 <cc:Agent>
1378 <dc:title>Jakub Steiner, Luca Ferretti</dc:title>
1379 </cc:Agent>
1380 </dc:contributor>
1381 </cc:Work>
1382 <cc:License
1383 rdf:about="http://creativecommons.org/licenses/by-sa/2.0/">
1384 <cc:permits
1385 rdf:resource="http://web.resource.org/cc/Reproduction" />
1386 <cc:permits
1387 rdf:resource="http://web.resource.org/cc/Distribution" />
1388 <cc:requires
1389 rdf:resource="http://web.resource.org/cc/Notice" />
1390 <cc:requires
1391 rdf:resource="http://web.resource.org/cc/Attribution" />
1392 <cc:permits
1393 rdf:resource="http://web.resource.org/cc/DerivativeWorks" />
1394 <cc:requires
1395 rdf:resource="http://web.resource.org/cc/ShareAlike" />
1396 </cc:License>
1397 </rdf:RDF>
1398 </metadata>
1399 <g
1400 id="layer1"
1401 inkscape:label="Layer 1"
1402 inkscape:groupmode="layer">
1403 <g
1404 id="g5480"
1405 transform="translate(14.98536,1)">
1406 <g
1407 style="display:inline"
1408 inkscape:label="Layer 1"
1409 id="g5482" />
1410 <g
1411 style="display:inline"
1412 inkscape:label="tastiera"
1413 id="g5484">
1414 <g
1415 transform="translate(-54,0.18088)"
1416 inkscape:label="Shadow"
1417 id="g5486" />
1418 <g
1419 id="g5488"
1420 inkscape:label="Shadow"
1421 transform="translate(-54,15.24691)" />
1422 <g
1423 id="g5490"
1424 inkscape:label="Lavoro"
1425 style="display:inline"
1426 transform="translate(-54,15.24691)" />
1427 </g>
1428 <g
1429 style="display:inline"
1430 inkscape:label="tasti"
1431 id="g5492">
1432 <path
1433 transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
1434 d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
1435 sodipodi:ry="5.8835783"
1436 sodipodi:rx="23.75956"
1437 sodipodi:cy="42.6875"
1438 sodipodi:cx="23.9375"
1439 id="path5494"
1440 style="opacity:0.3;fill:url(#radialGradient5620);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1441 sodipodi:type="arc" />
1442 <path
1443 style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient5622);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
1444 d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
1445 id="path5496"
1446 sodipodi:nodetypes="czz" />
1447 <path
1448 sodipodi:nodetypes="czz"
1449 id="path5498"
1450 d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
1451 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
1452 <g
1453 transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
1454 id="g5500"
1455 style="display:inline">
1456 <path
1457 sodipodi:nodetypes="csccscc"
1458 id="path5502"
1459 d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
1460 style="opacity:1;color:black;fill:url(#linearGradient5624);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1461 <path
1462 sodipodi:nodetypes="ccccc"
1463 id="path5504"
1464 d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
1465 style="opacity:0.5;fill:url(#linearGradient5626);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
1466 <path
1467 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
1468 d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
1469 id="path5506"
1470 sodipodi:nodetypes="cc" />
1471 <path
1472 sodipodi:nodetypes="cc"
1473 id="path5508"
1474 d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
1475 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
1476 </g>
1477 <path
1478 sodipodi:nodetypes="ccccccccc"
1479 id="path5510"
1480 d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
1481 style="fill:url(#linearGradient5628);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
1482 <rect
1483 y="3.5000005"
1484 x="3.4999971"
1485 height="15.194118"
1486 width="25.103695"
1487 id="rect5512"
1488 style="fill:url(#radialGradient5630);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
1489 <path
1490 sodipodi:nodetypes="ccccc"
1491 id="path5514"
1492 d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
1493 style="opacity:0.5;fill:url(#linearGradient5632);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
1494 <path
1495 sodipodi:nodetypes="cccsccscccc"
1496 id="path5516"
1497 d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
1498 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
1499 <g
1500 id="g5518"
1501 transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
1502 style="display:inline">
1503 <rect
1504 y="-150.69685"
1505 x="-1559.2523"
1506 height="478.35718"
1507 width="1339.6335"
1508 id="rect5520"
1509 style="opacity:0.40206185;color:black;fill:url(#linearGradient5634);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1510 <path
1511 sodipodi:nodetypes="cccc"
1512 id="path5522"
1513 d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
1514 style="opacity:0.40206185;color:black;fill:url(#radialGradient5636);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1515 <path
1516 style="opacity:0.40206185;color:black;fill:url(#radialGradient5638);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1517 d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
1518 id="path5524"
1519 sodipodi:nodetypes="cccc" />
1520 </g>
1521 <path
1522 sodipodi:nodetypes="ccccccccc"
1523 id="path5526"
1524 d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
1525 style="color:black;fill:url(#linearGradient5640);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1526 <path
1527 sodipodi:nodetypes="ccccccccc"
1528 id="path5528"
1529 d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
1530 style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1531 <path
1532 sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
1533 id="path5530"
1534 d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
1535 style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1536 <rect
1537 style="color:black;fill:url(#radialGradient5642);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1538 id="rect5532"
1539 width="1"
1540 height="1"
1541 x="5"
1542 y="26"
1543 rx="0.26516503"
1544 ry="0.26516503" />
1545 <rect
1546 style="color:black;fill:url(#radialGradient5644);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1547 id="rect5534"
1548 width="1"
1549 height="1"
1550 x="7"
1551 y="26"
1552 rx="0.26516503"
1553 ry="0.26516503" />
1554 <rect
1555 style="color:black;fill:url(#radialGradient5646);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1556 id="rect5536"
1557 width="1"
1558 height="1"
1559 x="9"
1560 y="26"
1561 rx="0.26516503"
1562 ry="0.26516503" />
1563 <rect
1564 style="color:black;fill:url(#radialGradient5648);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1565 id="rect5538"
1566 width="1"
1567 height="1"
1568 x="11"
1569 y="26"
1570 rx="0.26516503"
1571 ry="0.26516503" />
1572 <rect
1573 style="color:black;fill:url(#radialGradient5650);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1574 id="rect5540"
1575 width="1"
1576 height="1"
1577 x="13"
1578 y="26"
1579 rx="0.26516503"
1580 ry="0.26516503" />
1581 <rect
1582 style="color:black;fill:url(#radialGradient5652);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1583 id="rect5542"
1584 width="1"
1585 height="1"
1586 x="15"
1587 y="26"
1588 rx="0.26516503"
1589 ry="0.26516503" />
1590 <rect
1591 style="color:black;fill:url(#radialGradient5654);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1592 id="rect5544"
1593 width="1"
1594 height="1"
1595 x="17"
1596 y="26"
1597 rx="0.26516503"
1598 ry="0.26516503" />
1599 <rect
1600 style="color:black;fill:url(#radialGradient5656);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1601 id="rect5546"
1602 width="1"
1603 height="1"
1604 x="4"
1605 y="27"
1606 rx="0.26516503"
1607 ry="0.26516503" />
1608 <rect
1609 style="color:black;fill:url(#radialGradient5658);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1610 id="rect5548"
1611 width="1"
1612 height="1"
1613 x="6"
1614 y="27"
1615 rx="0.26516503"
1616 ry="0.26516503" />
1617 <rect
1618 style="color:black;fill:url(#radialGradient5660);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1619 id="rect5550"
1620 width="1"
1621 height="1"
1622 x="8"
1623 y="27"
1624 rx="0.26516503"
1625 ry="0.26516503" />
1626 <rect
1627 style="color:black;fill:url(#radialGradient5662);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1628 id="rect5552"
1629 width="1"
1630 height="1"
1631 x="10"
1632 y="27"
1633 rx="0.26516503"
1634 ry="0.26516503" />
1635 <rect
1636 style="color:black;fill:url(#radialGradient5664);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1637 id="rect5554"
1638 width="1"
1639 height="1"
1640 x="12"
1641 y="27"
1642 rx="0.26516503"
1643 ry="0.26516503" />
1644 <rect
1645 style="color:black;fill:url(#radialGradient5666);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1646 id="rect5556"
1647 width="1"
1648 height="1"
1649 x="14"
1650 y="27"
1651 rx="0.26516503"
1652 ry="0.26516503" />
1653 <rect
1654 style="color:black;fill:url(#radialGradient5668);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1655 id="rect5558"
1656 width="1"
1657 height="1"
1658 x="16"
1659 y="27"
1660 rx="0.26516503"
1661 ry="0.26516503" />
1662 <rect
1663 style="color:black;fill:url(#radialGradient5670);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1664 id="rect5560"
1665 width="1"
1666 height="1"
1667 x="18"
1668 y="27"
1669 rx="0.26516503"
1670 ry="0.26516503" />
1671 <rect
1672 style="color:black;fill:url(#radialGradient5672);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1673 id="rect5562"
1674 width="1"
1675 height="1"
1676 x="5"
1677 y="28"
1678 rx="0.26516503"
1679 ry="0.26516503" />
1680 <rect
1681 style="color:black;fill:url(#radialGradient5674);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1682 id="rect5564"
1683 width="1"
1684 height="1"
1685 x="7"
1686 y="28"
1687 rx="0.26516503"
1688 ry="0.26516503" />
1689 <rect
1690 style="color:black;fill:url(#radialGradient5676);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1691 id="rect5566"
1692 width="1"
1693 height="1"
1694 x="9"
1695 y="28"
1696 rx="0.26516503"
1697 ry="0.26516503" />
1698 <rect
1699 style="color:black;fill:url(#radialGradient5678);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1700 id="rect5568"
1701 width="1"
1702 height="1"
1703 x="11"
1704 y="28"
1705 rx="0.26516503"
1706 ry="0.26516503" />
1707 <rect
1708 style="color:black;fill:url(#radialGradient5680);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1709 id="rect5570"
1710 width="1"
1711 height="1"
1712 x="13"
1713 y="28"
1714 rx="0.26516503"
1715 ry="0.26516503" />
1716 <rect
1717 style="color:black;fill:url(#radialGradient5682);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1718 id="rect5572"
1719 width="1"
1720 height="1"
1721 x="15"
1722 y="28"
1723 rx="0.26516503"
1724 ry="0.26516503" />
1725 <rect
1726 style="color:black;fill:url(#radialGradient5684);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1727 id="rect5574"
1728 width="1"
1729 height="1"
1730 x="17"
1731 y="28"
1732 rx="0.26516503"
1733 ry="0.26516503" />
1734 <rect
1735 style="color:black;fill:url(#radialGradient5686);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1736 id="rect5576"
1737 width="1"
1738 height="1"
1739 x="4"
1740 y="29"
1741 rx="0.26516503"
1742 ry="0.26516503" />
1743 <rect
1744 style="color:black;fill:url(#radialGradient5688);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1745 id="rect5578"
1746 width="1"
1747 height="1"
1748 x="6"
1749 y="29"
1750 rx="0.26516503"
1751 ry="0.26516503" />
1752 <rect
1753 style="color:black;fill:url(#radialGradient5690);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1754 id="rect5580"
1755 width="1"
1756 height="1"
1757 x="8"
1758 y="29"
1759 rx="0.26516503"
1760 ry="0.26516503" />
1761 <rect
1762 style="color:black;fill:url(#radialGradient5692);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1763 id="rect5582"
1764 width="1"
1765 height="1"
1766 x="10"
1767 y="29"
1768 rx="0.26516503"
1769 ry="0.26516503" />
1770 <rect
1771 style="color:black;fill:url(#radialGradient5694);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1772 id="rect5584"
1773 width="1"
1774 height="1"
1775 x="12"
1776 y="29"
1777 rx="0.26516503"
1778 ry="0.26516503" />
1779 <rect
1780 style="color:black;fill:url(#radialGradient5696);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1781 id="rect5586"
1782 width="1"
1783 height="1"
1784 x="14"
1785 y="29"
1786 rx="0.26516503"
1787 ry="0.26516503" />
1788 <rect
1789 style="color:black;fill:url(#radialGradient5698);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1790 id="rect5588"
1791 width="1"
1792 height="1"
1793 x="16"
1794 y="29"
1795 rx="0.26516503"
1796 ry="0.26516503" />
1797 <rect
1798 style="color:black;fill:url(#radialGradient5700);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1799 id="rect5590"
1800 width="1"
1801 height="1"
1802 x="18"
1803 y="29"
1804 rx="0.26516503"
1805 ry="0.26516503" />
1806 <rect
1807 style="color:black;fill:url(#radialGradient5702);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1808 id="rect5592"
1809 width="1"
1810 height="1"
1811 x="21"
1812 y="26"
1813 rx="0.26516503"
1814 ry="0.26516503" />
1815 <rect
1816 style="color:black;fill:url(#radialGradient5704);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1817 id="rect5594"
1818 width="1"
1819 height="1"
1820 x="20"
1821 y="27"
1822 rx="0.26516503"
1823 ry="0.26516503" />
1824 <rect
1825 style="color:black;fill:url(#radialGradient5706);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1826 id="rect5596"
1827 width="1"
1828 height="1"
1829 x="22"
1830 y="27"
1831 rx="0.26516503"
1832 ry="0.26516503" />
1833 <rect
1834 style="color:black;fill:url(#radialGradient5708);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1835 id="rect5598"
1836 width="1"
1837 height="1"
1838 x="21"
1839 y="28"
1840 rx="0.26516503"
1841 ry="0.26516503" />
1842 <rect
1843 style="color:black;fill:url(#radialGradient5710);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1844 id="rect5600"
1845 width="1"
1846 height="1"
1847 x="23"
1848 y="28"
1849 rx="0.26516503"
1850 ry="0.26516503" />
1851 <rect
1852 style="color:black;fill:url(#radialGradient5712);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1853 id="rect5602"
1854 width="1"
1855 height="1"
1856 x="20"
1857 y="29"
1858 rx="0.26516503"
1859 ry="0.26516503" />
1860 <rect
1861 style="color:black;fill:url(#radialGradient5714);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1862 id="rect5604"
1863 width="1"
1864 height="1"
1865 x="22"
1866 y="29"
1867 rx="0.26516503"
1868 ry="0.26516503" />
1869 <rect
1870 style="color:black;fill:url(#radialGradient5716);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1871 id="rect5606"
1872 width="1"
1873 height="1"
1874 x="26"
1875 y="26"
1876 rx="0.26516503"
1877 ry="0.26516503" />
1878 <rect
1879 style="color:black;fill:url(#radialGradient5718);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1880 id="rect5608"
1881 width="1"
1882 height="1"
1883 x="25"
1884 y="27"
1885 rx="0.26516503"
1886 ry="0.26516503" />
1887 <rect
1888 style="color:black;fill:url(#radialGradient5720);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1889 id="rect5610"
1890 width="1"
1891 height="1"
1892 x="27"
1893 y="27"
1894 rx="0.26516503"
1895 ry="0.26516503" />
1896 <rect
1897 style="color:black;fill:url(#radialGradient5722);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1898 id="rect5612"
1899 width="1"
1900 height="1"
1901 x="26"
1902 y="28"
1903 rx="0.26516503"
1904 ry="0.26516503" />
1905 <rect
1906 style="color:black;fill:url(#radialGradient5724);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1907 id="rect5614"
1908 width="1"
1909 height="1"
1910 x="28"
1911 y="28"
1912 rx="0.26516503"
1913 ry="0.26516503" />
1914 <rect
1915 style="color:black;fill:url(#radialGradient5726);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1916 id="rect5616"
1917 width="1"
1918 height="1"
1919 x="25"
1920 y="29"
1921 rx="0.26516503"
1922 ry="0.26516503" />
1923 <rect
1924 style="color:black;fill:url(#radialGradient5728);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
1925 id="rect5618"
1926 width="1"
1927 height="1"
1928 x="27"
1929 y="29"
1930 rx="0.26516503"
1931 ry="0.26516503" />
1932 </g>
1933 </g>
1934 <g
1935 id="g5340"
1936 transform="translate(0.985355,12)">
1937 <g
1938 style="display:inline"
1939 inkscape:label="Layer 1"
1940 id="g5342" />
1941 <g
1942 style="display:inline"
1943 inkscape:label="tastiera"
1944 id="g5344">
1945 <g
1946 transform="translate(-54,0.18088)"
1947 inkscape:label="Shadow"
1948 id="g5346" />
1949 <g
1950 id="g5348"
1951 inkscape:label="Shadow"
1952 transform="translate(-54,15.24691)" />
1953 <g
1954 id="g5350"
1955 inkscape:label="Lavoro"
1956 style="display:inline"
1957 transform="translate(-54,15.24691)" />
1958 </g>
1959 <g
1960 style="display:inline"
1961 inkscape:label="tasti"
1962 id="layer2">
1963 <path
1964 transform="matrix(0.633479,0,0,0.565504,1.119993,0.201324)"
1965 d="M 47.69706 42.6875 A 23.75956 5.8835783 0 1 1 0.17794037,42.6875 A 23.75956 5.8835783 0 1 1 47.69706 42.6875 z"
1966 sodipodi:ry="5.8835783"
1967 sodipodi:rx="23.75956"
1968 sodipodi:cy="42.6875"
1969 sodipodi:cx="23.9375"
1970 id="path5353"
1971 style="opacity:0.3;fill:url(#radialGradient2313);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1972 sodipodi:type="arc" />
1973 <path
1974 style="opacity:0.20786516;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient4202);stroke-width:0.99999982;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
1975 d="M 27.082936,28.048013 C 21.663366,21.135948 31.947853,26.54939 30.855772,24.153878 C 29.785572,21.806364 17.408039,24.595241 18.709552,20.667209"
1976 id="path5355"
1977 sodipodi:nodetypes="czz" />
1978 <path
1979 sodipodi:nodetypes="czz"
1980 id="path5357"
1981 d="M 26.784723,27.671888 C 21.538638,20.412631 31.520563,26.487432 30.374151,23.604157 C 29.072638,20.330797 18.198646,24.276982 18.806217,20.406815"
1982 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#729fcf;stroke-width:0.99999994;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
1983 <g
1984 transform="matrix(0.530612,0,0,0.53095,3.140616,3.404111)"
1985 id="g5359"
1986 style="display:inline">
1987 <path
1988 sodipodi:nodetypes="csccscc"
1989 id="path5361"
1990 d="M 14.375479,32.558794 C 14.375479,32.558794 15.592355,37.45777 10.51915,37.50376 C 8.0888743,37.525507 8.5866723,41.509781 8.5866723,41.509781 L 39.433139,41.478634 C 39.433139,41.478634 39.851577,37.611393 37.410922,37.566053 C 32.423455,37.474579 33.600393,32.496503 33.600393,32.496503 L 14.375479,32.558794 z "
1991 style="opacity:1;color:black;fill:url(#linearGradient2308);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.88401449;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
1992 <path
1993 sodipodi:nodetypes="ccccc"
1994 id="path5363"
1995 d="M 13.926195,33.027451 C 14.010206,35.2 13.641655,35.938894 12.285731,36.702682 L 36,38 C 35.047008,36.831372 33.660837,35.066666 34.038883,33.011765 L 13.926195,33.027451 z "
1996 style="opacity:0.5;fill:url(#linearGradient2310);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
1997 <path
1998 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#8d8d8f;stroke-width:1.88401508px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:0.43902438"
1999 d="M 10.436202,38.661601 C 17.000465,38.66357 37.562637,38.661601 37.562637,38.661601"
2000 id="path5365"
2001 sodipodi:nodetypes="cc" />
2002 <path
2003 sodipodi:nodetypes="cc"
2004 id="path5367"
2005 d="M 11.134219,39.660187 C 17.146756,39.662156 36.881517,39.660187 36.881517,39.660187"
2006 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:1.88401532px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
2007 </g>
2008 <path
2009 sodipodi:nodetypes="ccccccccc"
2010 id="path5369"
2011 d="M 3.602229,1.4999996 L 28.319154,1.4999996 C 29.631932,1.4999996 30.588653,2.4197694 30.588653,3.8361498 L 30.595753,20.072828 C 30.595753,21.162945 30.253253,21.499994 29.276792,21.499994 L 2.7228402,21.487795 C 1.9583807,21.469246 1.414291,21.169109 1.404027,20.186855 L 1.4138652,3.7151949 C 1.4138652,2.572403 2.4117826,1.4999996 3.602229,1.4999996 z "
2012 style="fill:url(#linearGradient5147);fill-opacity:1;fill-rule:evenodd;stroke:#888a85;stroke-width:1.00000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2013 <rect
2014 y="3.5000005"
2015 x="3.4999971"
2016 height="15.194118"
2017 width="25.103695"
2018 id="rect5371"
2019 style="fill:url(#radialGradient5239);fill-opacity:1;fill-rule:evenodd;stroke:#204a87;stroke-width:0.99999958px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2020 <path
2021 sodipodi:nodetypes="ccccc"
2022 id="path5373"
2023 d="M 4.0984042,4.0204313 L 4.0984042,15.748091 C 15.025941,14.866132 19.115514,9.1623492 28,8.5664313 L 28,4 L 4.0984042,4.0204313 z "
2024 style="opacity:0.5;fill:url(#linearGradient6246);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline" />
2025 <path
2026 sodipodi:nodetypes="cccsccscccc"
2027 id="path5375"
2028 d="M 4.056094,2.4999991 C 3.2398944,2.4999991 2.4960113,3.2952856 2.4960113,4.0741096 L 2.4960108,19.789734 C 2.4999206,20.160319 2.5869303,20.275382 2.6715202,20.346431 C 2.7561101,20.417479 2.9348114,20.473541 3.2370502,20.480806 L 28.783404,20.500002 C 29.189758,20.500002 29.318189,20.437946 29.368434,20.384824 C 29.418681,20.3317 29.504941,20.138678 29.504941,19.674554 L 29.504942,4.1892884 C 29.504942,3.0791795 28.874178,2.4999991 27.866855,2.4999991 L 4.056094,2.4999991 z "
2029 style="fill:none;fill-opacity:1;fill-rule:evenodd;stroke:white;stroke-width:0.99999958;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;display:inline" />
2030 <g
2031 id="g5377"
2032 transform="matrix(1.543206e-2,0,0,1.215502e-2,29.57023,28.01728)"
2033 style="display:inline">
2034 <rect
2035 y="-150.69685"
2036 x="-1559.2523"
2037 height="478.35718"
2038 width="1339.6335"
2039 id="rect6709"
2040 style="opacity:0.40206185;color:black;fill:url(#linearGradient5478);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2041 <path
2042 sodipodi:nodetypes="cccc"
2043 id="path5380"
2044 d="M -219.61876,-150.68038 C -219.61876,-150.68038 -219.61876,327.65041 -219.61876,327.65041 C -76.744594,328.55086 125.78146,220.48075 125.78138,88.454235 C 125.78138,-43.572302 -33.655436,-150.68036 -219.61876,-150.68038 z "
2045 style="opacity:0.40206185;color:black;fill:url(#radialGradient2309);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2046 <path
2047 style="opacity:0.40206185;color:black;fill:url(#radialGradient2311);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:round;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2048 d="M -1559.2523,-150.68038 C -1559.2523,-150.68038 -1559.2523,327.65041 -1559.2523,327.65041 C -1702.1265,328.55086 -1904.6525,220.48075 -1904.6525,88.454235 C -1904.6525,-43.572302 -1745.2157,-150.68036 -1559.2523,-150.68038 z "
2049 id="path5382"
2050 sodipodi:nodetypes="cccc" />
2051 </g>
2052 <path
2053 sodipodi:nodetypes="ccccccccc"
2054 id="path5384"
2055 d="M 3.643761,26.504783 L 28.921938,26.504783 C 29.226374,26.504783 29.788645,26.492665 30,27 L 31.5,30 C 31.5625,30.406064 31.487026,31.562501 30,31.562501 L 2.5,31.500001 C 1,31.562501 1.0652178,30.281064 1.0652178,30 L 3,27 C 3.2113561,26.492665 3.3393239,26.504783 3.643761,26.504783 z "
2056 style="color:black;fill:url(#linearGradient3905);fill-opacity:1;fill-rule:nonzero;stroke:#888a85;stroke-width:0.99999976;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2057 <path
2058 sodipodi:nodetypes="ccccccccc"
2059 id="path5386"
2060 d="M 4.0955909,27.111942 L 28.49679,27.10614 C 28.788541,27.10614 28.820868,27.10614 29.023418,27.449588 L 30.420658,30.150759 C 30.420658,30.341029 30.185782,30.494207 29.894029,30.494207 L 2.6782341,30.500011 C 2.3864818,30.500011 2.1516056,30.346832 2.1516056,30.156562 L 3.5689622,27.45539 C 3.7715117,27.111942 3.8038386,27.111942 4.0955909,27.111942 z "
2061 style="opacity:1;color:black;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:white;stroke-width:0.99999964;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2062 <path
2063 sodipodi:nodetypes="csssssssccssssssssssssccccssscccccccccssssssssssssccsssssssssccccccc"
2064 id="path5388"
2065 d="M 4.9039459,26.500588 C 4.9019723,26.502459 4.9057445,26.514939 4.9039459,26.516406 C 4.89444,26.51889 4.8714034,26.528697 4.8616746,26.532224 C 4.8584281,26.533516 4.8437789,26.530815 4.840539,26.532224 C 4.8373165,26.533749 4.8225981,26.546397 4.8194034,26.548041 C 4.8130911,26.551565 4.8043634,26.559861 4.7982678,26.563859 C 4.7952901,26.565977 4.7800294,26.57744 4.7771322,26.579677 C 4.7743261,26.582033 4.7587013,26.593017 4.7559967,26.595495 C 4.7139608,26.641114 4.6696929,26.720423 4.6080475,26.816941 L 3.1646057,29.221226 C 3.1646057,29.224233 3.1644578,29.234029 3.1646057,29.237043 C 3.1648991,29.240062 3.1641691,29.249843 3.1646057,29.25286 C 3.1651831,29.255877 3.1638899,29.265668 3.1646057,29.268679 C 3.1663094,29.274683 3.1835077,29.294359 3.1857413,29.300313 C 3.1869871,29.303274 3.184369,29.31319 3.1857413,29.316132 C 3.1902312,29.324886 3.2013114,29.339269 3.2068769,29.347766 C 3.2127868,29.356161 3.2211123,29.37137 3.2280125,29.379402 C 3.230418,29.382033 3.2466397,29.392637 3.2491481,29.395219 C 3.2517571,29.39775 3.2675765,29.408562 3.2702837,29.411038 C 3.287102,29.425545 3.313719,29.446427 3.3336905,29.45849 C 3.3370984,29.460423 3.3513413,29.472456 3.3548262,29.474308 C 3.3655167,29.479116 3.3855128,29.485766 3.3970973,29.490126 C 3.4750042,29.516899 3.5780713,29.537579 3.6718601,29.537579 L 18.650036,29.537579 L 18.586629,26.500592 L 5.1153018,26.500588 C 5.0709049,26.500588 5.0221446,26.49941 4.9884883,26.500588 C 4.9806133,26.500623 4.9547729,26.500899 4.9462171,26.500588 C 4.9436075,26.500603 4.9274517,26.500458 4.9250814,26.500588 C 4.9232514,26.502034 4.9059195,26.498718 4.9039459,26.500588 z M 19.83363,26.500592 L 19.897036,27.512921 L 23.553495,27.512921 L 23.38441,26.500592 L 19.83363,26.500592 z M 24.652546,26.500592 L 25.413428,29.537579 L 28.795124,29.537579 C 28.888912,29.537579 28.991979,29.516899 29.069886,29.490126 C 29.081471,29.485766 29.101467,29.479116 29.112157,29.474308 C 29.115641,29.472456 29.129884,29.460423 29.133293,29.45849 C 29.153265,29.446427 29.179882,29.425545 29.1967,29.411038 C 29.199407,29.408562 29.215227,29.39775 29.217835,29.395219 C 29.220344,29.392637 29.236565,29.382033 29.238971,29.379402 C 29.245871,29.37137 29.254196,29.356161 29.260107,29.347766 C 29.265672,29.339269 29.276752,29.324886 29.281242,29.316132 C 29.282614,29.31319 29.279996,29.303274 29.281242,29.300313 C 29.283476,29.294359 29.300674,29.274683 29.302378,29.268679 C 29.303093,29.265668 29.3018,29.255877 29.302378,29.25286 C 29.302814,29.249843 29.302083,29.240062 29.302378,29.237043 C 29.302527,29.234029 29.302378,29.224233 29.302378,29.221226 L 28.119129,26.816941 C 28.057483,26.720424 28.013215,26.641114 27.97118,26.595495 C 27.968475,26.593017 27.95285,26.582033 27.950044,26.579677 C 27.947147,26.57744 27.931886,26.565977 27.928908,26.563859 C 27.922812,26.559861 27.914085,26.551565 27.907773,26.548041 C 27.904579,26.546397 27.88986,26.533749 27.886638,26.532224 C 27.883397,26.530815 27.868747,26.533516 27.865502,26.532224 C 27.855773,26.528697 27.832737,26.51889 27.823231,26.516406 C 27.812787,26.51452 27.796296,26.503902 27.780959,26.500588 C 27.773263,26.49907 27.745738,26.501448 27.738688,26.500588 C 27.705031,26.49941 27.656271,26.500588 27.611875,26.500588 L 24.652546,26.500592 z M 20.679054,28.525249 L 20.002715,29.537579 L 23.891664,29.537579 L 23.04624,28.525249 L 20.679054,28.525249 z "
2066 style="color:black;fill:#d3d7cf;fill-opacity:1;fill-rule:nonzero;stroke:#babdb6;stroke-width:0.99999923;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" />
2067 <rect
2068 style="color:black;fill:url(#radialGradient3248);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2069 id="rect5390"
2070 width="1"
2071 height="1"
2072 x="5"
2073 y="26"
2074 rx="0.26516503"
2075 ry="0.26516503" />
2076 <rect
2077 style="color:black;fill:url(#radialGradient3245);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2078 id="rect5392"
2079 width="1"
2080 height="1"
2081 x="7"
2082 y="26"
2083 rx="0.26516503"
2084 ry="0.26516503" />
2085 <rect
2086 style="color:black;fill:url(#radialGradient3242);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2087 id="rect5394"
2088 width="1"
2089 height="1"
2090 x="9"
2091 y="26"
2092 rx="0.26516503"
2093 ry="0.26516503" />
2094 <rect
2095 style="color:black;fill:url(#radialGradient3239);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2096 id="rect5396"
2097 width="1"
2098 height="1"
2099 x="11"
2100 y="26"
2101 rx="0.26516503"
2102 ry="0.26516503" />
2103 <rect
2104 style="color:black;fill:url(#radialGradient3236);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2105 id="rect5398"
2106 width="1"
2107 height="1"
2108 x="13"
2109 y="26"
2110 rx="0.26516503"
2111 ry="0.26516503" />
2112 <rect
2113 style="color:black;fill:url(#radialGradient3233);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2114 id="rect5400"
2115 width="1"
2116 height="1"
2117 x="15"
2118 y="26"
2119 rx="0.26516503"
2120 ry="0.26516503" />
2121 <rect
2122 style="color:black;fill:url(#radialGradient3230);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2123 id="rect5402"
2124 width="1"
2125 height="1"
2126 x="17"
2127 y="26"
2128 rx="0.26516503"
2129 ry="0.26516503" />
2130 <rect
2131 style="color:black;fill:url(#radialGradient3224);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2132 id="rect5404"
2133 width="1"
2134 height="1"
2135 x="4"
2136 y="27"
2137 rx="0.26516503"
2138 ry="0.26516503" />
2139 <rect
2140 style="color:black;fill:url(#radialGradient3221);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2141 id="rect5406"
2142 width="1"
2143 height="1"
2144 x="6"
2145 y="27"
2146 rx="0.26516503"
2147 ry="0.26516503" />
2148 <rect
2149 style="color:black;fill:url(#radialGradient3218);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2150 id="rect5408"
2151 width="1"
2152 height="1"
2153 x="8"
2154 y="27"
2155 rx="0.26516503"
2156 ry="0.26516503" />
2157 <rect
2158 style="color:black;fill:url(#radialGradient3215);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2159 id="rect5410"
2160 width="1"
2161 height="1"
2162 x="10"
2163 y="27"
2164 rx="0.26516503"
2165 ry="0.26516503" />
2166 <rect
2167 style="color:black;fill:url(#radialGradient3212);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2168 id="rect5412"
2169 width="1"
2170 height="1"
2171 x="12"
2172 y="27"
2173 rx="0.26516503"
2174 ry="0.26516503" />
2175 <rect
2176 style="color:black;fill:url(#radialGradient3209);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2177 id="rect5414"
2178 width="1"
2179 height="1"
2180 x="14"
2181 y="27"
2182 rx="0.26516503"
2183 ry="0.26516503" />
2184 <rect
2185 style="color:black;fill:url(#radialGradient3206);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2186 id="rect5416"
2187 width="1"
2188 height="1"
2189 x="16"
2190 y="27"
2191 rx="0.26516503"
2192 ry="0.26516503" />
2193 <rect
2194 style="color:black;fill:url(#radialGradient3203);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2195 id="rect5418"
2196 width="1"
2197 height="1"
2198 x="18"
2199 y="27"
2200 rx="0.26516503"
2201 ry="0.26516503" />
2202 <rect
2203 style="color:black;fill:url(#radialGradient3200);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2204 id="rect5420"
2205 width="1"
2206 height="1"
2207 x="5"
2208 y="28"
2209 rx="0.26516503"
2210 ry="0.26516503" />
2211 <rect
2212 style="color:black;fill:url(#radialGradient3197);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2213 id="rect5422"
2214 width="1"
2215 height="1"
2216 x="7"
2217 y="28"
2218 rx="0.26516503"
2219 ry="0.26516503" />
2220 <rect
2221 style="color:black;fill:url(#radialGradient3194);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2222 id="rect5424"
2223 width="1"
2224 height="1"
2225 x="9"
2226 y="28"
2227 rx="0.26516503"
2228 ry="0.26516503" />
2229 <rect
2230 style="color:black;fill:url(#radialGradient3191);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2231 id="rect5426"
2232 width="1"
2233 height="1"
2234 x="11"
2235 y="28"
2236 rx="0.26516503"
2237 ry="0.26516503" />
2238 <rect
2239 style="color:black;fill:url(#radialGradient3188);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2240 id="rect5428"
2241 width="1"
2242 height="1"
2243 x="13"
2244 y="28"
2245 rx="0.26516503"
2246 ry="0.26516503" />
2247 <rect
2248 style="color:black;fill:url(#radialGradient3185);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2249 id="rect5430"
2250 width="1"
2251 height="1"
2252 x="15"
2253 y="28"
2254 rx="0.26516503"
2255 ry="0.26516503" />
2256 <rect
2257 style="color:black;fill:url(#radialGradient3182);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2258 id="rect5432"
2259 width="1"
2260 height="1"
2261 x="17"
2262 y="28"
2263 rx="0.26516503"
2264 ry="0.26516503" />
2265 <rect
2266 style="color:black;fill:url(#radialGradient3176);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2267 id="rect5434"
2268 width="1"
2269 height="1"
2270 x="4"
2271 y="29"
2272 rx="0.26516503"
2273 ry="0.26516503" />
2274 <rect
2275 style="color:black;fill:url(#radialGradient3173);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2276 id="rect5436"
2277 width="1"
2278 height="1"
2279 x="6"
2280 y="29"
2281 rx="0.26516503"
2282 ry="0.26516503" />
2283 <rect
2284 style="color:black;fill:url(#radialGradient3170);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2285 id="rect5438"
2286 width="1"
2287 height="1"
2288 x="8"
2289 y="29"
2290 rx="0.26516503"
2291 ry="0.26516503" />
2292 <rect
2293 style="color:black;fill:url(#radialGradient3167);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2294 id="rect5440"
2295 width="1"
2296 height="1"
2297 x="10"
2298 y="29"
2299 rx="0.26516503"
2300 ry="0.26516503" />
2301 <rect
2302 style="color:black;fill:url(#radialGradient3164);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2303 id="rect5442"
2304 width="1"
2305 height="1"
2306 x="12"
2307 y="29"
2308 rx="0.26516503"
2309 ry="0.26516503" />
2310 <rect
2311 style="color:black;fill:url(#radialGradient3161);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2312 id="rect5444"
2313 width="1"
2314 height="1"
2315 x="14"
2316 y="29"
2317 rx="0.26516503"
2318 ry="0.26516503" />
2319 <rect
2320 style="color:black;fill:url(#radialGradient3158);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2321 id="rect5446"
2322 width="1"
2323 height="1"
2324 x="16"
2325 y="29"
2326 rx="0.26516503"
2327 ry="0.26516503" />
2328 <rect
2329 style="color:black;fill:url(#radialGradient3155);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2330 id="rect5448"
2331 width="1"
2332 height="1"
2333 x="18"
2334 y="29"
2335 rx="0.26516503"
2336 ry="0.26516503" />
2337 <rect
2338 style="color:black;fill:url(#radialGradient3264);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2339 id="rect5450"
2340 width="1"
2341 height="1"
2342 x="21"
2343 y="26"
2344 rx="0.26516503"
2345 ry="0.26516503" />
2346 <rect
2347 style="color:black;fill:url(#radialGradient3266);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2348 id="rect5452"
2349 width="1"
2350 height="1"
2351 x="20"
2352 y="27"
2353 rx="0.26516503"
2354 ry="0.26516503" />
2355 <rect
2356 style="color:black;fill:url(#radialGradient3268);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2357 id="rect5454"
2358 width="1"
2359 height="1"
2360 x="22"
2361 y="27"
2362 rx="0.26516503"
2363 ry="0.26516503" />
2364 <rect
2365 style="color:black;fill:url(#radialGradient3270);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2366 id="rect5456"
2367 width="1"
2368 height="1"
2369 x="21"
2370 y="28"
2371 rx="0.26516503"
2372 ry="0.26516503" />
2373 <rect
2374 style="color:black;fill:url(#radialGradient3272);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2375 id="rect5458"
2376 width="1"
2377 height="1"
2378 x="23"
2379 y="28"
2380 rx="0.26516503"
2381 ry="0.26516503" />
2382 <rect
2383 style="color:black;fill:url(#radialGradient3274);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2384 id="rect5460"
2385 width="1"
2386 height="1"
2387 x="20"
2388 y="29"
2389 rx="0.26516503"
2390 ry="0.26516503" />
2391 <rect
2392 style="color:black;fill:url(#radialGradient3276);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2393 id="rect5462"
2394 width="1"
2395 height="1"
2396 x="22"
2397 y="29"
2398 rx="0.26516503"
2399 ry="0.26516503" />
2400 <rect
2401 style="color:black;fill:url(#radialGradient3292);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2402 id="rect5464"
2403 width="1"
2404 height="1"
2405 x="26"
2406 y="26"
2407 rx="0.26516503"
2408 ry="0.26516503" />
2409 <rect
2410 style="color:black;fill:url(#radialGradient3294);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2411 id="rect5466"
2412 width="1"
2413 height="1"
2414 x="25"
2415 y="27"
2416 rx="0.26516503"
2417 ry="0.26516503" />
2418 <rect
2419 style="color:black;fill:url(#radialGradient3296);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2420 id="rect5468"
2421 width="1"
2422 height="1"
2423 x="27"
2424 y="27"
2425 rx="0.26516503"
2426 ry="0.26516503" />
2427 <rect
2428 style="color:black;fill:url(#radialGradient3298);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2429 id="rect5470"
2430 width="1"
2431 height="1"
2432 x="26"
2433 y="28"
2434 rx="0.26516503"
2435 ry="0.26516503" />
2436 <rect
2437 style="color:black;fill:url(#radialGradient3300);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2438 id="rect5472"
2439 width="1"
2440 height="1"
2441 x="28"
2442 y="28"
2443 rx="0.26516503"
2444 ry="0.26516503" />
2445 <rect
2446 style="color:black;fill:url(#radialGradient3302);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2447 id="rect5474"
2448 width="1"
2449 height="1"
2450 x="25"
2451 y="29"
2452 rx="0.26516503"
2453 ry="0.26516503" />
2454 <rect
2455 style="color:black;fill:url(#radialGradient3304);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:square;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible"
2456 id="rect5476"
2457 width="1"
2458 height="1"
2459 x="27"
2460 y="29"
2461 rx="0.26516503"
2462 ry="0.26516503" />
2463 </g>
2464 </g>
2465 </g>
2466</svg>
diff --git a/snapcraft.yaml b/snapcraft.yaml
index f67838b..18ba003 100644
--- a/snapcraft.yaml
+++ b/snapcraft.yaml
@@ -1,3 +1,4 @@
1<<<<<<< snapcraft.yaml
1name: pulseaudio2name: pulseaudio
2version: 8.0-33version: 8.0-3
3summary: PulseAudio sound server4summary: PulseAudio sound server
@@ -148,3 +149,246 @@ parts:
148149
149 snap:150 snap:
150 - $pauseaudiofiles151 - $pauseaudiofiles
152=======
153name: network-manager
154version: 1.2.2-10
155summary: Network management framework
156description: |
157 NetworkManager is a system network service that manages your network
158 devices and connections, attempting to keep active network connectivity
159 when available. It manages ethernet, WiFi, mobile broadband (WWAN) and
160 PPPoE devices, provides VPN integration with a variety of different
161 VPN serivces.
162 Please find the source code at https://code.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
163confinement: strict
164grade: stable
165
166slots:
167 service: network-manager
168
169plugs:
170 nmcli: network-manager
171
172apps:
173 nmcli:
174 command: usr/bin/nmcli
175 plugs: [nmcli]
176 aliases:
177 - nmcli
178 networkmanager:
179 command: bin/networkmanager
180 daemon: simple
181 slots: [service]
182 plugs: [modem-manager, ppp, network-setup-observe]
183 # FIXME: This will create currently a symlink inside /snap/bin
184 # which points nowhere as the service isn't exposed as application
185 # for the user. Instead snapd needs to gain support to handle
186 # aliases for services differently by adding the Alias= option
187 # within the systemd unit file instead for example. Until this
188 # is implemented we keep the alias disabled.
189 #
190 # aliases:
191 # - NetworkManager
192
193parts:
194 hooks:
195 plugin: dump
196 source: hooks
197 organize:
198 configure: meta/hooks/configure
199
200 networkmanager-common:
201 plugin: copy
202 files:
203 bin/networkmanager: bin/networkmanager
204 bin/dhcp-lease-mover: bin/dhcp-lease-mover
205 conf/NetworkManager.conf: etc/NetworkManager/NetworkManager.conf
206 data/copyright: usr/share/doc/network-manager/copyright
207 startup-hooks/99-wol-by-default.sh: startup-hooks/99-wol-by-default.sh
208
209 inotify-tools:
210 plugin: nil
211 stage-packages:
212 - libinotifytools0
213 - inotify-tools
214 filesets:
215 wanted:
216 - usr/share/doc/inotify-tools/copyright
217 - usr/bin/inotifywait
218 - usr/share/doc/libinotifytools0/copyright
219 - usr/lib/libinotifytools.so.0.4.1
220 - usr/lib/libinotifytools.so.0
221 snap:
222 - $wanted
223
224 networkmanager:
225 plugin: autotools
226
227 source: https://git.launchpad.net/~snappy-hwe-team/snappy-hwe-snaps/+git/network-manager
228 source-type: git
229 # For development you can directly build from the xenial branch if
230 # needed. Otherwise use the tag to the latest version which will be
231 # used by the published snap.
232 # source-branch: network-manager/xenial/1.2.2
233 source-tag: network-manager-xenial-1.2.2-2
234
235 build-packages:
236 - intltool
237 - gtk-doc-tools
238 - libdbus-glib-1-dev
239 - libdbus-1-dev
240 - libiw-dev
241 - libglib2.0-dev
242 - libnl-3-dev
243 - libnl-route-3-dev
244 - libnl-genl-3-dev
245 - libnss3-dev
246 - libgnutls28-dev
247 - libgcrypt11-dev
248 - uuid-dev
249 - systemd
250 - libsystemd-dev
251 - libudev-dev
252 - libgudev-1.0-dev
253 - libgirepository1.0-dev
254 - gobject-introspection
255 - libglib2.0-doc
256 - libmm-glib-dev
257 - libndp-dev
258 - libreadline-dev
259 - libnewt-dev
260 - dbus-test-runner
261 - isc-dhcp-client
262 - python-dbus
263 - python-gi
264 - iptables
265 - ppp-dev
266
267 # We stage everything here we need for build and runtime
268 stage-packages:
269 - iputils-arping
270 - iw
271 - libc6
272 - libdbus-1-3
273 - libdbus-glib-1-2
274 - libgcrypt20
275 - libglib2.0-0
276 - libgudev-1.0-0
277 - libiw-dev
278 - libmbim-glib4
279 - libndp0
280 - libnl-3-200
281 - libnl-3-dev
282 - libnl-genl-3-200
283 - libnl-route-3-200
284 - libpam-systemd
285 - libreadline6
286 - libsystemd0
287 - libuuid1
288 - lsb-base
289 - uuid-dev
290 - wireless-tools
291
292 configflags:
293 # Disable all features we don't want enabled as we're not
294 # supporting them (yet).
295 - --prefix=/usr
296 - --libdir=/usr/lib
297 - --libexecdir=/usr/lib/NetworkManager
298 - --disable-qt
299 - --disable-teamdctl
300 - --disable-polkit
301 - --disable-vala
302 - --disable-config-plugin-ibft
303 - --with-dhcpcd=no
304 - --with-dhclient=no
305 - --with-dnsmasq=no
306 - --with-systemd-journal=no
307 - --with-session-tracking=no
308 # We only support suspend/resume tracking together with systemd/logind
309 # at the moment.
310 - --with-suspend-resume=systemd
311 # Removes dependency on libicudata which weights 25M. Also libsoup
312 # is only used to verify a domain in the DNS resolve process has a
313 # valid format and to check if a valid internet connection is available.
314 - --with-libsoup=no
315 # We want to support ModemManager
316 - --with-modem-manager-1=yes
317
318 # Filter files pulled in by stage-packages so they aren't
319 # included in the final snap. We only need them to build
320 # NetworkManager. All runtime dependencies are pulled in with
321 # the rdepends part below. The only left items specified
322 # here are the results of the network manager build.
323 filesets:
324 binaries:
325 - usr/bin/nmcli
326 - usr/lib/*/NetworkManager
327 - usr/lib/pppd/2.4.5/nm-pppd-plugin.so
328 - usr/lib/NetworkManager
329 - usr/sbin/NetworkManager
330 - usr/lib/*/libnm-*
331 configs:
332 - etc/NetworkManager/*
333 docs:
334 - usr/share/doc
335 rdepends:
336 - lib64/*
337 - lib/*/
338 - usr/lib/*
339 unwanted:
340 # We don't want anything in usr/share but the doc folder
341 # to carry all copyright information
342 - -usr/share/bash-completion
343 - -usr/share/bug
344 - -usr/share/dbus-1
345 - -usr/share/gir-1.0
346 - -usr/share/glib-2.0
347 - -usr/share/gtk-doc
348 - -usr/share/lintian
349 - -usr/share/locale
350 - -usr/share/man
351 - -usr/share/pam-configs
352 - -usr/share/polkit-1
353 - -usr/share/upstart
354
355 # We don't use dhclient so we don't need this helper
356 - -usr/lib/NetworkManager/nm-dhcp-helper
357 # Things we don't support yet and don't have to ship
358 - -usr/lib/NetworkManager/libnm-device-plugin-adsl.so
359 - -usr/lib/NetworkManager/libnm-device-plugin-bluetooth.so
360 - -usr/lib/NetworkManager/libnm-settings-plugin-ibft.so
361
362 # Unwanted content coming from the stage debian packages
363 - -etc/
364 # Contains many libraries which are already present in usr/lib/
365 - -lib/
366 - -usr/include/
367 - -usr/etc
368 - -usr/sbin/invoke-rc.d
369 - -usr/sbin/service
370 - -usr/sbin/update-rc.d
371 - -usr/lib/dbus-1.0/
372 - -usr/lib/tmpfiles.d/
373 - -usr/lib/*/pkgconfig
374 - -usr/lib/pkgconfig
375 - -usr/lib/gcc/
376 - -usr/lib/*/gconv/
377 - -usr/lib/girepository-1.0/
378 - -usr/lib/systemd/
379 - -usr/lib/udev/
380 - -usr/lib/*.a
381 - -usr/lib/*/*.a
382 - -usr/lib/*.la
383 - -usr/lib/*/*.la
384 - -usr/lib/*/*.o
385 - -usr/lib/*/systemd-shim
386 - -usr/lib/*/systemd-shim-cgroup-release-agent
387 snap:
388 - $binaries
389 - $configs
390 - $docs
391 - $rdepends
392 - $unwanted
393
394>>>>>>> snapcraft.yaml
diff --git a/spread.yaml b/spread.yaml
index 0c615ba..2969c2d 100644
--- a/spread.yaml
+++ b/spread.yaml
@@ -1,5 +1,9 @@
1#1#
2<<<<<<< spread.yaml
2# Copyright (C) 2016 Canonical Ltd3# Copyright (C) 2016 Canonical Ltd
4=======
5# Copyright (C) 2015, 2016 Canonical Ltd
6>>>>>>> spread.yaml
3#7#
4# This program is free software: you can redistribute it and/or modify8# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU General Public License version 3 as9# it under the terms of the GNU General Public License version 3 as
@@ -13,12 +17,22 @@
13# You should have received a copy of the GNU General Public License17# You should have received a copy of the GNU General Public License
14# along with this program. If not, see <http://www.gnu.org/licenses/>.18# along with this program. If not, see <http://www.gnu.org/licenses/>.
1519
20<<<<<<< spread.yaml
16project: pulseaudio21project: pulseaudio
1722
18environment:23environment:
19 PROJECT_PATH: /home/pulseaudio24 PROJECT_PATH: /home/pulseaudio
20 TESTSLIB: $PROJECT_PATH/tests/lib25 TESTSLIB: $PROJECT_PATH/tests/lib
21 SNAP_NAME: pulseaudio26 SNAP_NAME: pulseaudio
27=======
28
29project: network-manager
30
31environment:
32 PROJECT_PATH: /home/network-manager
33 TESTSLIB: $PROJECT_PATH/tests/lib
34 SNAP_NAME: network-manager
35>>>>>>> spread.yaml
22 # Allow the host to pass the channel to use for the test run36 # Allow the host to pass the channel to use for the test run
23 SNAP_CHANNEL: $(HOST:echo $SNAP_CHANNEL)37 SNAP_CHANNEL: $(HOST:echo $SNAP_CHANNEL)
2438
@@ -30,7 +44,11 @@ backends:
30 password: test44 password: test
3145
32# Put this somewhere where we have read-write access46# Put this somewhere where we have read-write access
47<<<<<<< spread.yaml
33path: /home/pulseaudio48path: /home/pulseaudio
49=======
50path: /home/network-manager
51>>>>>>> spread.yaml
3452
35exclude:53exclude:
36 - .git54 - .git
@@ -38,13 +56,45 @@ exclude:
38prepare: |56prepare: |
39 . $TESTSLIB/prepare-all.sh57 . $TESTSLIB/prepare-all.sh
4058
59<<<<<<< spread.yaml
41suites:60suites:
42 tests/main/:61 tests/main/:
43 summary: Full-system tests for PulseAudio62 summary: Full-system tests for PulseAudio
63=======
64# Default is 15 min but we use a higher one here as we build the entire
65# network-manager snap inside the global prepare step so we need quite
66# some time. Once we can reuse artifacts from other builds we can change
67# this back to the default.
68kill-timeout: 30m
69
70suites:
71 tests/main/:
72 summary: Full-system tests for NetworkManager without ethernet support
73>>>>>>> spread.yaml
44 systems:74 systems:
45 - ubuntu-core-1675 - ubuntu-core-16
46 prepare: |76 prepare: |
47 . $TESTSLIB/prepare.sh77 . $TESTSLIB/prepare.sh
48 restore-each: |78 restore-each: |
49 . $TESTSLIB/restore-each.sh79 . $TESTSLIB/restore-each.sh
80<<<<<<< spread.yaml
5081
82=======
83 tests/full/:
84 summary: Full-system tests for NetworkManager being the only network management service
85 systems:
86 - ubuntu-core-16
87 prepare: |
88 . $TESTSLIB/utilities.sh
89 stop_after_first_reboot
90 switch_netplan_to_network_manager
91 . $TESTSLIB/prepare.sh
92 REBOOT
93 restore-each: |
94 . $TESTSLIB/restore-each.sh
95 restore: |
96 . $TESTSLIB/utilities.sh
97 stop_after_first_reboot
98 switch_netplan_to_networkd
99 REBOOT
100>>>>>>> spread.yaml
diff --git a/startup-hooks/99-wol-by-default.sh b/startup-hooks/99-wol-by-default.sh
51new file mode 100755101new file mode 100755
index 0000000..c2d4480
--- /dev/null
+++ b/startup-hooks/99-wol-by-default.sh
@@ -0,0 +1,13 @@
1#!/bin/sh
2
3# Enable wake-on-lan by default until we have a configuration
4# hook to do that.
5if [ ! -e $SNAP_DATA/conf.d/enable-wol.conf ] ; then
6 mkdir -p $SNAP_DATA/conf.d
7 cat <<-EOF > $SNAP_DATA/conf.d/enable-wol.conf
8 [connection]
9 # Value 64 maps to the 'magic' setting; see man nm-settings
10 # for more information.
11 802-3-ethernet.wake-on-lan=64
12 EOF
13fi
diff --git a/tests/full/correct-dns-setup/task.yaml b/tests/full/correct-dns-setup/task.yaml
0new file mode 10064414new file mode 100644
index 0000000..9b6dfe0
--- /dev/null
+++ b/tests/full/correct-dns-setup/task.yaml
@@ -0,0 +1,47 @@
1summary: Verify correct DNS setup
2
3execute: |
4 . $TESTSLIB/utilities.sh
5 case $SPREAD_REBOOT in
6 0)
7 # For correct timing if the device has just booted
8 wait_for_network_manager
9
10 # Precondition is a existing network connection
11 /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
12
13 # We get a default nameserver from the gateway
14 if [ "$SPREAD_BACKEND" = "qemu" ] ; then
15 cat /etc/resolv.conf | grep 'nameserver 10.0.2.3'
16 fi
17
18 # Ensure we can resolve a hostname correctly; must give a
19 # valid IP address
20 address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
21 [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
22
23 # Now lets switch to a system where we have a configuration
24 # for ethernet we can change
25 rm /etc/netplan/00-snapd-config.yaml
26 REBOOT
27 ;;
28 1)
29 /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
30 /snap/bin/network-manager.nmcli d | grep -v netplan
31
32 connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
33 /snap/bin/network-manager.nmcli c modify $connection ipv4.dns 8.8.8.8
34 # We need to bring up the connection again here to get the DNS
35 # server really applied to the system.
36 /snap/bin/network-manager.nmcli c up $connection
37
38 # Give system a moment to settle
39 sleep 1
40
41 grep 'nameserver 8.8.8.8' /etc/resolv.conf
42 address=`python3 -c 'import socket; print(socket.gethostbyname("ubuntu.com"))' 2> /dev/null || echo "invalid"`
43 [ "$address" != "invalid" ] && [[ $address =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]
44 ;;
45 *)
46 ;;
47 esac
diff --git a/tests/full/dhcp-leases-are-moved/task.yaml b/tests/full/dhcp-leases-are-moved/task.yaml
0new file mode 10064448new file mode 100644
index 0000000..80cf0e9
--- /dev/null
+++ b/tests/full/dhcp-leases-are-moved/task.yaml
@@ -0,0 +1,35 @@
1summary: Verify that the DHCP leases are moved to the correct location
2
3execute: |
4 . $TESTSLIB/utilities.sh
5
6 wait_for_network_manager
7
8 # We should have a single lease for eth0 at this point but give
9 # NetworkManager some time to do its job
10 test -e /run/NetworkManager/dhcp
11 test -e /var/snap/network-manager/current/state/dhcp
12 n=0
13 state_ok=0
14 while [ $n -lt 10 ] ; do
15 num_leases=`ls -1 /var/snap/network-manager/current/state/dhcp | wc -l`
16 num_public_leases=`ls -1 /run/NetworkManager/dhcp | wc -l`
17 if [ $num_leases -eq $num_public_leases ]; then
18 state_ok=1
19 break
20 fi
21 sleep 0.5
22 let n=n+1
23 done
24 test $state_ok -eq 1
25
26 # Create a new lease file and ensure it gets copied over
27 test ! -e /run/NetworkManager/dhcp/temp.lease
28 touch /var/snap/network-manager/current/state/dhcp/temp.lease
29 sleep 2
30 test -e /run/NetworkManager/dhcp/temp.lease
31 # Ensure that the lease is also removed from /run again when it
32 # gets removed from SNAP_DATA
33 rm /var/snap/network-manager/current/state/dhcp/temp.lease
34 sleep 2
35 test ! -e /var/snap/network-manager/current/state/dhcp/temp.lease
diff --git a/tests/full/immutable-netplan-config/task.yaml b/tests/full/immutable-netplan-config/task.yaml
0new file mode 10064436new file mode 100644
index 0000000..52c2d61
--- /dev/null
+++ b/tests/full/immutable-netplan-config/task.yaml
@@ -0,0 +1,9 @@
1summary: Verify that netplan configuration files are immutable
2
3execute: |
4 # Ensure we're using a configuration generated from netplan
5 test -e /etc/netplan/00-snapd-config.yaml
6 test -e /run/NetworkManager/system-connections/netplan-eth0
7 /snap/bin/network-manager.nmcli c | grep 'netplan.eth0.*eth0'
8 # Try to change the DNS server used on this connection
9 test ! `/snap/bin/network-manager.nmcli c modify netplan-eth0 ipv4.dns 8.8.8.8`
0\ No newline at end of file10\ No newline at end of file
diff --git a/tests/full/ipv6-address-assignment/task.yaml b/tests/full/ipv6-address-assignment/task.yaml
1new file mode 10064411new file mode 100644
index 0000000..e36ef00
--- /dev/null
+++ b/tests/full/ipv6-address-assignment/task.yaml
@@ -0,0 +1,27 @@
1summary: Verify NetworkManager can assign a static IPv6 address to an interface
2
3restore: |
4 # Ensure that the created virtual network interfaces are removed
5 # in any case when we're done
6 if [ -e /sys/class/net/veth0 ] ; then
7 ip link delete veth0
8 fi
9
10execute: |
11 . $TESTSLIB/utilities.sh
12
13 # Ensure that we have IPv6 support enabled in the kernel
14 test -e /proc/net/if_inet6
15
16 ip link add dev veth0 type veth peer name veth1
17
18 wait_for_network_manager
19
20 connection=veth-ipv6
21 /snap/bin/network-manager.nmcli c add con-name $connection ifname veth0 type ethernet \
22 ip6 abbe::cafe
23 /snap/bin/network-manager.nmcli c up $connection
24
25 # Verify that NetworkManager assigned the correct IPv6 address
26 # to the interface
27 ifconfig veth0 | grep 'abbe::cafe/128'
diff --git a/tests/full/ipv6-router-advertisements/task.yaml b/tests/full/ipv6-router-advertisements/task.yaml
0new file mode 10064428new file mode 100644
index 0000000..4af402b
--- /dev/null
+++ b/tests/full/ipv6-router-advertisements/task.yaml
@@ -0,0 +1,70 @@
1summary: Test IPv6 address assignment via router advertisements
2
3restore: |
4 # Ensure that the created virtual network interfaces are removed
5 # in any case when we're done
6 if [ -e /sys/class/net/veth0 ] ; then
7 ip link delete veth0
8 fi
9
10execute: |
11 . $TESTSLIB/utilities.sh
12
13 # Ensure that we have IPv6 support enabled in the kernel
14 test -e /proc/net/if_inet6
15
16 snap install --devmode se-test-tools
17 snap connect se-test-tools:home core
18 snap connect se-test-tools:network-control core
19
20 # Create virtual ethernet interface pair
21 sudo ip link add dev veth0 type veth peer name veth1
22
23 # As the virtual ethernet devices don't get IPv6 setup
24 # correctly by default we have to do this
25 sudo sysctl -w net.ipv6.conf.veth0.disable_ipv6=0
26 sudo sysctl -w net.ipv6.conf.veth1.disable_ipv6=0
27 veth0_lla=$(mac_to_ipv6 `cat /sys/class/net/veth0/address`)
28 veth1_lla=$(mac_to_ipv6 `cat /sys/class/net/veth1/address`)
29
30 # The radvd daemon will send out router advertisements on veth1
31 # so that we can receive them on veth0 end
32 cat <<-EOF > /home/test/radvd.conf
33 interface veth1 {
34 AdvSendAdvert on;
35 prefix 2001:db8:1:2::/64 {};
36 };
37 EOF
38
39 # To ensure that nobody touches veth1 we tell NetworkManager
40 # explicitly to do that.
41 /snap/bin/network-manager.nmcli d set veth1 managed no
42
43 # Assign our link-local addresses
44 if ! ip addr show dev veth0 | grep 'inet6.*scope link.*' ; then
45 sudo ip addr add dev veth0 scope link $veth0_lla
46 fi
47 if ! ip addr show dev veth1 | grep 'inet6.*scope link.*' ; then
48 sudo ip addr add dev veth1 scope link $veth1_lla
49 fi
50
51 # This will get our router advertisement daemon started and we
52 # now configure NetworkManager
53 sudo se-test-tools.radvd -C /home/test/radvd.conf -n -d 5 -m stderr -p /home/test/radvd.pid &
54
55 # Give things a bit more time to settle
56 sleep 10
57 ip addr show dev veth0
58
59 # At this point veth0 should have now a global IPv6 address
60 # assigned via router advertisements
61 ip addr show dev veth0 | grep 'inet6 2001:db8:1:2:.*/64 scope global'
62 # but veth1 should not have any
63 ip addr show dev veth1 | grep -v 'inet6.*scope global'
64
65 # NetworkManager should report the same addresses for IPv6
66 /snap/bin/network-manager.nmcli d show veth0 | grep 'GENERAL.STATE.*connected'
67 /snap/bin/network-manager.nmcli d show veth0 | grep 'IP6.ADDRESS.*2001:db8:1:2.*/64'
68
69 # Stop the radvd daemon
70 kill -TERM `cat /home/test/radvd.pid`
diff --git a/tests/full/no-netplan-default-config/task.yaml b/tests/full/no-netplan-default-config/task.yaml
0new file mode 10064471new file mode 100644
index 0000000..c0d6934
--- /dev/null
+++ b/tests/full/no-netplan-default-config/task.yaml
@@ -0,0 +1,41 @@
1summary: Verify ethernet is auto-connected when no default netplan configuration exists
2
3prepare: |
4 cp /etc/netplan/00-snapd-config.yaml /etc/netplan/00-snapd-config.yaml.orig
5
6restore: |
7 mv /etc/netplan/00-snapd-config.yaml.orig /etc/netplan/00-snapd-config.yaml
8
9execute: |
10 . $TESTSLIB/utilities.sh
11 case "$SPREAD_REBOOT" in
12 0)
13 # Remove all configuration files from netplan to get a system
14 # without generated configuration files from netplan
15 if [ -e /usr/lib/snapd/generate-network-conf ] ; then
16 echo "" > /etc/netplan/00-snapd-config.yaml
17 else
18 rm /etc/netplan/00-snapd-config.yaml
19 fi
20 REBOOT
21 ;;
22 1)
23 # We should be automatically connected now and not via a configuration
24 # generated from netplan
25 wait_for_network_manager
26 /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
27 networkctl status eth0 | grep 'State: n/a'
28 /snap/bin/network-manager.nmcli c show --active | grep eth0 | grep -v netplan
29
30 # We should only have a single active configuration
31 test `/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | wc -l` -eq 1
32
33 # Verify that we can modify the automatically created connection
34 connection=$(/snap/bin/network-manager.nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
35 /snap/bin/network-manager.nmcli c modify $connection 802-3-ethernet.wake-on-lan magic
36 wol_value=$(/snap/bin/network-manager.nmcli -f 802-3-ethernet.wake-on-lan c show $connection | xargs | cut -d':' -f 2)
37 test "$wol_value" = " 64 (magic)"
38 ;;
39 *)
40 ;;
41 esac
diff --git a/tests/full/system-network-is-active/task.yaml b/tests/full/system-network-is-active/task.yaml
0new file mode 10064442new file mode 100644
index 0000000..ee29ef0
--- /dev/null
+++ b/tests/full/system-network-is-active/task.yaml
@@ -0,0 +1,9 @@
1summary: Ethernet network should be managed by NetworkManager
2
3execute: |
4 . $TESTSLIB/utilities.sh
5 # Verify NetworManager handles ethernet and marks it as connected
6 test -e /etc/netplan/00-default-nm-renderer.yaml
7 wait_for_network_manager
8 /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
9 networkctl status eth0 | grep 'State: n/a'
diff --git a/tests/full/wol-enabled-by-default/task.yaml b/tests/full/wol-enabled-by-default/task.yaml
0new file mode 10064410new file mode 100644
index 0000000..4e1989d
--- /dev/null
+++ b/tests/full/wol-enabled-by-default/task.yaml
@@ -0,0 +1,59 @@
1summary: Verify that wake-on-lan is enabled by default for all ethernet connections
2
3execute: |
4 . $TESTSLIB/utilities.sh
5 nmcli=/snap/bin/network-manager.nmcli
6 case "$SPREAD_REBOOT" in
7 0)
8 # For correct timing if the device has just booted
9 wait_for_network_manager
10
11 # The config file needs to be present and have the correct default set
12 test -e /var/snap/network-manager/current/conf.d/enable-wol.conf
13 cat /var/snap/network-manager/current/conf.d/enable-wol.conf | grep '802-3-ethernet.wake-on-lan=64'
14
15 # Precondition is a existing network connection
16 $nmcli d | grep 'eth0.*connected'
17
18 # The netplan configuration file has WoL disabled by default as
19 # the default one the core snap provides does not explicitly
20 # enable WoL.
21 connection=$($nmcli -m multiline -f UUID c show --active | awk '{print$2;exit}')
22 $nmcli -m multiline -f connection.id c show $connection | grep 'netplan-eth0'
23 $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
24 $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '0 (none)'
25
26 # Now prepare for the next boot where we will run without a netplan
27 # config to get eth0 correctly configured.
28 rm /etc/netplan/00-snapd-config.yaml
29 REBOOT
30 ;;
31 1)
32 # For correct timing if the device has just booted
33 wait_for_network_manager
34
35 # Precondition is a existing network connection
36 $nmcli d | grep 'eth0.*connected'
37
38 # Connection should have the default wake-on-lan setting
39 connection=$($nmcli -m multiline -f UUID c show | awk '{print$2;exit}')
40 $nmcli -m multiline -f connection.type c show $connection | grep '802-3-ethernet'
41 # wake-on-lan should be set to respect the global defaults here
42 $nmcli -m multiline -f 802-3-ethernet.wake-on-lan c show $connection | grep '1 (default)'
43
44 # We can sadly only verify that the value was correctly applied when
45 # we're running the tests on a real device. QEMU doesn't support setting
46 # the WoL value of the ethernet network device.
47 if [ -z "`cat /proc/cpuinfo | grep QEMU`" ] ; then
48 # Get the tools snap to have the ethtool tool available
49 snap install --devmode --edge se-test-tools
50 snap connect se-test-tools:network core
51 snap connect se-test-tools:network-bind core
52 snap connect se-test-tools:network-control core
53
54 # See `man ethtool` for details; 'g' means 'wakeup when magic packet comes in'
55 # and is the default behavior we want.
56 /snap/bin/se-test-tools.ethtool eth0 | grep 'Wake-up: g'
57 fi
58 ;;
59 esac
diff --git a/tests/lib/prepare-all.sh b/tests/lib/prepare-all.sh
index e53efb4..ab933fd 100644
--- a/tests/lib/prepare-all.sh
+++ b/tests/lib/prepare-all.sh
@@ -6,7 +6,17 @@ if [ -n "$SNAP_CHANNEL" ] ; then
6 exit 06 exit 0
7fi7fi
88
9<<<<<<< tests/lib/prepare-all.sh
9# Setup classic snap and build the pulseaudio snap in there10# Setup classic snap and build the pulseaudio snap in there
11=======
12# If there is a network-manager snap prebuilt for us, lets take
13# that one to speed things up.
14if [ -e /home/network-manager/network-manager_*_amd64.snap ] ; then
15 exit 0
16fi
17
18# Setup classic snap and build the network-manager snap in there
19>>>>>>> tests/lib/prepare-all.sh
10snap install --devmode --beta classic20snap install --devmode --beta classic
11cat <<-EOF > /home/test/build-snap.sh21cat <<-EOF > /home/test/build-snap.sh
12#!/bin/sh22#!/bin/sh
@@ -19,6 +29,7 @@ echo "deb http://archive.ubuntu.com/ubuntu/ xenial-proposed restricted main univ
19# Ensure we have the latest updates installed as the core snap29# Ensure we have the latest updates installed as the core snap
20# may be a bit out of date.30# may be a bit out of date.
21apt update31apt update
32<<<<<<< tests/lib/prepare-all.sh
22apt upgrade --yes --force-yes33apt upgrade --yes --force-yes
2334
24apt install -y --force-yes snapcraft35apt install -y --force-yes snapcraft
@@ -27,9 +38,22 @@ snapcraft clean
27snapcraft38snapcraft
28EOF39EOF
2940
41=======
42apt full-upgrade -y --force-yes
43
44apt install -y --force-yes snapcraft
45cd /home/network-manager
46snapcraft clean
47snapcraft
48EOF
49>>>>>>> tests/lib/prepare-all.sh
30chmod +x /home/test/build-snap.sh50chmod +x /home/test/build-snap.sh
31sudo classic /home/test/build-snap.sh51sudo classic /home/test/build-snap.sh
32snap remove classic52snap remove classic
3353
34# Make sure we have a snap build54# Make sure we have a snap build
55<<<<<<< tests/lib/prepare-all.sh
35test -e /home/pulseaudio/pulseaudio_*_amd64.snap56test -e /home/pulseaudio/pulseaudio_*_amd64.snap
57=======
58test -e /home/network-manager/network-manager_*_amd64.snap
59>>>>>>> tests/lib/prepare-all.sh
diff --git a/tests/lib/prepare.sh b/tests/lib/prepare.sh
index 60a45e9..2d677d6 100644
--- a/tests/lib/prepare.sh
+++ b/tests/lib/prepare.sh
@@ -1,4 +1,8 @@
1#!/bin/bash1#!/bin/bash
2<<<<<<< tests/lib/prepare.sh
3=======
4. $TESTSLIB/utilities.sh
5>>>>>>> tests/lib/prepare.sh
26
3echo "Wait for firstboot change to be ready"7echo "Wait for firstboot change to be ready"
4while ! snap changes | grep -q "Done"; do8while ! snap changes | grep -q "Done"; do
@@ -21,6 +25,7 @@ done
21echo "Kernel has a store revision"25echo "Kernel has a store revision"
22snap list | grep ^${kernel_name} | grep -E " [0-9]+\s+canonical"26snap list | grep ^${kernel_name} | grep -E " [0-9]+\s+canonical"
2327
28<<<<<<< tests/lib/prepare.sh
24# If we don't install pulseaudio here we get a system29# If we don't install pulseaudio here we get a system
25# without any network connectivity after reboot.30# without any network connectivity after reboot.
26if [ -n "$SNAP_CHANNEL" ] ; then31if [ -n "$SNAP_CHANNEL" ] ; then
@@ -45,6 +50,27 @@ if [ ! -f $SPREAD_PATH/snapd-state.tar.gz ] ; then
45 tar czf $SPREAD_PATH/snapd-state.tar.gz /var/lib/snapd50 tar czf $SPREAD_PATH/snapd-state.tar.gz /var/lib/snapd
46 systemctl start snapd.socket51 systemctl start snapd.socket
47fi52fi
53=======
54# Remove any existing state archive from other test suites
55rm -f /home/network-manager/snapd-state.tar.gz
56rm -f /home/network-manager/nm-state.tar.gz
57
58snap_install network-manager
59
60# Snapshot of the current snapd state for a later restore
61systemctl stop snapd.service snapd.socket
62tar czf $SPREAD_PATH/snapd-state.tar.gz /var/lib/snapd /etc/netplan
63systemctl start snapd.socket
64
65# And also snapshot NetworkManager's state
66systemctl stop snap.network-manager.networkmanager
67tar czf $SPREAD_PATH/nm-state.tar.gz /var/snap/network-manager
68systemctl start snap.network-manager.networkmanager
69
70# Make sure the original netplan configuration is applied and active
71netplan generate
72netplan apply
73>>>>>>> tests/lib/prepare.sh
4874
49# For debugging dump all snaps and connected slots/plugs75# For debugging dump all snaps and connected slots/plugs
50snap list76snap list
diff --git a/tests/lib/restore-each.sh b/tests/lib/restore-each.sh
index 541ba8c..8808746 100644
--- a/tests/lib/restore-each.sh
+++ b/tests/lib/restore-each.sh
@@ -1,12 +1,20 @@
1#!/bin/bash1#!/bin/bash
22
3. $TESTSLIB/snap-names.sh3. $TESTSLIB/snap-names.sh
4<<<<<<< tests/lib/restore-each.sh
5=======
6. $TESTSLIB/utilities.sh
7>>>>>>> tests/lib/restore-each.sh
48
5# Remove all snaps not being the core, gadget, kernel or snap we're testing9# Remove all snaps not being the core, gadget, kernel or snap we're testing
6for snap in /snap/*; do10for snap in /snap/*; do
7 snap="${snap:6}"11 snap="${snap:6}"
8 case "$snap" in12 case "$snap" in
13<<<<<<< tests/lib/restore-each.sh
9 "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "$SNAP_NAME")14 "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "$SNAP_NAME")
15=======
16 "bin" | "$gadget_name" | "$kernel_name" | "$core_name" | "$SNAP_NAME" )
17>>>>>>> tests/lib/restore-each.sh
10 ;;18 ;;
11 *)19 *)
12 snap remove "$snap"20 snap remove "$snap"
@@ -14,9 +22,28 @@ for snap in /snap/*; do
14 esac22 esac
15done23done
1624
25<<<<<<< tests/lib/restore-each.sh
26=======
27# Drop any generated or modified netplan configuration files. The original
28# ones will be restored below.
29rm -f /etc/netplan/*
30
31>>>>>>> tests/lib/restore-each.sh
17# Ensure we have the same state for snapd as we had before32# Ensure we have the same state for snapd as we had before
18systemctl stop snapd.service snapd.socket33systemctl stop snapd.service snapd.socket
19rm -rf /var/lib/snapd/*34rm -rf /var/lib/snapd/*
20tar xzf $SPREAD_PATH/snapd-state.tar.gz -C /35tar xzf $SPREAD_PATH/snapd-state.tar.gz -C /
21rm -rf /root/.snap36rm -rf /root/.snap
22systemctl start snapd.service snapd.socket37systemctl start snapd.service snapd.socket
38<<<<<<< tests/lib/restore-each.sh
39=======
40
41systemctl stop snap.network-manager.networkmanager
42rm -rf /var/snap/network-manager/*
43tar xzf $SPREAD_PATH/nm-state.tar.gz -C /
44systemctl start snap.network-manager.networkmanager
45
46# Make sure the original netplan configuration is applied and active
47netplan generate
48netplan apply
49>>>>>>> tests/lib/restore-each.sh
diff --git a/tests/lib/utilities.sh b/tests/lib/utilities.sh
index 977d045..c14cdda 100644
--- a/tests/lib/utilities.sh
+++ b/tests/lib/utilities.sh
@@ -1,9 +1,71 @@
1#!/bin/sh1#!/bin/sh
2<<<<<<< tests/lib/utilities.sh
23
3wait_for_pulseaudio() {4wait_for_pulseaudio() {
4 while ! systemctl status snap.pulseaudio.pulseaudio ; do5 while ! systemctl status snap.pulseaudio.pulseaudio ; do
6=======
7snap_install() {
8 name=$1
9 if [ -n "$SNAP_CHANNEL" ] ; then
10 # Don't reinstall if we have it installed already
11 if ! snap list | grep $name ; then
12 snap install --$SNAP_CHANNEL $name
13 fi
14 else
15 # Need first install from store to get all necessary assertions into
16 # place. Second local install will then bring in our locally built
17 # snap.
18 snap install $name
19 snap install --dangerous $PROJECT_PATH/$name*_amd64.snap
20 fi
21}
22
23switch_netplan_to_network_manager() {
24 if [ -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
25 return 0
26 fi
27
28 cat <<-EOF > /etc/netplan/00-default-nm-renderer.yaml
29network:
30 renderer: NetworkManager
31 EOF
32}
33
34switch_netplan_to_networkd() {
35 if [ ! -e /etc/netplan/00-default-nm-renderer.yaml ] ; then
36 return 0
37 fi
38
39 rm /etc/netplan/00-default-nm-renderer.yaml
40}
41
42wait_for_systemd_service() {
43 while ! systemctl status $1 ; do
44>>>>>>> tests/lib/utilities.sh
5 sleep 145 sleep 1
6 done46 done
7 sleep 147 sleep 1
8}48}
949
50<<<<<<< tests/lib/utilities.sh
51=======
52wait_for_network_manager() {
53 wait_for_systemd_service snap.network-manager.networkmanager
54}
55
56stop_after_first_reboot() {
57 if [ $SPREAD_REBOOT -eq 1 ] ; then
58 exit 0
59 fi
60}
61
62mac_to_ipv6() {
63 mac=$1
64 ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
65 mac=${mac#*:}
66 ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
67 mac=${mac#*:*:}
68 ipv6_address=$ipv6_address${mac%:*}${mac##*:}
69 echo $ipv6_address
70}
71>>>>>>> tests/lib/utilities.sh
diff --git a/tests/main/aliases/task.yaml b/tests/main/aliases/task.yaml
10new file mode 10064472new file mode 100644
index 0000000..e2eff9d
--- /dev/null
+++ b/tests/main/aliases/task.yaml
@@ -0,0 +1,13 @@
1summary: Verify aliases provided by the snap are correctly enabled
2
3execute: |
4 # FIXME: Aliases should be not in place automatically unless we
5 # have them approved from the store in our snap-declaration assertion.
6 test ! -e /snap/bin/nmcli
7
8 snap alias network-manager nmcli
9
10 test -e /snap/bin/nmcli
11
12 # Verify the alias works without any problems
13 /snap/bin/nmcli g
diff --git a/tests/main/ethernet-managed-by-networkd/task.yaml b/tests/main/ethernet-managed-by-networkd/task.yaml
0new file mode 10064414new file mode 100644
index 0000000..80e75cb
--- /dev/null
+++ b/tests/main/ethernet-managed-by-networkd/task.yaml
@@ -0,0 +1,7 @@
1summary: When not specific configuration is in place networkd manages ethernet
2
3execute: |
4 . $TESTSLIB/utilities.sh
5 networkctl | grep 'eth0.*routable'
6 wait_for_network_manager
7 /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
diff --git a/tests/main/installation/task.yaml b/tests/main/installation/task.yaml
index 2d9fb0d..5471ecc 100644
--- a/tests/main/installation/task.yaml
+++ b/tests/main/installation/task.yaml
@@ -1,9 +1,14 @@
1<<<<<<< tests/main/installation/task.yaml
1summary: Test pulseaudio snap installation was successful2summary: Test pulseaudio snap installation was successful
3=======
4summary: Test network-manager snap installation was successful
5>>>>>>> tests/main/installation/task.yaml
26
3execute: |7execute: |
4 . $TESTSLIB/utilities.sh8 . $TESTSLIB/utilities.sh
59
6 # Service should be up an running10 # Service should be up an running
11<<<<<<< tests/main/installation/task.yaml
7 wait_for_pulseaudio12 wait_for_pulseaudio
8 systemctl status snap.pulseaudio.pulseaudio | grep -Pzq ': active'13 systemctl status snap.pulseaudio.pulseaudio | grep -Pzq ': active'
914
@@ -14,3 +19,14 @@ execute: |
14 snap interfaces | grep -Pzq "pulseaudio:service +pulseaudio:client"19 snap interfaces | grep -Pzq "pulseaudio:service +pulseaudio:client"
15 snap interfaces | grep -P "\-\ +pulseaudio:home"20 snap interfaces | grep -P "\-\ +pulseaudio:home"
1621
22=======
23 wait_for_network_manager
24
25 # .. and nmcli should be able to reach NetworkManager
26 /snap/bin/network-manager.nmcli g
27
28 # Ensure all necessary plugs/slots are connected
29 snap interfaces | grep -Pzq ":network-setup-observe +network-manager"
30 snap interfaces | grep -Pzq ":ppp +network-manager"
31 snap interfaces | grep -Pzq "network-manager:service +network-manager:nmcli"
32>>>>>>> tests/main/installation/task.yaml
diff --git a/tests/main/set-hostname/task.yaml b/tests/main/set-hostname/task.yaml
17new file mode 10064433new file mode 100644
index 0000000..ddcabd9
--- /dev/null
+++ b/tests/main/set-hostname/task.yaml
@@ -0,0 +1,13 @@
1summary: Verify we can modify the hostname of the system
2
3execute: |
4 # Print out current hostname for nm and hostnamed to have a reference
5 # for debugging later.
6 /snap/bin/network-manager.nmcli general hostname
7 hostnamectl
8
9 expected_hostname=foobar
10 /snap/bin/network-manager.nmcli general hostname $expected_hostname
11 test "`/snap/bin/network-manager.nmcli general hostname`" = "$expected_hostname"
12 test "`hostnamectl status | grep Static`" = " Static hostname: $expected_hostname"
13 test "`hostname`" = "$expected_hostname"
diff --git a/tests/main/static-ip-configuration/task.yaml b/tests/main/static-ip-configuration/task.yaml
0new file mode 10064414new file mode 100644
index 0000000..00031fc
--- /dev/null
+++ b/tests/main/static-ip-configuration/task.yaml
@@ -0,0 +1,49 @@
1summary: Test static IP configuration
2
3restore: |
4 # Ensure that the created virtual network interfaces are removed
5 # in any case when we're done
6 if [ -e /sys/class/net/veth0 ] ; then
7 ip link delete veth0
8 fi
9
10execute: |
11 . $TESTSLIB/utilities.sh
12
13 ip link add dev veth0 type veth peer name veth1
14
15 wait_for_network_manager
16 # NetworkManager should ignore the other side of our pipe so
17 # that we can configure it statically.
18 /snap/bin/network-manager.nmcli d set veth1 managed no
19 ip addr add 10.0.1.1/24 dev veth1
20
21 connection=veth0-static
22 /snap/bin/network-manager.nmcli c add con-name $connection type ethernet ifname veth0 \
23 ip4 10.0.1.2/24
24 /snap/bin/network-manager.nmcli c up $connection
25 /snap/bin/network-manager.nmcli d | grep 'veth0.*connected'
26
27 # Address should be correctly applied now
28 expected_veth0_address="10.0.1.2/24"
29 /snap/bin/network-manager.nmcli -m multiline -f IP4.ADDRESS c show veth0-static | grep $expected_veth0_address
30 ip addr show dev veth0 | grep 'UP'
31 ip addr show dev veth0 | grep $expected_veth0_address
32
33 # Routing needs to be in place as well
34 expected_veth0_route="10.0.1.0/24 dev veth0 proto kernel scope link src 10.0.1.2 metric 100"
35 ip route | grep "$expected_veth0_route"
36
37 # Disable connection and ensure IP configuration is removed
38 /snap/bin/network-manager.nmcli c down $connection
39 ip addr show dev veth0 | grep -v $expected_veth0_address
40 ip route | grep -v "$expected_veth0_route"
41
42 # Enabling network connection again and removing it should remove
43 # the IP configuration too
44 /snap/bin/network-manager.nmcli c up $connection
45 ip addr show dev veth0 | grep $expected_veth0_address
46 ip route | grep "$expected_veth0_route"
47 /snap/bin/network-manager.nmcli c delete $connection
48 ip addr show dev veth0 | grep -v $expected_veth0_address
49 ip route | grep -v "$expected_veth0_route"
0\ No newline at end of file50\ No newline at end of file
diff --git a/tests/main/suspend-resume/task.yaml b/tests/main/suspend-resume/task.yaml
1new file mode 10064451new file mode 100644
index 0000000..b5df7d1
--- /dev/null
+++ b/tests/main/suspend-resume/task.yaml
@@ -0,0 +1,80 @@
1summary: Verify suspend/resume tracking works reliable
2
3restore: |
4 rmmod mac80211_hwsim
5
6execute: |
7 # Install necessary test-tools, we need inotify-tools in this case
8 snap install --edge se-test-tools
9
10 # Get two connected wifi network interfaces wlan0 and wlan1
11 modprobe mac80211_hwsim radios=2
12
13 # FIXME: take the one from edge for now as that is the one which
14 # has automatic setup capabilities
15 snap install --edge wifi-ap
16
17 /snap/bin/network-manager.nmcli d wifi rescan
18 while ! /snap/bin/network-manager.nmcli d wifi | grep Ubuntu ; do
19 /snap/bin/network-manager.nmcli d wifi rescan
20 sleep 1
21 done
22
23 /snap/bin/network-manager.nmcli d wifi connect Ubuntu
24
25 # Override the existing systemd-suspend service unit with a customized
26 # one to prevent the device from entering real suspend. The service unit
27 # will block as long as no new files gets created inside the specified
28 # directory inotifywait listens for changes on.
29 cat <<-EOF > $PROJECT_PATH/systemd-suspend.service
30 [Unit]
31 Description=Suspend
32 Documentation=man:systemd-suspend.service(8)
33 DefaultDependencies=no
34 [Service]
35 Type=oneshot
36 ExecStart=/bin/sh -c '/snap/bin/se-test-tools.inotifywait -e create /home/network-manager/systemd-suspend'
37 EOF
38 mkdir -p /home/network-manager/systemd-suspend
39 mount -o bind,ro $PROJECT_PATH/systemd-suspend.service /lib/systemd/system/systemd-suspend.service
40 systemctl daemon-reload
41
42 # NetworkManager should have an inhibit lock in place by default
43 systemd-inhibit --list | grep "NetworkManager needs to turn off networks"
44
45 service=snap.network-manager.networkmanager
46
47 # Flush the syslog so that we can reliable grep it once we triggered
48 # the system suspend
49 journalctl --flush -u $service
50
51 # Kick off the actual suspend in background so that we can continue
52 # verifying the correct state left by the system before it would
53 # normally enter a sleep state.
54 systemctl suspend --no-block &
55
56 # The easiest way to ensure NetworkManager did the right thing is
57 # by going through its log output and verifying it prints out
58 # what we expect.
59 journalctl --no-pager -u $service | grep 'manager: sleep requested'
60 journalctl --no-pager -u $service | grep 'manager: sleeping...'
61 journalctl --no-pager -u $service | grep "device (wlan1): state change: activated -> unmanaged (reason 'sleeping')"
62 journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now ASLEEP'
63
64 # Connection should be reported as disconnected
65 /snap/bin/network-manager.nmcli d | grep -v 'wlan1.*connected'
66 # .. and interface should be disabled
67 ifconfig | grep -v wlan1
68
69 # Now we wakeup the system again and verify NetworkManager
70 # is correctly setting up the ethernet port again.
71 journalctl --flush -u $service
72 touch $PROJECT_PATH/systemd-suspend/wakeup
73
74 journalctl --no-pager -u $service | grep 'manager: wake requested (sleeping: yes enabled: yes)'
75 journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now CONNECTED_LOCAL'
76 journalctl --no-pager -u $service | grep 'manager: NetworkManager state is now CONNECTED_GLOBAL'
77 journalctl --no-pager -u $service | grep 'device (wlan1): Activation: successful, device activated.'
78
79 ifconfig | grep wlan1
80 /snap/bin/network-manager.nmcli d | grep -v 'wlan1.*connected'
diff --git a/tests/main/switch-netplan-renderer/task.yaml b/tests/main/switch-netplan-renderer/task.yaml
0new file mode 10064481new file mode 100644
index 0000000..4453b6a
--- /dev/null
+++ b/tests/main/switch-netplan-renderer/task.yaml
@@ -0,0 +1,40 @@
1summary: Dynamically switch the netplan renderer
2
3execute: |
4 . $TESTSLIB/utilities.sh
5 case "$SPREAD_REBOOT" in
6 0)
7 wait_for_network_manager
8
9 # networkd manages eth0 and NetworkManager does not
10 networkctl | grep 'eth0.*routable'
11 /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
12
13 # Now we switch back to the NetworkManager backend for netplan
14 switch_netplan_to_network_manager
15 REBOOT
16 ;;
17 1)
18 test -e /etc/netplan/00-default-nm-renderer.yaml
19
20 # Give NetworkManager a bit to come up after the reboot
21 wait_for_network_manager
22
23 # NetworkManager now controls eth0 and networkd does not
24 /snap/bin/network-manager.nmcli d | grep 'eth0.*connected'
25 networkctl status eth0 | grep 'State: n/a'
26
27 # And switch back to networkd
28 switch_netplan_to_networkd
29 REBOOT
30 ;;
31 2)
32 wait_for_network_manager
33
34 # networkd manages eth0 and NetworkManager does not
35 networkctl | grep 'eth0.*routable'
36 /snap/bin/network-manager.nmcli d | grep 'eth0.*unmanaged'
37 ;;
38 *)
39 ;;
40 esac
diff --git a/tests/main/wifi-connect-secured-ap/task.yaml b/tests/main/wifi-connect-secured-ap/task.yaml
0new file mode 10064441new file mode 100644
index 0000000..aa6a70c
--- /dev/null
+++ b/tests/main/wifi-connect-secured-ap/task.yaml
@@ -0,0 +1,38 @@
1summary: Test connection to a secured WiFi AP
2
3environment:
4 WIFI_SSID: Ubuntu
5 WIFI_PASSPHRASE: Test1234
6
7restore: |
8 rmmod mac80211_hwsim
9
10execute: |
11 # Get two connected wifi network interfaces wlan0 and wlan1 and
12 # give the system soem time to settle
13 modprobe mac80211_hwsim radios=2
14 sleep 1
15
16 snap install wifi-ap
17 # FIXME: until the wifi-ap utility is clever enough to retry
18 # connecting with the service we need to add a short sleep here
19 sleep 0.5
20
21 # Setup the AP on wlan0
22 /snap/bin/wifi-ap.config set wifi.interface wlan0
23 /snap/bin/wifi-ap.config set wifi.ssid $WIFI_SSID
24 /snap/bin/wifi-ap.config set wifi.security wpa2
25 /snap/bin/wifi-ap.config set wifi.security-passphrase $WIFI_PASSPHRASE
26
27 # AP needs a bit to appear and be visible for NetworkManager
28 /snap/bin/network-manager.nmcli d wifi rescan
29 while ! /snap/bin/network-manager.nmcli d wifi | grep Ubuntu ; do
30 /snap/bin/network-manager.nmcli d wifi rescan
31 sleep 1
32 done
33
34 /snap/bin/network-manager.nmcli d wifi | grep $WIFI_SSID
35
36 # Connect to the AP and ensure the connection was established
37 /snap/bin/network-manager.nmcli d wifi connect $WIFI_SSID password $WIFI_PASSPHRASE
38 /snap/bin/network-manager.nmcli d | grep 'wlan1.*connected'
diff --git a/tests/main/wifi-powersave-config-option/task.yaml b/tests/main/wifi-powersave-config-option/task.yaml
0new file mode 10064439new file mode 100644
index 0000000..56344ec
--- /dev/null
+++ b/tests/main/wifi-powersave-config-option/task.yaml
@@ -0,0 +1,28 @@
1summary: Verify WiFi powersave can be enabled via a snap config option
2
3environment:
4 WIFI_POWERSAVE_CONF_PATH: /var/snap/network-manager/current/conf.d/wifi-powersave.conf
5
6execute: |
7 . $TESTSLIB/utilities.sh
8
9 # The mac80211_hwsim driver does not support the powersave mode
10 # so we can't check this reliable.
11
12 test "`snap get network-manager wifi.powersave`" = "disabled"
13 grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
14
15 # Try to enable and disable again
16 snap set network-manager wifi.powersave=enabled
17 test "`snap get network-manager wifi.powersave`" = "enabled"
18 grep "wifi.powersave = 3" $WIFI_POWERSAVE_CONF_PATH
19
20 snap set network-manager wifi.powersave=disabled
21 test "`snap get network-manager wifi.powersave`" = "disabled"
22 grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
23
24 # Specifying no value means the snap should use the default
25 # which is 'disable'
26 snap set network-manager wifi.powersave=
27 test "`snap get network-manager wifi.powersave`" = "disabled"
28 grep "wifi.powersave = 2" $WIFI_POWERSAVE_CONF_PATH
diff --git a/tests/main/wifi-wowlan-config-option/task.yaml b/tests/main/wifi-wowlan-config-option/task.yaml
0new file mode 10064429new file mode 100644
index 0000000..bb34a01
--- /dev/null
+++ b/tests/main/wifi-wowlan-config-option/task.yaml
@@ -0,0 +1,55 @@
1summary: Verify WiFi WoWLAN can be enabled via a snap config option
2
3environment:
4 WIFI_WOWL_CONF_PATH: /var/snap/network-manager/current/conf.d/wifi-wowlan.conf
5
6execute: |
7 . $TESTSLIB/utilities.sh
8
9 # The mac80211_hwsim driver does not support WoWLAN so we can't
10 # check this reliable on the hardware level and will only check
11 # in the following that the correct configuration for
12 # NetworkManager itself is written out.
13
14 test `snap get network-manager wifi.wake-on-wlan` = disabled
15 grep "^wifi.wake-on-wlan=0$" $WIFI_WOWL_CONF_PATH
16
17 test "`snap get network-manager wifi.wake-on-wlan-password`" = ""
18 grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH
19
20 snap set network-manager wifi.wake-on-wlan-password=Test1234
21 grep "^wifi.wake-on-wlan-password=Test1234$" $WIFI_WOWL_CONF_PATH
22 # Setting the password alone should keep the actual WoWLAN value
23 # still unset so that NetworkManager uses its default.
24 grep -v "^wifi.wake-on-wlan=.*$" $WIFI_WOWL_CONF_PATH
25
26 snap set network-manager wifi.wake-on-wlan=magic
27 grep "^wifi.wake-on-wlan=8$" $WIFI_WOWL_CONF_PATH
28 grep "^wifi.wake-on-wlan-password=Test1234$" $WIFI_WOWL_CONF_PATH
29
30 # Test all other possible keys for the wifi.wake-on-wlan option
31 snap set network-manager wifi.wake-on-wlan=disabled
32 grep "^wifi.wake-on-wlan=0$" $WIFI_WOWL_CONF_PATH
33 snap set network-manager wifi.wake-on-wlan=any
34 grep "^wifi.wake-on-wlan=2$" $WIFI_WOWL_CONF_PATH
35 snap set network-manager wifi.wake-on-wlan=disconnect
36 grep "^wifi.wake-on-wlan=4$" $WIFI_WOWL_CONF_PATH
37 snap set network-manager wifi.wake-on-wlan=magic
38 grep "^wifi.wake-on-wlan=8$" $WIFI_WOWL_CONF_PATH
39 snap set network-manager wifi.wake-on-wlan=gtk-rekey-failure
40 grep "^wifi.wake-on-wlan=16$" $WIFI_WOWL_CONF_PATH
41 snap set network-manager wifi.wake-on-wlan=eap-identity-request
42 grep "^wifi.wake-on-wlan=32$" $WIFI_WOWL_CONF_PATH
43 snap set network-manager wifi.wake-on-wlan=4way-handshake
44 grep "^wifi.wake-on-wlan=64$" $WIFI_WOWL_CONF_PATH
45 snap set network-manager wifi.wake-on-wlan=rfkill-release
46 grep "^wifi.wake-on-wlan=128$" $WIFI_WOWL_CONF_PATH
47 snap set network-manager wifi.wake-on-wlan=tcp
48 grep "^wifi.wake-on-wlan=256$" $WIFI_WOWL_CONF_PATH
49
50 # Not setting any concrete value should remove the configuration
51 snap set network-manager wifi.wake-on-wlan-password=
52 grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH
53 snap set network-manager wifi.wake-on-wlan=
54 grep -v "^wifi.wake-on-wlan=.*$" $WIFI_WOWL_CONF_PATH
55 grep -v "^wifi.wake-on-wlan-password=.*$" $WIFI_WOWL_CONF_PATH

Subscribers

People subscribed via source and target branches