Initial Raspberry Pi build setup
This commit is contained in:
parent
f7edeca883
commit
0cfd62f14e
7 changed files with 422 additions and 0 deletions
241
build-rpi.sh
Executable file
241
build-rpi.sh
Executable file
|
@ -0,0 +1,241 @@
|
|||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Install dependencies in host system
|
||||
apt-get update
|
||||
apt-get install -y --no-install-recommends ubuntu-keyring ca-certificates debootstrap git qemu-user-static qemu-utils qemu-system-arm binfmt-support parted kpartx rsync dosfstools xz-utils
|
||||
|
||||
# Make sure cross-running ARM ELF executables is enabled
|
||||
update-binfmts --enable
|
||||
|
||||
rootdir=$(pwd)
|
||||
basedir=$(pwd)/artifacts/ubuntusway-rpi
|
||||
|
||||
# Free space on rootfs in MiB
|
||||
free_space="500"
|
||||
|
||||
export packages="ubuntusway-minimal ubuntusway-desktop ubuntusway-standard"
|
||||
export architecture="arm64"
|
||||
export codename="jammy"
|
||||
export channel="dev"
|
||||
|
||||
version=22.04
|
||||
YYYYMMDD="$(date +%Y%m%d)"
|
||||
imagename=ubuntusway-$version-$channel-rpi-$YYYYMMDD
|
||||
|
||||
mkdir -p "${basedir}"
|
||||
cd "${basedir}"
|
||||
|
||||
# Bootstrap an ubuntu minimal system
|
||||
debootstrap --foreign --arch $architecture $codename ubuntusway-$architecture http://ports.ubuntu.com/ubuntu-ports
|
||||
|
||||
# Add the QEMU emulator for running ARM executables
|
||||
cp /usr/bin/qemu-arm-static ubuntusway-$architecture/usr/bin/
|
||||
|
||||
# Run the second stage of the bootstrap in QEMU
|
||||
LANG=C chroot ubuntusway-$architecture /debootstrap/debootstrap --second-stage
|
||||
|
||||
# Copy Raspberry Pi specific files
|
||||
cp -r "${rootdir}"/rpi/rootfs/writable/* ubuntusway-${architecture}/
|
||||
|
||||
# Add the rest of the ubuntu repos
|
||||
cat << EOF > ubuntusway-$architecture/etc/apt/sources.list
|
||||
deb http://ports.ubuntu.com/ubuntu-ports $codename main restricted universe multiverse
|
||||
deb http://ports.ubuntu.com/ubuntu-ports $codename-updates main restricted universe multiverse
|
||||
EOF
|
||||
|
||||
# Copy in the ubuntusway PPAs/keys/apt config
|
||||
for f in "${rootdir}"/etc/config/archives/*.list; do cp -- "$f" "ubuntusway-$architecture/etc/apt/sources.list.d/$(basename -- "$f")"; done
|
||||
for f in "${rootdir}"/etc/config/archives/*.key; do cp -- "$f" "ubuntusway-$architecture/etc/apt/trusted.gpg.d/$(basename -- "$f").asc"; done
|
||||
for f in "${rootdir}"/etc/config/archives/*.pref; do cp -- "$f" "ubuntusway-$architecture/etc/apt/preferences.d/$(basename -- "$f")"; done
|
||||
|
||||
# Set codename/channel in added repos
|
||||
sed -i "s/@CHANNEL/$channel/" ubuntusway-$architecture/etc/apt/sources.list.d/*.list*
|
||||
sed -i "s/@BASECODENAME/$codename/" ubuntusway-$architecture/etc/apt/sources.list.d/*.list*
|
||||
|
||||
# Set codename in added preferences
|
||||
sed -i "s/@BASECODENAME/$codename/" ubuntusway-$architecture/etc/apt/preferences.d/*.pref*
|
||||
|
||||
echo "ubuntusway" > ubuntusway-$architecture/etc/hostname
|
||||
|
||||
cat << EOF > ubuntusway-${architecture}/etc/hosts
|
||||
127.0.0.1 ubuntusway localhost
|
||||
::1 localhost ip6-localhost ip6-loopback
|
||||
fe00::0 ip6-localnet
|
||||
ff00::0 ip6-mcastprefix
|
||||
ff02::1 ip6-allnodes
|
||||
ff02::2 ip6-allrouters
|
||||
EOF
|
||||
|
||||
# Configure mount points
|
||||
cat << EOF > ubuntusway-${architecture}/etc/fstab
|
||||
# <file system> <mount point> <type> <options> <dump> <pass>
|
||||
proc /proc proc nodev,noexec,nosuid 0 0
|
||||
LABEL=writable / ext4 defaults,noatime 0 0
|
||||
LABEL=system-boot /boot/firmware vfat defaults 0 1
|
||||
EOF
|
||||
|
||||
export LC_ALL=C
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
# Config to stop flash-kernel trying to detect the hardware in chroot
|
||||
export FK_MACHINE=none
|
||||
|
||||
mount -t proc proc ubuntusway-$architecture/proc
|
||||
mount -o bind /dev/ ubuntusway-$architecture/dev/
|
||||
mount -o bind /dev/pts ubuntusway-$architecture/dev/pts
|
||||
|
||||
# Make a third stage that installs all of the metapackages
|
||||
cat << EOF > ubuntusway-$architecture/third-stage
|
||||
#!/bin/bash
|
||||
apt-get update
|
||||
apt-get --yes upgrade
|
||||
apt-get --yes install $packages
|
||||
rm -f /third-stage
|
||||
EOF
|
||||
|
||||
chmod +x ubuntusway-$architecture/third-stage
|
||||
LANG=C chroot ubuntusway-$architecture /third-stage
|
||||
|
||||
|
||||
# Install Raspberry Pi specific packages
|
||||
cat << EOF > ubuntusway-$architecture/hardware
|
||||
#!/bin/bash
|
||||
# Make a dummy folder for the boot partition so packages install properly,
|
||||
# we'll recreate it on the actual partition later
|
||||
mkdir -p /boot/firmware
|
||||
apt-get --yes install linux-image-raspi linux-firmware-raspi linux-modules-extra-raspi \
|
||||
pi-bluetooth rpi-eeprom libraspberrypi0 libraspberrypi-bin
|
||||
# Symlink to workaround bug with Bluetooth driver looking in the wrong place for firmware
|
||||
ln -s /lib/firmware /etc/firmware
|
||||
rm -rf /boot/firmware
|
||||
rm -f hardware
|
||||
EOF
|
||||
|
||||
chmod +x ubuntusway-$architecture/hardware
|
||||
LANG=C chroot ubuntusway-$architecture /hardware
|
||||
|
||||
# Copy in any file overrides
|
||||
cp -r "${rootdir}"/etc/config/includes.chroot/* ubuntusway-$architecture/
|
||||
|
||||
mkdir ubuntusway-$architecture/hooks
|
||||
cp "${rootdir}"/etc/config/hooks/live/*.chroot ubuntusway-$architecture/hooks
|
||||
|
||||
hook_files="ubuntusway-$architecture/hooks/*"
|
||||
for f in $hook_files
|
||||
do
|
||||
base=$(basename "${f}")
|
||||
LANG=C chroot ubuntusway-$architecture "/hooks/${base}"
|
||||
done
|
||||
|
||||
rm -r "ubuntusway-$architecture/hooks"
|
||||
|
||||
# Add a oneshot service to grow the rootfs on first boot
|
||||
install -m 755 -o root -g root "${rootdir}/rpi/files/resizerootfs" "ubuntusway-$architecture/usr/sbin/resizerootfs"
|
||||
install -m 644 -o root -g root "${rootdir}/rpi/files/resizerootfs.service" "ubuntusway-$architecture/etc/systemd/system"
|
||||
mkdir -p "ubuntusway-$architecture/etc/systemd/system/systemd-remount-fs.service.requires/"
|
||||
ln -s /etc/systemd/system/resizerootfs.service "ubuntusway-$architecture/etc/systemd/system/systemd-remount-fs.service.requires/resizerootfs.service"
|
||||
|
||||
|
||||
# Support for kernel updates on the Pi 400
|
||||
cat << EOF >> ubuntusway-$architecture/etc/flash-kernel/db
|
||||
Machine: Raspberry Pi 400 Rev 1.0
|
||||
Method: pi
|
||||
Kernel-Flavors: raspi raspi2
|
||||
DTB-Id: bcm2711-rpi-4-b.dtb
|
||||
U-Boot-Script-Name: bootscr.rpi
|
||||
Required-Packages: u-boot-tools
|
||||
EOF
|
||||
|
||||
# Create default user (WARNING! This is a temporary solution, until postinstall user setup is created)
|
||||
cat <<EOF >> ubuntusway-$architecture/user
|
||||
#!/bin/bash
|
||||
adduser --disabled-password --gecos "" ubuntu
|
||||
echo "ubuntu:ubuntusway" | chpasswd
|
||||
usermod -a -G adm,dialout,cdrom,sudo,audio,video,plugdev,games,users,input,netdev ubuntu
|
||||
rm -f user
|
||||
EOF
|
||||
|
||||
chmod +x ubuntusway-$architecture/user
|
||||
LANG=C chroot ubuntusway-$architecture /user
|
||||
|
||||
# Calculate the space to create the image.
|
||||
root_size="$(du -s -B1K ubuntusway-$architecture | cut -f1)"
|
||||
raw_size="$(($((free_space*1024))+root_size))"
|
||||
|
||||
# Create the disk and partition it
|
||||
echo "Creating image file"
|
||||
|
||||
# Sometimes fallocate fails if the filesystem or location doesn't support it, fallback to slower dd in this case
|
||||
if ! fallocate -l "$(echo ${raw_size}Ki | numfmt --from=iec-i --to=si --format=%.1f)" "${basedir}/${imagename}.img"
|
||||
then
|
||||
dd if=/dev/zero of="${basedir}/${imagename}.img" bs=1024 count=${raw_size}
|
||||
fi
|
||||
|
||||
parted "${imagename}.img" --script -- mklabel msdos
|
||||
parted "${imagename}.img" --script -- mkpart primary fat32 0 256
|
||||
parted "${imagename}.img" --script -- mkpart primary ext4 256 -1
|
||||
|
||||
# Set the partition variables
|
||||
loopdevice=$(losetup -f --show "${basedir}/${imagename}.img")
|
||||
device=$(kpartx -va "$loopdevice" | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1)
|
||||
device="/dev/mapper/${device}"
|
||||
bootp=${device}p1
|
||||
rootp=${device}p2
|
||||
|
||||
# Create file systems
|
||||
mkfs.vfat -n system-boot "$bootp"
|
||||
mkfs.ext4 -L writable "$rootp"
|
||||
|
||||
# Create the dirs for the partitions and mount them
|
||||
mkdir -p "${basedir}/bootp" "${basedir}/root"
|
||||
mount -t vfat "$bootp" "${basedir}/bootp"
|
||||
mount "$rootp" "${basedir}/root"
|
||||
|
||||
mkdir -p ubuntusway-$architecture/boot/firmware
|
||||
mount -o bind "${basedir}/bootp/" ubuntusway-$architecture/boot/firmware
|
||||
|
||||
# Copy Raspberry Pi specific files
|
||||
cp -r "${rootdir}"/rpi/rootfs/system-boot/* ubuntusway-${architecture}/boot/firmware/
|
||||
|
||||
# Copy kernels and firmware to boot partition
|
||||
cat << EOF > ubuntusway-$architecture/hardware
|
||||
#!/bin/bash
|
||||
cp /boot/vmlinuz /boot/firmware/vmlinuz
|
||||
cp /boot/initrd.img /boot/firmware/initrd.img
|
||||
# Copy device-tree blobs to fat32 partition
|
||||
cp -r /lib/firmware/*-raspi/device-tree/broadcom/* /boot/firmware/
|
||||
cp -r /lib/firmware/*-raspi/device-tree/overlays /boot/firmware/
|
||||
rm -f hardware
|
||||
EOF
|
||||
|
||||
chmod +x ubuntusway-$architecture/hardware
|
||||
LANG=C chroot ubuntusway-$architecture /hardware
|
||||
|
||||
# Grab some updated firmware from the Raspberry Pi foundation
|
||||
git clone -b '1.20220331' --single-branch --depth 1 https://github.com/raspberrypi/firmware raspi-firmware
|
||||
cp raspi-firmware/boot/*.elf "${basedir}/bootp/"
|
||||
cp raspi-firmware/boot/*.dat "${basedir}/bootp/"
|
||||
cp raspi-firmware/boot/bootcode.bin "${basedir}/bootp/"
|
||||
|
||||
umount ubuntusway-$architecture/dev/pts
|
||||
umount ubuntusway-$architecture/dev/
|
||||
umount ubuntusway-$architecture/proc
|
||||
umount ubuntusway-$architecture/boot/firmware
|
||||
|
||||
echo "Rsyncing rootfs into image file"
|
||||
rsync -HPavz -q "${basedir}/ubuntusway-$architecture/" "${basedir}/root/"
|
||||
|
||||
# Unmount partitions
|
||||
umount "$bootp"
|
||||
umount "$rootp"
|
||||
kpartx -dv "$loopdevice"
|
||||
losetup -d "$loopdevice"
|
||||
|
||||
echo "Compressing ${imagename}.img"
|
||||
xz -T0 -z "${basedir}/${imagename}.img"
|
||||
|
||||
cd "${basedir}"
|
||||
|
||||
md5sum "${imagename}.img.xz" | tee "${imagename}.md5.txt"
|
||||
sha256sum "${imagename}.img.xz" | tee "${imagename}.sha256.txt"
|
22
rpi/files/resizerootfs
Executable file
22
rpi/files/resizerootfs
Executable file
|
@ -0,0 +1,22 @@
|
|||
#!/bin/sh
|
||||
|
||||
rootpart="$(findmnt -n -o SOURCE /)"
|
||||
rootdev="/dev/$(lsblk -no pkname "$rootpart")"
|
||||
|
||||
flock $rootdev sfdisk -f $rootdev -N 2 <<EOF
|
||||
,+
|
||||
EOF
|
||||
|
||||
sleep 5
|
||||
|
||||
udevadm settle
|
||||
|
||||
sleep 5
|
||||
|
||||
flock $rootdev partprobe $rootdev
|
||||
|
||||
mount -o remount,rw $rootpart
|
||||
|
||||
resize2fs $rootpart
|
||||
|
||||
exit 0
|
13
rpi/files/resizerootfs.service
Normal file
13
rpi/files/resizerootfs.service
Normal file
|
@ -0,0 +1,13 @@
|
|||
[Unit]
|
||||
Description=resize root file system
|
||||
Before=local-fs-pre.target
|
||||
DefaultDependencies=no
|
||||
|
||||
[Service]
|
||||
Type=oneshot
|
||||
TimeoutSec=infinity
|
||||
ExecStart=/usr/sbin/resizerootfs
|
||||
ExecStart=/bin/systemctl --no-reload disable %n
|
||||
|
||||
[Install]
|
||||
RequiredBy=local-fs-pre.target
|
1
rpi/rootfs/system-boot/cmdline.txt
Normal file
1
rpi/rootfs/system-boot/cmdline.txt
Normal file
|
@ -0,0 +1 @@
|
|||
dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash
|
36
rpi/rootfs/system-boot/config.txt
Normal file
36
rpi/rootfs/system-boot/config.txt
Normal file
|
@ -0,0 +1,36 @@
|
|||
[all]
|
||||
kernel=vmlinuz
|
||||
cmdline=cmdline.txt
|
||||
initramfs initrd.img followkernel
|
||||
[pi4]
|
||||
max_framebuffers=2
|
||||
arm_boost=1
|
||||
[all]
|
||||
# Enable the audio output, I2C and SPI interfaces on the GPIO header. As these
|
||||
# parameters related to the base device-tree they must appear *before* any
|
||||
# other dtoverlay= specification
|
||||
dtparam=audio=on
|
||||
dtparam=i2c_arm=on
|
||||
dtparam=spi=on
|
||||
# Comment out the following line if the edges of the desktop appear outside
|
||||
# the edges of your display
|
||||
disable_overscan=1
|
||||
# If you have issues with audio, you may try uncommenting the following line
|
||||
# which forces the HDMI output into HDMI mode instead of DVI (which doesn't
|
||||
# support audio output)
|
||||
hdmi_drive=2
|
||||
[cm4]
|
||||
# Enable the USB2 outputs on the IO board (assuming your CM4 is plugged into
|
||||
# such a board)
|
||||
dtoverlay=dwc2,dr_mode=host
|
||||
[all]
|
||||
# Enable the KMS ("full" KMS) graphics overlay, leaving GPU memory as the
|
||||
# default (the kernel is in control of graphics memory with full KMS)
|
||||
dtoverlay=vc4-kms-v3d
|
||||
# Autoload overlays for any recognized cameras or displays that are attached
|
||||
# to the CSI/DSI ports. Please note this is for libcamera support, *not* for
|
||||
# the legacy camera stack
|
||||
camera_auto_detect=1
|
||||
display_auto_detect=1
|
||||
arm_64bit=1
|
||||
dtoverlay=dwc2"
|
5
rpi/rootfs/writable/etc/oem.conf
Normal file
5
rpi/rootfs/writable/etc/oem.conf
Normal file
|
@ -0,0 +1,5 @@
|
|||
[OEM]
|
||||
Manufacturer=Raspberry Pi Foundation
|
||||
Product=Raspberry Pi
|
||||
Logo=/etc/oem/logo.svg
|
||||
URL=https://www.raspberrypi.org/
|
104
rpi/rootfs/writable/etc/oem/logo.svg
Normal file
104
rpi/rootfs/writable/etc/oem/logo.svg
Normal file
|
@ -0,0 +1,104 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
xml:space="preserve"
|
||||
width="656.47998"
|
||||
height="825.76001"
|
||||
viewBox="0 0 656.47998 825.76001"
|
||||
sodipodi:docname="logo.svg"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"><metadata
|
||||
id="metadata8"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs6" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="846"
|
||||
inkscape:window-height="480"
|
||||
id="namedview4"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.28579732"
|
||||
inkscape:cx="-488.77257"
|
||||
inkscape:cy="412.88"
|
||||
inkscape:window-x="793"
|
||||
inkscape:window-y="334"
|
||||
inkscape:window-maximized="0"
|
||||
inkscape:current-layer="g10" /><g
|
||||
id="g10"
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="ink_ext_XXXXXX"
|
||||
transform="matrix(1.3333333,0,0,-1.3333333,0,825.76)"><g
|
||||
id="g12"
|
||||
transform="scale(0.1)"><path
|
||||
d="m 1332.8,6193.06 c -31.79,-0.96 -66.04,-12.52 -104.87,-42.73 -95.16,36.15 -187.4,48.71 -269.879,-24.86 -127.371,16.28 -168.774,-17.31 -200.141,-56.51 -27.953,0.57 -209.25,28.3 -292.375,-93.84 -208.914,24.34 -274.953,-121.05 -200.14,-256.61 -42.661,-65.07 -86.86,-129.35 12.902,-253.37 -35.285,-69.08 -13.41,-144.01 69.746,-234.72 -21.949,-97.11 21.199,-165.62 98.555,-219.02 -14.481,-132.88 123.715,-210.15 164.984,-237.69 15.836,-77.42 48.871,-150.5 206.723,-190.89 26.019,-115.41 120.89,-135.33 212.755,-159.55 C 727.426,4249.43 467.074,4020.7 468.832,3459.5 L 424.34,3381.35 C 76.2109,3172.81 -237.016,2502.55 252.781,1957.78 284.773,1787.23 338.43,1664.75 386.207,1529.2 457.668,982.91 924.004,727.121 1047.01,696.859 1227.25,561.641 1419.2,433.332 1678.97,343.441 1923.85,94.6914 2189.13,-0.121094 2455.89,0.03125 c 3.91,0 7.89,-0.0507813 11.8,0 266.75,-0.160156 532.05,94.64065 776.91,343.40975 259.78,89.891 451.74,218.2 631.98,353.418 123,30.262 589.33,286.051 660.79,832.341 47.77,135.55 101.44,258.03 133.42,428.58 489.81,544.82 176.59,1215.13 -171.57,1423.67 l -44.53,78.13 c 1.76,561.15 -258.63,789.88 -562.24,963.77 91.87,24.21 186.73,44.14 212.76,159.53 157.86,40.42 190.88,113.49 206.71,190.91 41.28,27.52 179.47,104.8 164.99,237.7 77.36,53.39 120.5,121.91 98.57,219.01 83.14,90.7 105.03,165.63 69.73,234.71 99.8,123.99 55.51,188.26 12.91,253.33 74.75,135.56 8.79,280.94 -200.21,256.59 -83.11,122.15 -264.34,94.41 -292.36,93.85 -31.37,39.2 -72.74,72.79 -200.12,56.51 -82.48,73.57 -174.73,61.01 -269.87,24.87 -112.99,87.81 -187.74,17.43 -273.13,-9.18 -136.77,44.02 -168.05,-16.29 -235.24,-40.84 -149.18,31.05 -194.51,-36.54 -266.03,-107.9 l -83.19,1.62 c -224.98,-130.58 -336.74,-396.52 -376.36,-533.23 -39.64,136.74 -151.17,402.67 -376.1,533.23 l -83.18,-1.62 c -71.6,71.36 -116.94,138.95 -266.1,107.9 -67.2,24.55 -98.38,84.86 -235.25,40.84 -56.05,17.46 -107.61,53.77 -168.29,51.92 l 0.11,-0.04"
|
||||
style="fill:#040606;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path14"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 889.32,5618.51 c 596.92,-303.11 943.94,-548.33 1134.04,-757.16 -97.35,-384.36 -605.24,-401.9 -790.94,-391.11 38.01,17.43 69.74,38.32 80.99,70.4 -46.59,32.6 -211.83,3.44 -327.176,67.27 44.296,9.05 65.036,17.84 85.746,50.06 -108.968,34.23 -226.367,63.74 -295.402,120.46 37.266,-0.47 72.035,-8.21 120.707,25.03 -97.629,51.82 -201.781,92.87 -282.707,172.08 50.457,1.2 104.875,0.5 120.695,18.77 -89.335,54.51 -164.726,115.15 -227.128,181.47 70.644,-8.4 100.464,-1.17 117.546,10.95 -67.539,68.12 -153.023,125.66 -193.773,209.63 52.445,-17.81 100.422,-24.63 135.016,1.56 -22.957,51.01 -121.286,81.08 -177.903,200.24 55.223,-5.26 113.774,-11.85 125.489,0 -25.637,102.83 -69.598,160.66 -112.727,220.55 118.152,1.72 297.172,-0.46 289.066,9.39 l -73.05,73.53 c 115.406,30.6 233.496,-4.92 319.238,-31.3 38.488,29.92 -0.684,67.76 -47.652,106.4 98.089,-12.92 186.715,-35.13 266.815,-65.73 42.82,38.08 -27.77,76.15 -61.94,114.21 151.54,-28.32 215.75,-68.1 279.54,-107.95 46.3,43.71 2.65,80.85 -28.59,118.89 114.26,-41.68 173.12,-95.49 235.07,-148.61 21.01,27.92 53.37,48.39 14.3,115.77 81.11,-46.06 142.2,-100.33 187.42,-161.13 50.19,31.47 29.9,74.53 30.17,114.2 84.3,-67.56 137.81,-139.44 203.31,-209.63 13.18,9.45 24.74,41.55 34.93,92.3 201.12,-192.2 485.32,-676.3 73.06,-868.24 -350.87,285.03 -769.91,492.21 -1234.281,647.62 l 0.121,0.08"
|
||||
style="fill:#63c54d;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path16"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 4050.89,5618.51 c -596.87,-303.16 -943.87,-548.29 -1133.98,-757.16 97.36,-384.36 605.26,-401.9 790.96,-391.11 -38.03,17.43 -69.74,38.32 -80.99,70.4 46.6,32.6 211.83,3.44 327.18,67.27 -44.3,9.05 -65.04,17.84 -85.76,50.06 108.99,34.23 226.38,63.74 295.42,120.46 -37.26,-0.47 -72.06,-8.21 -120.71,25.03 97.61,51.82 201.78,92.87 282.7,172.08 -50.47,1.2 -104.87,0.5 -120.71,18.77 89.37,54.51 164.75,115.15 227.14,181.47 -70.63,-8.4 -100.45,-1.17 -117.54,10.95 67.55,68.12 153.02,125.66 193.78,209.63 -52.44,-17.81 -100.42,-24.63 -135.01,1.56 22.95,51.01 121.27,81.08 177.88,200.24 -55.21,-5.26 -113.75,-11.85 -125.47,0 25.67,102.88 69.65,160.7 112.76,220.6 -118.16,1.72 -297.16,-0.46 -289.08,9.38 l 73.09,73.52 c -115.43,30.61 -233.52,-4.9 -319.26,-31.28 -38.48,29.92 0.68,67.76 47.64,106.37 -98.08,-12.89 -186.71,-35.1 -266.82,-65.7 -42.8,38.06 27.79,76.13 61.94,114.2 -151.53,-28.32 -215.73,-68.11 -279.54,-107.94 -46.29,43.7 -2.63,80.85 28.6,118.88 -114.26,-41.67 -173.12,-95.48 -235.06,-148.6 -21.01,27.92 -53.36,48.38 -14.3,115.77 -81.13,-46.07 -142.21,-100.34 -187.41,-161.14 -50.2,31.48 -29.91,74.53 -30.19,114.19 -84.3,-67.54 -137.82,-139.43 -203.29,-209.62 -13.19,9.46 -24.74,41.56 -34.95,92.3 -201.13,-192.2 -485.34,-676.3 -73.05,-868.24 350.68,285.09 769.69,492.26 1234.1,647.66 h -0.07"
|
||||
style="fill:#63c54d;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path18"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 3192,1704.72 c 2.08,-358.64 -316.36,-650.93 -711.23,-652.82 -394.87,-1.89 -716.68,287.32 -718.76,645.98 0,2.28 0,4.56 0,6.84 -2.07,358.66 316.35,650.95 711.24,652.83 394.87,1.89 716.68,-287.31 718.75,-645.98 0.01,-2.29 0.01,-4.56 0,-6.85"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path20"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 2077.17,3559.87 c 296.27,-191.17 349.68,-624.54 119.3,-967.92 -230.38,-343.39 -657.31,-466.8 -953.56,-275.62 v 0 c -296.265,191.19 -349.68,624.56 -119.29,967.96 230.38,343.38 657.3,466.78 953.55,275.58 v 0"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path22"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 2876.82,3594.49 c -296.27,-191.18 -349.67,-624.56 -119.29,-967.93 230.39,-343.39 657.3,-466.8 953.56,-275.61 v 0 c 296.27,191.18 349.68,624.55 119.3,967.95 -230.38,343.39 -657.3,466.78 -953.57,275.59 v 0"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path24"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="M 614.797,3245.31 C 934.641,3329.76 722.777,1941.9 462.535,2055.77 176.246,2282.58 84.0352,2946.78 614.797,3245.31"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path26"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 4311.21,3262.62 c -319.88,84.42 -107.98,-1303.48 152.29,-1189.61 286.27,226.82 378.47,891.08 -152.29,1189.61 v 0"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path28"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 3238.44,4298.12 c 551.99,91.81 1011.31,-231.21 992.77,-820.8 -18.15,-226.03 -1196.15,787.15 -992.77,820.8"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path30"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 1713.29,4315.43 c -552.04,91.81 -1011.313,-231.29 -992.77,-820.82 18.136,-226.02 1196.14,787.16 992.77,820.82"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path32"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 2473.78,4452.92 c -329.46,8.44 -645.64,-240.85 -646.41,-385.43 -0.92,-175.69 260.48,-355.58 648.65,-360.15 396.41,-2.79 649.34,143.99 650.62,325.31 1.46,205.43 -360.52,423.45 -652.86,420.29 v -0.02"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path34"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 2499.23,850.172 c 287.23,12.359 672.67,-91.121 673.43,-228.391 4.77,-133.301 -349.56,-434.48 -692.48,-428.672 -355.16,-15.078 -703.39,286.551 -698.83,391.11 -5.32,153.301 432.44,272.98 717.88,265.953 v 0"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path36"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 1436.19,1663.74 c 204.49,-242.69 297.72,-669.049 127.07,-794.72 -161.47,-95.961 -553.57,-56.45 -832.276,337.92 -187.925,330.88 -163.722,667.63 -31.746,766.53 197.344,118.42 502.252,-41.52 736.952,-309.73 v 0"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path38"
|
||||
inkscape:connector-curvature="0" /><path
|
||||
d="m 3495.16,1740.65 c -221.27,-255.27 -344.49,-720.88 -183.07,-870.83 154.33,-116.488 568.64,-100.199 874.69,318.05 222.21,280.91 147.75,750.07 20.83,874.64 -188.58,143.66 -459.26,-40.19 -712.45,-321.78 v -0.08"
|
||||
style="fill:#c51850;fill-opacity:1;fill-rule:nonzero;stroke:none"
|
||||
id="path40"
|
||||
inkscape:connector-curvature="0" /></g></g></svg>
|
After Width: | Height: | Size: 10 KiB |
Loading…
Add table
Reference in a new issue