From f0e2c78b491c187a0f56e22c4d8fbd69963bed33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=28=D0=A5?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D1=8B=D1=87=D0=AA=29=20=D0=A5=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2?= Date: Wed, 30 Apr 2025 16:43:48 +0300 Subject: [PATCH] alr-bin 0.0.12-1 --- alr-bin/alr.sh | 4 +- alr-git/alr.sh | 4 +- obs-studio-browser/alr.sh | 220 +++++++++++++++++++++++++++++++++++++ protonup-qt/ProtonUP-qt.sh | 3 - protonup-qt/alr.sh | 100 ----------------- python3-pyaml/alr.sh | 4 +- python3-pyside6/alr.sh | 182 ++++++++++++++++++++++++++++++ 7 files changed, 408 insertions(+), 109 deletions(-) create mode 100644 obs-studio-browser/alr.sh delete mode 100644 protonup-qt/ProtonUP-qt.sh delete mode 100644 protonup-qt/alr.sh create mode 100644 python3-pyside6/alr.sh diff --git a/alr-bin/alr.sh b/alr-bin/alr.sh index 7645f99..29a8ced 100644 --- a/alr-bin/alr.sh +++ b/alr-bin/alr.sh @@ -1,6 +1,6 @@ name='alr-bin' -version='0.0.11' -release='3' +version='0.0.12' +release='1' desc='Any Linux Repository' homepage='https://gitea.plemya-x.ru/Plemya-x/ALR' maintainer_ru='Евгений Храмов ' diff --git a/alr-git/alr.sh b/alr-git/alr.sh index e01e235..4e8c186 100644 --- a/alr-git/alr.sh +++ b/alr-git/alr.sh @@ -1,6 +1,6 @@ name='alr-git' -version='2b7c2bbbb3' -release='2' +version='188.d0d8930491' +release='1' desc='Any Linux Repository' homepage='https://gitea.plemya-x.ru/Plemya-x/ALR' maintainer='Evgeniy Khramov ' diff --git a/obs-studio-browser/alr.sh b/obs-studio-browser/alr.sh new file mode 100644 index 0000000..8767d59 --- /dev/null +++ b/obs-studio-browser/alr.sh @@ -0,0 +1,220 @@ +name='obs-studio-browser' +version='31.0.3' +release='1' +desc='Free and open source software for video recording and live streaming. With everything except service integration.' +desc_ru='Бесплатная и открытая система для видео- и live-стриминга. Без сервисных интеграций.' +homepage='https://github.com/obsproject/obs-studio' +maintainer='Evgeny Hramov ' +maintainer_ru="Евгений Храмов " +architectures=('amd64' 'arm64') +licenses='GPL-2.0-or-later' +provides=('obs-studio' 'obs-vst' 'obs-websocket' 'obs-browser') +conflicts=('obs-studio' 'obs-vst' 'obs-websocket' 'obs-browser' 'obs-linuxbrowser' 'libva-vdpau-driver') + +deps=( +'alsa-lib' # Зависимости плагина ALSA и CEF +'curl' # Зависимости OBS Studio и плагина rtmp-services +'ffmpeg' # Зависимости OBS Studio и плагина FFmpeg +'fontconfig' # Зависимости плагина Freetype2 +'freetype' # Зависимости плагина Freetype2 +'gcc' # Зависимости любых бинарных файлов на C++ +'glib2' # Зависимости libobs, плагина PipeWire и CEF +'glibc' # Зависимости любых бинарных файлов на C +'jansson' # Зависимости libobs и плагина rtmp-services +'mesa-libGL' # Зависимости libobs-opengl и OBS Studio +'pipewire' # Зависимости плагина PipeWire +'pulseaudio-libs' # Зависимости мониторинга PulseAudio (в libobs) и плагина PulseAudio +'librist' # Зависимости плагина FFmpeg +'libva' # Зависимости плагина FFmpeg и плагина QSV +'libX11' # Зависимости libobs, libobs-opengl, плагина захвата X11, плагина инструментов интерфейса и CEF +'libxcb' # Зависимости libobs-opengl, плагина захвата X11 и CEF +'libXcomposite' # Зависимости плагина захвата X11 +'libxkbcommon' # Зависимости libobs, OBS Studio и CEF +'mbedtls' # Зависимости OBS Studio и плагина Outputs +'pciutils' # Зависимости плагина FFmpeg +'qrcodegen' # Зависимости плагина Websocket +'qt6-qtbase' # Зависимости OBS Studio и любых плагинов интерфейса +'qt6-qtsvg' # Зависимости OBS Studio +'qt6-qtwayland' # Необходимо для использования Qt на платформе Wayland +'rnnoise' # Зависимости фильтра плагина +'speexdsp' # Зависимости фильтра плагина +'srt' # Зависимости плагина FFmpeg +'util-linux' # Зависимости libobs +'vlc' # Зависимости плагина VLC (проблема с "vlc" вызывает сбой) +'wayland' # Зависимости libobs, libobs-opengl и CEF +'x264' # Зависимости плагина X264 +'zlib' # Зависимости libobs + +# Зависимости CEF +'at-spi2-core' 'cairo' 'dbus' 'expat' 'libcups' 'libdrm' +'libXdamage' 'libXext' 'libXfixes' 'libXrandr' 'mesa' 'nspr' +'nss' 'pango' + +) +deps_arch=( + 'alsa-lib' # Зависимости плагина ALSA и CEF + 'curl' # Зависимости OBS Studio и плагина rtmp-services + 'ffmpeg-obs' # Зависимости OBS Studio и плагина FFmpeg + 'fontconfig' # Зависимости плагина Freetype2 + 'freetype2' # Зависимости плагина Freetype2 + 'gcc-libs' # Зависимости любых бинарных файлов на C++ + 'glib2' # Зависимости libobs, плагина PipeWire и CEF + 'glibc' # Зависимости любых бинарных файлов на C + 'jansson' # Зависимости libobs и плагина rtmp-services + 'libgl' # Зависимости libobs-opengl и OBS Studio + 'libpipewire' # Зависимости плагина PipeWire + 'libpulse' # Зависимости мониторинга PulseAudio (в libobs) и плагина PulseAudio + 'librist' # Зависимости плагина FFmpeg + 'libva' # Зависимости плагина FFmpeg и плагина QSV + 'libx11' # Зависимости libobs, libobs-opengl, плагина захвата X11, плагина инструментов интерфейса и CEF + 'libxcb' # Зависимости libobs-opengl, плагина захвата X11 и CEF + 'libxcomposite' # Зависимости плагина захвата X11 + 'libxkbcommon' # Зависимости libobs, OBS Studio и CEF + 'mbedtls' # Зависимости OBS Studio и плагина Outputs + 'pciutils' # Зависимости плагина FFmpeg + 'qrcodegencpp-cmake' # Зависимости плагина Websocket + 'qt6-base' # Зависимости OBS Studio и любых плагинов интерфейса + 'qt6-svg' # Зависимости OBS Studio + 'qt6-wayland' # Необходимо для использования Qt на платформе Wayland + 'rnnoise' # Зависимости фильтра плагина + 'speexdsp' # Зависимости фильтра плагина + 'srt' # Зависимости плагина FFmpeg + 'util-linux-libs' # Зависимости libobs + 'vlc-luajit' # Зависимости плагина VLC (проблема с "vlc" вызывает сбой) + 'wayland' # Зависимости libobs, libobs-opengl и CEF + 'x264' # Зависимости плагина X264 + 'zlib' # Зависимости libobs + + # Зависимости CEF + 'at-spi2-core' 'cairo' 'dbus' 'expat' 'libcups' 'libdrm' + 'libxdamage' 'libxext' 'libxfixes' 'libxrandr' 'mesa' 'nspr' + 'nss' 'pango' + +) + +build_deps=( +'asio-devel' # Зависимости плагина Websocket (библиотека только с заголовками) +'cmake' +'nv-codec-headers' # Зависимости плагина NVENC (библиотека только с заголовками) +'pipewire-jack-audio-connection-kit' # Зависимости плагина JACK +'git' +'uthash-devel' # Зависимости libobs +'libdatachannel' # Зависимости плагина WebRTC (вариант NICE, как в Flatpak) +'libfdk-aac' # Зависимости плагина FDK AAC +'luajit' # Зависимости плагина Scripting +'nlohmann-json' # Зависимости плагина Websocket (библиотека только с заголовками) +'python' # Зависимости плагина Scripting +'sndio' # Зависимости плагина sndio +'swig' # Зависимости плагина Scripting +'systemd-devel' # Зависимости плагина V4L2 +'v4l-utils' # Зависимости плагина V4L2 +'websocketpp-devel' # Зависимости плагина Websocket (библиотека только с заголовками) + +) +build_deps_arch=( +'asio' # Зависимости плагина Websocket (библиотека только с заголовками) +'cmake' +'ffnvcodec-headers' # Зависимости плагина NVENC (библиотека только с заголовками) +'jack' # Зависимости плагина JACK +'git' +'uthash' # Зависимости libobs +'libajantv2' # Зависимости плагинов AJA +'libdatachannel' # Зависимости плагина WebRTC (вариант NICE, как в Flatpak) +'libfdk-aac' # Зависимости плагина FDK AAC +'luajit' # Зависимости плагина Scripting +'nlohmann-json' # Зависимости плагина Websocket (библиотека только с заголовками) +'libvpl' # Зависимости плагина QSV +'python' # Зависимости плагина Scripting +'sndio' # Зависимости плагина sndio +'swig' # Зависимости плагина Scripting +'systemd-libs' # Зависимости плагина V4L2 +'v4l-utils' # Зависимости плагина V4L2 +'websocketpp' # Зависимости плагина Websocket (библиотека только с заголовками) +) + +opt_deps=( +'jack: Поддержка JACK' +'libfdk-aac: Поддержка кодека FDK AAC' +'libvpl: Поддержка кодировщика QSV' +'intel-media-sdk: Поддержка кодировщика QSV (<= Rocket Lake & >= Broadwell)' +'vpl-gpu-rt: Поддержка кодировщика QSV (>= Alder Lake)' +'intel-media-driver: Поддержка кодировщика VAAPI (>= Broadwell)' +'libva-intel-driver: Поддержка кодировщика VAAPI (<= Haswell)' +'libva-mesa-driver: Поддержка кодировщика VAAPI' +'swig: Скрипты' +'luajit: Скрипты Lua' +'python: Скрипты на Python' +'sndio: Клиент ввода Sndio' +'v4l-utils: Поддержка V4L2' +'systemd-devel: Поддержка V4L2' # Заменено на systemd-devel +'v4l2loopback-dkms: Вывод виртуальной камеры V4L2' +'libdatachannel: Поддержка WHIP' +'libajantv2: Поддержка AJA' + +) +opt_deps_arch=( +'jack: Поддержка JACK' +'libfdk-aac: Поддержка кодека FDK AAC' +'libvpl: Поддержка кодировщика QSV' +'intel-media-sdk: Поддержка кодировщика QSV (<= Rocket Lake & >= Broadwell)' +'vpl-gpu-rt: Поддержка кодировщика QSV (>= Alder Lake)' +'intel-media-driver: Поддержка кодировщика VAAPI (>= Broadwell)' +'libva-intel-driver: Поддержка кодировщика VAAPI (<= Haswell)' +'libva-mesa-driver: Поддержка кодировщика VAAPI' +'swig: Скрипты' +'luajit: Скрипты Lua' +'python: Скрипты на Python' +'sndio: Клиент ввода Sndio' +'v4l-utils: Поддержка V4L2' +'systemd-libs: Поддержка V4L2' +'v4l2loopback-dkms: Вывод виртуальной камеры V4L2' +'libdatachannel: Поддержка WHIP' +'libajantv2: Поддержка AJA' +) + +sources=( +"git+https://github.com/obsproject/obs-studio.git#tag=version" +"git+https://github.com/obsproject/obs-browser.git" +"git+https://github.com/obsproject/obs-websocket.git" +"https://cdn-fastly.obsproject.com/downloads/cef_binary_6533_linux_x86_64_v3.tar.xz") +checksums=( +'SKIP' +'SKIP' +'SKIP' +'SKIP' +) + +prepare() { + cd $srcdir/obs-studio + git config submodule.plugins/obs-browser.url $srcdir/obs-browser + git config submodule.plugins/obs-websocket.url $srcdir/obs-websocket + git -c protocol.file.allow=always submodule update + + ## linux-v4l2: Fix virtual camera start failure + git cherry-pick -n 12c6febae21f369da50f09d511b54eadc1dc1342 + + ## Mark log and titlebar version + sed -i "s|obs_get_version_string()|\"$version-browser-$release\"|" UI/obs-app.cpp +} + +build() { + cmake -B build -S obs-studio \ + -DCMAKE_BUILD_TYPE=None \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_INSTALL_LIBDIR=lib \ + -DENABLE_LIBFDK=ON \ + -DENABLE_JACK=ON \ + -DENABLE_SNDIO=ON \ + -DENABLE_BROWSER=ON \ + -DCEF_ROOT_DIR="$srcdir/cef_binary_6533_linux_${CARCH/%_v?/}" \ + -DOBS_VERSION_OVERRIDE="version" \ + -DOBS_COMPILE_DEPRECATION_AS_WARNING=ON \ + -Wno-dev + + cmake --build build +} + +package() { + DESTDIR="$pkgdir" cmake --install build +} + diff --git a/protonup-qt/ProtonUP-qt.sh b/protonup-qt/ProtonUP-qt.sh deleted file mode 100644 index f756792..0000000 --- a/protonup-qt/ProtonUP-qt.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -/usr/bin/python -m pupgui2 "$@" diff --git a/protonup-qt/alr.sh b/protonup-qt/alr.sh deleted file mode 100644 index 3759733..0000000 --- a/protonup-qt/alr.sh +++ /dev/null @@ -1,100 +0,0 @@ -name='protonup-qt' -version='2.11.1' -release='2' -desc='GUI for installing and updating Proton-GE for Steam and Wine-based compatibility tools like Wine-GE for Lutris.\ - Partly based on protonup.' -desc_ru='Графический интерфейс для установки и обновления Proton-GE для Steam и инструментов совместимости на основе\ - Wine, таких как Wine-GE для Lutris. Частично основан на protonup.' -homepage='https://github.com/DavidoTek/ProtonUp-Qt' -maintainer="Евгений Храмов " -architectures=('amd64') -licenses='GPLv3' -provides=('protonup-qt') -conflicts=('protonup-qt') - -deps=( - 'python3-inputs' - 'python3-psutil' - 'python3-requests' - 'python3-setproctitle' - 'python3-steam' - 'python3-vdf' - 'python3-pyxdg' - 'python3-pyaml' - 'qt6-qttools' -) -deps_arch=( - 'pyside6' - 'python-inputs' - 'python-psutil' - 'python-requests' - 'python-setproctitle' - 'python-steam' - 'python-vdf' - 'python-pyxdg' - 'python-pyaml' - 'qt6-tools' -) - -build_deps=( - 'python3-build' - 'python3-installer' - 'python3-setuptools' - 'python3-wheel' -) -build_deps_arch=( - 'python-build' - 'python-installer' - 'python-setuptools' - 'python-wheel' -) - -opt_deps=( - 'dosbox: требуется для Boxtron' - 'git: требуется для SteamTinkerLaunch' - 'inotify-tools: требуется для Boxtron и Roberta' - 'scummvm: требуется для Roberta' - 'timidity++: требуется для Boxtron' - 'unzip: требуется для SteamTinkerLaunch' - 'wget: требуется для SteamTinkerLaunch' - 'xdotool: требуется для SteamTinkerLaunch' - 'xorg-xprop: требуется для SteamTinkerLaunch' - 'xorg-xrandr: требуется для SteamTinkerLaunch' - 'xorg-xwininfo: требуется для SteamTinkerLaunch' - 'xxd: требуется для SteamTinkerLaunch' - 'yad: требуется для SteamTinkerLaunch' -) -opt_deps_arch=( - 'dosbox: требуется для Boxtron' - 'git: требуется для SteamTinkerLaunch' - 'inotify-tools: требуется для Boxtron и Roberta' - 'scummvm: требуется для Roberta' - 'timidity++: требуется для Boxtron' - 'unzip: требуется для SteamTinkerLaunch' - 'wget: требуется для SteamTinkerLaunch' - 'xdotool: требуется для SteamTinkerLaunch' - 'xorg-xprop: требуется для SteamTinkerLaunch' - 'xorg-xrandr: требуется для SteamTinkerLaunch' - 'xorg-xwininfo: требуется для SteamTinkerLaunch' - 'xxd: требуется для SteamTinkerLaunch' - 'yad: требуется для SteamTinkerLaunch' -) - -sources=("https://github.com/DavidoTek/ProtonUp-Qt/archive/refs/tags/v${version}.tar.gz") -checksums=('SKIP') - -build() { - cd "${srcdir}/ProtonUp-Qt-${version}" - python -m build --wheel --no-isolation -} - -prepare() { - sed -i 's|Exec=net.davidotek.pupgui2|Exec=/usr/bin/protonup-qt|' ${srcdir}/ProtonUp-Qt-${version}/share/applications/net.davidotek.pupgui2.desktop - } - -package() { - cd "${srcdir}/ProtonUp-Qt-${version}" - python3 -m installer --destdir="${pkgdir}" dist/*.whl - cp -r ./share "${pkgdir}/usr/" - install -Dm755 "${scriptdir}/ProtonUP-qt.sh" "${pkgdir}/usr/bin/${name}" -} diff --git a/python3-pyaml/alr.sh b/python3-pyaml/alr.sh index fcd7ff3..cf04e8d 100644 --- a/python3-pyaml/alr.sh +++ b/python3-pyaml/alr.sh @@ -1,8 +1,8 @@ name='python3-pyaml' version='25.1.0' -release='1' +release='2' desc='PyYAML-based module to produce a bit more pretty and readable YAML-serialized data.' -desk_ru='Модуль PyYAML для создания более красивого и читаемого YAML-представления данных.' +desc_ru='Модуль PyYAML для создания более красивого и читаемого YAML-представления данных.' homepage='https://github.com/mk-fg/pretty-yaml' maintainer='Evgeniy Khramov ' maintainer_ru='Евгений Храмов ' diff --git a/python3-pyside6/alr.sh b/python3-pyside6/alr.sh new file mode 100644 index 0000000..36482d4 --- /dev/null +++ b/python3-pyside6/alr.sh @@ -0,0 +1,182 @@ +name='python3-pyside6' +version='6.9.0' +release='1' +desc='Enables the use of Qt6 APIs in Python applications.' +desc_ru='Позволяет использовать API Qt6 в Python-приложениях.' +homepage='https://github.com/mk-fg/pretty-yaml' +maintainer='Evgeniy Khramov ' +maintainer_ru='Евгений Храмов ' +architectures=('all') +license=('LGPL') +provides=( + 'pyside6' + 'pyside6-tools' + 'shiboken6' +) +conflicts=( + 'pyside6' + 'pyside6-tools' + 'shiboken6' +) + +deps=("python3") +deps_arch=( +"clang" +"gcc-libs" +"glibc" +"libxml2" +"libxslt" +"llvm" +"python" +"qt6-base" +"gcc-libs" +"glibc" +"python" +"qt6-base" +"qt6-declarative" +"python" +) + +build_deps=("python3" "python3-pip") +build_deps_arch=( + "clang" + "cmake" + "git" + "llvm" + "ninja" + "python-numpy" + "python-setuptools" + "qt6-3d" + "qt6-charts" + "qt6-connectivity" + "qt6-datavis3d" + "qt6-graphs" + "qt6-httpserver" + "qt6-location" + "qt6-multimedia" + "qt6-networkauth" + "qt6-positioning" + "qt6-quick3d" + "qt6-remoteobjects" + "qt6-scxml" + "qt6-sensors" + "qt6-serialbus" + "qt6-serialport" + "qt6-shadertools" + "qt6-speech" + "qt6-svg" + "qt6-tools" + "qt6-webchannel" + "qt6-webengine" + "qt6-websockets" +) + +sources=("git+https://code.qt.io/pyside/pyside-setup#tag=v$pkgver") +checksums=('a71ba1fe1e54b4819782ddddebf4a3e94c862b6e32d30be4e466fdc25365f90a') + +prepare() { + cd pyside-setup + patch -p1 < ../fix-build.patch +# Install missing doc snippets + git cherry-pick -n 12aba6c4dfafe191a4640e3ab755a1c7e2ddfc44 + git cherry-pick -n cacc9c5803a6dec820dd46211a836453183c8dab +} + +build() { + CLANG_INSTALL_DIR="/usr" \ + cmake -B build -S pyside-setup -G Ninja \ + -DCMAKE_INSTALL_PREFIX=/usr \ + -DCMAKE_BUILD_TYPE=None \ + -DSHIBOKEN_PYTHON_LIBRARIES=`pkgconf python3-embed --libs` \ + -DBUILD_TESTS=OFF \ + -DFORCE_LIMITED_API=no \ + -DNO_QT_TOOLS=yes + PYTHONPATH="$PWD"/build/sources \ + cmake --build build +} + +package_shiboken6() { + pkgdesc='Generates bindings for C++ libraries using CPython source code' + depends=(clang + gcc-libs + glibc + libxml2 + libxslt + llvm + python + qt6-base) + optdepends=('python: Python bindings') + + DESTDIR="$pkgdir" cmake --install build/sources/shiboken6 + +# Install egg-info + export PATH="/usr/lib/qt6/bin:$PATH" + cd pyside-setup + python setup.py egg_info --build-type=shiboken6 + python setup.py egg_info --build-type=shiboken6-generator + _pythonpath=`python -c "from sysconfig import get_path; print(get_path('platlib'))"` + cp -r shiboken6*.egg-info "$pkgdir"/$_pythonpath +} + +package_pyside6() { + pkgdesc='Enables the use of Qt6 APIs in Python applications' + depends=(gcc-libs + glibc + python + qt6-base + qt6-declarative + shiboken6) + optdepends=('qt6-3d: Qt3D bindings' + 'qt6-charts: QtCharts bindings' + 'qt6-connectivity: QtBluetooth and QtNfc bindings' + 'qt6-datavis3d: QtDataVisualization bindings' + 'qt6-graphs: QtGraphs bindings' + 'qt6-httpserver: QtHttpServer bindings' + 'qt6-location: QtLocation bindings' + 'qt6-multimedia: QtMultimedia bindings' + 'qt6-networkauth: QtNetworkAuth bindings' + 'qt6-positioning: QtPositioning bindings' + 'qt6-quick3d: QtQuick3D bindings' + 'qt6-remoteobjects: QtRemoteObjects bindings' + 'qt6-scxml: QtScxml bindings' + 'qt6-sensors: QtSensors bindings' + 'qt6-serialbus: QtSerialBus bindings' + 'qt6-serialport: QtSerialPort bindings' + 'qt6-speech: QtTextToSpeech bindings' + 'qt6-svg: QtSvg bindings' + 'qt6-tools: QtHelp, QtUiTools bindings' + 'qt6-webchannel: QtWebChannel bindings' + 'qt6-webengine: QtWebEngine bindings' + 'qt6-websockets: QtWebSockets bindings') + provides=(qt6-python-bindings) + + DESTDIR="$pkgdir" cmake --install build/sources/pyside6 + +# Install egg-info + export PATH="/usr/lib/qt6/bin:$PATH" + cd pyside-setup + python setup.py egg_info --build-type=pyside6 + _pythonpath=`python -c "from sysconfig import get_path; print(get_path('platlib'))"` + cp -r PySide6.egg-info "$pkgdir"/$_pythonpath +} + +package_pyside6-tools() { + pkgdesc='Tools for pyside6' + depends=(pyside6 + python) + + DESTDIR="$pkgdir" cmake --install build/sources/pyside-tools + +# Add convenience pyside6-designer wrapper +# Entry points in /usr/bin are not installed in the cmake build. This is the only one that does anything besides wrapping the Qt executable + echo "export LD_PRELOAD="`python -c "from sysconfig import get_config_var; print(get_config_var('LDLIBRARY'))"` > pyside6-designer + echo "exec designer6 \$@" >> pyside6-designer + install -Dm755 pyside6-designer -t "$pkgdir"/usr/bin +} + + +#files() { +# echo ./usr/local/bin/pyaml +# printf '"%s" ' ./usr/local/lib/python3.*/site-packages/pyaml/**/* +# printf '"%s" ' ./usr/local/lib/python3.*/site-packages/pyaml-${version}.dist-info/* +#} \ No newline at end of file