aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--README.md39
-rwxr-xr-xbuild.sh486
-rwxr-xr-xexport-image/04-finalise/01-run.sh60
-rw-r--r--scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg5
-rw-r--r--scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg5
-rw-r--r--scripts/build_vars188
-rw-r--r--scripts/common2
-rw-r--r--scripts/lib_nbd_img_handling181
-rw-r--r--scripts/qcow2_handling454
-rw-r--r--stage1/01-sys-tweaks/files/fstab1
-rw-r--r--stage2/01-sys-tweaks/00-packages1
-rw-r--r--stage2/01-sys-tweaks/00-packages-bookworm1
-rw-r--r--stage2/01-sys-tweaks/00-packages-bullseye1
-rw-r--r--stage2/01-sys-tweaks/00-packages-sys-debian1
-rw-r--r--stage2/01-sys-tweaks/00-packages-sys-debian-amd6410
-rwxr-xr-xstage2/01-sys-tweaks/01-run.sh61
-rw-r--r--stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg2
-rw-r--r--stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg2
-rw-r--r--stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro3
-rw-r--r--stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw2
-rw-r--r--stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro4
-rw-r--r--stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw3
-rw-r--r--stage2/01-sys-tweaks/files/fstab-rootfs_ro3
-rw-r--r--stage2/01-sys-tweaks/files/fstab-rootfs_rw3
-rwxr-xr-xstage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg86
-rwxr-xr-xstage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg120
-rw-r--r--stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg261
-rw-r--r--stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.pngbin0 -> 120559 bytes
-rw-r--r--stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg980
-rw-r--r--stage2/01-sys-tweaks/files/grub/theme/grub.pngbin0 -> 76170 bytes
-rw-r--r--stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg8
-rw-r--r--stage3b_kde/00-install-packages/00-packages-nr3
-rwxr-xr-xstage3b_lxde/00-install-packages/01-run.sh9
-rw-r--r--stage_rescue/00-install-packages/00-packages-sys-debian3
-rw-r--r--stage_rescue/00-install-packages/00-packages-sys-debian-bookworm3
-rwxr-xr-xstage_rescue/00-install-packages/01-run.sh-disabled (renamed from stage_rescue/00-install-packages/01-run.sh)7
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt70
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg5
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg5
-rwxr-xr-xstage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh29
-rwxr-xr-xstage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh2
-rwxr-xr-xstage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh3
-rwxr-xr-xstage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh8
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt27
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt46
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh37
-rw-r--r--stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh25
47 files changed, 2582 insertions, 673 deletions
diff --git a/README.md b/README.md
index 4ef526c..34e9035 100644
--- a/README.md
+++ b/README.md
@@ -5,9 +5,11 @@ Tool used to create Debian and Raspberry Pi derived OS images.
## Dependencies
-pi-gen has been tested and runs on Debian 11 `Bullseye`
+pi-gen has been tested and runs on Debian 12 `Bookworm`
to produce OS images for Raspi-arm64, Raspi-armhf and PC-amd64 machines
-based on Debian 10 `Buster` and Debian 11 `Bullseye`.
+based on Debian 12 `Bullseye`.
+
+Debian 13 `Trixie` may be supported.
PC-i386 is also supported, however, it has not been tested lately.
@@ -19,17 +21,16 @@ Related config variables are
It might be possible to use Docker on other Linux distributions as described below,
however, I have not tested this procedure.
-To install the required dependencies for `pi-gen` you should run:
+The file `depends` contains a list of tools needed. The format of this
+package is `<tool>[:<debian-package>]`.
+To install the required dependencies for `pi-gen` you should run:
```bash
apt-get install coreutils quilt parted qemu-user-static debootstrap zerofree zip \
dosfstools libarchive-tools libcap2-bin grep rsync xz-utils file git curl bc \
-qemu-utils kpartx squashfs-tools fatattr
+qemu-utils kpartx squashfs-tools fatattr e2fsprogs xfsprogs gdisk
```
-The file `depends` contains a list of tools needed. The format of this
-package is `<tool>[:<debian-package>]`.
-
### Package Source
For all targets, default source for `debootstrap` and `apt` package management
is `debian.org`.
@@ -53,6 +54,11 @@ as the package source.
that the network block device is not disconnected correctly after the Docker process has
ended abnormally. In that case see [Disconnect an image if something went wrong](#Disconnect-an-image-if-something-went-wrong)
+* UEFI Bootable Image
+
+ To support booting the image from UEFI (without `secure-boot`) as well as BIOS,
+ enable option `GPT_BIOS_UEFI`, see below.
+
## Config
Upon execution, `build.sh` will source the optional given config file, e.g.:
@@ -121,6 +127,17 @@ The following environment variables are supported:
Note: `apt cache` is disabled for all target configurations.
+ * `GPT_BIOS_UEFI` (Default: unset)
+
+ If set to one, i.e. `GPT_BIOS_UEFI=1`, a GPT partition table
+ will be used, bootable under bios and UEFI (without `secure-boot`).
+
+ Disable `secure-boot` in your UEFI bios!
+
+ In case the UEFI system doesn't launch the installed `EFISYS` partition directly,
+ utilize the UEFI `boot from file` facility and select
+ file `EFI/BOOT/BOOTX64.EFI` from the `EFISYS` partition.
+
* `ROOTFS_RO` (Default: unset)
If set to one, i.e. `ROOTFS_RO=1`, the root filesystem will be set read-only,
@@ -135,9 +152,13 @@ The following environment variables are supported:
```
Further all `apt-daily` systemd tasks are disabled,
- the ssh host keys are retained while `regenerate_ssh_host_keys` is disabled
- and the final `/boot/config.txt` has `splash` disabled (no rainbow).
+ the ssh host keys are retained while `regenerate_ssh_host_keys` is disabled.
+
+ On `amd64` PC platforms, grub is utilized here as usual, launching the `initramfs`
+ as described above.
+ On Raspberry `/boot/config.txt` has `splash` disabled (no rainbow).
+
* `ROOTFS_RO_OVERLAY_TMPFS_SIZE` (Default: 128M)
If using `ROOTFS_RO`, this variable specifies the shared `tmpfs` size
diff --git a/build.sh b/build.sh
index 5756439..3c41469 100755
--- a/build.sh
+++ b/build.sh
@@ -9,91 +9,99 @@ run_sub_stage()
local packfile;
local PACKAGES;
- log "Begin ${SUB_STAGE_DIR}"
- pushd "${SUB_STAGE_DIR}" > /dev/null
- for i in {00..99}; do
- if [ -f "${i}-debconf" ]; then
- log "Begin ${SUB_STAGE_DIR}/${i}-debconf"
- on_chroot << EOF
+ log "Begin ${SUB_STAGE_DIR}"
+ pushd "${SUB_STAGE_DIR}" > /dev/null
+ for i in {00..99}; do
+ if [ -f "${i}-debconf" ]; then
+ log "Begin ${SUB_STAGE_DIR}/${i}-debconf"
+ on_chroot << EOF
debconf-set-selections <<SELEOF
$(cat "${i}-debconf")
SELEOF
EOF
- log "End ${SUB_STAGE_DIR}/${i}-debconf"
- fi
- if [ "${TARGET_RASPI}" = "1" -a \( -f "${i}-packages-sys-raspi" -o -f "${i}-packages-sys-raspi-${RELEASE}" \) ]; then
+ log "End ${SUB_STAGE_DIR}/${i}-debconf"
+ fi
+ if [ "${TARGET_RASPI}" = "1" -a \( -f "${i}-packages-sys-raspi" -o -f "${i}-packages-sys-raspi-${RELEASE}" \) ]; then
if [ -f "${i}-packages-sys-raspi-${RELEASE}" ]; then
packfile="${i}-packages-sys-raspi-${RELEASE}"
else
packfile="${i}-packages-sys-raspi"
fi
- log "Begin ${SUB_STAGE_DIR}/${packfile}"
- PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
- if [ -n "$PACKAGES" ]; then
- on_chroot << EOF
+ log "Begin ${SUB_STAGE_DIR}/${packfile}"
+ PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
+ if [ -n "$PACKAGES" ]; then
+ on_chroot << EOF
echo "Installing ${packfile} '${PACKAGES}'"
apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES
EOF
- if [ "${USE_QCOW2}" = "1" ]; then
- on_chroot << EOF
+ if [ "${USE_QCOW2}" = "1" ]; then
+ on_chroot << EOF
apt-get clean
EOF
- fi
- fi
- log "End ${SUB_STAGE_DIR}/${packfile}"
- elif [ "${TARGET_RASPI}" != "1" -a \( -f "${i}-packages-sys-debian" -o -f "${i}-packages-sys-debian-${RELEASE}" \) ]; then
- if [ -f "${i}-packages-sys-debian-${RELEASE}" ]; then
+ fi
+ fi
+ log "End ${SUB_STAGE_DIR}/${packfile}"
+ elif [ "${TARGET_RASPI}" != "1" ]; then
+ if [ -f "${i}-packages-sys-debian-${RELEASE}-${TARGET_ARCH}" ]; then
+ packfile="${i}-packages-sys-debian-${RELEASE}-${TARGET_ARCH}"
+ elif [ -f "${i}-packages-sys-debian-${RELEASE}" ]; then
packfile="${i}-packages-sys-debian-${RELEASE}"
- else
+ elif [ -f "${i}-packages-sys-debian-${TARGET_ARCH}" ]; then
+ packfile="${i}-packages-sys-debian-${TARGET_ARCH}"
+ elif [ -f "${i}-packages-sys-debian" ]; then
packfile="${i}-packages-sys-debian"
+ else
+ packfile=
fi
- log "Begin ${SUB_STAGE_DIR}/${packfile}"
- PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
- if [ -n "$PACKAGES" ]; then
- on_chroot << EOF
+ if [ -n "${packfile}" ]; then
+ log "Begin ${SUB_STAGE_DIR}/${packfile}"
+ PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
+ if [ -n "$PACKAGES" ]; then
+ on_chroot << EOF
echo "Installing ${packfile} '${PACKAGES}'"
apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES
EOF
- if [ "${USE_QCOW2}" = "1" ]; then
- on_chroot << EOF
+ if [ "${USE_QCOW2}" = "1" ]; then
+ on_chroot << EOF
apt-get clean
EOF
- fi
- fi
- log "End ${SUB_STAGE_DIR}/${packfile}"
- fi
- if [ -f "${i}-packages-nr" -o -f "${i}-packages-nr-${RELEASE}" ]; then
+ fi
+ fi
+ log "End ${SUB_STAGE_DIR}/${packfile}"
+ fi
+ fi
+ if [ -f "${i}-packages-nr" -o -f "${i}-packages-nr-${RELEASE}" ]; then
if [ -f "${i}-packages-nr-${RELEASE}" ]; then
packfile="${i}-packages-nr-${RELEASE}"
else
packfile="${i}-packages-nr"
fi
- log "Begin ${SUB_STAGE_DIR}/${packfile}"
- PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
- if [ -n "$PACKAGES" ]; then
- on_chroot << EOF
+ log "Begin ${SUB_STAGE_DIR}/${packfile}"
+ PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
+ if [ -n "$PACKAGES" ]; then
+ on_chroot << EOF
echo "Installing ${packfile} '${PACKAGES}'"
apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES
EOF
- if [ "${USE_QCOW2}" = "1" ]; then
- on_chroot << EOF
+ if [ "${USE_QCOW2}" = "1" ]; then
+ on_chroot << EOF
apt-get clean
EOF
- fi
- fi
- log "End ${SUB_STAGE_DIR}/${packfile}"
- fi
- if [ -f "${i}-packages" -o -f "${i}-packages-${RELEASE}" ]; then
+ fi
+ fi
+ log "End ${SUB_STAGE_DIR}/${packfile}"
+ fi
+ if [ -f "${i}-packages" -o -f "${i}-packages-${RELEASE}" ]; then
if [ -f "${i}-packages-${RELEASE}" ]; then
packfile="${i}-packages-${RELEASE}"
else
packfile="${i}-packages"
fi
- log "Begin ${SUB_STAGE_DIR}/${packfile}"
- PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
- if [ -n "$PACKAGES" ]; then
- on_chroot << EOF
+ log "Begin ${SUB_STAGE_DIR}/${packfile}"
+ PACKAGES="$(sed -f "${SCRIPT_DIR}/remove-comments.sed" < "${packfile}")"
+ if [ -n "$PACKAGES" ]; then
+ on_chroot << EOF
echo "Installing ${packfile} '${PACKAGES}'"
if [ "${INSTALL_RECOMMENDS}" != "1" -o "${REDUCED_FOOTPRINT}" = "1" ]; then
apt-get ${APT_GET_INSTALL_OPTS} install --no-install-recommends -y $PACKAGES
@@ -102,55 +110,55 @@ else
apt-get ${APT_GET_INSTALL_OPTS} install -y $PACKAGES
fi
EOF
- if [ "${USE_QCOW2}" = "1" ]; then
- on_chroot << EOF
+ if [ "${USE_QCOW2}" = "1" ]; then
+ on_chroot << EOF
apt-get clean
EOF
- fi
- fi
- log "End ${SUB_STAGE_DIR}/${packfile}"
- fi
- if [ -d "${i}-patches" ]; then
- log "Begin ${SUB_STAGE_DIR}/${i}-patches"
- pushd "${STAGE_WORK_DIR}" > /dev/null
- if [ "${CLEAN}" = "1" ]; then
- rm -rf .pc
- rm -rf ./*-pc
- fi
- QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches"
- SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc"
- mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR"
- ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc
- quilt upgrade
- if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then
- echo "Dropping into bash to edit patches..."
- bash
- fi
- RC=0
- quilt push -a || RC=$?
- case "$RC" in
- 0|2)
- ;;
- *)
- false
- ;;
- esac
- popd > /dev/null
- log "End ${SUB_STAGE_DIR}/${i}-patches"
- fi
- if [ -x ${i}-run.sh ]; then
- log "Begin ${SUB_STAGE_DIR}/${i}-run.sh"
- ./${i}-run.sh
- log "End ${SUB_STAGE_DIR}/${i}-run.sh"
- fi
- if [ -f ${i}-run-chroot.sh ]; then
- log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
- on_chroot < ${i}-run-chroot.sh
- log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
- fi
- done
- popd > /dev/null
- log "End ${SUB_STAGE_DIR}"
+ fi
+ fi
+ log "End ${SUB_STAGE_DIR}/${packfile}"
+ fi
+ if [ -d "${i}-patches" ]; then
+ log "Begin ${SUB_STAGE_DIR}/${i}-patches"
+ pushd "${STAGE_WORK_DIR}" > /dev/null
+ if [ "${CLEAN}" = "1" ]; then
+ rm -rf .pc
+ rm -rf ./*-pc
+ fi
+ QUILT_PATCHES="${SUB_STAGE_DIR}/${i}-patches"
+ SUB_STAGE_QUILT_PATCH_DIR="$(basename "$SUB_STAGE_DIR")-pc"
+ mkdir -p "$SUB_STAGE_QUILT_PATCH_DIR"
+ ln -snf "$SUB_STAGE_QUILT_PATCH_DIR" .pc
+ quilt upgrade
+ if [ -e "${SUB_STAGE_DIR}/${i}-patches/EDIT" ]; then
+ echo "Dropping into bash to edit patches..."
+ bash
+ fi
+ RC=0
+ quilt push -a || RC=$?
+ case "$RC" in
+ 0|2)
+ ;;
+ *)
+ false
+ ;;
+ esac
+ popd > /dev/null
+ log "End ${SUB_STAGE_DIR}/${i}-patches"
+ fi
+ if [ -x ${i}-run.sh ]; then
+ log "Begin ${SUB_STAGE_DIR}/${i}-run.sh"
+ ./${i}-run.sh
+ log "End ${SUB_STAGE_DIR}/${i}-run.sh"
+ fi
+ if [ -f ${i}-run-chroot.sh ]; then
+ log "Begin ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
+ on_chroot < ${i}-run-chroot.sh
+ log "End ${SUB_STAGE_DIR}/${i}-run-chroot.sh"
+ fi
+ done
+ popd > /dev/null
+ log "End ${SUB_STAGE_DIR}"
}
@@ -163,229 +171,66 @@ contains() {
}
run_stage(){
- STAGE="$(basename "${STAGE_DIR}")"
+ STAGE="$(basename "${STAGE_DIR}")"
SKIP_STAGE=`contains "${SKIP_STAGE_LIST}" ${STAGE}`
SKIP_IMAGES=`contains "${SKIP_IMAGES_LIST}" ${STAGE}`
- log "Begin ${STAGE} ${STAGE_DIR} SKIP(STAGE ${SKIP_STAGE}, IMAGES ${SKIP_IMAGES})"
+ log "Begin ${STAGE} ${STAGE_DIR} SKIP(STAGE ${SKIP_STAGE}, IMAGES ${SKIP_IMAGES})"
- pushd "${STAGE_DIR}" > /dev/null
+ pushd "${STAGE_DIR}" > /dev/null
- STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
- ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs
+ STAGE_WORK_DIR="${WORK_DIR}/${STAGE}"
+ ROOTFS_DIR="${STAGE_WORK_DIR}"/rootfs
- if [ "${USE_QCOW2}" = "1" ]; then
+ if [ "${USE_QCOW2}" = "1" ]; then
if [ "${SKIP_STAGE}" != "1" ]; then
- load_qimage
- fi
- fi
-
+ load_qimage
+ fi
+ fi
+
if [ "${SKIP_IMAGES}" != "1" ]; then
- if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then
- EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}"
- fi
- fi
+ if [ -f "${STAGE_DIR}/EXPORT_IMAGE" ]; then
+ EXPORT_DIRS="${EXPORT_DIRS} ${STAGE_DIR}"
+ fi
+ fi
if [ "${SKIP_STAGE}" != "1" ]; then
- if [ "${CLEAN}" = "1" ] && [ "${USE_QCOW2}" = "0" ] ; then
- if [ -d "${ROOTFS_DIR}" ]; then
- rm -rf "${ROOTFS_DIR}"
- fi
- fi
- if [ -x prerun.sh ]; then
- log "Begin ${STAGE_DIR}/prerun.sh"
- ./prerun.sh
- log "End ${STAGE_DIR}/prerun.sh"
- fi
- for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do
- if [ -d "${SUB_STAGE_DIR}" ]; then
- run_sub_stage
- fi
- done
- fi
+ if [ "${CLEAN}" = "1" ] && [ "${USE_QCOW2}" = "0" ] ; then
+ if [ -d "${ROOTFS_DIR}" ]; then
+ rm -rf "${ROOTFS_DIR}"
+ fi
+ fi
+ if [ -x prerun.sh ]; then
+ log "Begin ${STAGE_DIR}/prerun.sh"
+ ./prerun.sh
+ log "End ${STAGE_DIR}/prerun.sh"
+ fi
+ for SUB_STAGE_DIR in "${STAGE_DIR}"/*; do
+ if [ -d "${SUB_STAGE_DIR}" ]; then
+ run_sub_stage
+ fi
+ done
+ fi
- if [ "${USE_QCOW2}" = "1" ]; then
- unload_qimage
- fi
+ if [ "${USE_QCOW2}" = "1" ]; then
+ unload_qimage
+ fi
- PREV_STAGE="${STAGE}"
- PREV_STAGE_DIR="${STAGE_DIR}"
- PREV_ROOTFS_DIR="${ROOTFS_DIR}"
- popd > /dev/null
- log "End ${STAGE_DIR}"
+ PREV_STAGE="${STAGE}"
+ PREV_STAGE_DIR="${STAGE_DIR}"
+ PREV_ROOTFS_DIR="${ROOTFS_DIR}"
+ popd > /dev/null
+ log "End ${STAGE_DIR}"
}
if [ "$(id -u)" != "0" ]; then
- echo "Please run as root" 1>&2
- exit 1
+ echo "Please run as root" 1>&2
+ exit 1
fi
BASE_DIR=`dirname $(readlink -f "${BASH_SOURCE[0]}")`
export BASE_DIR
-
-while getopts "c:" flag
-do
- case "$flag" in
- c)
- EXTRA_CONFIG="$OPTARG"
- # shellcheck disable=SC1090
- echo "Reading config from ${EXTRA_CONFIG}"
- source "$EXTRA_CONFIG"
- ;;
- *)
- ;;
- esac
-done
-
-term() {
- if [ "${USE_QCOW2}" = "1" ]; then
- log "Unloading image"
- unload_qimage
- fi
-}
-
-trap term EXIT INT TERM
-
-export PI_GEN=${PI_GEN:-pi-gen}
-export PI_GEN_REPO=${PI_GEN_REPO:-https://jausoft.com/cgit/pi-gen.git/about/}
-
-if [ -z "${IMG_NAME}" ]; then
- echo "IMG_NAME not set" 1>&2
- exit 1
-fi
-
-export USE_QEMU="${USE_QEMU:-0}"
-export IMG_DATE="${IMG_DATE:-"$(date --utc +%Y-%m-%d_%H:%M:%S)"}"
-export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}"
-export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}"
-
export SCRIPT_DIR="${BASE_DIR}/scripts"
-export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}"
-export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
-export DEPLOY_ZIP="${DEPLOY_ZIP:-1}"
-export LOG_FILE="${WORK_DIR}/build.log"
-export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi}
-
-export FIRST_USER_NAME=${FIRST_USER_NAME:-pi}
-export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry}
-export RELEASE=${RELEASE:-buster}
-
-export TARGET_RASPI="${TARGET_RASPI:-1}"
-export TARGET_ARCH="${TARGET_ARCH:-arm64}"
-
-export WPA_ESSID
-export WPA_PASSWORD
-export WPA_COUNTRY
-export ENABLE_SSH="${ENABLE_SSH:-0}"
-export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}"
-
-export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_US.UTF-8}"
-
-export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}"
-export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}"
-
-export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/Berlin}"
-
-export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
-
-export PUBKEY_SSH_FIRST_USER
-
-export CLEAN
-export IMG_NAME
-export APT_PROXY
-
-export STAGE
-export STAGE_DIR
-export STAGE_WORK_DIR
-export PREV_STAGE
-export PREV_STAGE_DIR
-export ROOTFS_DIR
-export PREV_ROOTFS_DIR
-export IMG_SUFFIX
-export NOOBS_NAME
-export NOOBS_DESCRIPTION
-export EXPORT_DIR
-export EXPORT_ROOTFS_DIR
-
-export QUILT_PATCHES
-export QUILT_NO_DIFF_INDEX=1
-export QUILT_NO_DIFF_TIMESTAMPS=1
-export QUILT_REFRESH_ARGS="-p ab"
-
-if [ -z "${DEB_SERVER}" ]; then
- export DEB_SERVER="http://deb.debian.org/debian"
-fi
-
-if [ -z "${IS_TESTING}" ]; then
- IS_TESTING=
- case "${RELEASE}" in
- "jessie")
- IS_TESTING=0 ;;
- "stretch")
- IS_TESTING=0 ;;
- "buster")
- IS_TESTING=0 ;;
- "bullseye")
- IS_TESTING=0 ;;
- "bookworm")
- IS_TESTING=0 ;;
- "trixie")
- IS_TESTING=1 ;;
- *)
- IS_TESTING=1 ;;
- esac
-fi
-export IS_TESTING
-
-if [ "${PREFER_RASPI_SOURCE}" = "1" -a "${TARGET_RASPI}" = "1" -a "${TARGET_ARCH}" = "armhf" ]; then
- USE_RASPI_SOURCE=1
-else
- USE_RASPI_SOURCE=0
-fi
-export USE_RASPI_SOURCE
-
-# shellcheck source=scripts/common
-source "${SCRIPT_DIR}/common"
-# shellcheck source=scripts/dependencies_check
-source "${SCRIPT_DIR}/dependencies_check"
-
-# merely a local flag for `run_stage` for EXPORT_DIRS (images) only
-export USE_QCOW2=1
-
-export BASE_QCOW2_SIZE=${BASE_QCOW2_SIZE:-15200M}
-source "${SCRIPT_DIR}/qcow2_handling"
-
-export ROOTFS_RO_OVERLAY_TMPFS_SIZE=${ROOTFS_RO_OVERLAY_TMPFS_SIZE:-128M}
-# vfat, ext2, ext4 or xfs
-export BOOT_FSTYPE=${BOOT_FSTYPE:-vfat}
-# codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build
-if [ -z ${FAT_CODEPAGE+x} ]; then
- readonly FAT_CODEPAGE="437"
- export FAT_CODEPAGE
-fi
-export BOOT_FSOPTIONS=${BOOT_FSOPTIONS:-rw,noatime,fmask=0022,dmask=0022,codepage=${FAT_CODEPAGE},iocharset=ascii,shortname=mixed,errors=remount-ro}
-
-dependencies_check "${BASE_DIR}/depends"
-
-#check username is valid
-if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
- echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
- exit 1
-fi
-
-if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then
- echo "Could not reach APT_PROXY server: ${APT_PROXY}"
- exit 1
-fi
-
-if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then
- echo "WPA_PASSWORD" must be between 8 and 63 characters
- exit 1
-fi
-
-if [[ "${PUBKEY_ONLY_SSH}" = "1" && -z "${PUBKEY_SSH_FIRST_USER}" ]]; then
- echo "Must set 'PUBKEY_SSH_FIRST_USER' to a valid SSH public key if using PUBKEY_ONLY_SSH"
- exit 1
-fi
+source "${SCRIPT_DIR}/build_vars"
CLEAN=1
mkdir -p "${WORK_DIR}"
@@ -400,22 +245,23 @@ echo "Skipping stages: \"${SKIP_STAGE_LIST}\""
echo "Skipping images: \"${SKIP_IMAGES_LIST}\""
for STAGE_DIR in $STAGE_LIST; do
- STAGE_DIR=$(realpath "${STAGE_DIR}")
- run_stage
+ STAGE_DIR=$(realpath "${STAGE_DIR}")
+ run_stage
done
CLEAN=1
for EXPORT_DIR in ${EXPORT_DIRS}; do
- STAGE_DIR=${BASE_DIR}/export-image
- # shellcheck source=/dev/null
- source "${EXPORT_DIR}/EXPORT_IMAGE"
- EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs
+ STAGE_DIR=${BASE_DIR}/export-image
+ # shellcheck source=/dev/null
+ source "${EXPORT_DIR}/EXPORT_IMAGE"
+ EXPORT_ROOTFS_DIR=${WORK_DIR}/$(basename "${EXPORT_DIR}")/rootfs
USE_QCOW2=0
EXPORT_NAME="${IMG_FILENAME}${IMG_SUFFIX}"
echo "------------------------------------------------------------------------"
echo "Running export stage for ${EXPORT_NAME}"
rm -f "${WORK_DIR}/export-image/${EXPORT_NAME}.img" || true
rm -f "${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2" || true
+ rm -rf "${WORK_DIR}/export-image/rootfs" || true
rm -f "${WORK_DIR}/${EXPORT_NAME}.img" || true
rm -f "${WORK_DIR}/${EXPORT_NAME}.qcow2" || true
EXPORT_STAGE=$(basename "${EXPORT_DIR}")
@@ -436,7 +282,7 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do
PREV_IMG="${EXPORT_NAME}"
continue
fi
- echo "Rebasing image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2"
+ echo "Rebasing image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2"
qemu-img rebase -f qcow2 -u -b ${PREV_IMG}.qcow2 image-${CURR_STAGE}.qcow2 -F qcow2
if [ "${CURR_STAGE}" = "${EXPORT_STAGE}" ]; then
break
@@ -454,8 +300,9 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do
PREV_IMG="image-${CURR_STAGE}"
continue
fi
- echo "Rebasing back image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2"
+ echo "Rebasing back image-${CURR_STAGE}.qcow2 onto ${PREV_IMG}.qcow2"
qemu-img rebase -f qcow2 -u -b ${PREV_IMG}.qcow2 image-${CURR_STAGE}.qcow2 -F qcow2
+ PREV_ROOTFS_DIR="${WORK_DIR}/${CURR_STAGE}"/rootfs
if [ "${CURR_STAGE}" = "${EXPORT_STAGE}" ]; then
break
fi
@@ -464,6 +311,11 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do
popd > /dev/null
mkdir -p "${WORK_DIR}/export-image/rootfs"
+ if [[ "${ROOTFS_RO}" = "1" && -n "${PREV_ROOTFS_DIR}" ]]; then
+ echo "ROOTFS_RO: rsync ${PREV_ROOTFS_DIR}/ ${WORK_DIR}/export-image/rootfs"
+ rsync -a "${PREV_ROOTFS_DIR}/" "${WORK_DIR}/export-image/rootfs"
+ sync
+ fi
mv "${WORK_DIR}/${EXPORT_NAME}.qcow2" "${WORK_DIR}/export-image/"
echo "Mounting image ${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2 to rootfs ${WORK_DIR}/export-image/rootfs"
mount_qimage "${WORK_DIR}/export-image/${EXPORT_NAME}.qcow2" "${WORK_DIR}/export-image/rootfs"
@@ -473,23 +325,23 @@ for EXPORT_DIR in ${EXPORT_DIRS}; do
CLEAN=1
USE_QCOW2=1
- if [ "${USE_QEMU}" != "1" ]; then
- if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then
- # shellcheck source=/dev/null
- source "${EXPORT_DIR}/EXPORT_NOOBS"
- STAGE_DIR="${BASE_DIR}/export-noobs"
+ if [ "${USE_QEMU}" != "1" ]; then
+ if [ -e "${EXPORT_DIR}/EXPORT_NOOBS" ]; then
+ # shellcheck source=/dev/null
+ source "${EXPORT_DIR}/EXPORT_NOOBS"
+ STAGE_DIR="${BASE_DIR}/export-noobs"
USE_QCOW2=0
run_stage
USE_QCOW2=1
- fi
- fi
+ fi
+ fi
done
if [ -x postrun.sh ]; then
- log "Begin postrun.sh"
- cd "${BASE_DIR}"
- ./postrun.sh
- log "End postrun.sh"
+ log "Begin postrun.sh"
+ cd "${BASE_DIR}"
+ ./postrun.sh
+ log "End postrun.sh"
fi
unload_qimage
diff --git a/export-image/04-finalise/01-run.sh b/export-image/04-finalise/01-run.sh
index cdaadc3..d94841b 100755
--- a/export-image/04-finalise/01-run.sh
+++ b/export-image/04-finalise/01-run.sh
@@ -10,6 +10,7 @@ fi
DEPLOY_DIR2="${DEPLOY_DIR}/${IMG_FILENAME}"
+QCOW2_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2"
IMG_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.img"
INFO_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.info"
@@ -98,36 +99,68 @@ if [ "${ROOTFS_RO}" = "1" ] ; then
cp -a "${ROOTFS_DIR}/boot" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}"
fi
+if [ "${ROOTFS_RO}" = "1" ] ; then
+ finalize_fstab_ro "${ROOTFS_DIR}"
+fi
+
+on_chroot <<EOF
+ if [ "${TARGET_RASPI}" != "1" ]; then
+ # BIOS Boot
+ echo "GRUB Install: BIOS: ROOTFS_RO=${ROOTFS_RO}"
+ if [ "${ROOTFS_RO}" = "1" ] ; then
+ # using manually copied /boot/grub/grub.cfg
+ grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat" /dev/${NBD_DEV}
+ else
+ grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat ext2 xfs" /dev/${NBD_DEV}
+ update-grub
+ fi
+ if [ -n "${UEFI_ARCH}" ] ; then
+ # EFI Boot
+ echo "GRUB Install: UEFI: Using grub-install. ROOTFS_RO=${ROOTFS_RO}"
+ mkdir -p /boot/efi/EFI/BOOT
+ # --removable: EFI/BOOT/bootx64.efi
+ # --uefi-secure-boot (we disable this option)
+ grub-install --target=${UEFI_ARCH}-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=BOOT
+ fi
+ # Remove storage device related search.fs_uuid and allow multi homing
+ rm -f /boot/grub/i386-pc/load.cfg
+ if [ -n "${UEFI_ARCH}" ] ; then
+ rm -f /boot/grub/${UEFI_ARCH}-efi/load.cfg
+ fi
+ fi
+EOF
+
unload_qimage
-make_bootable_image "${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.qcow2" \
- "$IMG_FILE" \
- "$IMG_FILE_ROOT_EXT4" "$INFO_FILE_ROOT"
if [ "${ROOTFS_RO}" = "1" ] ; then
- mount -o ro "$IMG_FILE_ROOT_EXT4" "${ROOTFS_DIR}"
- #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_GZ}" -comp gzip
- mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_LZO}" -comp lzo
- #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_ZSTD}" -comp zstd -Xcompression-level 10
- umount "${ROOTFS_DIR}"
+ rm -f "${IMG_FILE_ROOT_SQFS_LZO}"
+ #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_GZ}" -comp gzip -no-xattrs
+ mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_LZO}" -comp lzo -no-xattrs
+ #mksquashfs "${ROOTFS_DIR}" "${IMG_FILE_ROOT_SQFS_ZSTD}" -comp zstd -Xcompression-level 10 -no-xattrs
cp -a "$INFO_FILE_ROOT" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.inf"
# cp -a "$IMG_FILE_ROOT_EXT4" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img"
cp -a "$IMG_FILE_ROOT_SQFS_LZO" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img"
# cp -a "$IMG_FILE_ROOT_SQFS_ZSTD" "${DEPLOY_DIR2}/sdcard${IMG_SUFFIX}/sys_${TARGET_ARCH}_000/rootfs.img"
- echo "Mount image ${IMG_FILE}"
+ echo "Mount image ${QCOW2_FILE}"
MOUNTROOT=${STAGE_WORK_DIR}/tmpimage
mkdir -p $MOUNTROOT
- mount_rawimage "${IMG_FILE}" $MOUNTROOT
- if [ ! -d "${MOUNTROOT}/root" ]; then
+ mount_qimage "${QCOW2_FILE}" "${MOUNTROOT}"
+ if [ ! -d "${MOUNTROOT}/boot" ]; then
echo "Image damaged or not mounted. Exit."
exit 1
fi
cp "$IMG_FILE_ROOT_SQFS_LZO" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/rootfs.img"
- echo "Umount image ${IMG_FILE}"
+ echo "Umount image ${QCOW2_FILE}"
sync
umount_image $MOUNTROOT
fi
+
+make_bootable_image "${QCOW2_FILE}" \
+ "$IMG_FILE" \
+ "$IMG_FILE_ROOT_EXT4" "$INFO_FILE_ROOT"
+
mv "$INFO_FILE" "$INFO_FILE_ROOT" "$DEPLOY_DIR2/"
if [ "${DEPLOY_ZIP}" == "1" ]; then
@@ -150,8 +183,9 @@ if [ "${ROOTFS_RO}" = "1" ] ; then
#mv -v "$IMG_FILE_ROOT_SQFS_GZ" "$DEPLOY_DIR2/"
mv -v "$IMG_FILE_ROOT_SQFS_LZO" "$DEPLOY_DIR2/"
#mv -v "$IMG_FILE_ROOT_SQFS_ZSTD" "$DEPLOY_DIR2/"
+else
+ mv -v "$IMG_FILE_ROOT_EXT4" "$DEPLOY_DIR2/"
fi
-mv -v "$IMG_FILE_ROOT_EXT4" "$DEPLOY_DIR2/"
rm -f "${STAGE_WORK_DIR}/SHA256SUMS"
( cd "${DEPLOY_DIR2}"; find . -maxdepth 1 -type f -exec sha256sum -b \{\} >> "${STAGE_WORK_DIR}/SHA256SUMS" \; )
diff --git a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg
index 76d25b5..9f1ec21 100644
--- a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg
+++ b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs-jau.cfg
@@ -2,6 +2,7 @@
export TARGET_RASPI="0"
export TARGET_ARCH="amd64"
+export GPT_BIOS_UEFI="1"
export RELEASE=bookworm
# export RELEASE=bullseye
@@ -9,6 +10,8 @@ export RELEASE=bookworm
# Produce a read-only rootfs
export ROOTFS_RO=1
# export REDUCED_FOOTPRINT=1
+# 4096MiB = 4GiB, but we keep 96MiB 'allowance' for sdcard inaccuracy to fit on 4GB
+export BASE_QCOW2_SIZE=4000M
export DEB_SERVER="http://deb.debian.org/debian"
# export DEB_SERVER="http://ftp.de.debian.org/debian"
@@ -16,7 +19,7 @@ export DEB_SERVER="http://deb.debian.org/debian"
export APT_PROXY=http://jordan:3142
export CUSTOM_NAME="DebAmd64RescueZfs"
-export CUSTOM_VERSION="1.4-ro"
+export CUSTOM_VERSION="1.5-ro"
export PI_GEN="pi-gen (zfs branch)"
diff --git a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg
index 4b2672f..0faf725 100644
--- a/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg
+++ b/scripts/05-build-debian_deb12_amd64-ro-rescuezfs.cfg
@@ -2,6 +2,7 @@
export TARGET_RASPI="0"
export TARGET_ARCH="amd64"
+export GPT_BIOS_UEFI="1"
export RELEASE=bookworm
# export RELEASE=bullseye
@@ -9,6 +10,8 @@ export RELEASE=bookworm
# Produce a read-only rootfs
export ROOTFS_RO=1
# export REDUCED_FOOTPRINT=1
+# 4096MiB = 4GiB, but we keep 96MiB 'allowance' for sdcard inaccuracy to fit on 4GB
+export BASE_QCOW2_SIZE=4000M
export DEB_SERVER="http://deb.debian.org/debian"
# export DEB_SERVER="http://ftp.de.debian.org/debian"
@@ -16,7 +19,7 @@ export DEB_SERVER="http://deb.debian.org/debian"
# export APT_PROXY=http://jordan:3142
export CUSTOM_NAME="DebAmd64RescueZfs"
-export CUSTOM_VERSION="1.4-ro"
+export CUSTOM_VERSION="1.5-ro"
export PI_GEN="pi-gen (zfs branch)"
diff --git a/scripts/build_vars b/scripts/build_vars
new file mode 100644
index 0000000..7c7bda2
--- /dev/null
+++ b/scripts/build_vars
@@ -0,0 +1,188 @@
+#!/bin/bash
+
+while getopts "c:" flag
+do
+ case "$flag" in
+ c)
+ EXTRA_CONFIG="$OPTARG"
+ # shellcheck disable=SC1090
+ echo "Reading config from ${EXTRA_CONFIG}"
+ source "$EXTRA_CONFIG"
+ ;;
+ *)
+ ;;
+ esac
+done
+
+term() {
+ if [ "${USE_QCOW2}" = "1" ]; then
+ log "Unloading image"
+ unload_qimage
+ fi
+}
+
+trap term EXIT INT TERM
+
+export PI_GEN=${PI_GEN:-pi-gen}
+export PI_GEN_REPO=${PI_GEN_REPO:-https://jausoft.com/cgit/pi-gen.git/about/}
+
+export USE_QEMU="${USE_QEMU:-0}"
+
+if [ -z "${IMG_NAME}" ]; then
+ echo "IMG_NAME not set" 1>&2
+ exit 1
+fi
+export IMG_DATE="${IMG_DATE:-"$(date --utc +%Y-%m-%d_%H:%M:%S)"}"
+export IMG_FILENAME="${IMG_FILENAME:-"${IMG_DATE}-${IMG_NAME}"}"
+export ZIP_FILENAME="${ZIP_FILENAME:-"image_${IMG_DATE}-${IMG_NAME}"}"
+export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work/${IMG_DATE}-${IMG_NAME}"}"
+export IMG_NAME
+export IMG_SUFFIX
+
+export DEPLOY_DIR=${DEPLOY_DIR:-"${BASE_DIR}/deploy"}
+export DEPLOY_ZIP="${DEPLOY_ZIP:-1}"
+export WORK_DIR="${WORK_DIR:-"${BASE_DIR}/work"}"
+export LOG_FILE="${WORK_DIR}/build.log"
+
+export TARGET_HOSTNAME=${TARGET_HOSTNAME:-raspberrypi}
+
+export FIRST_USER_NAME=${FIRST_USER_NAME:-pi}
+export FIRST_USER_PASS=${FIRST_USER_PASS:-raspberry}
+export RELEASE=${RELEASE:-buster}
+
+export TARGET_RASPI="${TARGET_RASPI:-1}"
+export TARGET_ARCH="${TARGET_ARCH:-arm64}"
+
+export WPA_ESSID
+export WPA_PASSWORD
+export WPA_COUNTRY
+export ENABLE_SSH="${ENABLE_SSH:-0}"
+export PUBKEY_ONLY_SSH="${PUBKEY_ONLY_SSH:-0}"
+
+export LOCALE_DEFAULT="${LOCALE_DEFAULT:-en_US.UTF-8}"
+
+export KEYBOARD_KEYMAP="${KEYBOARD_KEYMAP:-us}"
+export KEYBOARD_LAYOUT="${KEYBOARD_LAYOUT:-English (US)}"
+
+export TIMEZONE_DEFAULT="${TIMEZONE_DEFAULT:-Europe/Berlin}"
+
+export GIT_HASH=${GIT_HASH:-"$(git rev-parse HEAD)"}
+
+export PUBKEY_SSH_FIRST_USER
+
+export CLEAN
+export APT_PROXY
+
+export STAGE
+export STAGE_DIR
+export STAGE_WORK_DIR
+export PREV_STAGE
+export PREV_STAGE_DIR
+export ROOTFS_DIR
+export PREV_ROOTFS_DIR
+export NOOBS_NAME
+export NOOBS_DESCRIPTION
+export EXPORT_DIR
+export EXPORT_ROOTFS_DIR
+
+export QUILT_PATCHES
+export QUILT_NO_DIFF_INDEX=1
+export QUILT_NO_DIFF_TIMESTAMPS=1
+export QUILT_REFRESH_ARGS="-p ab"
+
+export UEFI_ARCH
+
+if [ "${GPT_BIOS_UEFI}" = "1" -a "${TARGET_RASPI}" = "1" ]; then
+ echo "Not supported: GPT_BIOS_UEFI + TARGET_RASPI"
+ exit 1
+fi
+if [ "${GPT_BIOS_UEFI}" = "1" -a -z "${UEFI_ARCH}" ] ; then
+ case "${TARGET_ARCH}" in
+ "amd64")
+ UEFI_ARCH="x86_64" ;;
+ "i386")
+ UEFI_ARCH="i386" ;;
+ *)
+ echo "GPT BIOS/UEFI not supported on target arch ${TARGET_ARCH}"
+ UEFI_ARCH=
+ GPT_BIOS_UEFI=
+ exit 1 ;;
+ esac
+fi
+
+if [ -z "${DEB_SERVER}" ]; then
+ export DEB_SERVER="http://deb.debian.org/debian"
+fi
+
+if [ -z "${IS_TESTING}" ]; then
+ IS_TESTING=
+ case "${RELEASE}" in
+ "jessie")
+ IS_TESTING=0 ;;
+ "stretch")
+ IS_TESTING=0 ;;
+ "buster")
+ IS_TESTING=0 ;;
+ "bullseye")
+ IS_TESTING=0 ;;
+ "bookworm")
+ IS_TESTING=0 ;;
+ "trixie")
+ IS_TESTING=0 ;;
+ *)
+ IS_TESTING=1 ;;
+ esac
+fi
+export IS_TESTING
+
+if [ "${PREFER_RASPI_SOURCE}" = "1" -a "${TARGET_RASPI}" = "1" -a "${TARGET_ARCH}" = "armhf" ]; then
+ USE_RASPI_SOURCE=1
+else
+ USE_RASPI_SOURCE=0
+fi
+export USE_RASPI_SOURCE
+
+# shellcheck source=scripts/common
+source "${SCRIPT_DIR}/common"
+# shellcheck source=scripts/dependencies_check
+source "${SCRIPT_DIR}/dependencies_check"
+
+# merely a local flag for `run_stage` for EXPORT_DIRS (images) only
+export USE_QCOW2=1
+
+export BASE_QCOW2_SIZE=${BASE_QCOW2_SIZE:-15200M}
+source "${SCRIPT_DIR}/qcow2_handling"
+
+export ROOTFS_RO_OVERLAY_TMPFS_SIZE=${ROOTFS_RO_OVERLAY_TMPFS_SIZE:-128M}
+# vfat, ext2, ext4 or xfs
+export BOOT_FSTYPE=${BOOT_FSTYPE:-vfat}
+# codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build
+if [ -z ${FAT_CODEPAGE+x} ]; then
+ readonly FAT_CODEPAGE="437"
+ export FAT_CODEPAGE
+fi
+export BOOT_FSOPTIONS=${BOOT_FSOPTIONS:-rw,noatime,fmask=0022,dmask=0022,codepage=${FAT_CODEPAGE},iocharset=ascii,shortname=mixed,errors=remount-ro}
+
+dependencies_check "${BASE_DIR}/depends"
+
+#check username is valid
+if [[ ! "$FIRST_USER_NAME" =~ ^[a-z][-a-z0-9_]*$ ]]; then
+ echo "Invalid FIRST_USER_NAME: $FIRST_USER_NAME"
+ exit 1
+fi
+
+if [[ -n "${APT_PROXY}" ]] && ! curl --silent "${APT_PROXY}" >/dev/null ; then
+ echo "Could not reach APT_PROXY server: ${APT_PROXY}"
+ exit 1
+fi
+
+if [[ -n "${WPA_PASSWORD}" && ${#WPA_PASSWORD} -lt 8 || ${#WPA_PASSWORD} -gt 63 ]] ; then
+ echo "WPA_PASSWORD" must be between 8 and 63 characters
+ exit 1
+fi
+
+if [[ "${PUBKEY_ONLY_SSH}" = "1" && -z "${PUBKEY_SSH_FIRST_USER}" ]]; then
+ echo "Must set 'PUBKEY_SSH_FIRST_USER' to a valid SSH public key if using PUBKEY_ONLY_SSH"
+ exit 1
+fi
+
diff --git a/scripts/common b/scripts/common
index 4ff9a96..9cb0055 100644
--- a/scripts/common
+++ b/scripts/common
@@ -1,3 +1,5 @@
+#!/bin/bash
+
log (){
date +"[%T] $*" | tee -a "${LOG_FILE}"
}
diff --git a/scripts/lib_nbd_img_handling b/scripts/lib_nbd_img_handling
index ebbabf9..9f77612 100644
--- a/scripts/lib_nbd_img_handling
+++ b/scripts/lib_nbd_img_handling
@@ -17,12 +17,13 @@ export -f lib_echo_err
# Reusable: find and initialize free block device nodes
# Return: new nbd device basename
lib_init_nbd() {
- local res=
+ local res
+ res=
modprobe nbd max_part=16
for x in /sys/class/block/nbd* ; do
- S=`cat $x/size`
+ S=$(cat "$x"/size)
if [ "$S" == "0" ] ; then
- res=$(basename $x)
+ res=$(basename "$x")
break
fi
done
@@ -37,7 +38,7 @@ lib_check_imagetypearg() {
if [ -z "${2}" ] ; then
lib_echo_err "${1}: image-type not given. Exit."
return 1
- elif [ "${2}" != "raw" -a "${2}" != "qcow2" ]; then
+ elif [[ "${2}" != "raw" && "${2}" != "qcow2" ]]; then
lib_echo_err "${1}: image-type must be either raw or qcow, given was ${2}. Exit."
return 1
fi
@@ -62,18 +63,18 @@ lib_connect_blkdev3() {
lib_echo_err "lib_connect_blkdev3: nbd device basename not given. Exit."
exit 1;
fi
+ local img_file img_type nbd_dev
+ img_file=${1}
+ img_type=${2}
- local img_file=${1}
- local img_type=${2}
- local nbd_dev=${3}
-
+ nbd_dev=${3}
if [ "${img_type}" = "raw" ]; then
- qemu-nbd --discard=unmap -f raw -c /dev/${nbd_dev} "${img_file}"
+ qemu-nbd --discard=unmap -f raw -c "/dev/${nbd_dev}" "${img_file}"
else
- qemu-nbd --discard=unmap -c /dev/${nbd_dev} "${img_file}"
+ qemu-nbd --discard=unmap -c "/dev/${nbd_dev}" "${img_file}"
fi
sync
- kpartx -a /dev/${nbd_dev}
+ kpartx -a "/dev/${nbd_dev}"
sync
return 0
}
@@ -91,11 +92,11 @@ lib_connect_blkdev2() {
if ! lib_check_imagetypearg "lib_connect_blkdev2" "${2}" ; then
exit 1;
fi
+ local img_file img_type nbd_dev
+ img_file=${1}
+ img_type=${2}
- local img_file=${1}
- local img_type=${2}
-
- local nbd_dev=$(lib_init_nbd)
+ nbd_dev=$(lib_init_nbd)
if [ -z "${nbd_dev}" ] ; then
lib_echo_err "lib_connect_blkdev2: NBD device not determined. Exit."
exit 1;
@@ -114,20 +115,21 @@ lib_disconnect_blkdev() {
lib_echo_err "lib_disconnect_blkdev: NBD device basename not given._Exit."
exit 1;
fi
- local nbd_dev=${1}
- kpartx -d /dev/${nbd_dev}
- qemu-nbd -d /dev/${nbd_dev}
+ local nbd_dev
+ nbd_dev=${1}
+ kpartx -d "/dev/${nbd_dev}"
+ qemu-nbd -d "/dev/${nbd_dev}"
}
export -f lib_disconnect_blkdev
lib_nbd_cleanup() {
DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)"
- if [ ! -z "${DEVS}" ]; then
+ if [ -n "${DEVS}" ]; then
for d in $DEVS; do
- if [ ! -z "${d}" ]; then
- QDEV="$(ps xa | grep $d | grep -v grep)"
+ if [ -n "${d}" ]; then
+ QDEV="$(ps xa | grep "$d" | grep -v grep)"
if [ -z "${QDEV}" ]; then
- kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Unconnected device map removed: /dev/${d}"
+ kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Unconnected device map removed: /dev/${d}"
fi
fi
done
@@ -137,14 +139,14 @@ export -f lib_nbd_cleanup
lib_force_nbd_cleanup() {
DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)"
- if [ ! -z "${DEVS}" ]; then
+ if [ -n "${DEVS}" ]; then
for d in $DEVS; do
- if [ ! -z "${d}" ]; then
- QDEV="$(ps xa | grep $d | grep -v grep)"
+ if [ -n "${d}" ]; then
+ QDEV="$(ps xa | grep "$d" | grep -v grep)"
if [ -z "${QDEV}" ]; then
- kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Unconnected device map removed: /dev/${d}"
+ kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Unconnected device map removed: /dev/${d}"
else
- kpartx -d /dev/${d} && qemu-nbd -d /dev/${d} && echo "Connected device map removed (force): /dev/${d}"
+ kpartx -d "/dev/${d}" && qemu-nbd -d "/dev/${d}" && echo "Connected device map removed (force): /dev/${d}"
fi
fi
done
@@ -152,6 +154,57 @@ lib_force_nbd_cleanup() {
}
export -f lib_force_nbd_cleanup
+part_guid() {
+ local device part part_guid
+ device=$1
+ part=$2
+ part_guid=$(sgdisk --info="${part}" "${device}" | grep "Partition GUID code" | awk -e ' { print $4; }')
+ echo -n "${part_guid}"
+}
+part_exists() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test -n "${part_guid}"
+ return $?
+}
+part_notexists() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test -z "${part_guid}"
+ return $?
+}
+part_is_biosboot() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test "${part_guid}" = "21686148-6449-6E6F-744E-656564454649"
+ return $?
+}
+part_is_efi() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test "${part_guid}" = "C12A7328-F81F-11D2-BA4B-00A0C93EC93B"
+ return $?
+}
+part_is_msfs() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test "${part_guid}" = "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
+ return $?
+}
+part_is_rootfs() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test "${part_guid}" = "0FC63DAF-8483-4772-8E79-3D69D8477DE4" \
+ -o "${part_guid}" = "6A898CC3-1DD2-11B2-99A6-080020736631"
+ return $?
+}
+part_is_zfs() {
+ local part_guid
+ part_guid=$(part_guid "$1" "$2")
+ test "${part_guid}" = "6A898CC3-1DD2-11B2-99A6-080020736631"
+ return $?
+}
+
# Reusable: mount image
# Input {1}: image-file name
# Input {2}: image-type: "raw" or "qcow2"
@@ -171,25 +224,58 @@ lib_mount_image3() {
lib_echo_err "lib_mount_image3: mountpoint not given. Exit."
exit 1;
fi
- local img_file=${1}
- local img_type=${2}
- local mnt_dir=${3}
+ local img_file img_type mnt_dir nbd_dev
+ img_file=${1}
+ img_type=${2}
+ mnt_dir=${3}
- local nbd_dev=$(lib_connect_blkdev2 "${img_file}" "${img_type}")
+ nbd_dev=$(lib_connect_blkdev2 "${img_file}" "${img_type}")
if [ -z "${nbd_dev}" ] ; then
lib_echo_err "lib_mount_image3: NBD device not determined. Exit."
exit 1;
fi
- # Use heuristic: p1 /boot, p2 /
- local p1dev="/dev/mapper/${nbd_dev}p1"
- local p2dev="/dev/mapper/${nbd_dev}p2"
- if [ -e ${p1dev} -a -e ${p2dev} ]; then
- mount -v ${p2dev} "${mnt_dir}" >&2
+ # Total Combinations
+ # - 1: 1 bios-boot, 1 efi, 3 boot (fat, mounted)
+ # - 2: 1 bios-boot, 2 efi, 3 root
+ # - 3: 1 boot (fat, mounted), 2 root (RASPI)
+ # - 4: 1 boot (fat, unused), 2 root (no RASPI)
+ # - 5: 1 boot (fat, mounted)
+ local BIOSBOOT_PART EFISYS_PART BOOT_PART ROOT_PART part_count part_i
+ BIOSBOOT_PART=
+ EFISYS_PART=
+ BOOT_PART=
+ ROOT_PART=
+ part_count=0
+ part_i=1
+ while part_exists "/dev/${nbd_dev}" ${part_i} ; do
+ let part_count=$part_count+1
+ if part_is_biosboot "/dev/${nbd_dev}" ${part_i} ; then
+ BIOSBOOT_PART="/dev/mapper/${nbd_dev}p${part_i}"
+ elif part_is_efi "/dev/${nbd_dev}" ${part_i} ; then
+ EFISYS_PART="/dev/mapper/${nbd_dev}p${part_i}"
+ elif part_is_msfs "/dev/${nbd_dev}" ${part_i} ; then
+ BOOT_PART="/dev/mapper/${nbd_dev}p${part_i}"
+ elif part_is_rootfs "/dev/${nbd_dev}" ${part_i} ; then
+ ROOT_PART="/dev/mapper/${nbd_dev}p${part_i}"
+ fi
+ let part_i=${part_i}+1
+ done
+ lib_echo_err "Detected ${part_count} partitions on /dev/${nbd_dev} to be mounted on ${mnt_dir}"
+ lib_echo_err "BIOSBOOT ${BIOSBOOT_PART}"
+ lib_echo_err "EFISYS ${EFISYS_PART}"
+ lib_echo_err "BOOT ${BOOT_PART}"
+ lib_echo_err "ROOT ${ROOT_PART}"
+ if [ -n "${ROOT_PART}" ] ; then
+ mount -v "${ROOT_PART}" "${mnt_dir}" >&2
+ fi
+ if [[ -n "${BOOT_PART}" ]] && [[ "${TARGET_RASPI}" = "1" || -z "${ROOT_PART}" ]] ; then
mkdir -p "${mnt_dir}/boot"
- mount -v ${p1dev} "${mnt_dir}/boot" >&2
- elif [ -e ${p1dev} ]; then
- mount -v ${p1dev} "${mnt_dir}" >&2
+ mount -v "${BOOT_PART}" "${mnt_dir}/boot" >&2
+ fi
+ if [ -n "${EFISYS_PART}" ] ; then
+ mkdir -p "${mnt_dir}/boot/efi"
+ mount -v "${EFISYS_PART}" "${mnt_dir}/boot/efi" >&2
fi
echo -n "${nbd_dev}"
}
@@ -203,12 +289,13 @@ lib_find_nbd() {
lib_echo_err "lib_find_nbd: mountpoint not given. Exit."
exit 1;
fi
- local mnt_dir=${1}
+ local mnt_dir
+ mnt_dir=${1}
MAIN_DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)"
- if [ ! -z "${MAIN_DEVS}" ]; then
+ if [ -n "${MAIN_DEVS}" ]; then
for md in $MAIN_DEVS; do
- if [ ! -z "${md}" ]; then
+ if [ -n "${md}" ]; then
#SUB_DEVS="$(lsblk -l "/dev/${md}" | grep "${md}p" | cut -d" " -f1)"
if lsblk -l "/dev/${md}" | grep "${mnt_dir}" >& /dev/null ; then
echo -n "${md}"
@@ -224,8 +311,9 @@ lib_find_nbd() {
# Input {1}: mountpoint
# Input {2}: nbd device basename
lib_umount_image2() {
- local mnt_dir=${1}
- local nbd_dev=${2}
+ local mnt_dir nbd_dev
+ mnt_dir=${1}
+ nbd_dev=${2}
if [ -z "${mnt_dir}" ] ; then
lib_echo_err "lib_umount_image2: mountpoint not given. Exit."
@@ -257,8 +345,9 @@ lib_umount_image1() {
lib_echo_err "lib_umount_image1: mountpoint not given. Exit."
exit 1;
fi
- local mnt_dir=${1}
- local nbd_dev=$(lib_find_nbd "${mnt_dir}")
+ local mnt_dir nbd_dev
+ mnt_dir=${1}
+ nbd_dev=$(lib_find_nbd "${mnt_dir}")
if [ -z "${nbd_dev}" ] ; then
lib_echo_err "lib_umount_image: nbd device basename not found via mountpoint ${mnt_dir}. Continuing."
fi
diff --git a/scripts/qcow2_handling b/scripts/qcow2_handling
index 089a999..6f9b9a5 100644
--- a/scripts/qcow2_handling
+++ b/scripts/qcow2_handling
@@ -1,7 +1,7 @@
#!/bin/bash
-sdir=`dirname $(readlink -f "${BASH_SOURCE[0]}")`
-rootdir=`dirname $sdir`
+sdir=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
+rootdir=$(dirname "$sdir")
# codepage is hardcoded in 'loop_rootfs' and scripts, as well as required by pi-gen build
if [ -z ${FAT_CODEPAGE+x} ]; then
@@ -14,10 +14,38 @@ fi
export CURRENT_IMAGE
export CURRENT_MOUNTPOINT
-# 1 boot, 2 data, 3 root
+# Partition Layout
+# - Note: 'bios-boot' is never mounted
+#
+# With ROOTFS_RO
+# - GPT+UEFI
+# - 1 bios-boot, 2 efi, 3 boot (mounted)
+# - Bios
+# - 1 boot (mounted)
+#
+# RASPI (no ROOTFS_NO)
+# - Bios
+# - 1 boot (mounted), 2 root
+#
+# Vanilla (no ROOTFS_NO, no RASPI)
+# - GPT+UEFI
+# - 1 bios-boot, 2 efi, 3 root
+# - Bios
+# - 1 boot (unused), 2 root
+#
+# Total Combinations
+# - 1: 1 bios-boot, 2 efi, 3 boot (fat, mounted)
+# - 2: 1 bios-boot, 2 efi, 3 root
+# - 3: 1 boot (fat, mounted), 2 root (RASPI)
+# - 4: 1 boot (fat, unused), 2 root (no RASPI)
+# - 5: 1 boot (fat, mounted)
+
export NBD_DEV
+export MAP_BIOSBOOT_DEV
+export MAP_EFISYS_DEV
export MAP_BOOT_DEV
export MAP_ROOT_DEV
+export USES_BOOT_PART
# set in build.sh
# should be fairly enough for the beginning
@@ -32,15 +60,42 @@ source ${sdir}/lib_nbd_img_handling
# find and initialize free block device nodes
init_nbd() {
+ if [[ "${GPT_BIOS_UEFI}" = "1" && "${TARGET_RASPI}" = "1" ]]; then
+ echo "Not supported: GPT_BIOS_UEFI + TARGET_RASPI"
+ exit 1
+ fi
+ if [[ "${TARGET_RASPI}" = "1" || "${ROOTFS_RO}" = "1" ]]; then
+ USES_BOOT_PART="1"
+ else
+ USES_BOOT_PART="0"
+ fi
+
if [ -z "${NBD_DEV}" ]; then
- local nbd_dev=$(lib_init_nbd)
+ local nbd_dev
+ nbd_dev=$(lib_init_nbd)
if [ -z "${nbd_dev}" ] ; then
echo "init_nbd: NBD device not determined. Exit."
exit 1;
fi
NBD_DEV=${nbd_dev}
- MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p1
- MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p2
+ MAP_BIOSBOOT_DEV=
+ MAP_EFISYS_DEV=
+ MAP_BOOT_DEV=
+ MAP_ROOT_DEV=
+ if [ "${GPT_BIOS_UEFI}" = "1" ] ; then
+ MAP_BIOSBOOT_DEV=/dev/mapper/${nbd_dev}p1
+ MAP_EFISYS_DEV=/dev/mapper/${nbd_dev}p2
+ if [ "${ROOTFS_RO}" = "1" ]; then
+ MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p3
+ else
+ MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p3
+ fi
+ else
+ MAP_BOOT_DEV=/dev/mapper/${nbd_dev}p1
+ if [ "${ROOTFS_RO}" != "1" ]; then
+ MAP_ROOT_DEV=/dev/mapper/${nbd_dev}p2
+ fi
+ fi
fi
}
export -f init_nbd
@@ -81,8 +136,10 @@ disconnect_blkdev() {
fi
lib_disconnect_blkdev "${NBD_DEV}"
NBD_DEV=
- MAP_BOOT_DEV=
- MAP_ROOT_DEV=
+ MAP_BIOSBOOT_DEV=
+ MAP_EFISYS_DEV=
+ MAP_BOOT_DEV=
+ MAP_ROOT_DEV=
CURRENT_IMAGE=
}
export -f disconnect_blkdev
@@ -104,13 +161,17 @@ mount_qimage() {
echo "mount_qimage: NBD_DEV not determined. Exit."
exit 1;
fi
- if [ -z "$MAP_ROOT_DEV" -o -z "$MAP_BOOT_DEV" ] ; then
- echo "mount_qimage: map devices not determined. Exit."
- exit 1;
+ if [ -n "${MAP_ROOT_DEV}" ]; then
+ mount -v -t ext4 $MAP_ROOT_DEV "$2"
+ fi
+ mkdir -p "$2/boot"
+ if [ "${USES_BOOT_PART}" = "1" ] ; then
+ mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot"
+ fi
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ mkdir -p "$2/boot/efi"
+ mount -v -t vfat $MAP_EFISYS_DEV "$2/boot/efi"
fi
- mount -v -t ext4 $MAP_ROOT_DEV "$2"
- mkdir -p "$2/boot"
- mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot"
CURRENT_MOUNTPOINT="$2"
}
export -f mount_qimage
@@ -132,13 +193,17 @@ mount_rawimage() {
echo "mount_rawimage: NBD_DEV not determined. Exit."
exit 1;
fi
- if [ -z "$MAP_ROOT_DEV" -o -z "$MAP_BOOT_DEV" ] ; then
- echo "mount_rawimage: map devices not determined. Exit."
- exit 1;
+ if [ -n "${MAP_ROOT_DEV}" ]; then
+ mount -v -t ext4 $MAP_ROOT_DEV "$2"
+ fi
+ mkdir -p "$2/boot"
+ if [ "${USES_BOOT_PART}" = "1" ] ; then
+ mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot"
+ fi
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ mkdir -p "$2/boot/efi"
+ mount -v -t vfat $MAP_EFISYS_DEV "$2/boot/efi"
fi
- mount -v -t ext4 $MAP_ROOT_DEV "$2"
- mkdir -p "$2/boot"
- mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "$2/boot"
CURRENT_MOUNTPOINT="$2"
}
export -f mount_rawimage
@@ -169,8 +234,11 @@ export -f umount_image
# create base image / backing image / mount image
load_qimage() {
if [ -z "${CURRENT_MOUNTPOINT}" ]; then
+ if [ "${ROOTFS_RO}" = "1" ]; then
+ rm -rf "${ROOTFS_DIR}"
+ fi
if [ ! -d "${ROOTFS_DIR}" ]; then
- mkdir -p "${ROOTFS_DIR}";
+ mkdir -p "${ROOTFS_DIR}"
fi
if [ "${CLEAN}" = "1" ] && [ -f "${WORK_DIR}/image-${STAGE}.qcow2" ]; then
@@ -187,16 +255,30 @@ load_qimage() {
sync
qemu-nbd --discard=unmap -c /dev/${NBD_DEV} image-${STAGE}.qcow2
sync
-
- if [ "${ROOTFS_RO}" = "1" ] ; then
- # 1 boot (7100 MiB), rootfs (remainder of BASE_QCOW2_SIZE)
- sfdisk /dev/${NBD_DEV} << EOF
-4MiB,7100MiB,c,*
-7104MiB,,83;
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ if [ "${ROOTFS_RO}" = "1" ] ; then
+ # 1 bios-boot (1 MiB), efi-sys (700MiB), boot (remainder of BASE_QCOW2_SIZE)
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \
+ --new 2::+700M --typecode=2:ef00 --change-name=2:'EFI System' \
+ --new 3::0 --typecode=3:0700 --change-name=2:'Boot RO root filesystem host' \
+ "/dev/${NBD_DEV}"
+ else
+ # 1 bios-boot (1 MiB), efi-sys (700MiB), rootfs (remainder of BASE_QCOW2_SIZE)
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:ef02 --change-name=1:'BIOS boot partition' \
+ --new 2::+700M --typecode=2:ef00 --change-name=2:'EFI System' \
+ --new 3::0 --typecode=3:8300 --change-name=3:'Root filesystem' \
+ "/dev/${NBD_DEV}"
+ fi
+ elif [ "${ROOTFS_RO}" = "1" ] ; then
+ # 1 boot (remainder of BASE_QCOW2_SIZE), no rootfs
+ sfdisk "/dev/${NBD_DEV}" << EOF
+4MiB,,c,;
EOF
else
# 1 boot (250 MiB), rootfs (remainder of BASE_QCOW2_SIZE)
- sfdisk /dev/${NBD_DEV} << EOF
+ sfdisk "/dev/${NBD_DEV}" << EOF
4MiB,250MiB,c,*
254MiB,,83;
EOF
@@ -204,30 +286,32 @@ EOF
sync
kpartx -a /dev/${NBD_DEV}
- case ${BOOT_FSTYPE} in
- xfs)
- mkfs.xfs -L BOOT $MAP_BOOT_DEV
- ;;
- ext4)
- mkfs.ext4 -L BOOT -O "^huge_file,^metadata_csum,^64bit" $MAP_BOOT_DEV
- ;;
- ext2)
- mkfs.ext2 -L BOOT -O "^has_journal,^huge_file,^metadata_csum,^64bit" $MAP_BOOT_DEV
- ;;
- vfat)
- mkfs.fat -n BOOT -F 32 --codepage=${FAT_CODEPAGE} -v $MAP_BOOT_DEV
- ;;
- *)
- echo "BOOT_FSTYPE not one of[xfs,ext4,ext2,vfat] but '${BOOT_FSTYPE}'. Exit."
- exit 1;
- ;;
- esac
+ if [ -n "${MAP_BOOT_DEV}" ]; then
+ case ${BOOT_FSTYPE} in
+ xfs)
+ mkfs.xfs -L BOOT "$MAP_BOOT_DEV"
+ ;;
+ ext4)
+ mkfs.ext4 -L BOOT -O "^huge_file,^metadata_csum,^64bit" "$MAP_BOOT_DEV"
+ ;;
+ ext2)
+ mkfs.ext2 -L BOOT -O "^has_journal,^huge_file,^metadata_csum,^64bit" "$MAP_BOOT_DEV"
+ ;;
+ vfat)
+ mkfs.fat -n BOOT -F 32 --codepage="${FAT_CODEPAGE}" -v "$MAP_BOOT_DEV"
+ ;;
+ *)
+ echo "BOOT_FSTYPE not one of[xfs,ext4,ext2,vfat] but '${BOOT_FSTYPE}'. Exit."
+ exit 1;
+ ;;
+ esac
+ fi
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ mkfs.fat -n EFISYS -F 32 -v "$MAP_EFISYS_DEV"
+ fi
- if [ "${ROOTFS_RO}" = "1" ] ; then
- # Set reserved-blocks-percentage for root to zero, no journaling
- mkfs.ext4 -L ROOTFS -m 0 -O "^has_journal,^huge_file,^metadata_csum,^64bit" $MAP_ROOT_DEV
- else
- mkfs.ext4 -L ROOTFS -O "^huge_file,^metadata_csum,^64bit" $MAP_ROOT_DEV
+ if [ -n "${MAP_ROOT_DEV}" ]; then
+ mkfs.ext4 -L ROOTFS -O "^huge_file,^metadata_csum,^64bit" "$MAP_ROOT_DEV"
fi
sync
else
@@ -242,11 +326,27 @@ EOF
qemu-nbd --discard=unmap -c /dev/${NBD_DEV} image-${STAGE}.qcow2
sync
kpartx -a /dev/${NBD_DEV}
+ if [ "${ROOTFS_RO}" = "1" ]; then
+ if [[ -z "${PREV_ROOTFS_DIR}" || ! -d "${PREV_ROOTFS_DIR}" ]]; then
+ echo "PREV_ROOTFS_DIR: ${PREV_ROOTFS_DIR}, stage ${STAGE}"
+ exit 1
+ fi
+ echo "ROOTFS_RO: rsync ${PREV_ROOTFS_DIR}/ ${ROOTFS_DIR}/"
+ rsync -a "${PREV_ROOTFS_DIR}/" "${ROOTFS_DIR}/"
+ sync
+ fi
fi
-
- mount -v -t ext4 $MAP_ROOT_DEV "${ROOTFS_DIR}"
- mkdir -p "${ROOTFS_DIR}/boot"
- mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "${ROOTFS_DIR}/boot"
+ if [ -n "${MAP_ROOT_DEV}" ]; then
+ mount -v -t ext4 $MAP_ROOT_DEV "${ROOTFS_DIR}"
+ fi
+ mkdir -p "${ROOTFS_DIR}/boot"
+ if [ "${USES_BOOT_PART}" = "1" ] ; then
+ mount -v -t ${BOOT_FSTYPE} $MAP_BOOT_DEV "${ROOTFS_DIR}/boot"
+ fi
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ mkdir -p "${ROOTFS_DIR}/boot/efi"
+ mount -v -t vfat $MAP_EFISYS_DEV "${ROOTFS_DIR}/boot/efi"
+ fi
CURRENT_IMAGE=${WORK_DIR}/image-${STAGE}.qcow2
CURRENT_MOUNTPOINT=${ROOTFS_DIR}
popd > /dev/null
@@ -260,7 +360,7 @@ export -f load_qimage
# umount current image and refresh mount point env var
unload_qimage() {
- if [ ! -z "${CURRENT_MOUNTPOINT}" ]; then
+ if [ -n "${CURRENT_MOUNTPOINT}" ]; then
fstrim -v "${CURRENT_MOUNTPOINT}" || true
umount_image "${CURRENT_MOUNTPOINT}"
fi
@@ -283,35 +383,47 @@ function resize_qcow2() {
return 1
fi
- # 1 boot, 2 rootfs
+ # 1 boot, 2 uefi (optional), 3 rootfs
#
# rootfs ext4 ^journal => ext2, second partition
# ROOT_MARGIN=$((800*1024*1024))
ROOT_MARGIN=$((1*1024*1024))
- PARTED_OUT=`parted -s -m "/dev/${NBD_DEV}" unit B print`
- #PART_NO=`echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print $1 } '`
- #PART_START=`echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print substr($2,1,length($2)-1) } '`
- PART_NO=2
- PART_START=`echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($2,1,length($2)-1) } '`
+ PARTED_OUT=$(parted -s -m "/dev/${NBD_DEV}" unit B print)
+ #PART_NO=$(echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print $1 } ')
+ #PART_START=$(echo "$PARTED_OUT" | grep ext[24] | awk -F: ' { print substr($2,1,length($2)-1) } ')
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ PART_NO=3
+ else
+ PART_NO=2
+ fi
+ PART_START=$(echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($2,1,length($2)-1) } ')
e2fsck -y -f $MAP_ROOT_DEV || true
- DATA_SIZE=`resize2fs -P $MAP_ROOT_DEV | awk -F': ' ' { print $2 } '`
BLOCK_SIZE=$(e2fs_block_size $MAP_ROOT_DEV)
- let DATA_SIZE=$DATA_SIZE+$ROOT_MARGIN/$BLOCK_SIZE
- resize2fs -p $MAP_ROOT_DEV $DATA_SIZE
- sleep 1
-
- let PART_NEW_SIZE=$DATA_SIZE*$BLOCK_SIZE
- let PART_NEW_END=$PART_START+$PART_NEW_SIZE
- ACT1=`parted -s "/dev/${NBD_DEV}" rm ${PART_NO}`
- ACT2=`parted -s "/dev/${NBD_DEV}" unit B mkpart primary $PART_START $PART_NEW_END`
- NEW_IMG_SIZE=`parted -s -m "/dev/${NBD_DEV}" unit B print free | tail -1 | awk -F: ' { print substr($2,1,length($2)-1) } '`
+ if [ -n "$MAP_EFISYS_DEV" ] ; then
+ # No resize on GPT/UEFI, leave partition layout as-is
+ ROOT_PART_SIZE_BYTES=$(echo "$PARTED_OUT" | grep "^${PART_NO}:" | awk -F: ' { print substr($4,1,length($4)-1) } ')
+ BLOCK_COUNT=$(($(($ROOT_PART_SIZE_BYTES+$BLOCK_SIZE-1))/$BLOCK_SIZE))
+ NEW_IMG_SIZE=
+ else
+ BLOCK_COUNT=$(resize2fs -P $MAP_ROOT_DEV | awk -F': ' ' { print $2 } ')
+
+ let BLOCK_COUNT=$BLOCK_COUNT+$ROOT_MARGIN/$BLOCK_SIZE
+ resize2fs -p $MAP_ROOT_DEV $BLOCK_COUNT
+ sleep 1
+
+ let PART_NEW_SIZE=$BLOCK_COUNT*$BLOCK_SIZE
+ let PART_NEW_END=$PART_START+$PART_NEW_SIZE
+ ACT1=$(parted -s "/dev/${NBD_DEV}" rm ${PART_NO})
+ ACT2=$(parted -s "/dev/${NBD_DEV}" unit B mkpart primary $PART_START $PART_NEW_END)
+ ROOT_PART_SIZE_BYTES=$PART_NEW_SIZE
+ NEW_IMG_SIZE=$(parted -s -m "/dev/${NBD_DEV}" unit B print free | tail -1 | awk -F: ' { print substr($2,1,length($2)-1) } ')
+ fi
ROOT_PART_START=$PART_START
- ROOT_PART_SIZE_BYTES=$PART_NEW_SIZE
ROOT_PART_BLOCK_SIZE=$BLOCK_SIZE
- ROOT_PART_BLOCK_COUNT=$DATA_SIZE
+ ROOT_PART_BLOCK_COUNT=$BLOCK_COUNT
}
export -f resize_qcow2
@@ -350,98 +462,136 @@ function write_partitions_qcow2() {
}
export -f write_partitions_qcow2
+# finalize fstab device-map entries: finalize_fstab_ro <mountpoint>
+function finalize_fstab_ro() {
+ local MOUNTROOT
+ MOUNTROOT="$1"
+
+ if [ "${ROOTFS_RO}" != "1" ] ; then
+ echo "finalize_fstab_ro only to be used with ROOTFS_RO. Exit."
+ exit 1
+ fi
+
+ echo "Setup hard devicenames"
+ local EFISYS_DEV_NAME BOOT_DEV_NAME ROOT_DEV_NAME
+ EFISYS_DEV_NAME=
+ BOOT_DEV_NAME=
+ ROOT_DEV_NAME=
+ if [ "${GPT_BIOS_UEFI}" = "1" ] ; then
+ EFISYS_DEV_NAME="\/dev\/mmcblk0p2"
+ BOOT_DEV_NAME="\/dev\/mmcblk0p3"
+ ROOT_DEV_NAME="\/dev\/mmcblk0p4"
+ else
+ BOOT_DEV_NAME="\/dev\/mmcblk0p1"
+ ROOT_DEV_NAME="\/dev\/mmcblk0p2"
+ fi
+ echo "EFI: $EFISYS_DEV_NAME"
+ echo "Boot: $BOOT_DEV_NAME"
+ echo "Fake Root: $ROOT_DEV_NAME"
+
+ echo "Set hard device names in fstab (rootfs ro -> /boot uncommented)"
+ sed -i "s/BOOTDEV/${BOOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab"
+ sed -i "s/EFIDEV/${EFISYS_DEV_NAME}/" "${MOUNTROOT}/etc/fstab"
+ sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab"
+ if [ "${TARGET_RASPI}" = "1" ]; then
+ echo "Set rootfs ro fake device name in cmdline, required"
+ sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt"
+ fi
+}
+export -f finalize_fstab_ro
+
# create raw img from qcow2: make_bootable_image <in.qcow2> <out.img>
function make_bootable_image() {
+ local EXPORT_QCOW2 EXPORT_IMAGE EXPORT_IMAGE_ROOT EXPORT_INFO_ROOT
EXPORT_QCOW2="$1"
EXPORT_IMAGE="$2"
EXPORT_IMAGE_ROOT="$3"
EXPORT_INFO_ROOT="$4"
- echo "Connect block device to source qcow2"
- connect_blkdev "${EXPORT_QCOW2}"
-
- CALL_FROM_MBI=1
- echo "Resize fs"
- resize_qcow2
- sync
- CALL_FROM_MBI=
-
- echo "Disconnect block device"
- disconnect_blkdev
-
- if [ -z "$NEW_IMG_SIZE" ]; then
- echo "NEW_IMG_SIZE could not be calculated, cannot process image. Exit."
- exit 1
- fi
- echo "Shrinking qcow2 image"
- qemu-img resize --shrink "${EXPORT_QCOW2}" $NEW_IMG_SIZE
- sync
-
- echo "Convert qcow2 to raw image"
- qemu-img convert -f qcow2 -O raw "${EXPORT_QCOW2}" "${EXPORT_IMAGE}"
- sync
-
- echo "Get PARTUUIDs from image"
- IMGID="$(blkid -o value -s PTUUID "${EXPORT_IMAGE}")"
-
- echo "Mount image ${EXPORT_IMAGE}"
- MOUNTROOT=${WORK_DIR}/tmpimage
- mkdir -p $MOUNTROOT
- mount_rawimage "${EXPORT_IMAGE}" $MOUNTROOT
-
- if [ ! -d "${MOUNTROOT}/root" ]; then
- echo "Image damaged or not mounted. Exit."
- exit 1
- fi
-
- if [ "${ROOTFS_RO}" = "1" ] ; then
- echo "Setup hard devicenames"
- BOOT_DEV_NAME="\/dev\/mmcblk0p1"
- echo "Boot: $BOOT_DEV_NAME"
- ROOT_DEV_NAME="\/dev\/mmcblk0p2"
- echo "Root1: $ROOT_DEV_NAME"
+ if [ "${ROOTFS_RO}" != "1" ] ; then
+ echo "Connect block device to source qcow2"
+ connect_blkdev "${EXPORT_QCOW2}"
- echo "Set hard device names in fstab (rootfs ro -> /boot uncommented)"
- sed -i "s/BOOTDEV/${BOOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab"
- sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/etc/fstab"
- if [ "${TARGET_RASPI}" = "1" ]; then
- echo "Set rootfs ro hard device name in cmdline, required"
- sed -i "s/ROOTDEV/${ROOT_DEV_NAME}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt"
+ CALL_FROM_MBI=1
+ echo "Resize fs"
+ resize_qcow2
+ sync
+ CALL_FROM_MBI=
+
+ echo "Get PARTUUIDs from connected image"
+ local PARTUUID_EFISYS PARTUUID_BOOT PARTUUID_ROOT
+ PARTUUID_EFISYS=
+ PARTUUID_BOOT=
+ PARTUUID_ROOT=
+ if [ -n "${MAP_EFISYS_DEV}" ] ; then
+ PARTUUID_EFISYS=$(blkid -o value -s PARTUUID ${MAP_EFISYS_DEV})
+ echo "PARTUUID_EFISYS ${PARTUUID_EFISYS}"
fi
- else
- echo "Setup PARTUUIDs"
- BOOT_PARTUUID="${IMGID}-01"
- echo "Boot: $BOOT_PARTUUID"
- ROOT_PARTUUID="${IMGID}-02"
- echo "Root1: $ROOT_PARTUUID"
-
- if [ ! -z "$BOOT_PARTUUID" ] && [ ! -z "$ROOT_PARTUUID" ]; then
- echo "Set UUIDs to make it bootable, required."
- sed -i "s/BOOTDEV/PARTUUID=${BOOT_PARTUUID}/" "${MOUNTROOT}/etc/fstab"
- sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${MOUNTROOT}/etc/fstab"
- if [ "${TARGET_RASPI}" = "1" ]; then
- sed -i "s/ROOTDEV/PARTUUID=${ROOT_PARTUUID}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt"
+ if [ -n "${MAP_BOOT_DEV}" ]; then
+ PARTUUID_BOOT=$(blkid -o value -s PARTUUID ${MAP_BOOT_DEV})
+ echo "PARTUUID_BOOT ${PARTUUID_BOOT}"
+ fi
+ if [ -n "${MAP_ROOT_DEV}" ]; then
+ PARTUUID_ROOT=$(blkid -o value -s PARTUUID ${MAP_ROOT_DEV})
+ echo "PARTUUID_ROOT ${PARTUUID_ROOT}"
+ fi
+
+ echo "Disconnect block device"
+ disconnect_blkdev
+
+ if [ "${GPT_BIOS_UEFI}" != "1" ] ; then
+ if [ -z "$NEW_IMG_SIZE" ]; then
+ echo "NEW_IMG_SIZE could not be calculated, cannot process image. Exit."
+ exit 1
fi
+ echo "Shrinking qcow2 image"
+ qemu-img resize --shrink "${EXPORT_QCOW2}" $NEW_IMG_SIZE
+ sync
fi
fi
+
+ echo "Convert qcow2 to raw image"
+ echo "- qcow2: ${EXPORT_QCOW2}"
+ echo "- raw: ${EXPORT_IMAGE}"
+ qemu-img convert -f qcow2 -O raw "${EXPORT_QCOW2}" "${EXPORT_IMAGE}"
+ sync
+
+ if [ "${ROOTFS_RO}" != "1" ] ; then
+ echo "Mount image ${EXPORT_IMAGE}"
+ MOUNTROOT=${WORK_DIR}/tmpimage
+ mkdir -p $MOUNTROOT
+ mount_rawimage "${EXPORT_IMAGE}" $MOUNTROOT
+
+ if [ ! -d "${MOUNTROOT}/root" ]; then
+ echo "Image damaged or not mounted. Exit."
+ exit 1
+ fi
- echo "Umount image ${EXPORT_IMAGE}"
- sync
- umount_image $MOUNTROOT
+ echo "Set UUIDs to make it bootable, required."
+ sed -i "s/BOOTDEV/PARTUUID=${PARTUUID_BOOT}/" "${MOUNTROOT}/etc/fstab"
+ sed -i "s/EFIDEV/PARTUUID=${PARTUUID_EFISYS}/" "${MOUNTROOT}/etc/fstab"
+ sed -i "s/ROOTDEV/PARTUUID=${PARTUUID_ROOT}/" "${MOUNTROOT}/etc/fstab"
+ if [ "${TARGET_RASPI}" = "1" ]; then
+ sed -i "s/ROOTDEV/PARTUUID=${PARTUUID_ROOT}/" "${MOUNTROOT}/boot/sys_${TARGET_ARCH}_000/cmdline.txt"
+ fi
- echo "Extracting partitions - Writing partitions from ${EXPORT_IMAGE}"
- connect_raw_blkdev "${EXPORT_IMAGE}"
-
- CALL_FROM_MBI=1
- # 1 boot (512), 2 rootfs (4096)
- echo "Extract partitions to raw image"
- write_partitions_qcow2 $MAP_ROOT_DEV $ROOT_PART_BLOCK_SIZE $ROOT_PART_BLOCK_COUNT $EXPORT_IMAGE_ROOT $EXPORT_INFO_ROOT
- sync
- CALL_FROM_MBI=
-
- echo "Disconnect block device"
- disconnect_blkdev
-
+ echo "Umount image ${EXPORT_IMAGE}"
+ sync
+ umount_image $MOUNTROOT
+
+ echo "Extracting partitions - Writing partitions from ${EXPORT_IMAGE}"
+ connect_raw_blkdev "${EXPORT_IMAGE}"
+
+ CALL_FROM_MBI=1
+ # 1 boot (512), 2 rootfs (4096)
+ echo "Extract partitions to raw image"
+ write_partitions_qcow2 $MAP_ROOT_DEV $ROOT_PART_BLOCK_SIZE $ROOT_PART_BLOCK_COUNT $EXPORT_IMAGE_ROOT $EXPORT_INFO_ROOT
+ sync
+ CALL_FROM_MBI=
+
+ echo "Disconnect block device"
+ disconnect_blkdev
+ fi
echo "Remove qcow2 export image"
rm -f "${EXPORT_QCOW2}"
}
diff --git a/stage1/01-sys-tweaks/files/fstab b/stage1/01-sys-tweaks/files/fstab
index 3238758..24fa662 100644
--- a/stage1/01-sys-tweaks/files/fstab
+++ b/stage1/01-sys-tweaks/files/fstab
@@ -1,3 +1,4 @@
proc /proc proc defaults 0 0
# BOOTDEV /boot vfat defaults 0 2
+# EFIDEV /boot/efi vfat defaults 0 2
ROOTDEV / ext4 defaults,noatime 0 1
diff --git a/stage2/01-sys-tweaks/00-packages b/stage2/01-sys-tweaks/00-packages
index ab1aff3..51dfb55 100644
--- a/stage2/01-sys-tweaks/00-packages
+++ b/stage2/01-sys-tweaks/00-packages
@@ -38,3 +38,4 @@ pciutils
busybox
initramfs-tools-core
initramfs-tools
+openssh-server openssh-client
diff --git a/stage2/01-sys-tweaks/00-packages-bookworm b/stage2/01-sys-tweaks/00-packages-bookworm
index 683e70b..7542e4f 100644
--- a/stage2/01-sys-tweaks/00-packages-bookworm
+++ b/stage2/01-sys-tweaks/00-packages-bookworm
@@ -38,3 +38,4 @@ pciutils
busybox
initramfs-tools-core
initramfs-tools
+openssh-server openssh-client
diff --git a/stage2/01-sys-tweaks/00-packages-bullseye b/stage2/01-sys-tweaks/00-packages-bullseye
index 683e70b..7542e4f 100644
--- a/stage2/01-sys-tweaks/00-packages-bullseye
+++ b/stage2/01-sys-tweaks/00-packages-bullseye
@@ -38,3 +38,4 @@ pciutils
busybox
initramfs-tools-core
initramfs-tools
+openssh-server openssh-client
diff --git a/stage2/01-sys-tweaks/00-packages-sys-debian b/stage2/01-sys-tweaks/00-packages-sys-debian
index d8cdf6f..7289231 100644
--- a/stage2/01-sys-tweaks/00-packages-sys-debian
+++ b/stage2/01-sys-tweaks/00-packages-sys-debian
@@ -1,3 +1,4 @@
sysfsutils
xfsprogs
+e2fsprogs
grub-pc
diff --git a/stage2/01-sys-tweaks/00-packages-sys-debian-amd64 b/stage2/01-sys-tweaks/00-packages-sys-debian-amd64
new file mode 100644
index 0000000..1bd89b1
--- /dev/null
+++ b/stage2/01-sys-tweaks/00-packages-sys-debian-amd64
@@ -0,0 +1,10 @@
+sysfsutils
+xfsprogs
+e2fsprogs
+#grub-pc
+#grub-efi-amd64-bin
+grub-pc-bin
+efibootmgr
+grub-efi-amd64
+grub-efi-amd64-bin
+grub-efi-amd64-signed
diff --git a/stage2/01-sys-tweaks/01-run.sh b/stage2/01-sys-tweaks/01-run.sh
index 8014d56..29db04e 100755
--- a/stage2/01-sys-tweaks/01-run.sh
+++ b/stage2/01-sys-tweaks/01-run.sh
@@ -1,9 +1,17 @@
#!/bin/bash -e
if [ "${ROOTFS_RO}" = "1" ] ; then
- install -v -m 644 files/fstab-rootfs_ro "${ROOTFS_DIR}/etc/fstab"
+ if [ -n "${UEFI_ARCH}" ] ; then
+ install -v -m 644 files/fstab-efisys-rootfs_ro "${ROOTFS_DIR}/etc/fstab"
+ else
+ install -v -m 644 files/fstab-bios-rootfs_ro "${ROOTFS_DIR}/etc/fstab"
+ fi
else
- install -v -m 644 files/fstab-rootfs_rw "${ROOTFS_DIR}/etc/fstab"
+ if [ -n "${UEFI_ARCH}" ] ; then
+ install -v -m 644 files/fstab-efisys-rootfs_rw "${ROOTFS_DIR}/etc/fstab"
+ else
+ install -v -m 644 files/fstab-bios-rootfs_rw "${ROOTFS_DIR}/etc/fstab"
+ fi
fi
install -m 644 files/overlay_mount.service "${ROOTFS_DIR}/lib/systemd/system/"
install -m 755 files/overlay_mount "${ROOTFS_DIR}/etc/init.d/"
@@ -81,6 +89,7 @@ on_chroot << EOF
fi
systemctl disable regenerate_ssh_host_keys
systemctl mask regenerate_ssh_host_keys
+ chmod go-rwx /etc/ssh/ssh_host*key
if [ "${ROOTFS_RO}" = "1" ] ; then
sed -i -e 's/^D \/tmp/#D \/tmp/g' /usr/lib/tmpfiles.d/tmp.conf
@@ -159,12 +168,24 @@ on_chroot << EOF
echo "\$i" >> /etc/modules
echo "\$i" >> /etc/initramfs-tools/modules
done
+ elif [ -n "${UEFI_ARCH}" ] ; then
+ systemctl disable resize2fs_once
+ systemctl mask resize2fs_once
else
systemctl unmask resize2fs_once
systemctl enable resize2fs_once
fi
EOF
+mkdir -p "${ROOTFS_DIR}/boot/grub/theme"
+install -m 644 files/grub/theme/grub.png "${ROOTFS_DIR}/boot/grub/theme/grub.png"
+install -m 644 files/grub/theme/desktop-4x3.svg "${ROOTFS_DIR}/boot/grub/theme/desktop-4x3.svg"
+install -m 644 files/grub/theme/desktop-4x3.png "${ROOTFS_DIR}/boot/grub/theme/desktop-4x3.png"
+install -m 644 files/grub/theme/desktop-16x9.svg "${ROOTFS_DIR}/boot/grub/theme/desktop-16x9.svg"
+if [ "${TARGET_RASPI}" != "1" ]; then
+ echo "GRUB_BACKGROUND=/boot/theme/grub.png" >> "${ROOTFS_DIR}/etc/default/grub"
+fi
+
if [ "${ROOTFS_RO}" = "1" ] ; then
if [ "${TARGET_RASPI}" = "1" ]; then
install -m 644 files/boot/config-rootfs_ro.txt "${ROOTFS_DIR}/boot/config.txt"
@@ -177,17 +198,21 @@ if [ "${ROOTFS_RO}" = "1" ] ; then
sed -i "s/arm_64bit=1/# arm_64bit=1/g" "${ROOTFS_DIR}/boot/sys_${TARGET_ARCH}_000/config.txt"
fi
else
+ install -m 644 files/grub/grub-rootfs_ro.cfg "${ROOTFS_DIR}/boot/grub/grub.cfg"
install -m 644 files/grub/custom-rootfs_ro.cfg "${ROOTFS_DIR}/boot/grub/custom.cfg"
sed -i "s/sys_amd64_000/sys_${TARGET_ARCH}_000/g" "${ROOTFS_DIR}/boot/grub/custom.cfg"
cp "${ROOTFS_DIR}/boot/grub/custom.cfg" "${ROOTFS_DIR}/boot/sys_${TARGET_ARCH}_000/"
sed -i 's/GRUB_DEFAULT=.*$/GRUB_DEFAULT=loop_rootfs/g;s/GRUB_TIMEOUT=.*$/GRUB_TIMEOUT=0/g;s/#GRUB_TERMINAL=.*$/GRUB_TERMINAL=console/g;s/#GRUB_DISABLE_LINUX_UUID=.*$/GRUB_DISABLE_LINUX_UUID=true/g' "${ROOTFS_DIR}/etc/default/grub"
echo "GRUB_DISABLE_LINUX_PARTUUID=true" >> "${ROOTFS_DIR}/etc/default/grub"
echo "GRUB_DISABLE_RECOVERY=true" >> "${ROOTFS_DIR}/etc/default/grub"
+ echo "GRUB_DISABLE_OS_PROBER=true" >> "${ROOTFS_DIR}/etc/default/grub"
rm -f "${ROOTFS_DIR}/etc/grub.d/05_debian_theme"
rm -f "${ROOTFS_DIR}/etc/grub.d/10_linux"
rm -f "${ROOTFS_DIR}/etc/grub.d/20_linux_xen"
rm -f "${ROOTFS_DIR}/etc/grub.d/30_os-prober"
- rm -f "${ROOTFS_DIR}/etc/grub.d/30_uefi-firmware"
+ if [ -z "${UEFI_ARCH}" ] ; then
+ rm -f "${ROOTFS_DIR}/etc/grub.d/30_uefi-firmware"
+ fi
rm -f "${ROOTFS_DIR}/etc/grub.d/20_memtest86"
rm -f "${ROOTFS_DIR}/etc/grub.d/20_memtest86+"
fi
@@ -268,15 +293,37 @@ on_chroot <<EOF
fi
fi
if [ "${TARGET_RASPI}" != "1" ]; then
- update-grub
+ # BIOS Boot
+ echo "GRUB Install: BIOS: ROOTFS_RO=${ROOTFS_RO}"
if [ "${ROOTFS_RO}" = "1" ] ; then
- grub-install --force-file-id --modules="gzio part_msdos fat" /dev/${NBD_DEV}
+ # using manually copied /boot/grub/grub.cfg
+ grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat" /dev/${NBD_DEV}
else
- grub-install --force-file-id --modules="gzio part_msdos fat ext2" /dev/${NBD_DEV}
+ grub-install --target=i386-pc --force-file-id --modules="gzio part_msdos part_gpt fat ext2 xfs" /dev/${NBD_DEV}
+ update-grub
+ fi
+ if [ -n "${UEFI_ARCH}" ] ; then
+ # EFI Boot
+ echo "GRUB Install: UEFI: Using grub-install. ROOTFS_RO=${ROOTFS_RO}"
+ mkdir -p /boot/efi/EFI/BOOT
+ # --removable: EFI/BOOT/bootx64.efi
+ # --uefi-secure-boot (we disable this option)
+ grub-install --target=${UEFI_ARCH}-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=BOOT
fi
-
# Remove storage device related search.fs_uuid and allow multi homing
rm -f /boot/grub/i386-pc/load.cfg
+ if [ -n "${UEFI_ARCH}" ] ; then
+ rm -f /boot/grub/${UEFI_ARCH}-efi/load.cfg
+ fi
fi
EOF
+if [ "${TARGET_RASPI}" != "1" ]; then
+ if [ -n "${UEFI_ARCH}" ] ; then
+ if [ "${ROOTFS_RO}" = "1" ] ; then
+ install -m 644 files/EFI/BOOT/grub-rootfs_ro.cfg "${ROOTFS_DIR}/boot/efi/EFI/BOOT/grub.cfg"
+ else
+ install -m 644 files/EFI/BOOT/grub-rootfs_rw.cfg "${ROOTFS_DIR}/boot/efi/EFI/BOOT/grub.cfg"
+ fi
+ fi
+fi
diff --git a/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg
new file mode 100644
index 0000000..cbd33a7
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_ro.cfg
@@ -0,0 +1,2 @@
+search --label "BOOT" --set prefix
+configfile (\$prefix)/grub/grub.cfg
diff --git a/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg
new file mode 100644
index 0000000..b7358c4
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/EFI/BOOT/grub-rootfs_rw.cfg
@@ -0,0 +1,2 @@
+search --label "ROOTFS" --set prefix
+configfile (\$prefix)/boot/grub/grub.cfg
diff --git a/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro
new file mode 100644
index 0000000..bb8c127
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_ro
@@ -0,0 +1,3 @@
+proc /proc proc defaults 0 0
+# BOOTDEV /boot vfat defaults 0 2
+ROOTDEV / ext4 defaults,noatime,ro,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw
new file mode 100644
index 0000000..c13a146
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/fstab-bios-rootfs_rw
@@ -0,0 +1,2 @@
+proc /proc proc defaults 0 0
+ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro
new file mode 100644
index 0000000..679d148
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_ro
@@ -0,0 +1,4 @@
+proc /proc proc defaults 0 0
+# BOOTDEV /boot vfat defaults 0 2
+# EFIDEV /boot/efi vfat defaults 0 2
+ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw
new file mode 100644
index 0000000..5ae6b66
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/fstab-efisys-rootfs_rw
@@ -0,0 +1,3 @@
+proc /proc proc defaults 0 0
+EFIDEV /boot/efi vfat defaults 0 2
+ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/fstab-rootfs_ro b/stage2/01-sys-tweaks/files/fstab-rootfs_ro
deleted file mode 100644
index ad040ea..0000000
--- a/stage2/01-sys-tweaks/files/fstab-rootfs_ro
+++ /dev/null
@@ -1,3 +0,0 @@
-proc /proc proc defaults 0 0
-# BOOTDEV /boot vfat defaults 0 2
-ROOTDEV / ext4 defaults,noatime,ro,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/fstab-rootfs_rw b/stage2/01-sys-tweaks/files/fstab-rootfs_rw
deleted file mode 100644
index 5a4df6b..0000000
--- a/stage2/01-sys-tweaks/files/fstab-rootfs_rw
+++ /dev/null
@@ -1,3 +0,0 @@
-proc /proc proc defaults 0 0
-BOOTDEV /boot vfat defaults 0 2
-ROOTDEV / ext4 defaults,noatime,errors=remount-ro 0 0
diff --git a/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg
new file mode 100755
index 0000000..3036c9f
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro-console.cfg
@@ -0,0 +1,86 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+ set have_grubenv=true
+ load_env
+fi
+if [ "${next_entry}" ] ; then
+ set default="${next_entry}"
+ set next_entry=
+ save_env next_entry
+ set boot_once=true
+else
+ set default="loop_rootfs"
+fi
+
+if [ x"${feature_menuentry_id}" = xy ]; then
+ menuentry_id_option="--id"
+else
+ menuentry_id_option=""
+fi
+
+export menuentry_id_option
+
+if [ "${prev_saved_entry}" ]; then
+ set saved_entry="${prev_saved_entry}"
+ save_env saved_entry
+ set prev_saved_entry=
+ save_env prev_saved_entry
+ set boot_once=true
+fi
+
+function savedefault {
+ if [ -z "${boot_once}" ]; then
+ saved_entry="${chosen}"
+ save_env saved_entry
+ fi
+}
+function load_video {
+ if [ x$feature_all_video_module = xy ]; then
+ insmod all_video
+ else
+ insmod efi_gop
+ insmod efi_uga
+ insmod ieee1275_fb
+ insmod vbe
+ insmod vga
+ insmod video_bochs
+ insmod video_cirrus
+ fi
+}
+
+terminal_input console
+terminal_output console
+if [ "${recordfail}" = 1 ] ; then
+ set timeout=30
+else
+ if [ x$feature_timeout_style = xy ] ; then
+ set timeout_style=menu
+ set timeout=5
+ # Fallback normal timeout code in case the timeout_style feature is
+ # unavailable.
+ else
+ set timeout=5
+ fi
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/40_custom ###
+# This file provides an easy way to add custom menu entries. Simply type the
+# menu entries you want to add after this comment. Be careful not to change
+# the 'exec tail' line above.
+### END /etc/grub.d/40_custom ###
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f ${config_directory}/custom.cfg ]; then
+ source ${config_directory}/custom.cfg
+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
+ source $prefix/custom.cfg
+fi
+### END /etc/grub.d/41_custom ###
diff --git a/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg
new file mode 100755
index 0000000..2d2f869
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/grub-rootfs_ro.cfg
@@ -0,0 +1,120 @@
+#
+# DO NOT EDIT THIS FILE
+#
+# It is automatically generated by grub-mkconfig using templates
+# from /etc/grub.d and settings from /etc/default/grub
+#
+
+### BEGIN /etc/grub.d/00_header ###
+if [ -s $prefix/grubenv ]; then
+ set have_grubenv=true
+ load_env
+fi
+if [ "${next_entry}" ] ; then
+ set default="${next_entry}"
+ set next_entry=
+ save_env next_entry
+ set boot_once=true
+else
+ set default="loop_rootfs"
+fi
+
+if [ x"${feature_menuentry_id}" = xy ]; then
+ menuentry_id_option="--id"
+else
+ menuentry_id_option=""
+fi
+
+export menuentry_id_option
+
+if [ "${prev_saved_entry}" ]; then
+ set saved_entry="${prev_saved_entry}"
+ save_env saved_entry
+ set prev_saved_entry=
+ save_env prev_saved_entry
+ set boot_once=true
+fi
+
+function savedefault {
+ if [ -z "${boot_once}" ]; then
+ saved_entry="${chosen}"
+ save_env saved_entry
+ fi
+}
+function load_video {
+ if [ x$feature_all_video_module = xy ]; then
+ insmod all_video
+ else
+ insmod efi_gop
+ insmod efi_uga
+ insmod ieee1275_fb
+ insmod vbe
+ insmod vga
+ insmod video_bochs
+ insmod video_cirrus
+ fi
+}
+
+insmod gzio
+insmod part_msdos
+insmod part_gpt
+insmod ext2
+insmod fat
+
+font=${config_directory}/unicode.pf2
+
+if loadfont $font ; then
+ set gfxmode=auto
+ load_video
+ insmod gfxterm
+ set locale_dir=$prefix/locale
+ set lang=en_US
+ insmod gettext
+fi
+terminal_output gfxterm
+insmod png
+background_image -m stretch ${config_directory}/theme/grub.png
+if [ "${recordfail}" = 1 ] ; then
+ set timeout=30
+else
+ if [ x$feature_timeout_style = xy ] ; then
+ set timeout_style=menu
+ set timeout=5
+ # Fallback normal timeout code in case the timeout_style feature is
+ # unavailable.
+ else
+ set timeout=5
+ fi
+fi
+### END /etc/grub.d/00_header ###
+
+### BEGIN /etc/grub.d/05_debian_theme ###
+if background_image ${config_directory}/theme/grub.png; then
+ true
+else
+ set menu_color_normal=cyan/blue
+ set menu_color_highlight=white/blue
+fi
+### END /etc/grub.d/05_debian_theme ###
+
+function gfxmode {
+ set gfxpayload="${1}"
+}
+set linux_gfx_mode=
+export linux_gfx_mode
+
+### BEGIN /etc/grub.d/41_custom ###
+if [ -f ${config_directory}/custom.cfg ]; then
+ source ${config_directory}/custom.cfg
+elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
+ source $prefix/custom.cfg
+fi
+### END /etc/grub.d/41_custom ###
+
+### BEGIN /etc/grub.d/30_uefi-firmware ###
+if [ "$grub_platform" = "efi" ]; then
+ menuentry 'UEFI Firmware Settings' $menuentry_id_option 'uefi-firmware' {
+ fwsetup
+ }
+fi
+
diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg b/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg
new file mode 100644
index 0000000..14d8eaf
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-16x9.svg
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg enable-background="new 0 0 1920 1080" version="1.1" viewBox="0 0 1920 1080" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<style type="text/css">
+ .st0{clip-path:url(#SVGID_00000093167105208028638090000008063807857182655396_);}
+ .st1{fill:#05475C;}
+ .st2{opacity:0.34;fill:url(#SVGID_00000012445251672029399260000003270595326732136081_);enable-background:new ;}
+ .st3{opacity:0.34;fill:url(#SVGID_00000127010423592997111840000013957416611417821059_);enable-background:new ;}
+ .st4{opacity:0.34;fill:url(#SVGID_00000101814971404403400460000010609185819928108449_);enable-background:new ;}
+ .st5{opacity:0.71;}
+ .st6{fill:#FFFFFF;}
+ .st7{opacity:0.62;}
+ .st8{opacity:0.34;fill:url(#SVGID_00000107557325802917530330000017592151723363848840_);enable-background:new ;}
+ .st9{opacity:0.34;fill:url(#SVGID_00000032650273911267859500000015024660283904495788_);enable-background:new ;}
+ .st10{opacity:0.34;fill:url(#SVGID_00000057851989095838282160000014663790337944238500_);enable-background:new ;}
+ .st11{opacity:0.34;fill:url(#SVGID_00000178165242061037739810000007582236097397314448_);enable-background:new ;}
+ .st12{opacity:0.34;fill:url(#SVGID_00000064329767591241199690000000234602624410839680_);enable-background:new ;}
+ .st13{opacity:0.34;fill:url(#SVGID_00000014609603927260903510000009061463274724089486_);enable-background:new ;}
+ .st14{opacity:0.34;fill:url(#SVGID_00000050627399097891942390000014523148072975367070_);enable-background:new ;}
+ .st15{opacity:0.34;fill:url(#SVGID_00000109731321347584724990000010142768297725207449_);enable-background:new ;}
+ .st16{opacity:0.34;fill:url(#SVGID_00000000926441590728654410000012560741159445150083_);enable-background:new ;}
+ .st17{opacity:0.34;fill:url(#SVGID_00000137832232493639134090000003781239364591219342_);enable-background:new ;}
+ .st18{opacity:0.34;fill:url(#SVGID_00000150812387129626622020000009167110439853258936_);enable-background:new ;}
+ .st19{opacity:0.34;fill:url(#SVGID_00000179608784322168811290000010365701417373876369_);enable-background:new ;}
+ .st20{opacity:0.34;fill:url(#SVGID_00000120531069539707179100000007006360167335202962_);enable-background:new ;}
+ .st21{opacity:0.34;fill:url(#SVGID_00000181089157459068778460000011901104969134050459_);enable-background:new ;}
+ .st22{opacity:0.34;fill:url(#SVGID_00000062164313994880221460000014631417913117263241_);enable-background:new ;}
+ .st23{opacity:0.12;fill:url(#SVGID_00000000902067244530690860000014386718989792038839_);enable-background:new ;}
+ .st24{opacity:0.12;fill:url(#SVGID_00000089550684643991047870000016914371577980347776_);enable-background:new ;}
+ .st25{opacity:0.12;fill:url(#SVGID_00000084507925595054884490000005003863653038598286_);enable-background:new ;}
+ .st26{opacity:0.12;fill:url(#SVGID_00000047780407226302564420000009742350089197221517_);enable-background:new ;}
+ .st27{opacity:0.12;fill:url(#SVGID_00000066480680368962549320000006921805612706891392_);enable-background:new ;}
+ .st28{opacity:0.12;fill:url(#SVGID_00000122678307387241734090000002868210978020395689_);enable-background:new ;}
+ .st29{opacity:0.12;fill:url(#SVGID_00000150100474908702981900000008908414767416909709_);enable-background:new ;}
+ .st30{opacity:0.12;fill:url(#SVGID_00000072960791515750302390000015282140940621514149_);enable-background:new ;}
+ .st31{opacity:0.12;fill:url(#SVGID_00000114770971300144002370000016800559959910618791_);enable-background:new ;}
+ .st32{opacity:0.12;fill:url(#SVGID_00000036952937828426554700000000522215132809990844_);enable-background:new ;}
+ .st33{opacity:0.12;fill:url(#SVGID_00000090974002902719031840000015158340248134540673_);enable-background:new ;}
+</style>
+
+ <defs>
+ <rect id="SVGID_1_" x="-.3" y=".1" width="1920" height="1080"/>
+ </defs>
+ <clipPath id="SVGID_00000085218408489160111120000007828018339010817721_">
+ <use xlink:href="#SVGID_1_"/>
+ </clipPath>
+ <g clip-path="url(#SVGID_00000085218408489160111120000007828018339010817721_)">
+
+
+ <rect class="st1" x="-17.3" y="-74.9" width="1955" height="1231"/>
+
+ <radialGradient id="SVGID_00000018216064389455096890000017941378598996776607_" cx="-680.76" cy="15330" r="1365.4" gradientTransform="matrix(.5 0 0 .5 345.38 -7667.8)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </radialGradient>
+
+ <circle cx="5" cy="-2.8" r="682.7" enable-background="new" fill="url(#SVGID_00000018216064389455096890000017941378598996776607_)" opacity=".34"/>
+
+ <radialGradient id="SVGID_00000000933302580452020710000013162680496496488371_" cx="-1132.4" cy="-1996.9" r="342.1" gradientTransform="matrix(-2.8317 2.4125 -.8042 -.9439 -3965.7 1030.7)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </radialGradient>
+
+ <polygon points="-301.3 537.5 1374 -889.6 1988.4 -168.2 313.1 1258.8" enable-background="new" fill="url(#SVGID_00000000933302580452020710000013162680496496488371_)" opacity=".34"/>
+
+ <radialGradient id="SVGID_00000080193032524742796840000011048436269149918087_" cx="173.04" cy="15838" r="459.4" gradientTransform="matrix(.5 0 0 .5 345.38 -7667.8)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#DAC9BA" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </radialGradient>
+
+ <circle cx="431.9" cy="251.1" r="229.7" enable-background="new" fill="url(#SVGID_00000080193032524742796840000011048436269149918087_)" opacity=".34"/>
+
+ <g class="st7">
+
+ <radialGradient id="SVGID_00000091732848191404214390000004736846775492618424_" cx="-37.305" cy="10365" r="173.24" gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </radialGradient>
+
+ <ellipse cx="766.2" cy="645.9" rx="173.2" ry="181.5" enable-background="new" fill="url(#SVGID_00000091732848191404214390000004736846775492618424_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000114788164137069528000000005957745660025105319_" x1="4501.7" x2="4698.5" y1="506.23" y2="506.23" gradientTransform="matrix(-.7151 .699 -.5383 -.5506 4391.6 -2623.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="700.3 321.9 810.7 153.3 949 375.1 885 415.5" enable-background="new" fill="url(#SVGID_00000114788164137069528000000005957745660025105319_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000054962312987295980090000006017935243511788676_" x1="2066" x2="2337.2" y1="7874.2" y2="7874.2" gradientTransform="matrix(.7774 .629 -.629 .7774 4107.2 -7204.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="871.9 494.7 784.8 279.5 810.7 153.3 905.6 201.5 1025.1 241.8 1001 349.2" enable-background="new" fill="url(#SVGID_00000054962312987295980090000006017935243511788676_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000012442755421995762960000014664915799359269053_" x1="-7687.7" x2="-7185.4" y1="5138.4" y2="5138.4" gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="458.3 613.8 629.2 399.9 799.9 213.2 939.5 373.1" enable-background="new" fill="url(#SVGID_00000012442755421995762960000014664915799359269053_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000086651592687441638420000016273738828393233579_" x1="9454.2" x2="9671.5" y1="2925.7" y2="2925.7" gradientTransform="matrix(-.3483 .5724 -.7648 -.6285 6665.3 -3309.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1211.9 391.7 1226.6 518.1 988.7 310.2 972.8 123.9" enable-background="new" fill="url(#SVGID_00000086651592687441638420000016273738828393233579_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000095314929038062691570000012080618537926193552_" x1="-4049.4" x2="-3743.9" y1="6098.6" y2="6098.6" gradientTransform="matrix(.7151 -.699 .699 .7151 -446.37 -6772.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="988.7 310.2 784.8 279.5 889.2 212.3 1029.8 93.1 1208.9 409.2" enable-background="new" fill="url(#SVGID_00000095314929038062691570000012080618537926193552_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000069384093065957304470000008686477747994526866_" x1="6255.9" x2="6490.9" y1="2547.1" y2="2547.1" gradientTransform="matrix(-.5898 .8076 -.8076 -.5898 6758.6 -3397.5)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="960 371.1 730.2 237.8 972.8 123.9 1043.6 409.2" enable-background="new" fill="url(#SVGID_00000069384093065957304470000008686477747994526866_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000174570387500765410560000018201440021002273169_" x1="-7023" x2="-6656.5" y1="-1443.5" y2="-1443.5" gradientTransform="matrix(-.2682 -.9634 1.0501 -.2924 294.06 -6276.8)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="657.1 531.1 756.4 656.4 507.9 953.1 521.4 741.6" enable-background="new" fill="url(#SVGID_00000174570387500765410560000018201440021002273169_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000041276010603755054700000012950505128597653693_" x1="6476.3" x2="6860.4" y1="-3050.7" y2="-3050.7" gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="397 619.9 699 580.8 766.2 642.6 628.2 832 516.1 895 427.7 829.7" enable-background="new" fill="url(#SVGID_00000041276010603755054700000012950505128597653693_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000061435600823447587540000000552723606534874028_" x1="-14448" x2="-13998" y1="-4271" y2="-4271" gradientTransform="matrix(-.2347 -.2596 .879 -.2953 1043 -4356)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="431.9 727.7 458.3 613.8 806 449.6 700.3 584.1" enable-background="new" fill="url(#SVGID_00000061435600823447587540000000552723606534874028_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000002351047188999019860000002566414104328457898_" x1="12773" x2="13681" y1="6937.4" y2="6937.4" gradientTransform="matrix(.1765 .3022 -.9209 .1087 4716.3 -3888.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="740.4 729.5 893.4 986.9 504.3 864.5 521.4 741.6" enable-background="new" fill="url(#SVGID_00000002351047188999019860000002566414104328457898_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000004534978137110897330000008179059058368671906_" x1="-7687.7" x2="-7400.5" y1="5080.5" y2="5080.5" gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="699 580.8 458.3 613.8 533.2 379.6 806 449.6" enable-background="new" fill="url(#SVGID_00000004534978137110897330000008179059058368671906_)" opacity=".34"/>
+
+ <radialGradient id="SVGID_00000091017312778810520490000013487813255627565699_" cx="-108.26" cy="10031" r="181.94" gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </radialGradient>
+
+ <ellipse cx="871.9" cy="305.4" rx="181.9" ry="190.6" enable-background="new" fill="url(#SVGID_00000091017312778810520490000013487813255627565699_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000093149179829732349710000008128861407447028144_" x1="6476.3" x2="6770.7" y1="-3135.9" y2="-3135.9" gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="501.4 638.1 766.2 642.6 717.1 936.1 628.2 832 532.1 848" enable-background="new" fill="url(#SVGID_00000093149179829732349710000008128861407447028144_)" opacity=".34"/>
+
+ <linearGradient id="SVGID_00000034071598378061202680000005682775137060128388_" x1="-2446" x2="-2179.5" y1="8617" y2="8617" gradientTransform="matrix(.9797 -.2004 .2004 .9797 1206.6 -8533.7)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="533.2 379.6 730.2 345.4 784.8 279.5 797.9 413.5" enable-background="new" fill="url(#SVGID_00000034071598378061202680000005682775137060128388_)" opacity=".34"/>
+ </g>
+
+ <linearGradient id="SVGID_00000147222259863327894370000004713185813428820113_" x1="-8054.3" x2="-7614.2" y1="5144.3" y2="5144.3" gradientTransform="matrix(.4172 -.9088 .9088 .4172 401.78 -8335.1)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="2140.7 840.5 1984.5 1253.1 1507.2 881.3 1602 731.1" enable-background="new" fill="url(#SVGID_00000147222259863327894370000004713185813428820113_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000063620498617606890090000008720960172290484925_" x1="-338.65" x2="213.1" y1="-4980.9" y2="-4980.9" gradientTransform="matrix(-.9511 -.3089 .3089 -.9511 3185.3 -3756.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1556 569.8 1783 991.1 1934.2 1191.5 1645 1256.7 1426.9 1290.3 1413.7 1026.6" enable-background="new" fill="url(#SVGID_00000063620498617606890090000008720960172290484925_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000078013590621525976610000006727138897565908112_" x1="5217.2" x2="5885.5" y1="6487.9" y2="6487.9" gradientTransform="matrix(-.035946 .9994 -.9994 -.035946 8477.3 -4502.9)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1933.3 482.6 1995.2 701.9 1737.9 1144.3 1601.6 667.3" enable-background="new" fill="url(#SVGID_00000078013590621525976610000006727138897565908112_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000129169157574715853980000000301106401069963673_" x1="8268.4" x2="8986.3" y1="570.84" y2="570.84" gradientTransform="matrix(-.079098 .6653 -.9567 -.2541 3183.2 -4748.3)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="2004.8 870.8 2102.8 1126.5 1757.4 979.3 1814 558.8" enable-background="new" fill="url(#SVGID_00000129169157574715853980000000301106401069963673_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000051343387064157711410000007010731585534318724_" x1="-6628.8" x2="-6236.5" y1="4207.9" y2="4207.9" gradientTransform="matrix(.2612 -.9653 .9653 .2612 -653.47 -6361.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1621.5 776.7 2068.4 836 1927.9 1204.4 1463.9 778.1" enable-background="new" fill="url(#SVGID_00000051343387064157711410000007010731585534318724_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000169518436558334241300000010220786071391330234_" x1="1836.1" x2="2258.3" y1="7829.2" y2="7829.2" gradientTransform="matrix(.9919 -.1269 .1269 .9919 -1274.9 -6407.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1983.4 1264.7 1663.6 1217.3 1515.2 932.3" enable-background="new" fill="url(#SVGID_00000169518436558334241300000010220786071391330234_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000003075246375309062510000005919818320267613622_" x1="10927" x2="11459" y1="12790" y2="12790" gradientTransform="matrix(.3792 .341 -.9317 .5609 7924.4 -10915)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#AABDCB" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="276.7 -75.4 413.8 -51.6 325.9 197.4 26.2 146.4" enable-background="new" fill="url(#SVGID_00000003075246375309062510000005919818320267613622_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000151504943794861704500000013710966191068745143_" x1="9379" x2="9964.7" y1="6171.8" y2="6171.8" gradientTransform="matrix(.353 .5695 -.9064 .3978 2451.4 -7980.3)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="320.6 -31.9 538.6 70 180.3 178.5 -2.7 -115.1" enable-background="new" fill="url(#SVGID_00000151504943794861704500000013710966191068745143_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000116945986907177242930000003619234899467008173_" x1="-7309.4" x2="-6990.4" y1="-1249.7" y2="-1249.7" gradientTransform="matrix(-.3976 -.9175 .9175 -.3976 -1553.6 -6849.4)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="-37.5 164 354.7 -57.8 441.9 252.1 -163.5 256" enable-background="new" fill="url(#SVGID_00000116945986907177242930000003619234899467008173_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000018934028870046402510000005056381095522587327_" x1="-3331.9" x2="-2897" y1="6389.5" y2="6389.5" gradientTransform="matrix(.6964 -.7176 .7176 .6964 -2068.3 -6498.1)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="626.8 154.1 343.4 309.7 69 218.8" enable-background="new" fill="url(#SVGID_00000018934028870046402510000005056381095522587327_)" opacity=".12"/>
+
+ <linearGradient id="SVGID_00000101790783768249243120000007920411576515842194_" x1="-6562.5" x2="-6127.7" y1="1880.1" y2="1880.1" gradientTransform="matrix(-.094803 -.9955 .9955 -.094803 -1443.6 -5086.3)" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#18F5B0" offset="0"/>
+ <stop stop-color="#05475C" stop-opacity="0" offset="1"/>
+ </linearGradient>
+
+ <polygon points="1185.8 818.7 1120.5 1135.3 873.3 1285.3" enable-background="new" fill="url(#SVGID_00000101790783768249243120000007920411576515842194_)" opacity=".12"/>
+ <g transform="matrix(3.6992 0 0 3.6992 -680.64 -2515.7)"><path d="m531.96 720.55v-40h170.61v80h-170.61z" fill="none"/><g stroke-width=".12945"><g fill="#7b83bd"><path d="m670.74 730.55c-0.0818-0.0531-0.16919-0.23985-0.19417-0.41492-0.0305-0.21386-0.15161-0.34321-0.36903-0.39418l-0.32362-0.0759-0.0662-21.537-0.29051-0.0669c-0.15979-0.0368-0.78567-0.0815-1.3908-0.0994-1.0948-0.0323-1.1005-0.0343-1.1413-0.38814-0.0289-0.25118-0.13348-0.3789-0.35599-0.43474l-0.31505-0.0791v-4.3657l3.4304-0.0722 0.0834-2.8937c0.0459-1.5915 0.12295-3.2808 0.17123-3.754 0.55772-5.4656 5.2221-8.5581 11.266-7.4696 1.7396 0.31327 1.8663 0.3522 1.9441 0.59727 0.0411 0.12952 0.27584 0.30185 0.52162 0.38297l0.4469 0.14749v2.2594c0 2.6364 0.10954 2.4765-1.5041 2.1943-4.918-0.86025-6.5218 0.83332-6.5218 6.8868 0 1.7286-0.0125 1.7138 1.453 1.7138 1.0904 0 1.1478 0.0143 1.2619 0.31438 0.0801 0.21064 0.23922 0.32811 0.48224 0.35599l0.36271 0.0416 0.0353 2.2977 0.0354 2.2977h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0319c-1.424 0.0175-2.6559-0.0116-2.7378-0.0647z"/><path d="m591.61 730.9c-3.7039-0.53738-7.0106-3.4323-8.0598-7.0559l-0.29814-1.0298v-20.194l5.3776-0.07 0.0768 0.38392c0.0525 0.26237 0.16432 0.3964 0.35328 0.42334l0.27649 0.0394 0.0736 9.2556c0.079 9.9387 0.0773 9.9135 0.76626 11.257 1.3801 2.6904 6.9458 2.3678 9.9291-0.57556l1.074-1.0596 0.0664-19.654h5.2958l0.0753 0.3189c0.047 0.19927 0.19491 0.34714 0.39418 0.39418l0.3189 0.0753 0.033 13.514c0.0262 10.725-5.2e-4 13.535-0.12945 13.617-0.20417 0.12963-4.8997 0.13701-5.0989 8e-3 -0.0808-0.0523-0.16844-0.20905-0.19485-0.34833-0.0269-0.14191-0.18997-0.28648-0.37096-0.32888-0.28889-0.0677-0.32714-0.15018-0.36272-0.78238-0.0542-0.96318-0.15572-1.0082-0.91689-0.40651-2.3769 1.8788-5.5074 2.6793-8.679 2.2191z"/><path d="m561.76 730.95c-4.2843-0.56824-7.407-4.7148-6.4879-8.6152 0.86029-3.6509 3.4588-5.5455 11.131-8.1162 4.6592-1.5611 4.2768-1.3005 4.1863-2.8524-0.15943-2.7352-0.79601-3.3326-3.6916-3.4641-3.0082-0.13663-5.6954 0.70511-8.7593 2.7438-1.2728 0.8469-1.3628 0.86348-1.3628 0.25112 0-0.48648 0.0213-0.47889-0.61488-0.21878-0.12635 0.0517-0.16181-0.51706-0.16181-2.5949v-2.661l0.82694-0.5901c5.2674-3.7587 13.751-3.7839 17.434-0.0517 2.5162 2.5493 2.6105 3.0035 2.702 13.017 0.0531 5.8125 0.11288 7.9629 0.2245 8.0745 0.25719 0.25697 1.0232 0.0162 1.9355-0.60838 0.90099-0.61684 1.0376-0.61487 1.1063 0.016 0.0233 0.21359 0.10058 0.37864 0.17177 0.36678 0.0712-0.0119 0.21683-0.041 0.32363-0.0647 0.16213-0.036 0.20024 0.19981 0.23092 1.429l0.0367 1.4721-0.55455 0.51222c-2.6053 2.4065-6.7165 2.7237-8.7268 0.67343l-0.80225-0.8182-1.1187 0.62712c-2.3378 1.3105-5.2392 1.8426-8.0297 1.4725zm5.2244-4.8972c0.88081-0.20764 2.4044-0.91608 3.0928-1.438l0.42071-0.31902v-3.4238c0-1.8831-0.0473-3.4238-0.10517-3.4238-0.40015 0-3.8792 1.3399-5.1726 1.9921-2.9246 1.4748-4.1841 3.6985-3.1976 5.6457 0.53853 1.063 2.737 1.4914 4.9619 0.96689z"/><path d="m692.78 731.04c-2.3851-0.29962-3.4213-0.77524-4.8482-2.2253-2.3472-2.3854-2.6086-3.8112-2.6107-14.245l-2e-3 -6.4377-0.29126-0.0679c-0.1602-0.0373-1.0194-0.0821-1.9094-0.0996l-1.6181-0.0317 0.0376-0.35818c0.0323-0.30729-0.0183-0.36936-0.35598-0.43689-0.65008-0.13002-0.56652-0.23919 4.2936-5.6105 4.6046-5.0889 5.1509-5.604 5.1509-4.8566 0 0.28356 0.0561 0.32362 0.45308 0.32362 0.56801 0 0.49372-0.3673 0.57601 2.8479l0.0713 2.7832 7.4259 0.0686 0.0411 0.28929c0.0314 0.221 0.14033 0.29886 0.46141 0.32983 0.54803 0.0529 0.56833 0.15422 0.52291 2.6132l-0.0371 2.0065-8.4142 0.1294v7.5728c0 9.5837-0.0655 9.2666 1.9819 9.5843 1.5108 0.23441 3.1565-0.0641 5.3548-0.97139 0.16875-0.0697 0.22628-8e-3 0.2589 0.27662 0.0387 0.3379 0.0796 0.3632 0.5302 0.32784l0.48825-0.0383-0.0704 4.9927-0.97087 0.41299c-1.7164 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-11.238-1.0706-17.821-13.565-11.852-22.494 5.9444-8.8911 19.075-8.4641 25.171 0.81859 6.4018 9.7493-1.6115 22.79-13.319 21.675zm2.9126-6.0591c7.7496-2.6058 8.4496-14.106 1.0146-16.668-8.3701-2.885-15.023 7.2302-9.5468 14.515 1.7018 2.2639 5.4158 3.2012 8.5322 2.1533z"/><path d="m619.89 731.03c-2.8196-0.29176-6.9807-1.7126-7.3427-2.5072-0.0762-0.16724-0.27775-0.3675-0.44789-0.44502l-0.30935-0.14095v-2.7212c0-1.4967 0.0437-2.7211 0.0971-2.7209 0.0534 1.3e-4 0.44315 0.20901 0.86612 0.46405 5.3282 3.2128 10.987 3.4948 12.196 0.60774 0.69414-1.6581 0.15941-2.2365-4.1073-4.4429-6.4073-3.3134-8.5588-5.5874-8.7519-9.2506-0.29372-5.5709 4.7665-8.7291 12.008-7.4942 2.0597 0.35128 5.0673 1.4593 5.5474 2.0436 0.10161 0.12369 0.34918 0.30993 0.55016 0.41386l0.36541 0.18896v2.5133c0 2.9906 0.14723 2.8388-1.831 1.8868-5.1014-2.4552-9.8447-2.4082-10.269 0.10163-0.26309 1.5572 0.92868 2.6352 5.4331 4.9142 6.757 3.4188 8.6834 6.1049 7.6785 10.707-0.89609 4.1038-5.6643 6.5046-11.682 5.8819z"/><path d="m534.77 719.58v-35.405h16.57v70.809h-16.57z"/></g><g fill="#656fb2"><path d="m670.73 730.56c-0.089-0.0367-0.16181-0.238-0.16181-0.44742 0-0.28704-0.0797-0.41105-0.32363-0.50381l-0.32362-0.12304v-21.361l-0.29126-0.0672c-0.1602-0.037-0.81553-0.0818-1.4563-0.0995l-1.165-0.0323-0.0401-0.41444c-0.0265-0.27418-0.12511-0.44143-0.29126-0.49416-0.23474-0.0745-0.25116-0.21458-0.25116-2.1422v-2.0625h1.5428c2.135 0 1.9515 0.20457 1.9569-2.1821 0.0159-7.0334 0.99689-9.455 4.5385-11.203 2.309-1.1398 7.8279-1.3403 8.5832-0.31196 0.0782 0.10655 0.36074 0.26568 0.62773 0.35361l0.48544 0.15987v2.2594c0 2.6364 0.10955 2.4765-1.5041 2.1943-4.9223-0.861-6.5218 0.83183-6.5218 6.9021 0 1.9303-0.076 1.828 1.358 1.828 1.0771 0 1.2076 0.0257 1.2661 0.24962 0.0449 0.17179 0.20097 0.26259 0.50053 0.29126l0.43526 0.0417 0.0708 4.5954h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0235c-1.4239 0.0129-2.6618-6e-3 -2.7508-0.0432z"/><path d="m591.61 730.9c-3.4819-0.50517-6.7272-3.1895-7.8207-6.4688-0.5836-1.7502-0.61525-2.4342-0.57499-12.426l0.0378-9.3851h5.2958l0.0753 0.3189c0.0471 0.1993 0.19489 0.34712 0.39418 0.39412l0.31891 0.0752 0.0736 9.2499c0.0792 9.9576 0.0752 9.8986 0.77877 11.278 1.3578 2.6616 6.8344 2.386 9.8272-0.49455l1.1003-1.059 0.1294-19.762h5.2958l0.0753 0.31891c0.047 0.19927 0.19492 0.34714 0.39419 0.39418l0.3189 0.0753 0.033 13.514c0.0262 10.725-5.2e-4 13.535-0.12945 13.617-0.56635 0.35958-5.2757 0.0901-5.2757-0.30185 0-0.16338-0.13636-0.29932-0.38835-0.38717-0.37234-0.1298-0.38834-0.16687-0.38834-0.89941 0-0.90633-0.0637-0.92433-0.90853-0.25655-2.3594 1.865-5.5001 2.6648-8.6624 2.206z"/><path d="m561.76 730.95c-5.3138-0.70478-8.3017-6.5701-5.5291-10.854 1.5815-2.4432 3.8738-3.7426 10.481-5.9409 3.4712-1.1549 3.7935-1.287 3.8684-1.5854 1.348-5.3709-5.6374-6.4513-12.441-1.9242-1.2717 0.84616-1.3628 0.86318-1.3628 0.25469 0-0.4475-0.0133-0.46044-0.38834-0.37806l-0.38835 0.0853v-5.0423l0.44664-0.39216c4.5382-3.9846 13.807-4.2036 17.72-0.41868 2.6193 2.5339 2.7045 2.9306 2.797 13.017 0.0398 4.343 0.11949 7.9692 0.17709 8.0582 0.2426 0.37484 1.1921 0.0659 2.3292-0.75782 0.57746-0.41831 0.73197-0.35139 0.73556 0.31859 2e-3 0.29916 0.0453 0.35299 0.22852 0.28167 0.12459-0.0485 0.28479-0.0984 0.35598-0.11093 0.0783-0.0138 0.14397 0.55885 0.1662 1.4494l0.0367 1.4721-0.55455 0.51222c-2.6041 2.4053-6.7064 2.725-8.6943 0.67756l-0.81122-0.83552-1.1305 0.63372c-2.35 1.3173-5.2454 1.8499-8.0415 1.479zm5.2116-4.8402c0.79886-0.18736 2.8442-1.1848 3.2997-1.6092l0.35599-0.33165v-3.2881c0-3.7408 0.0648-3.5603-1.1358-3.1658-4.8564 1.5959-7.2347 3.2113-7.6621 5.2042-0.58196 2.7136 1.546 4.0339 5.1422 3.1905z"/><path d="m692.78 731.04c-2.4091-0.30264-3.4356-0.7762-4.6827-2.1602-2.4427-2.7111-2.542-3.2174-2.6159-13.342l-0.054-7.4113-0.28035-0.0652c-0.15419-0.0359-1.0376-0.0794-1.9632-0.0968l-1.6828-0.0316v-0.45307c0-0.37467-0.0517-0.4604-0.29872-0.49542-0.4453-0.0631-0.54891 0.0646 4.3816-5.4015 4.6028-5.1028 4.8606-5.3543 4.9372-4.815 0.0358 0.25217 0.10654 0.28556 0.52682 0.24878 0.6036-0.0528 0.52578-0.42248 0.6085 2.8904l0.0711 2.8479 3.6424 0.0344c3.5092 0.0331 3.6448 0.0437 3.7096 0.29126 0.0512 0.1958 0.17725 0.25691 0.5299 0.25691 0.59961 0 0.61589 0.0741 0.56945 2.589l-0.0371 2.0065-8.4142 0.1294v7.5081c0 9.7863-0.0637 9.4798 2.0322 9.7771 1.4488 0.20548 3.854-0.21499 5.1271-0.89634 0.22913-0.12263 0.27186-0.10198 0.30745 0.1486 0.0364 0.2565 0.10691 0.28686 0.5943 0.25598l0.55295-0.035-0.0704 4.986-0.97088 0.41299c-1.7163 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-10.373-0.98819-17.019-12.123-12.559-21.041 3.9318-7.8609 14.385-10.258 21.43-4.9134 3.0764 2.3337 3.3585 2.6091 4.5628 4.4539 6.2729 9.6092-1.8466 22.605-13.434 21.501zm2.9357-5.9384c8.0194-2.692 8.6057-14.237 0.85519-16.838-7.5107-2.5213-14.13 5.9216-10.311 13.153 1.9027 3.6033 5.5115 5.0099 9.4561 3.6857z"/><path d="m619.89 731.03c-2.9246-0.30263-7.3232-1.8427-7.3232-2.5641 0-0.13526-0.14563-0.34134-0.32363-0.45796l-0.32362-0.21205v-5.1867l0.55016 0.33741c5.879 3.6055 12.343 3.6211 12.748 0.0309 0.16185-1.4359-0.0201-1.6038-3.9316-3.6263-7.5874-3.9233-10.005-7.0829-8.9245-11.665 1.3612-5.7752 10.451-7.3093 17.649-2.9787l0.55016 0.33102v2.5069c0 2.9834 0.14703 2.8324-1.831 1.8804-6.3168-3.0401-11.755-2.1043-9.9057 1.7044 0.45195 0.93065 1.1262 1.3962 4.7279 3.2644 2.3633 1.2258 3.8584 2.1546 5.4554 3.389 0.32039 0.24763 0.77763 0.60053 1.0161 0.78422 1.8324 1.4114 2.3335 5.3127 1.0291 8.0115-1.5772 3.2635-5.9165 4.9938-11.162 4.451z"/><path d="m534.9 719.58v-35.275h16.311v70.55h-16.311z"/></g><g fill="#595a5f"><path d="m690.69 702.52c-0.0349-0.091-0.0476-1.3275-0.0283-2.7478l0.0352-2.5823 0.36361-0.12778c0.28167-0.099 0.39061-0.0851 0.48345 0.0617 0.13135 0.20765 0.17203 5.0265 0.0452 5.3569-0.095 0.24758-0.80733 0.27871-0.8992 0.0393z"/><path d="m675.32 702.61c-0.19007-0.19007-0.10023-5.0699 0.11227-6.0987 0.66257-3.2077 2.5582-4.0389 7.2712-3.1884l0.42071 0.0759v-1.8955c0-2.0526 0.0299-2.1349 0.71226-1.9636l0.32334 0.0811v2.267c0 2.645 0.10984 2.4842-1.5041 2.2019-4.8619-0.85044-6.2885 0.55275-6.5068 6.4l-0.0797 2.1359-0.32847 0.0383c-0.18066 0.0211-0.36998-3e-3 -0.42072-0.0539z"/><path d="m681.5 707.86c-0.32007-0.51788 0.29482-0.771 1.8729-0.771 1.8188 0 1.9494 0.0356 1.9494 0.53165v0.3745h-1.8694c-1.1591 0-1.9011-0.0514-1.9529-0.13515z"/><path d="m666.98 707.78c-0.17529-0.45678 0.13272-0.62783 1.2029-0.66804 1.391-0.0523 1.605 0.0136 1.605 0.49392v0.38589h-1.3633c-1.1427 0-1.3764-0.0343-1.4445-0.21177z"/><path d="m618 710.49c-2.7335-3.8064 3.5231-5.049 9.9541-1.977 0.73991 0.35344 1.396 0.64262 1.4581 0.64262s0.11281-0.98685 0.11281-2.193c0-2.3588 0.031-2.4622 0.64345-2.1455l0.39215 0.20279v2.5133c0 2.9906 0.14723 2.8388-1.831 1.8868-5.8477-2.8143-11.331-2.2056-10.155 1.1273 0.26954 0.76348-5e-3 0.73613-0.57494-0.0572z"/><path d="m620.73 719.06c-2.5656-1.3215-4.1969-2.2971-4.5475-2.7196-0.33177-0.39975 6.4586 3.2049 7.0984 3.7682 0.60446 0.53213 0.17677 0.35631-2.5509-1.0487z"/><path d="m641.76 721.83c-4.9976-6.7888 0.83778-16.377 8.9328-14.677 0.9947 0.20884 2.4991 0.90054 3.1068 1.4284 0.45313 0.39364 0.4177 0.3879-1.2907-0.20927-7.667-2.68-14.362 5.801-10.413 13.191 0.55814 1.0447 0.5629 1.058 0.37701 1.058-0.0714 0-0.39197-0.35625-0.71249-0.79165z"/><path d="m691.57 724.27c-0.8651-0.94979-0.93509-1.685-0.94038-9.877-3e-3 -5.2745 0.0337-7.035 0.15083-7.1521 0.1143-0.1143 1.2419-0.15534 4.2683-0.15534h4.113l0.0718-3.6893 0.41627-0.0402c0.54868-0.053 0.57307 0.0657 0.52692 2.5645l-0.0371 2.0065-8.4142 0.1294-0.0354 7.1845c-0.0298 6.0227-3e-3 7.3435 0.16181 8.1682 0.26734 1.3332 0.2359 1.4292-0.28179 0.86087z"/><path d="m670.71 730.54c-0.0952-0.0612-0.15347-0.25029-0.12945-0.42023l0.0437-0.30898 2.1266-0.0357c1.2999-0.0218 2.1932-0.0909 2.2977-0.17766 0.13937-0.11568 0.17108-2.2017 0.17108-11.256v-11.114l0.29126-0.0677c0.1602-0.0372 0.96117-0.082 1.7799-0.0996l1.4887-0.0318 0.1294-3.6246h0.7767l0.0353 2.2977 0.0354 2.2977h-1.67c-2.2052 0-1.9538-1.4471-1.9922 11.469l-0.0331 11.12-2.589 0.0319c-1.4239 0.0175-2.6669-0.0182-2.7621-0.0794z"/><path d="m591.57 730.9c-3.7289-0.54686-7.0248-3.5752-8.0194-7.3684-0.3436-1.3105-0.55619-20.396-0.23155-20.787 0.12218-0.14722 0.63561-0.18368 2.5641-0.18209 2.5105 2e-3 2.674 0.0285 2.753 0.44541 0.0269 0.14172 0.19023 0.28677 0.37096 0.3294l0.32295 0.0762 0.0736 9.2499c0.0801 10.068 0.0657 9.8726 0.83961 11.4 1.3852 2.7337 7.3912 2.1559 10.264-0.98741l0.66741-0.73025v-9.7371c0-11.449-0.37922-10.048 2.7184-10.048 2.4822 0 2.7184 0.0465 2.7184 0.53509 0 0.14858 0.12029 0.23825 0.35598 0.26537l0.35599 0.041 0.033 13.519c0.0262 10.73-5.2e-4 13.541-0.12945 13.623-0.20416 0.12963-4.8991 0.137-5.1008 8e-3 -0.0818-0.0523-0.1692-0.24014-0.19418-0.41741-0.028-0.19852-0.14484-0.34099-0.30431-0.37096-0.36253-0.0681-0.44882-0.25125-0.45109-0.95722-2e-3 -0.7458-0.0898-0.75611-0.91051-0.1074-2.3696 1.8731-5.5104 2.6679-8.6962 2.2007z"/><path d="m561.76 730.95c-4.3402-0.57565-7.3915-4.8602-6.339-8.9011 0.87897-3.3746 3.5104-5.2322 10.935-7.7192 4.7818-1.6018 4.3083-1.2648 4.2507-3.0249-0.0875-2.6727-0.75627-3.2875-3.7085-3.409-3.0236-0.12442-5.704 0.71709-8.7593 2.75-1.27 0.84502-1.3628 0.86273-1.3628 0.26008 0-0.42235-0.0277-0.45508-0.35598-0.42072l-0.35599 0.0373-0.0369-2.2654c-0.0472-2.9001-0.11258-2.712 1.255-3.61 6.4612-4.2427 16.039-3.0524 18.633 2.3155 0.96574 1.9988 0.96709 2.0128 1.0477 10.837 0.0867 9.4933-0.027 9.122 2.2883 7.4759 0.7737-0.55008 0.79991-0.55095 0.85033-0.028 0.0399 0.41396 0.12686 0.46128 0.62309 0.33908 0.16245-0.04 0.20017 0.19263 0.23092 1.4243l0.0367 1.4722-0.55455 0.51222c-2.6345 2.4334-6.8976 2.733-8.7099 0.61198-0.77979-0.91261-0.56769-0.89776-1.9283-0.13502-2.3478 1.3161-5.2443 1.8486-8.0393 1.4778zm5.0915-4.7669c0.97953-0.23092 2.465-0.9076 3.2257-1.4694l0.55016-0.40633v-3.4296c0-2.7444-0.034-3.4296-0.16989-3.4296-0.45768 0-3.8324 1.2836-5.2374 1.9921-2.9819 1.5037-4.1044 3.5283-3.1813 5.7378 0.43614 1.0438 2.6697 1.5102 4.8127 1.005z"/><path d="m692.78 731.04c-1.7421-0.21885-2.994-0.62908-3.8032-1.2462-0.67447-0.51445-0.4951-0.56137 0.64711-0.16929 2.5563 0.8775 6.2164 0.75562 8.7379-0.29095l0.93851-0.38955v-1.8576c0-1.7728 0.0131-1.8668 0.28771-2.0591 0.73232-0.51294 0.75677-0.435 0.71832 2.2889l-0.0352 2.4904-0.97088 0.41299c-1.7163 0.7301-4.4758 1.0773-6.5203 0.82049z"/><path d="m648.56 731.08c-2.858-0.27227-5.7296-1.2988-7.1845-2.5681l-0.5178-0.45179 1.3592 0.6406c13.389 6.3104 26.634-8.2234 18.516-20.319-0.72111-1.0745-0.73867-1.146-0.14313-0.58252 8.8465 8.3706 0.52369 24.477-12.03 23.281z"/><path d="m619.89 731.03c-2.6847-0.27781-7.3232-1.8389-7.3232-2.4646 0-0.19065 0.29709-0.11705 1.877 0.46502 10.102 3.7216 19.524-2.1546 15.665-9.7697-0.58365-1.1518 0.22704-0.71028 0.86704 0.4722 3.3903 6.264-2.4277 12.193-11.086 11.297z"/><path d="m539.32 744.45c-0.0663-0.0818-0.14208-0.26465-0.16836-0.40623-0.0263-0.14157-0.16362-0.27938-0.30519-0.30623-0.42304-0.0802-0.44763-0.23771-0.44763-2.8668 0-2.9534-0.0811-2.7445 1.2291-3.1652 1.8317-0.58808 2.6157-1.4383 3.2209-3.493 0.26714-0.90701 0.26994-1.1012 0.33492-23.217 0.0577-19.636 0.0887-22.317 0.2597-22.425 0.1068-0.0675 1.3696-0.12362 2.8063-0.12471 2.7147-2e-3 3.019 0.0565 3.019 0.58119 0 0.097 0.16019 0.19476 0.35599 0.21729l0.35598 0.041 0.0376 21.1c0.0391 21.923 4e-3 23.768-0.49687 26.263-0.68682 3.4202-2.9938 6.0716-6.2605 7.1956-1.3931 0.4793-3.7498 0.84162-3.9408 0.60587z"/></g><g fill="#02024b"><path d="m690.84 702.47c-0.19442-0.19442-0.0956-5.0523 0.10622-5.2198 0.51369-0.42632 0.58418-0.13146 0.58418 2.4435 0 2.8034-0.13208 3.3346-0.6904 2.7762z"/><path d="m675.44 702.48c-0.13769-0.13768-0.10707-4.5343 0.0377-5.4198 0.5689-3.479 2.2357-4.3886 6.7082-3.6607 1.2092 0.19678 1.1847 0.23829 1.1872-2.0118 2e-3 -1.7807 3e-3 -1.7887 0.29325-1.7476 0.28768 0.0409 0.29169 0.0689 0.32674 2.2894l0.0355 2.248-0.42383-0.0765c-5.8141-1.0494-7.3669 0.20471-7.5884 6.1292-0.0843 2.2537-0.18384 2.6423-0.5764 2.2498z"/><path d="m681.7 707.61c0-0.24612 0.0863-0.2589 1.7476-0.2589s1.7476 0.0128 1.7476 0.2589c0 0.24611-0.0863 0.2589-1.7476 0.2589s-1.7476-0.0128-1.7476-0.2589z"/><path d="m629.81 709.78c-0.21098-0.10161-0.26717-0.20185-0.19466-0.34722 0.0561-0.11241 0.11939-1.1801 0.1407-2.3727 0.0291-1.6318 0.0789-2.1683 0.20113-2.1683 0.41883 0 0.47306 0.30719 0.47306 2.6796 0 2.5162 2e-3 2.5083-0.62023 2.2086z"/><path d="m617.9 710.08c-1.8102-3.2207 3.5049-4.2691 9.1399-1.8028 1.5305 0.66984 1.4692 0.74501-0.13887 0.17027-4.9652-1.7746-9.1565-0.91473-8.5694 1.7581 0.11671 0.53137-0.0974 0.46909-0.43161-0.12554z"/><path d="m641.44 721.08c-4.8688-6.8376 3.3253-16.893 10.775-13.222 0.44372 0.21868 0.68386 0.36765 0.53365 0.33105-8.0511-1.9617-14.303 5.0028-11.245 12.527 0.34161 0.84072 0.32899 0.91357-0.0629 0.36317z"/><path d="m691.34 723.62c-0.50518-1.1035-0.59087-2.6201-0.55003-9.7343l0.0371-6.4725 4.2071-0.0692c2.3139-0.0381 4.2201-0.0818 4.2359-0.0971 0.0159-0.0153 0.045-0.85795 0.0647-1.8725l0.0359-1.8447h0.64724v4.2718l-4.2071 0.0692c-2.3139 0.0381-4.2217 0.0818-4.2395 0.0971-0.13693 0.11786 2e-3 14.715 0.14628 15.465 0.20305 1.049 0.0512 1.1244-0.37775 0.18742z"/><path d="m670.78 730.44c-0.46697-0.46696-0.13168-0.55698 2.2088-0.59298l2.2977-0.0353 0.0662-22.46h1.5612c2.1729 0 2.062 0.11169 2.062-2.0758v-1.8077h0.64724v4.4013h-1.667c-2.2016 0-1.9508-1.4462-1.9892 11.469l-0.0331 11.12-2.5324 0.035c-1.3928 0.0193-2.5724-5e-3 -2.6214-0.0539z"/><path d="m591.67 730.77c-3.9163-0.61678-7.1803-3.6317-8.0525-7.4379-0.21886-0.95513-0.2373-1.795-0.2373-10.809v-9.7735l5.0798-0.07 0.0782 0.39103c0.0617 0.30872 0.14567 0.39103 0.39869 0.39103h0.32048l0.0439 9.2233c0.0478 10.047 0.0319 9.8232 0.8049 11.349 1.4007 2.7642 7.0887 2.4317 10.134-0.59239l1.0671-1.0597 0.0664-19.632h5.0369l0.0753 0.3189c0.047 0.19927 0.19492 0.34714 0.39419 0.39418l0.3189 0.0753v26.914h-5.0485l-0.0434-0.30666c-0.0281-0.19874-0.17619-0.3568-0.42071-0.4491-0.35687-0.1347-0.37733-0.18301-0.37733-0.89074 0-0.94207-0.10354-0.95124-1.2594-0.11151-2.4324 1.7672-5.5061 2.5287-8.3796 2.0762z"/><path d="m561.24 730.69c-4.6636-0.98973-7.241-5.8162-5.2508-9.8328 1.3736-2.7721 3.7157-4.2194 10.545-6.5161 4.7229-1.5884 4.8694-1.7627 3.9586-4.7116-0.90112-2.9175-7.1675-2.5311-12.176 0.75082-1.5194 0.99554-1.4127 0.96703-1.4127 0.3774 0-0.45235-0.014-0.46645-0.38835-0.39158l-0.38834 0.0777v-4.8995l0.80906-0.57406c5.2708-3.7399 13.526-3.7519 17.253-0.0252 2.4796 2.4796 2.5486 2.8136 2.6457 12.819 0.0919 9.4615 7e-3 9.1546 2.1515 7.7728 0.49223-0.31716 0.90444-0.53561 0.91601-0.48544 0.0116 0.0502 0.0569 0.25338 0.10065 0.45156 0.0662 0.29956 0.13904 0.35414 0.43203 0.32363l0.35243-0.0367 0.0381 1.165c0.0506 1.5477 0.0221 1.6228-0.84441 2.228-3.1181 2.1778-6.2018 2.3529-8.0485 0.45685l-0.95838-0.98396-0.40085 0.23287c-3.1539 1.8322-6.3131 2.4419-9.3329 1.801zm6.3364-4.6346c1.0709-0.35947 2.5704-1.1675 2.9546-1.592 0.20747-0.22926 0.22485-0.55896 0.1934-3.6697l-0.0345-3.4178-0.39268 0.016c-0.62297 0.0254-2.9529 0.89879-4.7853 1.7937-6.4019 3.1266-4.6042 9.1084 2.0645 6.8697z"/><path d="m692.78 730.9c-1.1585-0.13093-2.2382-0.41908-2.9709-0.79283-0.64123-0.32713-0.56252-0.40685 0.18083-0.18314 2.4212 0.72867 6.3179 0.50596 8.5694-0.48977 0.95011-0.42018 0.99949-0.54515 0.99949-2.5294 0-1.7031 0.0739-1.9548 0.57402-1.9548 0.17063 0 0.0748 4.6272-0.0988 4.7712-0.99575 0.8264-4.8417 1.4513-7.2541 1.1786z"/><path d="m648.69 730.96c-2.3442-0.26255-4.4079-0.79916-5.2394-1.3624-0.21938-0.14861-0.27779-0.22721-0.13277-0.1787 12.43 4.1585 23.932-7.1824 18.891-18.627-0.61644-1.3995-0.64313-1.4896-0.3295-1.1122 0.90386 1.0877 1.8654 3.8583 2.0837 6.0037 0.86132 8.4674-6.8855 16.216-15.273 15.276z"/><path d="m620.08 730.9c-2.2622-0.23381-4.1321-0.73516-6.1044-1.6367-1.4106-0.64479-1.2414-0.63836 0.72701 0.0276 10.297 3.4841 18.665-1.841 15.672-9.9732-0.0663-0.18029 5e-3 -0.14241 0.23329 0.12476 1.0295 1.2022 1.361 4.3048 0.66933 6.2652-1.3105 3.7144-5.7186 5.7585-11.197 5.1923z"/><path d="m539.36 744.18c-0.0334-0.1068-0.0862-0.27704-0.11747-0.37831-0.0312-0.10127-0.19144-0.20322-0.35599-0.22654l-0.29918-0.0424-0.035-2.6033c-0.0399-2.9652-0.13959-2.7111 1.2319-3.1384 2.0169-0.62844 2.9952-1.9992 3.3936-4.7553 0.0819-0.56677 0.13023-8.8176 0.13186-22.519 2e-3 -16.644 0.0383-21.66 0.1579-21.78 0.11051-0.11051 0.90615-0.15534 2.7573-0.15534 2.6843 0 2.9126 0.0419 2.9126 0.53509 0 0.14859 0.12029 0.23826 0.35599 0.26538l0.35598 0.041v21.942c0 23.149-2e-3 23.221-0.59063 25.743-0.49901 2.1363-2.0195 4.3248-3.848 5.5385-1.7038 1.131-5.8486 2.1819-6.0509 1.5343z"/></g><g fill="#08080b"><path d="m690.92 699.82c0.0337-2.5327 0.0447-2.6307 0.29397-2.6307 0.25026 0 0.2589 0.0863 0.2589 2.589v2.589l-0.58795 0.0834z"/><path d="m675.39 702.22c-0.13781-0.35914 0.0729-4.8613 0.26983-5.7645 0.60494-2.7748 2.3969-3.6592 6.1446-3.0325 1.6729 0.27974 1.5702 0.40304 1.5702-1.8846 0-1.941 0-1.9431 0.29127-1.9018 0.28768 0.0409 0.2917 0.0689 0.32674 2.2894l0.0355 2.248-0.42383-0.0765c-5.7994-1.0468-7.3666 0.20272-7.5678 6.0336-0.0791 2.2934-0.29741 2.9986-0.6465 2.0889z"/><path d="m681.72 707.64c0.0554-0.28928 3.182-0.41955 3.3548-0.13979 0.19401 0.3139-0.0512 0.36633-1.7136 0.36633-1.5347 0-1.6808-0.0202-1.6413-0.22654z"/><path d="m629.91 709.78c-0.25451-0.22076-0.20476-4.8867 0.0521-4.8867 0.41912 0 0.47332 0.30687 0.47332 2.6796 0 2.4546-0.0411 2.6272-0.52542 2.2071z"/><path d="m617.97 710.08c-1.6912-2.863 3.03-4.0665 8.1726-2.0833 1.3193 0.50877 1.3202 0.61532 2e-3 0.19662-4.5237-1.4365-8.4275-0.46-7.821 1.9564 0.10589 0.4219-0.0851 0.3842-0.35323-0.0697z"/><path d="m556.91 710.66c0-0.56676 4e-3 -0.57154 0.93851-1.1503 3.7761-2.3383 7.9882-3.1384 10.602-2.0139 0.58889 0.25333 1.2505 0.78692 0.73786 0.59508-2.7685-1.036-7.2199-0.0972-10.866 2.2915-1.5344 1.0054-1.4127 0.98146-1.4127 0.27753z"/><path d="m641.27 720.64c-3.7774-6.4457 2.2372-14.927 9.3939-13.246 1.6497 0.3874 2.4232 0.84882 0.87446 0.52166-6.983-1.4751-12.789 5.8037-10.09 12.65 0.30612 0.77665 0.2476 0.80104-0.1783 0.0743z"/><path d="m589.37 723.11c-0.68335-1.4158-0.68487-1.4399-0.68487-10.841v-8.7379l0.56973-0.081 0.0439 9.2315c0.0454 9.5404 0.0468 9.5686 0.55599 10.882 0.20685 0.5336-0.1856 0.16682-0.48479-0.45307z"/><path d="m691.42 723.65c-0.49073-1.0782-0.54509-2.0748-0.50811-9.3132l0.0354-6.9256 4.1359-0.0342c4.8388-0.04 4.3385 0.20695 4.3411-2.1431 2e-3 -1.7807 3e-3 -1.7888 0.29325-1.7476 0.2886 0.041 0.29126 0.0608 0.29126 2.1773v2.1359l-4.2071 0.0692c-2.3139 0.0381-4.2217 0.0818-4.2395 0.0971-0.11129 0.0958-0.0112 14.593 0.10515 15.223 0.18361 0.99323 0.0815 1.1839-0.24732 0.46151z"/><path d="m561.29 724.47c-1.2698-2.5785 0.43461-4.8225 5.0694-6.6741 3.5869-1.433 4.3298-1.5932 4.2481-0.91595-0.0372 0.30874-0.17269 0.38517-1.465 0.82659-5.8532 1.9994-8.017 3.9591-7.4678 6.7635 0.0662 0.33818 0.0749 0.61488 0.0192 0.61488s-0.23745-0.2767-0.404-0.61488z"/><path d="m576.62 725.7c-0.32097-0.41482-0.35877-1.1658-0.43166-8.576-0.0835-8.4914-0.10266-8.7304-0.83848-10.48-0.33765-0.80263 0.10787-0.35209 0.52616 0.53208 0.79051 1.671 0.87593 2.3155 0.92379 6.9701 0.12722 12.373 0.13367 11.959-0.17981 11.553z"/><path d="m670.74 730.33c-0.15857-0.41327 0.0896-0.46202 2.3522-0.46202h2.2577l2e-3 -11.1c2e-3 -12.849-0.23454-11.406 1.8802-11.452l1.6778-0.0364 0.0647-1.877c0.0629-1.8255 0.0727-1.8782 0.35599-1.9184l0.29126-0.0414v4.4193h-1.667c-2.2016 0-1.9508-1.4462-1.9892 11.469l-0.0331 11.12-2.5596 0.0351c-2.1577 0.0296-2.5711 5e-3 -2.6328-0.15561z"/><path d="m602.13 730.33c-0.20261-0.528-0.0218-0.57751 2.2446-0.61454l2.1736-0.0355 0.066-26.231 0.58129 0.0826v26.926l-2.4949 0.0352c-2.1359 0.0301-2.5058 7e-3 -2.5705-0.16181z"/><path d="m591.67 730.77c-1.0964-0.17232-2.0766-0.47587-2.9338-0.90862-0.96772-0.4885-1.0942-0.71145-0.21885-0.38583 3.9063 1.4532 8.1076 0.74575 11.386-1.9173 1.2214-0.99203 1.276-1.0016 1.2752-0.22378-2e-3 1.8833-5.8778 4.0062-9.509 3.4355z"/><path d="m573.3 730.72c-1.1241-0.4006-0.95427-0.52083 0.7356-0.52083 2.1606 0 3.5542-0.47194 5.4323-1.8396l0.61489-0.44779v-0.87506c0-0.89201 0.29123-1.4588 0.63909-1.2438 0.26043 0.16095 0.17434 2.622-0.10136 2.8977-1.6593 1.6593-5.4277 2.704-7.3205 2.0294z"/><path d="m561.31 730.71c-0.95995-0.20807-1.6916-0.48043-2.3067-0.85864-0.59492-0.36582-0.45424-0.40728 0.39295-0.1158 3.1569 1.0861 7.3059 0.47172 10.467-1.55 0.94668-0.60553 1.6504-0.0911 0.81966 0.59915-1.9727 1.639-6.4501 2.5588-9.3725 1.9253z"/><path d="m693.28 730.96c-1.5119-0.15107-3.7095-0.71964-3.5187-0.9104 0.0324-0.0324 0.5353 0.0375 1.1174 0.15548 2.3568 0.47756 5.9964 0.1179 7.8014-0.77093l0.8135-0.40059 0.0345-1.877c0.0345-1.8795 0.11816-2.2006 0.57273-2.2006 0.19172 0 0.12668 4.6103-0.0673 4.7713-0.88434 0.73392-4.7268 1.4354-6.7536 1.2328z"/><path d="m648.04 730.9c-1.2649-0.1378-2.8785-0.52988-3.7842-0.91953-0.88228-0.37955-0.73215-0.38114 0.67743-7e-3 11.52 3.0562 21.702-7.9891 17.483-18.965-0.44027-1.1454-0.17496-0.9113 0.40399 0.3564 4.4732 9.7948-3.8014 20.731-14.78 19.535z"/><path d="m620.66 730.96c-2.3017-0.22465-3.985-0.59499-5.6284-1.2383-1.3817-0.54084-1.2537-0.57279 0.39282-0.098 9.9009 2.8549 17.982-2.4463 15.172-9.9523-0.0693-0.18495-0.0505-0.19302 0.12233-0.0526 0.88637 0.71998 1.2125 4.2528 0.5626 6.0947-1.2495 3.5414-5.6781 5.729-10.621 5.2466z"/><path d="m539.52 744.29c-0.34266-0.34266 0.0131-0.82127 0.61046-0.82127 3.468 0 7.4386-3.4123 8.36-7.1845 0.55366-2.2669 0.55887-2.4804 0.61237-25.081l0.0514-21.715h0.63408l-1e-3 21.456c-1e-3 21.901-0.0306 23.382-0.50713 25.736-0.83084 4.1035-4.1078 6.9978-8.4896 7.498-0.42646 0.0487-0.86698 0.11352-0.97893 0.14407-0.11194 0.0305-0.24301 0.0161-0.29126-0.0322z"/></g></g><g aria-label="ZFS Rescue"><path d="m578.99 752.62q-0.992 0-1.536-0.48-0.512-0.544-0.832-0.864-3.168-0.8-6.464-0.8-3.808 0-7.84 1.024l-2.24 0.096q-0.192-0.32 0.256-1.056 0.288-0.448 0.608-0.896 1.056-1.312 2.08-2.56 1.024-1.28 1.92-2.496 1.28-0.896 2.688-2.976 0.704-1.056 1.44-2.144 0.032-0.064 0.896-1.12 0.544-0.672 0.544-1.12 0-0.096-0.064-0.288h-6.144q-0.096-0.192-0.096-0.288 0-0.256 0.352-0.384 0.352-0.16 0.608-0.16 0.864 0.192 1.792 0.192 0.608 0 1.856-0.096t1.856-0.096q0.64 0 1.184 0.064 0.576 0.064 1.344 0.384l0.16 0.192-5.44 7.296q-0.704 0.544-1.504 1.44-0.352 0.416-2.112 2.784-0.064 0.224-0.736 0.96-0.544 0.608-0.544 1.12 3.328-0.608 6.688-0.608 4.384 0 8.96 0.992 0.256 0.48 0.416 0.864 0.192 0.384 0.192 0.64 0 0.288-0.288 0.384z"/><path d="m594.35 738.25q-1.024 0.224-4.32 0.672-3.264 0.448-4.768 0.928-2.368 0.768-3.808 2.272-0.096 0.64-0.16 1.088-0.032 0.416-0.032 0.512 0 0.736 0.384 1.088l3.328-0.064q1.344 0 2.272 0.128 0.928 0.096 1.792 0.48-0.992 0.224-2.4 0.288-1.376 0.064-2.688 0.064h-1.696q-0.384 0.096-0.64 0.16-0.224 0.064-0.32 0.256l-0.544 4.576q-0.544-0.096-0.96 0.128-0.736 0.384-0.832 0.416l-0.352-7.488q0.16-0.224 0.352-0.448 0.224-0.192 0.288-0.672 0.064-0.512 0.16-0.736 1.6-1.44 4.192-2.336 1.856-0.64 4.96-1.184 4.864-0.864 4.928-0.864 0.064-0.064 0.064-0.224t0.096-0.192q0.32 0.192 0.448 0.288 0.48 0.352 0.48 0.576 0 0.192-0.224 0.288z"/><path d="m607.92 749.87q0 0.512-0.288 0.832-1.344 0.48-2.688 0.64-1.312 0.192-2.88 0.192l-4.384-0.096q-0.512-0.448-1.856-0.512t-1.76-0.48l1.568-0.768q1.12 0.768 2.624 1.088t3.392 0.32q1.984 0 3.68-0.256 0.256 0 0.352-0.256 0.096-0.288 0.096-0.64-0.032-0.352-0.032-0.416-0.576-2.208-4.512-3.456-2.464-0.64-3.296-0.864-0.288-0.48-2.016-1.44-1.28-0.736-1.28-2.176 0-0.384 0.032-0.608 0.608-0.992 1.984-1.408t2.688-0.8q0.896-0.16 1.952-0.32 1.056-0.192 1.792-0.192t1.28 0.128q0.544 0.096 1.152 0.384 1.088 0.512 1.376 1.856-0.032 0.288-0.352 0.48-0.128 0.064-0.608 0.224-0.096-0.064-0.096-0.416 0-0.256-0.512-0.48-0.192-0.352-0.544-0.64t-0.768-0.48q-0.928-0.32-1.952-0.32-1.216 0-2.656 0.448-1.152 0.352-2.368 0.992-0.256 0.256-0.256 0.8 0 0.224 0.064 0.544 0.896 1.664 3.104 2.656 2.016 0.736 4.032 1.472 2.4 0.928 3.456 2.272 0.192 0.416 0.32 0.864 0.16 0.416 0.16 0.832z"/><path d="m632.11 753.45q0 0.864-0.256 0.864-0.096 0-0.48-0.16-0.256 0.192-0.352 0.224-0.064 0.064-0.16 0.064-0.032 0-0.672-0.16-4.512-3.84-8.992-7.712-0.16 0.64-0.32 1.376-0.128 0.704-0.128 1.28 0 0.736 0.192 1.12l-0.48 1.376q-0.16-0.128-0.416-0.128-0.192 0-0.544 0.064-0.352 0.096-0.416 0.096-0.32 0-0.48-0.192 0-1.312 0.672-6.112 0.32-2.304 0.32-3.712 0-1.92-0.448-3.52-0.32-0.384-0.608-1.056-0.16-0.384-0.32-0.768 0.256-0.384 0.8-0.736 0.576-0.352 1.12-0.672 1.6-0.48 3.104-0.768 1.536-0.288 2.88-0.288 2.208 0 3.84 0.8 0.352 0.576 0.352 1.28t-0.352 1.76q-0.192 0.544-0.352 1.056-0.576 1.408-1.6 2.528t-2.336 1.696q-0.224 0.352-1.76 0.672-0.736 0.16-1.664 0.288-0.096 0.416 0.288 0.864 1.12 1.344 1.12 1.376 4.224 3.616 8.448 7.2zm-4.032-17.184q0-0.48-0.128-0.832-0.416-0.384-1.088-0.544t-1.44-0.16q-0.704 0-1.12 0.064-0.416 0.032-1.44 0.192-0.992 0.224-1.6 0.512-0.576 0.288-1.024 0.896-0.096 0.288-0.096 0.512t0.128 0.64q0.16 0.416 0.192 0.512l0.736 0.16q0.256 0.416 0.352 0.992t0.096 1.184v1.344q0 0.736 0.064 1.088 0.128 0.096 0.256 0.224 0.128 0.096 0.256 0.096 1.472-0.192 2.688-1.056 1.216-0.896 1.984-2.272 0.608-1.248 0.896-2.112 0.288-0.896 0.288-1.44z"/><path d="m642.96 750.7q-0.832 0.48-1.76 0.608-0.928 0.16-2.112 0.16h-1.536q-1.312-0.384-2.592-0.736-1.152-0.608-1.536-2.528-0.192-0.544-0.192-1.088 0-0.992 0.576-2.016 0.48-0.832 1.28-1.568 1.184-0.512 2.368-0.768 1.216-0.288 2.432-0.288 0.512 0.352 1.056 0.672 0.8 0.576 0.8 1.12 0 0.352-0.416 0.736-0.928 0.736-2.688 1.408-1.152 0.448-3.136 0.992 0 0.736 0.416 1.28 0.256 0.352 1.024 0.928t1.664 0.8q0.928 0.192 2.048 0.192 0.928 0 1.44-0.064 0.544-0.064 0.8-0.064 0.032 0.032 0.064 0.224zm-3.776-5.664q0.288-0.096 0.288-0.352 0-0.224-0.16-0.48t-0.352-0.544l-1.792 0.096q-0.512 0.576-1.024 1.12-0.64 0.8-0.64 1.6 1.12 0 2.048-0.32 0.96-0.32 1.632-1.12z"/><path d="m650.51 742.99q0 0.384-0.192 0.544-0.16 0.16-0.288 0.224-0.16-0.064-0.448-0.16-0.256-0.416-0.48-0.832-0.192-0.192-0.736-0.288-0.448-0.064-0.8 0.256t-0.544 0.864q0 0.96 0.768 1.92 0.352 0.416 1.536 1.504 0.576 0.512 0.832 0.864 0.384 0.512 0.384 1.056 0 0.128-0.064 0.384-0.704 0.512-1.568 0.704-0.864 0.16-1.952 0.16l-1.952-0.032-0.896 0.032q-0.512-0.128-0.512-0.544l1.536-0.416q0.128 0.064 0.832 0.256 0.704 0.16 1.28 0.16t0.832-0.128q0.288-0.16 0.288-0.608-0.192-0.64-1.792-2.08-0.864-0.768-1.12-1.376-0.608-1.088-0.608-1.824 0-1.184 2.016-1.856 0.928-0.096 1.856-0.192 0.544 0 0.832 0.064t0.736 0.384q0.096 0.288 0.16 0.544 0.064 0.224 0.064 0.416z"/><path d="m663.28 749.87q-0.48 0.256-1.28 0.544t-1.056 0.416q-0.768 0.192-1.632 0.256t-1.664 0.064h-1.056q-0.96-0.448-1.888-0.896-0.704-0.416-1.184-1.312-0.32-0.672-0.32-1.472 0-0.832 0.256-1.568 0.256-0.768 0.768-1.536 0.896-1.216 2.048-1.984t2.688-0.768q0.96 0 2.272 0.384 0.416 0.288 0.672 0.576 0.384 0.416 0.288 0.736-0.192 0.512-0.64 0.736-0.416 0.192-0.992 0.192-0.256-0.128-0.448-0.704-0.16-0.608-0.928-0.928-0.544-0.096-1.088 0.288-0.544 0.352-1.024 0.704-1.792 1.504-1.792 3.808 0 0.768 0.608 1.376 0.192 0.192 1.184 0.864 0.992 0.448 2.176 0.448 0.672 0 1.216-0.096 0.576-0.096 1.568-0.32 0.192 0.064 0.512 0t0.384-0.064q0.224 0 0.352 0.256z"/><path d="m678.67 751.4-2.656-0.096q-0.48-0.192-1.024-0.672-0.416-0.352-1.376-1.472-0.128 0-0.512 0.224-0.544 0.672-1.696 1.088-1.12 0.384-2.432 0.512l-0.992 0.064q-0.448 0-0.8-0.128-0.352-0.16-0.576-0.576-0.32-0.736-0.512-1.696-0.16-0.992-0.16-1.92 0-0.992 0.064-1.536t0.32-2.048q0.224 0 0.64-0.16 0.448-0.192 0.64-0.192 0.384 0 0.736 0.352-0.192 0.896-0.256 1.728-0.064 0.8-0.064 1.888 0 1.344 0.16 2.144 0.192 0.8 0.8 1.312 0.608 0.064 1.248-0.288 0.736-0.48 1.12-0.704 1.28-0.928 1.504-3.136 0.352-3.296 0.416-3.552 0.128-0.16 0.256-0.16l0.864-0.064q0.736 0 0.896 0.416-0.128 0.896-0.16 1.344 0 0.416 0 0.64 0 1.248 0.256 2.432 0.288 1.152 0.832 2.08 0.32 0.352 0.64 0.704 0.16 0.128 1.344 0.768 0.32 0.288 0.416 0.384 0.224 0.224 0.064 0.32z"/><path d="m689.74 750.7q-0.832 0.48-1.76 0.608-0.928 0.16-2.112 0.16h-1.536q-1.312-0.384-2.592-0.736-1.152-0.608-1.536-2.528-0.192-0.544-0.192-1.088 0-0.992 0.576-2.016 0.48-0.832 1.28-1.568 1.184-0.512 2.368-0.768 1.216-0.288 2.432-0.288 0.512 0.352 1.056 0.672 0.8 0.576 0.8 1.12 0 0.352-0.416 0.736-0.928 0.736-2.688 1.408-1.152 0.448-3.136 0.992 0 0.736 0.416 1.28 0.256 0.352 1.024 0.928t1.664 0.8q0.928 0.192 2.048 0.192 0.928 0 1.44-0.064 0.544-0.064 0.8-0.064 0.032 0.032 0.064 0.224zm-3.776-5.664q0.288-0.096 0.288-0.352 0-0.224-0.16-0.48t-0.352-0.544l-1.792 0.096q-0.512 0.576-1.024 1.12-0.64 0.8-0.64 1.6 1.12 0 2.048-0.32 0.96-0.32 1.632-1.12z"/></g></g>
+
+ </g>
+
+</svg>
diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png
new file mode 100644
index 0000000..6751c01
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.png
Binary files differ
diff --git a/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg
new file mode 100644
index 0000000..6ba61e1
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/theme/desktop-4x3.svg
@@ -0,0 +1,980 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 26.5.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ width="640"
+ height="480"
+ enable-background="new 0 0 1920 1080"
+ version="1.1"
+ viewBox="0 0 640 480"
+ xml:space="preserve"
+ id="svg388"
+ sodipodi:docname="zfsrescue-background-640x480.svg"
+ inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:svg="http://www.w3.org/2000/svg"><sodipodi:namedview
+ id="namedview390"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:showpageshadow="2"
+ inkscape:pageopacity="0.0"
+ inkscape:pagecheckerboard="0"
+ inkscape:deskcolor="#d1d1d1"
+ showgrid="false"
+ inkscape:zoom="2.48125"
+ inkscape:cx="312.54408"
+ inkscape:cy="240"
+ inkscape:window-width="3840"
+ inkscape:window-height="2111"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg388" />
+<style
+ type="text/css"
+ id="style2">
+ .st0{clip-path:url(#SVGID_00000093167105208028638090000008063807857182655396_);}
+ .st1{fill:#05475C;}
+ .st2{opacity:0.34;fill:url(#SVGID_00000012445251672029399260000003270595326732136081_);enable-background:new ;}
+ .st3{opacity:0.34;fill:url(#SVGID_00000127010423592997111840000013957416611417821059_);enable-background:new ;}
+ .st4{opacity:0.34;fill:url(#SVGID_00000101814971404403400460000010609185819928108449_);enable-background:new ;}
+ .st5{opacity:0.71;}
+ .st6{fill:#FFFFFF;}
+ .st7{opacity:0.62;}
+ .st8{opacity:0.34;fill:url(#SVGID_00000107557325802917530330000017592151723363848840_);enable-background:new ;}
+ .st9{opacity:0.34;fill:url(#SVGID_00000032650273911267859500000015024660283904495788_);enable-background:new ;}
+ .st10{opacity:0.34;fill:url(#SVGID_00000057851989095838282160000014663790337944238500_);enable-background:new ;}
+ .st11{opacity:0.34;fill:url(#SVGID_00000178165242061037739810000007582236097397314448_);enable-background:new ;}
+ .st12{opacity:0.34;fill:url(#SVGID_00000064329767591241199690000000234602624410839680_);enable-background:new ;}
+ .st13{opacity:0.34;fill:url(#SVGID_00000014609603927260903510000009061463274724089486_);enable-background:new ;}
+ .st14{opacity:0.34;fill:url(#SVGID_00000050627399097891942390000014523148072975367070_);enable-background:new ;}
+ .st15{opacity:0.34;fill:url(#SVGID_00000109731321347584724990000010142768297725207449_);enable-background:new ;}
+ .st16{opacity:0.34;fill:url(#SVGID_00000000926441590728654410000012560741159445150083_);enable-background:new ;}
+ .st17{opacity:0.34;fill:url(#SVGID_00000137832232493639134090000003781239364591219342_);enable-background:new ;}
+ .st18{opacity:0.34;fill:url(#SVGID_00000150812387129626622020000009167110439853258936_);enable-background:new ;}
+ .st19{opacity:0.34;fill:url(#SVGID_00000179608784322168811290000010365701417373876369_);enable-background:new ;}
+ .st20{opacity:0.34;fill:url(#SVGID_00000120531069539707179100000007006360167335202962_);enable-background:new ;}
+ .st21{opacity:0.34;fill:url(#SVGID_00000181089157459068778460000011901104969134050459_);enable-background:new ;}
+ .st22{opacity:0.34;fill:url(#SVGID_00000062164313994880221460000014631417913117263241_);enable-background:new ;}
+ .st23{opacity:0.12;fill:url(#SVGID_00000000902067244530690860000014386718989792038839_);enable-background:new ;}
+ .st24{opacity:0.12;fill:url(#SVGID_00000089550684643991047870000016914371577980347776_);enable-background:new ;}
+ .st25{opacity:0.12;fill:url(#SVGID_00000084507925595054884490000005003863653038598286_);enable-background:new ;}
+ .st26{opacity:0.12;fill:url(#SVGID_00000047780407226302564420000009742350089197221517_);enable-background:new ;}
+ .st27{opacity:0.12;fill:url(#SVGID_00000066480680368962549320000006921805612706891392_);enable-background:new ;}
+ .st28{opacity:0.12;fill:url(#SVGID_00000122678307387241734090000002868210978020395689_);enable-background:new ;}
+ .st29{opacity:0.12;fill:url(#SVGID_00000150100474908702981900000008908414767416909709_);enable-background:new ;}
+ .st30{opacity:0.12;fill:url(#SVGID_00000072960791515750302390000015282140940621514149_);enable-background:new ;}
+ .st31{opacity:0.12;fill:url(#SVGID_00000114770971300144002370000016800559959910618791_);enable-background:new ;}
+ .st32{opacity:0.12;fill:url(#SVGID_00000036952937828426554700000000522215132809990844_);enable-background:new ;}
+ .st33{opacity:0.12;fill:url(#SVGID_00000090974002902719031840000015158340248134540673_);enable-background:new ;}
+</style>
+
+ <defs
+ id="defs107">
+ <rect
+ id="SVGID_1_"
+ x="-.3"
+ y=".1"
+ width="1920"
+ height="1080" />
+
+
+
+
+
+
+
+
+
+ <radialGradient
+ id="SVGID_00000000933302580452020710000013162680496496488371_"
+ cx="-1132.4"
+ cy="-1996.9"
+ r="342.1"
+ gradientTransform="matrix(-.75893 .72532 -.21553 -.28378 -445.08 609.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#0a8a5f"
+ stop-opacity=".99"
+ offset="0"
+ id="stop5" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop7" />
+ </radialGradient>
+
+
+
+ <radialGradient
+ id="SVGID_00000080193032524742796840000011048436269149918087_"
+ cx="173.04"
+ cy="15838"
+ r="459.4"
+ gradientTransform="matrix(.22222 0 0 .22222 686.67 -3107.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#DAC9BA"
+ offset="0"
+ id="stop10" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop12" />
+ </radialGradient>
+
+
+
+
+
+ <linearGradient
+ id="SVGID_00000147222259863327894370000004713185813428820113_"
+ x1="-8054.3"
+ x2="-7614.2"
+ y1="5144.3"
+ y2="5144.3"
+ gradientTransform="matrix(.4172 -.9088 .9088 .4172 401.78 -8335.1)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop15" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop17" />
+ </linearGradient>
+
+
+
+ <linearGradient
+ id="SVGID_00000063620498617606890090000008720960172290484925_"
+ x1="-338.65"
+ x2="213.1"
+ y1="-4980.9"
+ y2="-4980.9"
+ gradientTransform="matrix(-.9511 -.3089 .3089 -.9511 3185.3 -3756.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop20" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop22" />
+ </linearGradient>
+
+
+
+ <linearGradient
+ id="SVGID_00000078013590621525976610000006727138897565908112_"
+ x1="5217.2"
+ x2="5885.5"
+ y1="6487.9"
+ y2="6487.9"
+ gradientTransform="matrix(-.035946 .9994 -.9994 -.035946 8477.3 -4502.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop25" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop27" />
+ </linearGradient>
+
+
+
+ <linearGradient
+ id="SVGID_00000129169157574715853980000000301106401069963673_"
+ x1="8268.4"
+ x2="8986.3"
+ y1="570.84"
+ y2="570.84"
+ gradientTransform="matrix(-.079098 .6653 -.9567 -.2541 3183.2 -4748.3)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop30" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop32" />
+ </linearGradient>
+
+
+
+ <linearGradient
+ id="SVGID_00000051343387064157711410000007010731585534318724_"
+ x1="-6628.8"
+ x2="-6236.5"
+ y1="4207.9"
+ y2="4207.9"
+ gradientTransform="matrix(.2612 -.9653 .9653 .2612 -653.47 -6361.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop35" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop37" />
+ </linearGradient>
+
+
+
+ <linearGradient
+ id="SVGID_00000169518436558334241300000010220786071391330234_"
+ x1="1836.1"
+ x2="2258.3"
+ y1="7829.2"
+ y2="7829.2"
+ gradientTransform="matrix(.9919 -.1269 .1269 .9919 -1274.9 -6407.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop40" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop42" />
+ </linearGradient>
+
+
+
+
+
+
+
+ <linearGradient
+ id="SVGID_00000151504943794861704500000013710966191068745143_"
+ x1="9379"
+ x2="9964.7"
+ y1="6171.8"
+ y2="6171.8"
+ gradientTransform="matrix(.15689 .25311 -.40284 .1768 1622.7 -3246.7)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop45" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop47" />
+ </linearGradient>
+
+
+
+
+
+
+
+
+
+
+
+ <linearGradient
+ id="SVGID_00000101790783768249243120000007920411576515842194_"
+ x1="-6562.5"
+ x2="-6127.7"
+ y1="1880.1"
+ y2="1880.1"
+ gradientTransform="matrix(-.094803 -.9955 .9955 -.094803 -1443.6 -5086.3)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop50" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop52" />
+ </linearGradient>
+
+
+
+
+ <clipPath
+ id="clipPath3119"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g57"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use55" /></g></clipPath><clipPath
+ id="clipPath3131"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use60" /></clipPath><clipPath
+ id="clipPath3137"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g65"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use63" /></g></clipPath><clipPath
+ id="clipPath3143"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g70"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use68" /></g></clipPath><clipPath
+ id="clipPath3149"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g75"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use73" /></g></clipPath><clipPath
+ id="clipPath3155"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g80"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use78" /></g></clipPath><clipPath
+ id="clipPath3161"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g85"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use83" /></g></clipPath><clipPath
+ id="clipPath3167"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g90"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use88" /></g></clipPath><clipPath
+ id="clipPath3173"><g
+ transform="matrix(2.25 0 0 2.25 -1199.6 -675.13)"
+ id="g95"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use93" /></g></clipPath><clipPath
+ id="clipPath3179"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use98" /></clipPath><clipPath
+ id="clipPath3185"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use101" /></clipPath><clipPath
+ id="clipPath3191"><use
+ transform="matrix(.44444 0 0 .44444 533.17 300.06)"
+ xlink:href="#SVGID_1_"
+ id="use104" /></clipPath>
+
+ </defs>
+
+
+
+<rect
+ class="st1"
+ transform="matrix(.75 0 0 1 -399.65 -300.1)"
+ x="525.48"
+ y="266.77"
+ width="868.89"
+ height="547.11"
+ clip-path="url(#clipPath3191)"
+ stroke-width=".44444"
+ id="rect109" /><path
+ transform="translate(-745.57 -300.1)"
+ d="m1097.8 299.95h-351.55v324.01h12.459z"
+ clip-path="url(#clipPath3185)"
+ fill="url(#SVGID_00000000933302580452020710000013162680496496488371_)"
+ stroke-width=".28358"
+ id="path111" /><path
+ transform="translate(-745.57 -300.1)"
+ d="m746.28 311.87v199.49a102.09 102.09 0 0 0 80.934-99.705 102.09 102.09 0 0 0-80.934-99.785z"
+ clip-path="url(#clipPath3179)"
+ fill="url(#SVGID_00000080193032524742796840000011048436269149918087_)"
+ stroke-width=".44444"
+ id="path113" /><g
+ class="st7"
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ clip-path="url(#clipPath3173)"
+ id="g208">
+
+ <radialGradient
+ id="SVGID_00000091732848191404214390000004736846775492618424_"
+ cx="-37.305"
+ cy="10365"
+ r="173.24"
+ gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop115" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop117" />
+ </radialGradient>
+
+ <ellipse
+ cx="766.2"
+ cy="645.9"
+ rx="173.2"
+ ry="181.5"
+ enable-background="new"
+ fill="url(#SVGID_00000091732848191404214390000004736846775492618424_)"
+ opacity=".34"
+ id="ellipse120" />
+
+ <linearGradient
+ id="SVGID_00000114788164137069528000000005957745660025105319_"
+ x1="4501.7"
+ x2="4698.5"
+ y1="506.23"
+ y2="506.23"
+ gradientTransform="matrix(-.7151 .699 -.5383 -.5506 4391.6 -2623.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop122" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop124" />
+ </linearGradient>
+
+ <polygon
+ points="885 415.5 700.3 321.9 810.7 153.3 949 375.1"
+ enable-background="new"
+ fill="url(#SVGID_00000114788164137069528000000005957745660025105319_)"
+ opacity=".34"
+ id="polygon127" />
+
+ <linearGradient
+ id="SVGID_00000054962312987295980090000006017935243511788676_"
+ x1="2066"
+ x2="2337.2"
+ y1="7874.2"
+ y2="7874.2"
+ gradientTransform="matrix(.7774 .629 -.629 .7774 4107.2 -7204.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop129" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop131" />
+ </linearGradient>
+
+ <polygon
+ points="784.8 279.5 810.7 153.3 905.6 201.5 1025.1 241.8 1001 349.2 871.9 494.7"
+ enable-background="new"
+ fill="url(#SVGID_00000054962312987295980090000006017935243511788676_)"
+ opacity=".34"
+ id="polygon134" />
+
+ <linearGradient
+ id="SVGID_00000012442755421995762960000014664915799359269053_"
+ x1="-7687.7"
+ x2="-7185.4"
+ y1="5138.4"
+ y2="5138.4"
+ gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop136" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop138" />
+ </linearGradient>
+
+ <path
+ d="m479.5 609.22v258.74l36.602 27.04 112.1-63 138-189.4-67.197-61.8z"
+ fill="url(#SVGID_00000012442755421995762960000014664915799359269053_)"
+ id="path141" />
+
+ <linearGradient
+ id="SVGID_00000086651592687441638420000016273738828393233579_"
+ x1="9454.2"
+ x2="9671.5"
+ y1="2925.7"
+ y2="2925.7"
+ gradientTransform="matrix(-.3483 .5724 -.7648 -.6285 6665.3 -3309.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop143" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop145" />
+ </linearGradient>
+
+ <polygon
+ points="972.8 123.9 1211.9 391.7 1226.6 518.1 988.7 310.2"
+ enable-background="new"
+ fill="url(#SVGID_00000086651592687441638420000016273738828393233579_)"
+ opacity=".34"
+ id="polygon148" />
+
+ <linearGradient
+ id="SVGID_00000095314929038062691570000012080618537926193552_"
+ x1="-4049.4"
+ x2="-3743.9"
+ y1="6098.6"
+ y2="6098.6"
+ gradientTransform="matrix(.7151 -.699 .699 .7151 -446.37 -6772.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop150" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop152" />
+ </linearGradient>
+
+ <polygon
+ points="1208.9 409.2 988.7 310.2 784.8 279.5 889.2 212.3 1029.8 93.1"
+ enable-background="new"
+ fill="url(#SVGID_00000095314929038062691570000012080618537926193552_)"
+ opacity=".34"
+ id="polygon155" />
+
+ <linearGradient
+ id="SVGID_00000069384093065957304470000008686477747994526866_"
+ x1="6255.9"
+ x2="6490.9"
+ y1="2547.1"
+ y2="2547.1"
+ gradientTransform="matrix(-.5898 .8076 -.8076 -.5898 6758.6 -3397.5)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop157" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop159" />
+ </linearGradient>
+
+ <polygon
+ points="1043.6 409.2 960 371.1 730.2 237.8 972.8 123.9"
+ enable-background="new"
+ fill="url(#SVGID_00000069384093065957304470000008686477747994526866_)"
+ opacity=".34"
+ id="polygon162" />
+
+ <linearGradient
+ id="SVGID_00000174570387500765410560000018201440021002273169_"
+ x1="-7023"
+ x2="-6656.5"
+ y1="-1443.5"
+ y2="-1443.5"
+ gradientTransform="matrix(-.2682 -.9634 1.0501 -.2924 294.06 -6276.8)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop164" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop166" />
+ </linearGradient>
+
+ <polygon
+ points="521.4 741.6 657.1 531.1 756.4 656.4 507.9 953.1"
+ enable-background="new"
+ fill="url(#SVGID_00000174570387500765410560000018201440021002273169_)"
+ opacity=".34"
+ id="polygon169" />
+
+
+
+
+
+
+
+ <path
+ d="m479.5 603.79 326.5-154.19-105.7 134.5-220.8 118.13"
+ fill="none"
+ id="path171" />
+
+ <linearGradient
+ id="SVGID_00000002351047188999019860000002566414104328457898_"
+ x1="12773"
+ x2="13681"
+ y1="6937.4"
+ y2="6937.4"
+ gradientTransform="matrix(.1765 .3022 -.9209 .1087 4716.3 -3888.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop173" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop175" />
+ </linearGradient>
+
+ <polygon
+ points="521.4 741.6 740.4 729.5 893.4 986.9 504.3 864.5"
+ enable-background="new"
+ fill="url(#SVGID_00000002351047188999019860000002566414104328457898_)"
+ opacity=".34"
+ id="polygon178" />
+
+ <linearGradient
+ id="SVGID_00000004534978137110897330000008179059058368671906_"
+ x1="-7687.7"
+ x2="-7400.5"
+ y1="5080.5"
+ y2="5080.5"
+ gradientTransform="matrix(.3915 -.9202 .9202 .3915 -1099.9 -8403.9)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop180" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop182" />
+ </linearGradient>
+
+ <path
+ d="m479.5 547.51v63.382l219.5-30.094 107-131.2-272.8-69.996z"
+ fill="url(#SVGID_00000004534978137110897330000008179059058368671906_)"
+ id="path185" />
+
+ <radialGradient
+ id="SVGID_00000091017312778810520490000013487813255627565699_"
+ cx="-108.26"
+ cy="10031"
+ r="181.94"
+ gradientTransform="matrix(.8642 .5228 -.5025 .9115 5995.2 -8755.3)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop187" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop189" />
+ </radialGradient>
+
+ <ellipse
+ cx="871.9"
+ cy="305.4"
+ rx="181.9"
+ ry="190.6"
+ enable-background="new"
+ fill="url(#SVGID_00000091017312778810520490000013487813255627565699_)"
+ opacity=".34"
+ id="ellipse192" />
+
+ <linearGradient
+ id="SVGID_00000093149179829732349710000008128861407447028144_"
+ x1="6476.3"
+ x2="6770.7"
+ y1="-3135.9"
+ y2="-3135.9"
+ gradientTransform="matrix(-.9257 .3783 -.3783 -.9257 5603.1 -4641.4)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#18F5B0"
+ offset="0"
+ id="stop194" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop196" />
+ </linearGradient>
+
+ <polygon
+ points="532.1 848 501.4 638.1 766.2 642.6 717.1 936.1 628.2 832"
+ enable-background="new"
+ fill="url(#SVGID_00000093149179829732349710000008128861407447028144_)"
+ opacity=".34"
+ id="polygon199" />
+
+ <linearGradient
+ id="SVGID_00000034071598378061202680000005682775137060128388_"
+ x1="-2446"
+ x2="-2179.5"
+ y1="8617"
+ y2="8617"
+ gradientTransform="matrix(.9797 -.2004 .2004 .9797 1206.6 -8533.7)"
+ gradientUnits="userSpaceOnUse">
+ <stop
+ stop-color="#AABDCB"
+ offset="0"
+ id="stop201" />
+ <stop
+ stop-color="#05475C"
+ stop-opacity="0"
+ offset="1"
+ id="stop203" />
+ </linearGradient>
+
+ <polygon
+ points="797.9 413.5 533.2 379.6 730.2 345.4 784.8 279.5"
+ enable-background="new"
+ fill="url(#SVGID_00000034071598378061202680000005682775137060128388_)"
+ opacity=".34"
+ id="polygon206" />
+ </g><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1602 731.1 2140.7 840.5 1984.5 1253.1 1507.2 881.3"
+ clip-path="url(#clipPath3167)"
+ enable-background="new"
+ fill="url(#SVGID_00000147222259863327894370000004713185813428820113_)"
+ opacity=".12"
+ id="polygon210" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1783 991.1 1934.2 1191.5 1645 1256.7 1426.9 1290.3 1413.7 1026.6 1556 569.8"
+ clip-path="url(#clipPath3161)"
+ enable-background="new"
+ fill="url(#SVGID_00000063620498617606890090000008720960172290484925_)"
+ opacity=".12"
+ id="polygon212" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1601.6 667.3 1933.3 482.6 1995.2 701.9 1737.9 1144.3"
+ clip-path="url(#clipPath3155)"
+ enable-background="new"
+ fill="url(#SVGID_00000078013590621525976610000006727138897565908112_)"
+ opacity=".12"
+ id="polygon214" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1814 558.8 2004.8 870.8 2102.8 1126.5 1757.4 979.3"
+ clip-path="url(#clipPath3149)"
+ enable-background="new"
+ fill="url(#SVGID_00000129169157574715853980000000301106401069963673_)"
+ opacity=".12"
+ id="polygon216" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1463.9 778.1 1621.5 776.7 2068.4 836 1927.9 1204.4"
+ clip-path="url(#clipPath3143)"
+ enable-background="new"
+ fill="url(#SVGID_00000051343387064157711410000007010731585534318724_)"
+ opacity=".12"
+ id="polygon218" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1663.6 1217.3 1515.2 932.3 1983.4 1264.7"
+ clip-path="url(#clipPath3137)"
+ enable-background="new"
+ fill="url(#SVGID_00000169518436558334241300000010220786071391330234_)"
+ opacity=".12"
+ id="polygon220" /><path
+ transform="translate(-745.57 -300.1)"
+ d="m745.57 318.56v20.775l26.971-8.168z"
+ clip-path="url(#clipPath3131)"
+ fill="url(#SVGID_00000151504943794861704500000013710966191068745143_)"
+ stroke-width=".44444"
+ id="path222" /><polygon
+ transform="matrix(.44444 0 0 .44444 -212.41 -.044444)"
+ points="1120.5 1135.3 873.3 1285.3 1185.8 818.7"
+ clip-path="url(#clipPath3119)"
+ enable-background="new"
+ fill="url(#SVGID_00000101790783768249243120000007920411576515842194_)"
+ opacity=".12"
+ id="polygon224" /><g
+ transform="matrix(1.6019,0,0,1.6019,-485.28,-1052.8)"
+ id="g386"><path
+ d="m 531.96,720.55 v -40 h 170.61 v 80 H 531.96 Z"
+ fill="none"
+ id="path226" /><g
+ stroke-width="0.12945"
+ id="g364"><g
+ fill="#7b83bd"
+ id="g242"><path
+ d="m 670.74,730.55 c -0.0818,-0.0531 -0.16919,-0.23985 -0.19417,-0.41492 -0.0305,-0.21386 -0.15161,-0.34321 -0.36903,-0.39418 l -0.32362,-0.0759 -0.0662,-21.537 -0.29051,-0.0669 c -0.15979,-0.0368 -0.78567,-0.0815 -1.3908,-0.0994 -1.0948,-0.0323 -1.1005,-0.0343 -1.1413,-0.38814 -0.0289,-0.25118 -0.13348,-0.3789 -0.35599,-0.43474 l -0.31505,-0.0791 v -4.3657 l 3.4304,-0.0722 0.0834,-2.8937 c 0.0459,-1.5915 0.12295,-3.2808 0.17123,-3.754 0.55772,-5.4656 5.2221,-8.5581 11.266,-7.4696 1.7396,0.31327 1.8663,0.3522 1.9441,0.59727 0.0411,0.12952 0.27584,0.30185 0.52162,0.38297 l 0.4469,0.14749 v 2.2594 c 0,2.6364 0.10954,2.4765 -1.5041,2.1943 -4.918,-0.86025 -6.5218,0.83332 -6.5218,6.8868 0,1.7286 -0.0125,1.7138 1.453,1.7138 1.0904,0 1.1478,0.0143 1.2619,0.31438 0.0801,0.21064 0.23922,0.32811 0.48224,0.35599 l 0.36271,0.0416 0.0353,2.2977 0.0354,2.2977 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0319 c -1.424,0.0175 -2.6559,-0.0116 -2.7378,-0.0647 z"
+ id="path228" /><path
+ d="m 591.61,730.9 c -3.7039,-0.53738 -7.0106,-3.4323 -8.0598,-7.0559 l -0.29814,-1.0298 v -20.194 l 5.3776,-0.07 0.0768,0.38392 c 0.0525,0.26237 0.16432,0.3964 0.35328,0.42334 l 0.27649,0.0394 0.0736,9.2556 c 0.079,9.9387 0.0773,9.9135 0.76626,11.257 1.3801,2.6904 6.9458,2.3678 9.9291,-0.57556 l 1.074,-1.0596 0.0664,-19.654 h 5.2958 l 0.0753,0.3189 c 0.047,0.19927 0.19491,0.34714 0.39418,0.39418 l 0.3189,0.0753 0.033,13.514 c 0.0262,10.725 -5.2e-4,13.535 -0.12945,13.617 -0.20417,0.12963 -4.8997,0.13701 -5.0989,0.008 -0.0808,-0.0523 -0.16844,-0.20905 -0.19485,-0.34833 -0.0269,-0.14191 -0.18997,-0.28648 -0.37096,-0.32888 -0.28889,-0.0677 -0.32714,-0.15018 -0.36272,-0.78238 -0.0542,-0.96318 -0.15572,-1.0082 -0.91689,-0.40651 -2.3769,1.8788 -5.5074,2.6793 -8.679,2.2191 z"
+ id="path230" /><path
+ d="m 561.76,730.95 c -4.2843,-0.56824 -7.407,-4.7148 -6.4879,-8.6152 0.86029,-3.6509 3.4588,-5.5455 11.131,-8.1162 4.6592,-1.5611 4.2768,-1.3005 4.1863,-2.8524 -0.15943,-2.7352 -0.79601,-3.3326 -3.6916,-3.4641 -3.0082,-0.13663 -5.6954,0.70511 -8.7593,2.7438 -1.2728,0.8469 -1.3628,0.86348 -1.3628,0.25112 0,-0.48648 0.0213,-0.47889 -0.61488,-0.21878 -0.12635,0.0517 -0.16181,-0.51706 -0.16181,-2.5949 v -2.661 l 0.82694,-0.5901 c 5.2674,-3.7587 13.751,-3.7839 17.434,-0.0517 2.5162,2.5493 2.6105,3.0035 2.702,13.017 0.0531,5.8125 0.11288,7.9629 0.2245,8.0745 0.25719,0.25697 1.0232,0.0162 1.9355,-0.60838 0.90099,-0.61684 1.0376,-0.61487 1.1063,0.016 0.0233,0.21359 0.10058,0.37864 0.17177,0.36678 0.0712,-0.0119 0.21683,-0.041 0.32363,-0.0647 0.16213,-0.036 0.20024,0.19981 0.23092,1.429 l 0.0367,1.4721 -0.55455,0.51222 c -2.6053,2.4065 -6.7165,2.7237 -8.7268,0.67343 l -0.80225,-0.8182 -1.1187,0.62712 c -2.3378,1.3105 -5.2392,1.8426 -8.0297,1.4725 z m 5.2244,-4.8972 c 0.88081,-0.20764 2.4044,-0.91608 3.0928,-1.438 l 0.42071,-0.31902 v -3.4238 c 0,-1.8831 -0.0473,-3.4238 -0.10517,-3.4238 -0.40015,0 -3.8792,1.3399 -5.1726,1.9921 -2.9246,1.4748 -4.1841,3.6985 -3.1976,5.6457 0.53853,1.063 2.737,1.4914 4.9619,0.96689 z"
+ id="path232" /><path
+ d="m 692.78,731.04 c -2.3851,-0.29962 -3.4213,-0.77524 -4.8482,-2.2253 -2.3472,-2.3854 -2.6086,-3.8112 -2.6107,-14.245 l -0.002,-6.4377 -0.29126,-0.0679 c -0.1602,-0.0373 -1.0194,-0.0821 -1.9094,-0.0996 l -1.6181,-0.0317 0.0376,-0.35818 c 0.0323,-0.30729 -0.0183,-0.36936 -0.35598,-0.43689 -0.65008,-0.13002 -0.56652,-0.23919 4.2936,-5.6105 4.6046,-5.0889 5.1509,-5.604 5.1509,-4.8566 0,0.28356 0.0561,0.32362 0.45308,0.32362 0.56801,0 0.49372,-0.3673 0.57601,2.8479 l 0.0713,2.7832 7.4259,0.0686 0.0411,0.28929 c 0.0314,0.221 0.14033,0.29886 0.46141,0.32983 0.54803,0.0529 0.56833,0.15422 0.52291,2.6132 l -0.0371,2.0065 -8.4142,0.1294 v 7.5728 c 0,9.5837 -0.0655,9.2666 1.9819,9.5843 1.5108,0.23441 3.1565,-0.0641 5.3548,-0.97139 0.16875,-0.0697 0.22628,-0.008 0.2589,0.27662 0.0387,0.3379 0.0796,0.3632 0.5302,0.32784 l 0.48825,-0.0383 -0.0704,4.9927 -0.97087,0.41299 c -1.7164,0.7301 -4.4758,1.0773 -6.5203,0.82049 z"
+ id="path234" /><path
+ d="m 648.56,731.08 c -11.238,-1.0706 -17.821,-13.565 -11.852,-22.494 5.9444,-8.8911 19.075,-8.4641 25.171,0.81859 6.4018,9.7493 -1.6115,22.79 -13.319,21.675 z m 2.9126,-6.0591 c 7.7496,-2.6058 8.4496,-14.106 1.0146,-16.668 -8.3701,-2.885 -15.023,7.2302 -9.5468,14.515 1.7018,2.2639 5.4158,3.2012 8.5322,2.1533 z"
+ id="path236" /><path
+ d="m 619.89,731.03 c -2.8196,-0.29176 -6.9807,-1.7126 -7.3427,-2.5072 -0.0762,-0.16724 -0.27775,-0.3675 -0.44789,-0.44502 l -0.30935,-0.14095 v -2.7212 c 0,-1.4967 0.0437,-2.7211 0.0971,-2.7209 0.0534,1.3e-4 0.44315,0.20901 0.86612,0.46405 5.3282,3.2128 10.987,3.4948 12.196,0.60774 0.69414,-1.6581 0.15941,-2.2365 -4.1073,-4.4429 -6.4073,-3.3134 -8.5588,-5.5874 -8.7519,-9.2506 -0.29372,-5.5709 4.7665,-8.7291 12.008,-7.4942 2.0597,0.35128 5.0673,1.4593 5.5474,2.0436 0.10161,0.12369 0.34918,0.30993 0.55016,0.41386 l 0.36541,0.18896 v 2.5133 c 0,2.9906 0.14723,2.8388 -1.831,1.8868 -5.1014,-2.4552 -9.8447,-2.4082 -10.269,0.10163 -0.26309,1.5572 0.92868,2.6352 5.4331,4.9142 6.757,3.4188 8.6834,6.1049 7.6785,10.707 -0.89609,4.1038 -5.6643,6.5046 -11.682,5.8819 z"
+ id="path238" /><path
+ d="m 534.77,719.58 v -35.405 h 16.57 v 70.809 h -16.57 z"
+ id="path240" /></g><g
+ fill="#656fb2"
+ id="g258"><path
+ d="m 670.73,730.56 c -0.089,-0.0367 -0.16181,-0.238 -0.16181,-0.44742 0,-0.28704 -0.0797,-0.41105 -0.32363,-0.50381 l -0.32362,-0.12304 v -21.361 l -0.29126,-0.0672 c -0.1602,-0.037 -0.81553,-0.0818 -1.4563,-0.0995 l -1.165,-0.0323 -0.0401,-0.41444 c -0.0265,-0.27418 -0.12511,-0.44143 -0.29126,-0.49416 -0.23474,-0.0745 -0.25116,-0.21458 -0.25116,-2.1422 v -2.0625 h 1.5428 c 2.135,0 1.9515,0.20457 1.9569,-2.1821 0.0159,-7.0334 0.99689,-9.455 4.5385,-11.203 2.309,-1.1398 7.8279,-1.3403 8.5832,-0.31196 0.0782,0.10655 0.36074,0.26568 0.62773,0.35361 l 0.48544,0.15987 v 2.2594 c 0,2.6364 0.10955,2.4765 -1.5041,2.1943 -4.9223,-0.861 -6.5218,0.83183 -6.5218,6.9021 0,1.9303 -0.076,1.828 1.358,1.828 1.0771,0 1.2076,0.0257 1.2661,0.24962 0.0449,0.17179 0.20097,0.26259 0.50053,0.29126 l 0.43526,0.0417 0.0708,4.5954 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0235 c -1.4239,0.0129 -2.6618,-0.006 -2.7508,-0.0432 z"
+ id="path244" /><path
+ d="m 591.61,730.9 c -3.4819,-0.50517 -6.7272,-3.1895 -7.8207,-6.4688 -0.5836,-1.7502 -0.61525,-2.4342 -0.57499,-12.426 l 0.0378,-9.3851 h 5.2958 l 0.0753,0.3189 c 0.0471,0.1993 0.19489,0.34712 0.39418,0.39412 l 0.31891,0.0752 0.0736,9.2499 c 0.0792,9.9576 0.0752,9.8986 0.77877,11.278 1.3578,2.6616 6.8344,2.386 9.8272,-0.49455 l 1.1003,-1.059 0.1294,-19.762 h 5.2958 l 0.0753,0.31891 c 0.047,0.19927 0.19492,0.34714 0.39419,0.39418 l 0.3189,0.0753 0.033,13.514 c 0.0262,10.725 -5.2e-4,13.535 -0.12945,13.617 -0.56635,0.35958 -5.2757,0.0901 -5.2757,-0.30185 0,-0.16338 -0.13636,-0.29932 -0.38835,-0.38717 -0.37234,-0.1298 -0.38834,-0.16687 -0.38834,-0.89941 0,-0.90633 -0.0637,-0.92433 -0.90853,-0.25655 -2.3594,1.865 -5.5001,2.6648 -8.6624,2.206 z"
+ id="path246" /><path
+ d="m 561.76,730.95 c -5.3138,-0.70478 -8.3017,-6.5701 -5.5291,-10.854 1.5815,-2.4432 3.8738,-3.7426 10.481,-5.9409 3.4712,-1.1549 3.7935,-1.287 3.8684,-1.5854 1.348,-5.3709 -5.6374,-6.4513 -12.441,-1.9242 -1.2717,0.84616 -1.3628,0.86318 -1.3628,0.25469 0,-0.4475 -0.0133,-0.46044 -0.38834,-0.37806 l -0.38835,0.0853 v -5.0423 l 0.44664,-0.39216 c 4.5382,-3.9846 13.807,-4.2036 17.72,-0.41868 2.6193,2.5339 2.7045,2.9306 2.797,13.017 0.0398,4.343 0.11949,7.9692 0.17709,8.0582 0.2426,0.37484 1.1921,0.0659 2.3292,-0.75782 0.57746,-0.41831 0.73197,-0.35139 0.73556,0.31859 0.002,0.29916 0.0453,0.35299 0.22852,0.28167 0.12459,-0.0485 0.28479,-0.0984 0.35598,-0.11093 0.0783,-0.0138 0.14397,0.55885 0.1662,1.4494 l 0.0367,1.4721 -0.55455,0.51222 c -2.6041,2.4053 -6.7064,2.725 -8.6943,0.67756 l -0.81122,-0.83552 -1.1305,0.63372 c -2.35,1.3173 -5.2454,1.8499 -8.0415,1.479 z m 5.2116,-4.8402 c 0.79886,-0.18736 2.8442,-1.1848 3.2997,-1.6092 l 0.35599,-0.33165 v -3.2881 c 0,-3.7408 0.0648,-3.5603 -1.1358,-3.1658 -4.8564,1.5959 -7.2347,3.2113 -7.6621,5.2042 -0.58196,2.7136 1.546,4.0339 5.1422,3.1905 z"
+ id="path248" /><path
+ d="m 692.78,731.04 c -2.4091,-0.30264 -3.4356,-0.7762 -4.6827,-2.1602 -2.4427,-2.7111 -2.542,-3.2174 -2.6159,-13.342 l -0.054,-7.4113 -0.28035,-0.0652 c -0.15419,-0.0359 -1.0376,-0.0794 -1.9632,-0.0968 l -1.6828,-0.0316 v -0.45307 c 0,-0.37467 -0.0517,-0.4604 -0.29872,-0.49542 -0.4453,-0.0631 -0.54891,0.0646 4.3816,-5.4015 4.6028,-5.1028 4.8606,-5.3543 4.9372,-4.815 0.0358,0.25217 0.10654,0.28556 0.52682,0.24878 0.6036,-0.0528 0.52578,-0.42248 0.6085,2.8904 l 0.0711,2.8479 3.6424,0.0344 c 3.5092,0.0331 3.6448,0.0437 3.7096,0.29126 0.0512,0.1958 0.17725,0.25691 0.5299,0.25691 0.59961,0 0.61589,0.0741 0.56945,2.589 l -0.0371,2.0065 -8.4142,0.1294 v 7.5081 c 0,9.7863 -0.0637,9.4798 2.0322,9.7771 1.4488,0.20548 3.854,-0.21499 5.1271,-0.89634 0.22913,-0.12263 0.27186,-0.10198 0.30745,0.1486 0.0364,0.2565 0.10691,0.28686 0.5943,0.25598 l 0.55295,-0.035 -0.0704,4.986 -0.97088,0.41299 c -1.7163,0.7301 -4.4758,1.0773 -6.5203,0.82049 z"
+ id="path250" /><path
+ d="m 648.56,731.08 c -10.373,-0.98819 -17.019,-12.123 -12.559,-21.041 3.9318,-7.8609 14.385,-10.258 21.43,-4.9134 3.0764,2.3337 3.3585,2.6091 4.5628,4.4539 6.2729,9.6092 -1.8466,22.605 -13.434,21.501 z m 2.9357,-5.9384 c 8.0194,-2.692 8.6057,-14.237 0.85519,-16.838 -7.5107,-2.5213 -14.13,5.9216 -10.311,13.153 1.9027,3.6033 5.5115,5.0099 9.4561,3.6857 z"
+ id="path252" /><path
+ d="m 619.89,731.03 c -2.9246,-0.30263 -7.3232,-1.8427 -7.3232,-2.5641 0,-0.13526 -0.14563,-0.34134 -0.32363,-0.45796 l -0.32362,-0.21205 v -5.1867 l 0.55016,0.33741 c 5.879,3.6055 12.343,3.6211 12.748,0.0309 0.16185,-1.4359 -0.0201,-1.6038 -3.9316,-3.6263 -7.5874,-3.9233 -10.005,-7.0829 -8.9245,-11.665 1.3612,-5.7752 10.451,-7.3093 17.649,-2.9787 l 0.55016,0.33102 v 2.5069 c 0,2.9834 0.14703,2.8324 -1.831,1.8804 -6.3168,-3.0401 -11.755,-2.1043 -9.9057,1.7044 0.45195,0.93065 1.1262,1.3962 4.7279,3.2644 2.3633,1.2258 3.8584,2.1546 5.4554,3.389 0.32039,0.24763 0.77763,0.60053 1.0161,0.78422 1.8324,1.4114 2.3335,5.3127 1.0291,8.0115 -1.5772,3.2635 -5.9165,4.9938 -11.162,4.451 z"
+ id="path254" /><path
+ d="m 534.9,719.58 v -35.275 h 16.311 v 70.55 H 534.9 Z"
+ id="path256" /></g><g
+ fill="#595a5f"
+ id="g290"><path
+ d="m 690.69,702.52 c -0.0349,-0.091 -0.0476,-1.3275 -0.0283,-2.7478 l 0.0352,-2.5823 0.36361,-0.12778 c 0.28167,-0.099 0.39061,-0.0851 0.48345,0.0617 0.13135,0.20765 0.17203,5.0265 0.0452,5.3569 -0.095,0.24758 -0.80733,0.27871 -0.8992,0.0393 z"
+ id="path260" /><path
+ d="m 675.32,702.61 c -0.19007,-0.19007 -0.10023,-5.0699 0.11227,-6.0987 0.66257,-3.2077 2.5582,-4.0389 7.2712,-3.1884 l 0.42071,0.0759 v -1.8955 c 0,-2.0526 0.0299,-2.1349 0.71226,-1.9636 l 0.32334,0.0811 v 2.267 c 0,2.645 0.10984,2.4842 -1.5041,2.2019 -4.8619,-0.85044 -6.2885,0.55275 -6.5068,6.4 l -0.0797,2.1359 -0.32847,0.0383 c -0.18066,0.0211 -0.36998,-0.003 -0.42072,-0.0539 z"
+ id="path262" /><path
+ d="m 681.5,707.86 c -0.32007,-0.51788 0.29482,-0.771 1.8729,-0.771 1.8188,0 1.9494,0.0356 1.9494,0.53165 v 0.3745 h -1.8694 c -1.1591,0 -1.9011,-0.0514 -1.9529,-0.13515 z"
+ id="path264" /><path
+ d="m 666.98,707.78 c -0.17529,-0.45678 0.13272,-0.62783 1.2029,-0.66804 1.391,-0.0523 1.605,0.0136 1.605,0.49392 v 0.38589 h -1.3633 c -1.1427,0 -1.3764,-0.0343 -1.4445,-0.21177 z"
+ id="path266" /><path
+ d="m 618,710.49 c -2.7335,-3.8064 3.5231,-5.049 9.9541,-1.977 0.73991,0.35344 1.396,0.64262 1.4581,0.64262 0.0621,0 0.11281,-0.98685 0.11281,-2.193 0,-2.3588 0.031,-2.4622 0.64345,-2.1455 l 0.39215,0.20279 v 2.5133 c 0,2.9906 0.14723,2.8388 -1.831,1.8868 -5.8477,-2.8143 -11.331,-2.2056 -10.155,1.1273 0.26954,0.76348 -0.005,0.73613 -0.57494,-0.0572 z"
+ id="path268" /><path
+ d="m 620.73,719.06 c -2.5656,-1.3215 -4.1969,-2.2971 -4.5475,-2.7196 -0.33177,-0.39975 6.4586,3.2049 7.0984,3.7682 0.60446,0.53213 0.17677,0.35631 -2.5509,-1.0487 z"
+ id="path270" /><path
+ d="m 641.76,721.83 c -4.9976,-6.7888 0.83778,-16.377 8.9328,-14.677 0.9947,0.20884 2.4991,0.90054 3.1068,1.4284 0.45313,0.39364 0.4177,0.3879 -1.2907,-0.20927 -7.667,-2.68 -14.362,5.801 -10.413,13.191 0.55814,1.0447 0.5629,1.058 0.37701,1.058 -0.0714,0 -0.39197,-0.35625 -0.71249,-0.79165 z"
+ id="path272" /><path
+ d="m 691.57,724.27 c -0.8651,-0.94979 -0.93509,-1.685 -0.94038,-9.877 -0.003,-5.2745 0.0337,-7.035 0.15083,-7.1521 0.1143,-0.1143 1.2419,-0.15534 4.2683,-0.15534 h 4.113 l 0.0718,-3.6893 0.41627,-0.0402 c 0.54868,-0.053 0.57307,0.0657 0.52692,2.5645 l -0.0371,2.0065 -8.4142,0.1294 -0.0354,7.1845 c -0.0298,6.0227 -0.003,7.3435 0.16181,8.1682 0.26734,1.3332 0.2359,1.4292 -0.28179,0.86087 z"
+ id="path274" /><path
+ d="m 670.71,730.54 c -0.0952,-0.0612 -0.15347,-0.25029 -0.12945,-0.42023 l 0.0437,-0.30898 2.1266,-0.0357 c 1.2999,-0.0218 2.1932,-0.0909 2.2977,-0.17766 0.13937,-0.11568 0.17108,-2.2017 0.17108,-11.256 v -11.114 l 0.29126,-0.0677 c 0.1602,-0.0372 0.96117,-0.082 1.7799,-0.0996 l 1.4887,-0.0318 0.1294,-3.6246 h 0.7767 l 0.0353,2.2977 0.0354,2.2977 h -1.67 c -2.2052,0 -1.9538,-1.4471 -1.9922,11.469 l -0.0331,11.12 -2.589,0.0319 c -1.4239,0.0175 -2.6669,-0.0182 -2.7621,-0.0794 z"
+ id="path276" /><path
+ d="m 591.57,730.9 c -3.7289,-0.54686 -7.0248,-3.5752 -8.0194,-7.3684 -0.3436,-1.3105 -0.55619,-20.396 -0.23155,-20.787 0.12218,-0.14722 0.63561,-0.18368 2.5641,-0.18209 2.5105,0.002 2.674,0.0285 2.753,0.44541 0.0269,0.14172 0.19023,0.28677 0.37096,0.3294 l 0.32295,0.0762 0.0736,9.2499 c 0.0801,10.068 0.0657,9.8726 0.83961,11.4 1.3852,2.7337 7.3912,2.1559 10.264,-0.98741 l 0.66741,-0.73025 v -9.7371 c 0,-11.449 -0.37922,-10.048 2.7184,-10.048 2.4822,0 2.7184,0.0465 2.7184,0.53509 0,0.14858 0.12029,0.23825 0.35598,0.26537 l 0.35599,0.041 0.033,13.519 c 0.0262,10.73 -5.2e-4,13.541 -0.12945,13.623 -0.20416,0.12963 -4.8991,0.137 -5.1008,0.008 -0.0818,-0.0523 -0.1692,-0.24014 -0.19418,-0.41741 -0.028,-0.19852 -0.14484,-0.34099 -0.30431,-0.37096 -0.36253,-0.0681 -0.44882,-0.25125 -0.45109,-0.95722 -0.002,-0.7458 -0.0898,-0.75611 -0.91051,-0.1074 -2.3696,1.8731 -5.5104,2.6679 -8.6962,2.2007 z"
+ id="path278" /><path
+ d="m 561.76,730.95 c -4.3402,-0.57565 -7.3915,-4.8602 -6.339,-8.9011 0.87897,-3.3746 3.5104,-5.2322 10.935,-7.7192 4.7818,-1.6018 4.3083,-1.2648 4.2507,-3.0249 -0.0875,-2.6727 -0.75627,-3.2875 -3.7085,-3.409 -3.0236,-0.12442 -5.704,0.71709 -8.7593,2.75 -1.27,0.84502 -1.3628,0.86273 -1.3628,0.26008 0,-0.42235 -0.0277,-0.45508 -0.35598,-0.42072 l -0.35599,0.0373 -0.0369,-2.2654 c -0.0472,-2.9001 -0.11258,-2.712 1.255,-3.61 6.4612,-4.2427 16.039,-3.0524 18.633,2.3155 0.96574,1.9988 0.96709,2.0128 1.0477,10.837 0.0867,9.4933 -0.027,9.122 2.2883,7.4759 0.7737,-0.55008 0.79991,-0.55095 0.85033,-0.028 0.0399,0.41396 0.12686,0.46128 0.62309,0.33908 0.16245,-0.04 0.20017,0.19263 0.23092,1.4243 l 0.0367,1.4722 -0.55455,0.51222 c -2.6345,2.4334 -6.8976,2.733 -8.7099,0.61198 -0.77979,-0.91261 -0.56769,-0.89776 -1.9283,-0.13502 -2.3478,1.3161 -5.2443,1.8486 -8.0393,1.4778 z m 5.0915,-4.7669 c 0.97953,-0.23092 2.465,-0.9076 3.2257,-1.4694 l 0.55016,-0.40633 v -3.4296 c 0,-2.7444 -0.034,-3.4296 -0.16989,-3.4296 -0.45768,0 -3.8324,1.2836 -5.2374,1.9921 -2.9819,1.5037 -4.1044,3.5283 -3.1813,5.7378 0.43614,1.0438 2.6697,1.5102 4.8127,1.005 z"
+ id="path280" /><path
+ d="m 692.78,731.04 c -1.7421,-0.21885 -2.994,-0.62908 -3.8032,-1.2462 -0.67447,-0.51445 -0.4951,-0.56137 0.64711,-0.16929 2.5563,0.8775 6.2164,0.75562 8.7379,-0.29095 l 0.93851,-0.38955 v -1.8576 c 0,-1.7728 0.0131,-1.8668 0.28771,-2.0591 0.73232,-0.51294 0.75677,-0.435 0.71832,2.2889 l -0.0352,2.4904 -0.97088,0.41299 c -1.7163,0.7301 -4.4758,1.0773 -6.5203,0.82049 z"
+ id="path282" /><path
+ d="m 648.56,731.08 c -2.858,-0.27227 -5.7296,-1.2988 -7.1845,-2.5681 l -0.5178,-0.45179 1.3592,0.6406 c 13.389,6.3104 26.634,-8.2234 18.516,-20.319 -0.72111,-1.0745 -0.73867,-1.146 -0.14313,-0.58252 8.8465,8.3706 0.52369,24.477 -12.03,23.281 z"
+ id="path284" /><path
+ d="m 619.89,731.03 c -2.6847,-0.27781 -7.3232,-1.8389 -7.3232,-2.4646 0,-0.19065 0.29709,-0.11705 1.877,0.46502 10.102,3.7216 19.524,-2.1546 15.665,-9.7697 -0.58365,-1.1518 0.22704,-0.71028 0.86704,0.4722 3.3903,6.264 -2.4277,12.193 -11.086,11.297 z"
+ id="path286" /><path
+ d="m 539.32,744.45 c -0.0663,-0.0818 -0.14208,-0.26465 -0.16836,-0.40623 -0.0263,-0.14157 -0.16362,-0.27938 -0.30519,-0.30623 -0.42304,-0.0802 -0.44763,-0.23771 -0.44763,-2.8668 0,-2.9534 -0.0811,-2.7445 1.2291,-3.1652 1.8317,-0.58808 2.6157,-1.4383 3.2209,-3.493 0.26714,-0.90701 0.26994,-1.1012 0.33492,-23.217 0.0577,-19.636 0.0887,-22.317 0.2597,-22.425 0.1068,-0.0675 1.3696,-0.12362 2.8063,-0.12471 2.7147,-0.002 3.019,0.0565 3.019,0.58119 0,0.097 0.16019,0.19476 0.35599,0.21729 l 0.35598,0.041 0.0376,21.1 c 0.0391,21.923 0.004,23.768 -0.49687,26.263 -0.68682,3.4202 -2.9938,6.0716 -6.2605,7.1956 -1.3931,0.4793 -3.7498,0.84162 -3.9408,0.60587 z"
+ id="path288" /></g><g
+ fill="#02024b"
+ id="g320"><path
+ d="m 690.84,702.47 c -0.19442,-0.19442 -0.0956,-5.0523 0.10622,-5.2198 0.51369,-0.42632 0.58418,-0.13146 0.58418,2.4435 0,2.8034 -0.13208,3.3346 -0.6904,2.7762 z"
+ id="path292" /><path
+ d="m 675.44,702.48 c -0.13769,-0.13768 -0.10707,-4.5343 0.0377,-5.4198 0.5689,-3.479 2.2357,-4.3886 6.7082,-3.6607 1.2092,0.19678 1.1847,0.23829 1.1872,-2.0118 0.002,-1.7807 0.003,-1.7887 0.29325,-1.7476 0.28768,0.0409 0.29169,0.0689 0.32674,2.2894 l 0.0355,2.248 -0.42383,-0.0765 c -5.8141,-1.0494 -7.3669,0.20471 -7.5884,6.1292 -0.0843,2.2537 -0.18384,2.6423 -0.5764,2.2498 z"
+ id="path294" /><path
+ d="m 681.7,707.61 c 0,-0.24612 0.0863,-0.2589 1.7476,-0.2589 1.6613,0 1.7476,0.0128 1.7476,0.2589 0,0.24611 -0.0863,0.2589 -1.7476,0.2589 -1.6613,0 -1.7476,-0.0128 -1.7476,-0.2589 z"
+ id="path296" /><path
+ d="m 629.81,709.78 c -0.21098,-0.10161 -0.26717,-0.20185 -0.19466,-0.34722 0.0561,-0.11241 0.11939,-1.1801 0.1407,-2.3727 0.0291,-1.6318 0.0789,-2.1683 0.20113,-2.1683 0.41883,0 0.47306,0.30719 0.47306,2.6796 0,2.5162 0.002,2.5083 -0.62023,2.2086 z"
+ id="path298" /><path
+ d="m 617.9,710.08 c -1.8102,-3.2207 3.5049,-4.2691 9.1399,-1.8028 1.5305,0.66984 1.4692,0.74501 -0.13887,0.17027 -4.9652,-1.7746 -9.1565,-0.91473 -8.5694,1.7581 0.11671,0.53137 -0.0974,0.46909 -0.43161,-0.12554 z"
+ id="path300" /><path
+ d="m 641.44,721.08 c -4.8688,-6.8376 3.3253,-16.893 10.775,-13.222 0.44372,0.21868 0.68386,0.36765 0.53365,0.33105 -8.0511,-1.9617 -14.303,5.0028 -11.245,12.527 0.34161,0.84072 0.32899,0.91357 -0.0629,0.36317 z"
+ id="path302" /><path
+ d="m 691.34,723.62 c -0.50518,-1.1035 -0.59087,-2.6201 -0.55003,-9.7343 l 0.0371,-6.4725 4.2071,-0.0692 c 2.3139,-0.0381 4.2201,-0.0818 4.2359,-0.0971 0.0159,-0.0153 0.045,-0.85795 0.0647,-1.8725 l 0.0359,-1.8447 h 0.64724 v 4.2718 l -4.2071,0.0692 c -2.3139,0.0381 -4.2217,0.0818 -4.2395,0.0971 -0.13693,0.11786 0.002,14.715 0.14628,15.465 0.20305,1.049 0.0512,1.1244 -0.37775,0.18742 z"
+ id="path304" /><path
+ d="m 670.78,730.44 c -0.46697,-0.46696 -0.13168,-0.55698 2.2088,-0.59298 l 2.2977,-0.0353 0.0662,-22.46 h 1.5612 c 2.1729,0 2.062,0.11169 2.062,-2.0758 v -1.8077 h 0.64724 v 4.4013 h -1.667 c -2.2016,0 -1.9508,-1.4462 -1.9892,11.469 l -0.0331,11.12 -2.5324,0.035 c -1.3928,0.0193 -2.5724,-0.005 -2.6214,-0.0539 z"
+ id="path306" /><path
+ d="m 591.67,730.77 c -3.9163,-0.61678 -7.1803,-3.6317 -8.0525,-7.4379 -0.21886,-0.95513 -0.2373,-1.795 -0.2373,-10.809 v -9.7735 l 5.0798,-0.07 0.0782,0.39103 c 0.0617,0.30872 0.14567,0.39103 0.39869,0.39103 h 0.32048 l 0.0439,9.2233 c 0.0478,10.047 0.0319,9.8232 0.8049,11.349 1.4007,2.7642 7.0887,2.4317 10.134,-0.59239 l 1.0671,-1.0597 0.0664,-19.632 h 5.0369 l 0.0753,0.3189 c 0.047,0.19927 0.19492,0.34714 0.39419,0.39418 l 0.3189,0.0753 v 26.914 h -5.0485 l -0.0434,-0.30666 c -0.0281,-0.19874 -0.17619,-0.3568 -0.42071,-0.4491 -0.35687,-0.1347 -0.37733,-0.18301 -0.37733,-0.89074 0,-0.94207 -0.10354,-0.95124 -1.2594,-0.11151 -2.4324,1.7672 -5.5061,2.5287 -8.3796,2.0762 z"
+ id="path308" /><path
+ d="m 561.24,730.69 c -4.6636,-0.98973 -7.241,-5.8162 -5.2508,-9.8328 1.3736,-2.7721 3.7157,-4.2194 10.545,-6.5161 4.7229,-1.5884 4.8694,-1.7627 3.9586,-4.7116 -0.90112,-2.9175 -7.1675,-2.5311 -12.176,0.75082 -1.5194,0.99554 -1.4127,0.96703 -1.4127,0.3774 0,-0.45235 -0.014,-0.46645 -0.38835,-0.39158 l -0.38834,0.0777 v -4.8995 l 0.80906,-0.57406 c 5.2708,-3.7399 13.526,-3.7519 17.253,-0.0252 2.4796,2.4796 2.5486,2.8136 2.6457,12.819 0.0919,9.4615 0.007,9.1546 2.1515,7.7728 0.49223,-0.31716 0.90444,-0.53561 0.91601,-0.48544 0.0116,0.0502 0.0569,0.25338 0.10065,0.45156 0.0662,0.29956 0.13904,0.35414 0.43203,0.32363 l 0.35243,-0.0367 0.0381,1.165 c 0.0506,1.5477 0.0221,1.6228 -0.84441,2.228 -3.1181,2.1778 -6.2018,2.3529 -8.0485,0.45685 l -0.95838,-0.98396 -0.40085,0.23287 c -3.1539,1.8322 -6.3131,2.4419 -9.3329,1.801 z m 6.3364,-4.6346 c 1.0709,-0.35947 2.5704,-1.1675 2.9546,-1.592 0.20747,-0.22926 0.22485,-0.55896 0.1934,-3.6697 l -0.0345,-3.4178 -0.39268,0.016 c -0.62297,0.0254 -2.9529,0.89879 -4.7853,1.7937 -6.4019,3.1266 -4.6042,9.1084 2.0645,6.8697 z"
+ id="path310" /><path
+ d="m 692.78,730.9 c -1.1585,-0.13093 -2.2382,-0.41908 -2.9709,-0.79283 -0.64123,-0.32713 -0.56252,-0.40685 0.18083,-0.18314 2.4212,0.72867 6.3179,0.50596 8.5694,-0.48977 0.95011,-0.42018 0.99949,-0.54515 0.99949,-2.5294 0,-1.7031 0.0739,-1.9548 0.57402,-1.9548 0.17063,0 0.0748,4.6272 -0.0988,4.7712 -0.99575,0.8264 -4.8417,1.4513 -7.2541,1.1786 z"
+ id="path312" /><path
+ d="m 648.69,730.96 c -2.3442,-0.26255 -4.4079,-0.79916 -5.2394,-1.3624 -0.21938,-0.14861 -0.27779,-0.22721 -0.13277,-0.1787 12.43,4.1585 23.932,-7.1824 18.891,-18.627 -0.61644,-1.3995 -0.64313,-1.4896 -0.3295,-1.1122 0.90386,1.0877 1.8654,3.8583 2.0837,6.0037 0.86132,8.4674 -6.8855,16.216 -15.273,15.276 z"
+ id="path314" /><path
+ d="m 620.08,730.9 c -2.2622,-0.23381 -4.1321,-0.73516 -6.1044,-1.6367 -1.4106,-0.64479 -1.2414,-0.63836 0.72701,0.0276 10.297,3.4841 18.665,-1.841 15.672,-9.9732 -0.0663,-0.18029 0.005,-0.14241 0.23329,0.12476 1.0295,1.2022 1.361,4.3048 0.66933,6.2652 -1.3105,3.7144 -5.7186,5.7585 -11.197,5.1923 z"
+ id="path316" /><path
+ d="m 539.36,744.18 c -0.0334,-0.1068 -0.0862,-0.27704 -0.11747,-0.37831 -0.0312,-0.10127 -0.19144,-0.20322 -0.35599,-0.22654 l -0.29918,-0.0424 -0.035,-2.6033 c -0.0399,-2.9652 -0.13959,-2.7111 1.2319,-3.1384 2.0169,-0.62844 2.9952,-1.9992 3.3936,-4.7553 0.0819,-0.56677 0.13023,-8.8176 0.13186,-22.519 0.002,-16.644 0.0383,-21.66 0.1579,-21.78 0.11051,-0.11051 0.90615,-0.15534 2.7573,-0.15534 2.6843,0 2.9126,0.0419 2.9126,0.53509 0,0.14859 0.12029,0.23826 0.35599,0.26538 l 0.35598,0.041 v 21.942 c 0,23.149 -0.002,23.221 -0.59063,25.743 -0.49901,2.1363 -2.0195,4.3248 -3.848,5.5385 -1.7038,1.131 -5.8486,2.1819 -6.0509,1.5343 z"
+ id="path318" /></g><g
+ fill="#08080b"
+ id="g362"><path
+ d="m 690.92,699.82 c 0.0337,-2.5327 0.0447,-2.6307 0.29397,-2.6307 0.25026,0 0.2589,0.0863 0.2589,2.589 v 2.589 l -0.58795,0.0834 z"
+ id="path322" /><path
+ d="m 675.39,702.22 c -0.13781,-0.35914 0.0729,-4.8613 0.26983,-5.7645 0.60494,-2.7748 2.3969,-3.6592 6.1446,-3.0325 1.6729,0.27974 1.5702,0.40304 1.5702,-1.8846 0,-1.941 0,-1.9431 0.29127,-1.9018 0.28768,0.0409 0.2917,0.0689 0.32674,2.2894 l 0.0355,2.248 -0.42383,-0.0765 c -5.7994,-1.0468 -7.3666,0.20272 -7.5678,6.0336 -0.0791,2.2934 -0.29741,2.9986 -0.6465,2.0889 z"
+ id="path324" /><path
+ d="m 681.72,707.64 c 0.0554,-0.28928 3.182,-0.41955 3.3548,-0.13979 0.19401,0.3139 -0.0512,0.36633 -1.7136,0.36633 -1.5347,0 -1.6808,-0.0202 -1.6413,-0.22654 z"
+ id="path326" /><path
+ d="m 629.91,709.78 c -0.25451,-0.22076 -0.20476,-4.8867 0.0521,-4.8867 0.41912,0 0.47332,0.30687 0.47332,2.6796 0,2.4546 -0.0411,2.6272 -0.52542,2.2071 z"
+ id="path328" /><path
+ d="m 617.97,710.08 c -1.6912,-2.863 3.03,-4.0665 8.1726,-2.0833 1.3193,0.50877 1.3202,0.61532 0.002,0.19662 -4.5237,-1.4365 -8.4275,-0.46 -7.821,1.9564 0.10589,0.4219 -0.0851,0.3842 -0.35323,-0.0697 z"
+ id="path330" /><path
+ d="m 556.91,710.66 c 0,-0.56676 0.004,-0.57154 0.93851,-1.1503 3.7761,-2.3383 7.9882,-3.1384 10.602,-2.0139 0.58889,0.25333 1.2505,0.78692 0.73786,0.59508 -2.7685,-1.036 -7.2199,-0.0972 -10.866,2.2915 -1.5344,1.0054 -1.4127,0.98146 -1.4127,0.27753 z"
+ id="path332" /><path
+ d="m 641.27,720.64 c -3.7774,-6.4457 2.2372,-14.927 9.3939,-13.246 1.6497,0.3874 2.4232,0.84882 0.87446,0.52166 -6.983,-1.4751 -12.789,5.8037 -10.09,12.65 0.30612,0.77665 0.2476,0.80104 -0.1783,0.0743 z"
+ id="path334" /><path
+ d="m 589.37,723.11 c -0.68335,-1.4158 -0.68487,-1.4399 -0.68487,-10.841 v -8.7379 l 0.56973,-0.081 0.0439,9.2315 c 0.0454,9.5404 0.0468,9.5686 0.55599,10.882 0.20685,0.5336 -0.1856,0.16682 -0.48479,-0.45307 z"
+ id="path336" /><path
+ d="m 691.42,723.65 c -0.49073,-1.0782 -0.54509,-2.0748 -0.50811,-9.3132 l 0.0354,-6.9256 4.1359,-0.0342 c 4.8388,-0.04 4.3385,0.20695 4.3411,-2.1431 0.002,-1.7807 0.003,-1.7888 0.29325,-1.7476 0.2886,0.041 0.29126,0.0608 0.29126,2.1773 v 2.1359 l -4.2071,0.0692 c -2.3139,0.0381 -4.2217,0.0818 -4.2395,0.0971 -0.11129,0.0958 -0.0112,14.593 0.10515,15.223 0.18361,0.99323 0.0815,1.1839 -0.24732,0.46151 z"
+ id="path338" /><path
+ d="m 561.29,724.47 c -1.2698,-2.5785 0.43461,-4.8225 5.0694,-6.6741 3.5869,-1.433 4.3298,-1.5932 4.2481,-0.91595 -0.0372,0.30874 -0.17269,0.38517 -1.465,0.82659 -5.8532,1.9994 -8.017,3.9591 -7.4678,6.7635 0.0662,0.33818 0.0749,0.61488 0.0192,0.61488 -0.0557,0 -0.23745,-0.2767 -0.404,-0.61488 z"
+ id="path340" /><path
+ d="m 576.62,725.7 c -0.32097,-0.41482 -0.35877,-1.1658 -0.43166,-8.576 -0.0835,-8.4914 -0.10266,-8.7304 -0.83848,-10.48 -0.33765,-0.80263 0.10787,-0.35209 0.52616,0.53208 0.79051,1.671 0.87593,2.3155 0.92379,6.9701 0.12722,12.373 0.13367,11.959 -0.17981,11.553 z"
+ id="path342" /><path
+ d="m 670.74,730.33 c -0.15857,-0.41327 0.0896,-0.46202 2.3522,-0.46202 h 2.2577 l 0.002,-11.1 c 0.002,-12.849 -0.23454,-11.406 1.8802,-11.452 l 1.6778,-0.0364 0.0647,-1.877 c 0.0629,-1.8255 0.0727,-1.8782 0.35599,-1.9184 l 0.29126,-0.0414 v 4.4193 h -1.667 c -2.2016,0 -1.9508,-1.4462 -1.9892,11.469 l -0.0331,11.12 -2.5596,0.0351 c -2.1577,0.0296 -2.5711,0.005 -2.6328,-0.15561 z"
+ id="path344" /><path
+ d="m 602.13,730.33 c -0.20261,-0.528 -0.0218,-0.57751 2.2446,-0.61454 l 2.1736,-0.0355 0.066,-26.231 0.58129,0.0826 v 26.926 l -2.4949,0.0352 c -2.1359,0.0301 -2.5058,0.007 -2.5705,-0.16181 z"
+ id="path346" /><path
+ d="m 591.67,730.77 c -1.0964,-0.17232 -2.0766,-0.47587 -2.9338,-0.90862 -0.96772,-0.4885 -1.0942,-0.71145 -0.21885,-0.38583 3.9063,1.4532 8.1076,0.74575 11.386,-1.9173 1.2214,-0.99203 1.276,-1.0016 1.2752,-0.22378 -0.002,1.8833 -5.8778,4.0062 -9.509,3.4355 z"
+ id="path348" /><path
+ d="m 573.3,730.72 c -1.1241,-0.4006 -0.95427,-0.52083 0.7356,-0.52083 2.1606,0 3.5542,-0.47194 5.4323,-1.8396 l 0.61489,-0.44779 v -0.87506 c 0,-0.89201 0.29123,-1.4588 0.63909,-1.2438 0.26043,0.16095 0.17434,2.622 -0.10136,2.8977 -1.6593,1.6593 -5.4277,2.704 -7.3205,2.0294 z"
+ id="path350" /><path
+ d="m 561.31,730.71 c -0.95995,-0.20807 -1.6916,-0.48043 -2.3067,-0.85864 -0.59492,-0.36582 -0.45424,-0.40728 0.39295,-0.1158 3.1569,1.0861 7.3059,0.47172 10.467,-1.55 0.94668,-0.60553 1.6504,-0.0911 0.81966,0.59915 -1.9727,1.639 -6.4501,2.5588 -9.3725,1.9253 z"
+ id="path352" /><path
+ d="m 693.28,730.96 c -1.5119,-0.15107 -3.7095,-0.71964 -3.5187,-0.9104 0.0324,-0.0324 0.5353,0.0375 1.1174,0.15548 2.3568,0.47756 5.9964,0.1179 7.8014,-0.77093 l 0.8135,-0.40059 0.0345,-1.877 c 0.0345,-1.8795 0.11816,-2.2006 0.57273,-2.2006 0.19172,0 0.12668,4.6103 -0.0673,4.7713 -0.88434,0.73392 -4.7268,1.4354 -6.7536,1.2328 z"
+ id="path354" /><path
+ d="m 648.04,730.9 c -1.2649,-0.1378 -2.8785,-0.52988 -3.7842,-0.91953 -0.88228,-0.37955 -0.73215,-0.38114 0.67743,-0.007 11.52,3.0562 21.702,-7.9891 17.483,-18.965 -0.44027,-1.1454 -0.17496,-0.9113 0.40399,0.3564 4.4732,9.7948 -3.8014,20.731 -14.78,19.535 z"
+ id="path356" /><path
+ d="m 620.66,730.96 c -2.3017,-0.22465 -3.985,-0.59499 -5.6284,-1.2383 -1.3817,-0.54084 -1.2537,-0.57279 0.39282,-0.098 9.9009,2.8549 17.982,-2.4463 15.172,-9.9523 -0.0693,-0.18495 -0.0505,-0.19302 0.12233,-0.0526 0.88637,0.71998 1.2125,4.2528 0.5626,6.0947 -1.2495,3.5414 -5.6781,5.729 -10.621,5.2466 z"
+ id="path358" /><path
+ d="m 539.52,744.29 c -0.34266,-0.34266 0.0131,-0.82127 0.61046,-0.82127 3.468,0 7.4386,-3.4123 8.36,-7.1845 0.55366,-2.2669 0.55887,-2.4804 0.61237,-25.081 l 0.0514,-21.715 h 0.63408 l -10e-4,21.456 c -0.001,21.901 -0.0306,23.382 -0.50713,25.736 -0.83084,4.1035 -4.1078,6.9978 -8.4896,7.498 -0.42646,0.0487 -0.86698,0.11352 -0.97893,0.14407 -0.11194,0.0305 -0.24301,0.0161 -0.29126,-0.0322 z"
+ id="path360" /></g></g><g
+ aria-label="ZFS Rescue"
+ id="g384"><path
+ d="m 578.99,752.62 q -0.992,0 -1.536,-0.48 -0.512,-0.544 -0.832,-0.864 -3.168,-0.8 -6.464,-0.8 -3.808,0 -7.84,1.024 l -2.24,0.096 q -0.192,-0.32 0.256,-1.056 0.288,-0.448 0.608,-0.896 1.056,-1.312 2.08,-2.56 1.024,-1.28 1.92,-2.496 1.28,-0.896 2.688,-2.976 0.704,-1.056 1.44,-2.144 0.032,-0.064 0.896,-1.12 0.544,-0.672 0.544,-1.12 0,-0.096 -0.064,-0.288 h -6.144 q -0.096,-0.192 -0.096,-0.288 0,-0.256 0.352,-0.384 0.352,-0.16 0.608,-0.16 0.864,0.192 1.792,0.192 0.608,0 1.856,-0.096 1.248,-0.096 1.856,-0.096 0.64,0 1.184,0.064 0.576,0.064 1.344,0.384 l 0.16,0.192 -5.44,7.296 q -0.704,0.544 -1.504,1.44 -0.352,0.416 -2.112,2.784 -0.064,0.224 -0.736,0.96 -0.544,0.608 -0.544,1.12 3.328,-0.608 6.688,-0.608 4.384,0 8.96,0.992 0.256,0.48 0.416,0.864 0.192,0.384 0.192,0.64 0,0.288 -0.288,0.384 z"
+ id="path366" /><path
+ d="m 594.35,738.25 q -1.024,0.224 -4.32,0.672 -3.264,0.448 -4.768,0.928 -2.368,0.768 -3.808,2.272 -0.096,0.64 -0.16,1.088 -0.032,0.416 -0.032,0.512 0,0.736 0.384,1.088 l 3.328,-0.064 q 1.344,0 2.272,0.128 0.928,0.096 1.792,0.48 -0.992,0.224 -2.4,0.288 -1.376,0.064 -2.688,0.064 h -1.696 q -0.384,0.096 -0.64,0.16 -0.224,0.064 -0.32,0.256 l -0.544,4.576 q -0.544,-0.096 -0.96,0.128 -0.736,0.384 -0.832,0.416 l -0.352,-7.488 q 0.16,-0.224 0.352,-0.448 0.224,-0.192 0.288,-0.672 0.064,-0.512 0.16,-0.736 1.6,-1.44 4.192,-2.336 1.856,-0.64 4.96,-1.184 4.864,-0.864 4.928,-0.864 0.064,-0.064 0.064,-0.224 0,-0.16 0.096,-0.192 0.32,0.192 0.448,0.288 0.48,0.352 0.48,0.576 0,0.192 -0.224,0.288 z"
+ id="path368" /><path
+ d="m 607.92,749.87 q 0,0.512 -0.288,0.832 -1.344,0.48 -2.688,0.64 -1.312,0.192 -2.88,0.192 l -4.384,-0.096 q -0.512,-0.448 -1.856,-0.512 -1.344,-0.064 -1.76,-0.48 l 1.568,-0.768 q 1.12,0.768 2.624,1.088 1.504,0.32 3.392,0.32 1.984,0 3.68,-0.256 0.256,0 0.352,-0.256 0.096,-0.288 0.096,-0.64 -0.032,-0.352 -0.032,-0.416 -0.576,-2.208 -4.512,-3.456 -2.464,-0.64 -3.296,-0.864 -0.288,-0.48 -2.016,-1.44 -1.28,-0.736 -1.28,-2.176 0,-0.384 0.032,-0.608 0.608,-0.992 1.984,-1.408 1.376,-0.416 2.688,-0.8 0.896,-0.16 1.952,-0.32 1.056,-0.192 1.792,-0.192 0.736,0 1.28,0.128 0.544,0.096 1.152,0.384 1.088,0.512 1.376,1.856 -0.032,0.288 -0.352,0.48 -0.128,0.064 -0.608,0.224 -0.096,-0.064 -0.096,-0.416 0,-0.256 -0.512,-0.48 -0.192,-0.352 -0.544,-0.64 -0.352,-0.288 -0.768,-0.48 -0.928,-0.32 -1.952,-0.32 -1.216,0 -2.656,0.448 -1.152,0.352 -2.368,0.992 -0.256,0.256 -0.256,0.8 0,0.224 0.064,0.544 0.896,1.664 3.104,2.656 2.016,0.736 4.032,1.472 2.4,0.928 3.456,2.272 0.192,0.416 0.32,0.864 0.16,0.416 0.16,0.832 z"
+ id="path370" /><path
+ d="m 632.11,753.45 q 0,0.864 -0.256,0.864 -0.096,0 -0.48,-0.16 -0.256,0.192 -0.352,0.224 -0.064,0.064 -0.16,0.064 -0.032,0 -0.672,-0.16 -4.512,-3.84 -8.992,-7.712 -0.16,0.64 -0.32,1.376 -0.128,0.704 -0.128,1.28 0,0.736 0.192,1.12 l -0.48,1.376 q -0.16,-0.128 -0.416,-0.128 -0.192,0 -0.544,0.064 -0.352,0.096 -0.416,0.096 -0.32,0 -0.48,-0.192 0,-1.312 0.672,-6.112 0.32,-2.304 0.32,-3.712 0,-1.92 -0.448,-3.52 -0.32,-0.384 -0.608,-1.056 -0.16,-0.384 -0.32,-0.768 0.256,-0.384 0.8,-0.736 0.576,-0.352 1.12,-0.672 1.6,-0.48 3.104,-0.768 1.536,-0.288 2.88,-0.288 2.208,0 3.84,0.8 0.352,0.576 0.352,1.28 0,0.704 -0.352,1.76 -0.192,0.544 -0.352,1.056 -0.576,1.408 -1.6,2.528 -1.024,1.12 -2.336,1.696 -0.224,0.352 -1.76,0.672 -0.736,0.16 -1.664,0.288 -0.096,0.416 0.288,0.864 1.12,1.344 1.12,1.376 4.224,3.616 8.448,7.2 z m -4.032,-17.184 q 0,-0.48 -0.128,-0.832 -0.416,-0.384 -1.088,-0.544 -0.672,-0.16 -1.44,-0.16 -0.704,0 -1.12,0.064 -0.416,0.032 -1.44,0.192 -0.992,0.224 -1.6,0.512 -0.576,0.288 -1.024,0.896 -0.096,0.288 -0.096,0.512 0,0.224 0.128,0.64 0.16,0.416 0.192,0.512 l 0.736,0.16 q 0.256,0.416 0.352,0.992 0.096,0.576 0.096,1.184 v 1.344 q 0,0.736 0.064,1.088 0.128,0.096 0.256,0.224 0.128,0.096 0.256,0.096 1.472,-0.192 2.688,-1.056 1.216,-0.896 1.984,-2.272 0.608,-1.248 0.896,-2.112 0.288,-0.896 0.288,-1.44 z"
+ id="path372" /><path
+ d="m 642.96,750.7 q -0.832,0.48 -1.76,0.608 -0.928,0.16 -2.112,0.16 h -1.536 q -1.312,-0.384 -2.592,-0.736 -1.152,-0.608 -1.536,-2.528 -0.192,-0.544 -0.192,-1.088 0,-0.992 0.576,-2.016 0.48,-0.832 1.28,-1.568 1.184,-0.512 2.368,-0.768 1.216,-0.288 2.432,-0.288 0.512,0.352 1.056,0.672 0.8,0.576 0.8,1.12 0,0.352 -0.416,0.736 -0.928,0.736 -2.688,1.408 -1.152,0.448 -3.136,0.992 0,0.736 0.416,1.28 0.256,0.352 1.024,0.928 0.768,0.576 1.664,0.8 0.928,0.192 2.048,0.192 0.928,0 1.44,-0.064 0.544,-0.064 0.8,-0.064 0.032,0.032 0.064,0.224 z m -3.776,-5.664 q 0.288,-0.096 0.288,-0.352 0,-0.224 -0.16,-0.48 -0.16,-0.256 -0.352,-0.544 l -1.792,0.096 q -0.512,0.576 -1.024,1.12 -0.64,0.8 -0.64,1.6 1.12,0 2.048,-0.32 0.96,-0.32 1.632,-1.12 z"
+ id="path374" /><path
+ d="m 650.51,742.99 q 0,0.384 -0.192,0.544 -0.16,0.16 -0.288,0.224 -0.16,-0.064 -0.448,-0.16 -0.256,-0.416 -0.48,-0.832 -0.192,-0.192 -0.736,-0.288 -0.448,-0.064 -0.8,0.256 -0.352,0.32 -0.544,0.864 0,0.96 0.768,1.92 0.352,0.416 1.536,1.504 0.576,0.512 0.832,0.864 0.384,0.512 0.384,1.056 0,0.128 -0.064,0.384 -0.704,0.512 -1.568,0.704 -0.864,0.16 -1.952,0.16 l -1.952,-0.032 -0.896,0.032 q -0.512,-0.128 -0.512,-0.544 l 1.536,-0.416 q 0.128,0.064 0.832,0.256 0.704,0.16 1.28,0.16 0.576,0 0.832,-0.128 0.288,-0.16 0.288,-0.608 -0.192,-0.64 -1.792,-2.08 -0.864,-0.768 -1.12,-1.376 -0.608,-1.088 -0.608,-1.824 0,-1.184 2.016,-1.856 0.928,-0.096 1.856,-0.192 0.544,0 0.832,0.064 0.288,0.064 0.736,0.384 0.096,0.288 0.16,0.544 0.064,0.224 0.064,0.416 z"
+ id="path376" /><path
+ d="m 663.28,749.87 q -0.48,0.256 -1.28,0.544 -0.8,0.288 -1.056,0.416 -0.768,0.192 -1.632,0.256 -0.864,0.064 -1.664,0.064 h -1.056 q -0.96,-0.448 -1.888,-0.896 -0.704,-0.416 -1.184,-1.312 -0.32,-0.672 -0.32,-1.472 0,-0.832 0.256,-1.568 0.256,-0.768 0.768,-1.536 0.896,-1.216 2.048,-1.984 1.152,-0.768 2.688,-0.768 0.96,0 2.272,0.384 0.416,0.288 0.672,0.576 0.384,0.416 0.288,0.736 -0.192,0.512 -0.64,0.736 -0.416,0.192 -0.992,0.192 -0.256,-0.128 -0.448,-0.704 -0.16,-0.608 -0.928,-0.928 -0.544,-0.096 -1.088,0.288 -0.544,0.352 -1.024,0.704 -1.792,1.504 -1.792,3.808 0,0.768 0.608,1.376 0.192,0.192 1.184,0.864 0.992,0.448 2.176,0.448 0.672,0 1.216,-0.096 0.576,-0.096 1.568,-0.32 0.192,0.064 0.512,0 0.32,-0.064 0.384,-0.064 0.224,0 0.352,0.256 z"
+ id="path378" /><path
+ d="m 678.67,751.4 -2.656,-0.096 q -0.48,-0.192 -1.024,-0.672 -0.416,-0.352 -1.376,-1.472 -0.128,0 -0.512,0.224 -0.544,0.672 -1.696,1.088 -1.12,0.384 -2.432,0.512 l -0.992,0.064 q -0.448,0 -0.8,-0.128 -0.352,-0.16 -0.576,-0.576 -0.32,-0.736 -0.512,-1.696 -0.16,-0.992 -0.16,-1.92 0,-0.992 0.064,-1.536 0.064,-0.544 0.32,-2.048 0.224,0 0.64,-0.16 0.448,-0.192 0.64,-0.192 0.384,0 0.736,0.352 -0.192,0.896 -0.256,1.728 -0.064,0.8 -0.064,1.888 0,1.344 0.16,2.144 0.192,0.8 0.8,1.312 0.608,0.064 1.248,-0.288 0.736,-0.48 1.12,-0.704 1.28,-0.928 1.504,-3.136 0.352,-3.296 0.416,-3.552 0.128,-0.16 0.256,-0.16 l 0.864,-0.064 q 0.736,0 0.896,0.416 -0.128,0.896 -0.16,1.344 0,0.416 0,0.64 0,1.248 0.256,2.432 0.288,1.152 0.832,2.08 0.32,0.352 0.64,0.704 0.16,0.128 1.344,0.768 0.32,0.288 0.416,0.384 0.224,0.224 0.064,0.32 z"
+ id="path380" /><path
+ d="m 689.74,750.7 q -0.832,0.48 -1.76,0.608 -0.928,0.16 -2.112,0.16 h -1.536 q -1.312,-0.384 -2.592,-0.736 -1.152,-0.608 -1.536,-2.528 -0.192,-0.544 -0.192,-1.088 0,-0.992 0.576,-2.016 0.48,-0.832 1.28,-1.568 1.184,-0.512 2.368,-0.768 1.216,-0.288 2.432,-0.288 0.512,0.352 1.056,0.672 0.8,0.576 0.8,1.12 0,0.352 -0.416,0.736 -0.928,0.736 -2.688,1.408 -1.152,0.448 -3.136,0.992 0,0.736 0.416,1.28 0.256,0.352 1.024,0.928 0.768,0.576 1.664,0.8 0.928,0.192 2.048,0.192 0.928,0 1.44,-0.064 0.544,-0.064 0.8,-0.064 0.032,0.032 0.064,0.224 z m -3.776,-5.664 q 0.288,-0.096 0.288,-0.352 0,-0.224 -0.16,-0.48 -0.16,-0.256 -0.352,-0.544 l -1.792,0.096 q -0.512,0.576 -1.024,1.12 -0.64,0.8 -0.64,1.6 1.12,0 2.048,-0.32 0.96,-0.32 1.632,-1.12 z"
+ id="path382" /></g></g></svg>
diff --git a/stage2/01-sys-tweaks/files/grub/theme/grub.png b/stage2/01-sys-tweaks/files/grub/theme/grub.png
new file mode 100644
index 0000000..399a64d
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/theme/grub.png
Binary files differ
diff --git a/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg b/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg
new file mode 100644
index 0000000..c81ca06
--- /dev/null
+++ b/stage2/01-sys-tweaks/files/grub/x86_64-efi/load.cfg
@@ -0,0 +1,8 @@
+# Just for reference.
+# Following content dropped by default grub-install:
+# search.fs_uuid 873A-6B97 root hd0,msdos1
+# set prefix=($root)'/grub'
+#
+# We delete this grub/i386-pc/load.cfg config file
+# forcing GRUB to detect the partition hosting 'grub' folder and files.
+# This is required as we reuse our boot environment bits.
diff --git a/stage3b_kde/00-install-packages/00-packages-nr b/stage3b_kde/00-install-packages/00-packages-nr
index 878bb78..1b03c72 100644
--- a/stage3b_kde/00-install-packages/00-packages-nr
+++ b/stage3b_kde/00-install-packages/00-packages-nr
@@ -3,4 +3,5 @@ kde-plasma-desktop kde-baseapps kate okular kdeadmin kdenetwork plasma-nm kdeuti
kdeconnect kdiff3 krdc partitionmanager ksystemlog
zenity xdg-utils
gvfs-backends gvfs-fuse
-lightdm gnome-themes-standard gnome-icon-theme
+sddm sddm-theme-breeze kde-config-sddm
+gnome-icon-theme
diff --git a/stage3b_lxde/00-install-packages/01-run.sh b/stage3b_lxde/00-install-packages/01-run.sh
new file mode 100755
index 0000000..f96da89
--- /dev/null
+++ b/stage3b_lxde/00-install-packages/01-run.sh
@@ -0,0 +1,9 @@
+#!/bin/bash -e
+
+echo "background=/boot/grub/theme/desktop-4x3.svg" >> "${ROOTFS_DIR}/etc/lightdm/lightdm-gtk-greeter.conf"
+
+on_chroot << EOF
+ rm -f /etc/alternatives/desktop-background
+ ln -s /boot/grub/theme/desktop-4x3.svg /etc/alternatives/desktop-background
+EOF
+
diff --git a/stage_rescue/00-install-packages/00-packages-sys-debian b/stage_rescue/00-install-packages/00-packages-sys-debian
index fd46fd8..c5a6e64 100644
--- a/stage_rescue/00-install-packages/00-packages-sys-debian
+++ b/stage_rescue/00-install-packages/00-packages-sys-debian
@@ -14,7 +14,6 @@ isc-dhcp-client ifupdown network-manager net-tools
wireless-tools wpasupplicant wpagui
nfs-common nfs-kernel-server nfswatch
smbclient cifs-utils
-rsync tcpdump wget openssh-server openssh-client iptables
+rsync tcpdump wget iptables
lsof rpcbind iptraf iftop wireshark tcpdump pcaputils ngrep
sharutils psmisc patch less
-memtest86+
diff --git a/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm b/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm
index 439fb88..dbcec07 100644
--- a/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm
+++ b/stage_rescue/00-install-packages/00-packages-sys-debian-bookworm
@@ -14,7 +14,6 @@ isc-dhcp-client ifupdown network-manager net-tools
wireless-tools wpasupplicant wpagui
nfs-common nfs-kernel-server nfswatch
smbclient cifs-utils
-rsync tcpdump wget openssh-server openssh-client iptables
+rsync tcpdump wget iptables
lsof rpcbind iptraf iftop wireshark tcpdump pcaputils ngrep
sharutils psmisc patch less
-memtest86+
diff --git a/stage_rescue/00-install-packages/01-run.sh b/stage_rescue/00-install-packages/01-run.sh-disabled
index b39a924..730ca70 100755
--- a/stage_rescue/00-install-packages/01-run.sh
+++ b/stage_rescue/00-install-packages/01-run.sh-disabled
@@ -24,12 +24,5 @@ on_chroot <<EOF
mkdir -p /data/sdcard
cp -a /boot/sys_${TARGET_ARCH}_000 /data/sdcard/
fi
- if [ "${TARGET_RASPI}" != "1" ]; then
- # Update grub.cfg for (1 ROOTFS_RO): timeout=5 or (2) normal memtest86+.bin menu entries
- update-grub
-
- # Remove storage device related search.fs_uuid and allow multi homing
- rm -f /boot/grub/i386-pc/load.cfg
- fi
EOF
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt
new file mode 100644
index 0000000..aa16892
--- /dev/null
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/LICENSE.txt
@@ -0,0 +1,70 @@
+Debian ZFS Bootstrap is licensed under the 'New BSD 2-Clause License':
+
+Location: <stage_rescuezfs/00-install-zfs/files/zfs/bootstrap/>
+
+/**
+ * Copyright 2019 Gothel Software e.K. All rights reserved.
+ * Copyright 2021 Gothel Software e.K. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY Gothel Software e.K. ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Gothel Software e.K. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of Gothel Software e.K.
+ */
+
++++
+
+ZFS On Linux parts: 'zfs-linux-x.y.z-*'
+
+The majority of the code in the ZFS on Linux port comes from OpenSolaris
+which has been released under the terms of the CDDL open source license.
+This includes the core ZFS code, libavl, libnvpair, libefi, libunicode,
+and libutil. The original OpenSolaris source can be downloaded from:
+
+http://dlc.sun.com/osol/on/downloads/b121/on-src.tar.bz2
+
+Files which do not originate from OpenSolaris are noted in the file header
+and attributed properly. These exceptions include, but are not limited
+to, the vdev_disk.c and zvol.c implementation which are licensed under
+the CDDL.
+
+The zpios test code is originally derived from the Lustre pios test code
+which is licensed under the GPLv2. As such the heavily modified zpios
+kernel test code also remains licensed under the GPLv2.
+
+The latest stable and development versions of this port can be downloaded
+from the official ZFS on Linux site located at:
+
+http://zfsonlinux.org/
+
+This ZFS on Linux port was produced at the Lawrence Livermore National
+Laboratory (LLNL) under Contract No. DE-AC52-07NA27344 (Contract 44)
+between the U.S. Department of Energy (DOE) and Lawrence Livermore
+National Security, LLC (LLNS) for the operation of LLNL. It has been
+approved for release under LLNL-CODE-403049.
+
+Unless otherwise noted, all files in this distribution are released
+under the Common Development and Distribution License (CDDL).
+Exceptions are noted within the associated source files. See the file
+OPENSOLARIS.LICENSE for more information.
+
+Refer to the git commit log for authoritative copyright attribution.
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg
index 87afb32..bd82ea9 100644
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install-jau.cfg
@@ -32,7 +32,6 @@ export DISK1=ata-QEMU_HARDDISK_QM00005
export DISK2=ata-QEMU_HARDDISK_QM00007
export DISK3=ata-QEMU_HARDDISK_QM00009
export MYSWAPSIZE=1G
-# Warning: zstd may not yet been supported with zstd
-# lz4 is our default
-# export ZFS_COMPRESSION_METHOD=lz4
+export ZFS_COMPRESSION_METHOD=lz4
+# export ZFS_COMPRESSION_METHOD=zstd
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg
index 326d07d..ba4fb82 100644
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install.cfg
@@ -32,7 +32,6 @@ export DISK1=ata-WDC_WD2003FYYS-02W0B1_WD-WCAY00187731
export DISK2=ata-WDC_WD2002FYPS-02W3B0_WD-WCAVY7137063
export DISK3=ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N2STURAK
export MYSWAPSIZE=33G
-# Warning: zstd may not yet been supported with zstd
-# lz4 is our default
-# export ZFS_COMPRESSION_METHOD=lz4
+export ZFS_COMPRESSION_METHOD=lz4
+# export ZFS_COMPRESSION_METHOD=zstd
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh
index 8c291c3..2084690 100755
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_d0.sh
@@ -22,27 +22,20 @@ modprobe zfs
#mdadm --zero-superblock --force /dev/disk/by-id/$DISK2
#mdadm --zero-superblock --force /dev/disk/by-id/$DISK3
-# Clear the partition table:
-sgdisk --zap-all /dev/disk/by-id/$DISK1
-sgdisk --zap-all /dev/disk/by-id/$DISK2
-sgdisk --zap-all /dev/disk/by-id/$DISK3
-sync
-
-# 2.2 Partition your disk:
+# 2.2 Partition your disks:
#
# We assume advanced format: 4096 bytes per sector, 8 multiple
#
-# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap':
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK1
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK2
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$DISK3
-sync
-
-# ZFS partition: Remainder
-sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK1
-sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK2
-sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$DISK3
-sync
+# EF02 Bios-Boot (Grub core)
+# EF00 EFI System
+# BF01 ZFS Root
+for dname in "${DISK1}" "${DISK2}" "${DISK3}" ; do
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:EF02 \
+ --new 2::+700M --typecode=2:EF00 \
+ --new 3::0 --typecode=3:BF01 \
+ "/dev/disk/by-id/${dname}"
+done
sleep 3
sync
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh
index 9066ee1..b41db89 100755
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s0.sh
@@ -83,7 +83,7 @@ cp -a ${BASE_DIR}/../../zfs "${ROOTFS_DIR}/root/"
on_chroot << EOF
# Build ZFS from scratch requirements
- apt_install sysfsutils grub-pc \
+ apt_install sysfsutils grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed \
build-essential autoconf automake libtool gawk alien fakeroot dkms libblkid-dev uuid-dev libudev-dev \
libssl-dev zlib1g-dev libaio-dev libattr1-dev libelf-dev \
linux-headers-generic \
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh
index 452f222..56dce0c 100755
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s1.sh
@@ -52,7 +52,8 @@ on_chroot << EOF
SELEOF
# Fundamentals
- apt_install less sysfsutils grub-pc vim sharutils psmisc htop patch fbset sudo \
+ apt_install less sysfsutils grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed \
+ vim sharutils psmisc htop patch fbset sudo \
console-setup keyboard-configuration debconf-utils parted unzip bash-completion \
manpages-dev gdb pkg-config libstdc++6 python3-minimal strace \
v4l-utils lua5.1 luajit hardlink ca-certificates \
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh
index 43d002f..32e2769 100755
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/install_s2.sh
@@ -120,10 +120,12 @@ on_chroot << EOF
KVERSION=\$(ls /lib/modules/ | tail -n 1)
update-initramfs -u -k \${KVERSION}
+ grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK1
+ grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK2
+ grub-install --target=i386-pc --force-file-id /dev/disk/by-id/$DISK3
update-grub
- grub-install /dev/disk/by-id/$DISK1
- grub-install /dev/disk/by-id/$DISK2
- grub-install /dev/disk/by-id/$DISK3
+ mkdir -p /boot/efi/EFI/debian
+ grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian
EOF
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt
deleted file mode 100644
index 72185e8..0000000
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/bootstrap/zfs-zap-disk.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-#! /bin/sh
-
-strace -e pread64 zdb -l /dev/sdl >/dev/null
-pread64(5, "\0\1\0\0\0\0\0\0\1\0\0\0000\0\0\0\7\0\0\0\1\0\0\0\23\0\0\0doze"..., 13920, 0) = 13920
-pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 0) = 262144
-pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 262144) = 262144
-pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 16000900136960) = 262144
-pread64(5, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 262144, 16000900399104) = 262144
-+++ exited with 2 +++
-[root@fs01 etc]# for f in 0 262144 16000900136960 16000900399104; do dd if=/dev/zero of=/dev/sdl bs=1 seek=$f count=262144; done
-[root@fs01 etc]# for f in 0 262144 4000785367040 4000785629184; do dd if=/dev/zero of=/dev/disk/by-id/ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN-part2 bs=1 seek=$f count=262144; done
-262144+0 records in
-262144+0 records out
-262144 bytes (262 kB, 256 KiB) copied, 0.507745 s, 516 kB/s
-262144+0 records in
-262144+0 records out
-262144 bytes (262 kB, 256 KiB) copied, 0.508549 s, 515 kB/s
-262144+0 records in
-262144+0 records out
-262144 bytes (262 kB, 256 KiB) copied, 0.499234 s, 525 kB/s
-262144+0 records in
-262144+0 records out
-262144 bytes (262 kB, 256 KiB) copied, 0.496669 s, 528 kB/s
-
-[root@fs01 etc]# partprobe /dev/sdl
-### LSBLK shows sdl has no partitions, so far so good
-
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt
index d4e8c3f..798a936 100644
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/convert-mbr_to_uefi.txt
@@ -1,3 +1,22 @@
+Dual BIOS + UEFI Bootable Disk:
+ # EF02 Bios-Boot (Grub core)
+ # EF00 EFI System
+ # BF01 ZFS Root
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:EF02 \
+ --new 2::+700M --typecode=2:EF00 \
+ --new 3::0 --typecode=3:BF01 \
+ /dev/disk/by-id/DISK
+
+Single UEFI Bootable Disk:
+ # EF00 EFI System
+ # BF01 ZFS Root
+ sgdisk --zap-all \
+ --new 1::+700M --typecode=1:EF00 \
+ --new 2::0 --typecode=2:BF01 \
+ /dev/disk/by-id/DISK
+
+
Setup /boot/efi vfat mount
505 mkdir /boot/efi
509 mount /dev/disk/by-id/ata-QEMU_HARDDISK_QM00007-part2 /boot/efi
@@ -10,20 +29,23 @@ Setup /boot/efi vfat mount
515 mount /boot/efi
Install grub efi
- 522 sudo apt install grub-efi-amd64 -y
525 dpkg -P grub-pc grub-pc-bin
- 533 rm -rf /boot/grub/i386-pc
- check
- - existing /etc/default/grub
- - only /boot/efi/EFI/debian/ should exist
- - rm -rf /boot/efi/EFI/GRUB (???)
- - may need: `sudo apt reinstall grub-efi-amd64 -y`
-
- - Misc
- - Not needed: `grub-install --target=x86_64-efi --bootloader-id=debian --efi-directory=/boot/efi`
- - But could `sudo apt install --reinstall grub-efi-amd64`
- 536 update-grub
+ 526 rm -rf /boot/grub/i386-pc
+ 527 sudo apt install grub-pc-bin efibootmgr grub-efi-amd64 grub-efi-amd64-bin grub-efi-amd64-signed -y
+
+ Dual BIOS + UEFI Bootable Disk:
+ - grub-install --target=i386-pc --force-file-id /dev/disk/by-id/DISK
+ - update-grub
+ - mkdir -p /boot/efi/EFI/debian
+ - grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian
+
+ Single UEFI Bootable Disk:
+ - update-grub
+ - mkdir -p /boot/efi/EFI/debian
+ - grub-install --target=x86_64-efi --removable --force-file-id --efi-directory=/boot/efi --bootloader-id=debian
+
537 ls -la /boot/grub/
+ 537 ls -la /boot/efi/EFI/debian
BIOS
- Disable Secure-Boot
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh
index c9a5b75..62982d1 100644
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_efi_disk.sh
@@ -3,35 +3,24 @@ NDISK1=ata-QEMU_HARDDISK_QM00007
NDISK2=ata-QEMU_HARDDISK_QM00009
NDISK3=ata-QEMU_HARDDISK_QM00011
-# Clear the partition table:
-sgdisk --zap-all /dev/disk/by-id/$NDISK1
-sgdisk --zap-all /dev/disk/by-id/$NDISK2
-sgdisk --zap-all /dev/disk/by-id/$NDISK3
-
-# 2.2 Partition your disk:
-#
-# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap':
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK1
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK2
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK3
-
-# Run this if you need legacy (EFI) booting:
-sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK1
-sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK2
-sgdisk -n2:0:+1G -t2:EF00 /dev/disk/by-id/$NDISK3
-
-#Run these in all cases:
-sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK1
-sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK2
-sgdisk -n3:0:0 -t3:BF01 /dev/disk/by-id/$NDISK3
+# EF02 Bios-Boot (Grub core)
+# EF00 EFI System
+# BF01 ZFS Root
+for dname in "${NDISK1}" "${NDISK2}" "${NDISK3}" ; do
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:EF02 \
+ --new 2::+700M --typecode=2:EF00 \
+ --new 3::0 --typecode=3:BF01 \
+ "/dev/disk/by-id/${dname}"
+done
sleep 3
sync
# Create EFI filesystems
-mkfs.fat -F32 /dev/disk/by-id/$NDISK1-part2
-mkfs.fat -F32 /dev/disk/by-id/$NDISK2-part2
-mkfs.fat -F32 /dev/disk/by-id/$NDISK3-part2
+mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK1-part2
+mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK2-part2
+mkfs.fat -n EFISYS -F32 /dev/disk/by-id/$NDISK3-part2
echo "Now replace the disk .."
echo "zpool replace risa 12458555210078177352 /dev/disk/by-id/ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN-part1"
diff --git a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh
index 4335a25..fba8aba 100644
--- a/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh
+++ b/stage_rescuezfs/00-install-zfs/files/root_zfs/setup/new_gpt_mpr_disk.sh
@@ -3,24 +3,15 @@ NDISK1=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0798JN
NDISK2=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA0791VU
NDISK3=ata-WDC_WD40EFZX-68AWUN0_WD-WX92DA02K427
-# Clear the partition table:
-sgdisk --zap-all /dev/disk/by-id/$NDISK1
-#sgdisk --zap-all /dev/disk/by-id/$NDISK2
-#sgdisk --zap-all /dev/disk/by-id/$NDISK3
+# EF02 Bios-Boot (Grub core)
+# BF01 ZFS Root
+for dname in "${NDISK1}" "${NDISK2}" "${NDISK3}" ; do
+ sgdisk --zap-all \
+ --new 1::+1M --typecode=1:EF02 \
+ --new 2::0 --typecode=2:BF01 \
+ "/dev/disk/by-id/${dname}"
+done
-# 2.2 Partition your disk:
-#
-# Legacy (BIOS) booting (part-1): Used for GRUB boot-code in 'MBR-gap':
-sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK1
-#sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK2
-#sgdisk -a1 -n1:40:8191 -t1:EF02 /dev/disk/by-id/$NDISK3
-
-#Run these in all cases:
-sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK1
-#sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK2
-#sgdisk -n2:0:0 -t2:BF01 /dev/disk/by-id/$NDISK3
-
-sleep 3
sync
echo "Now replace the disk .."