games/iagno: Added (reversi game).

Signed-off-by: Willy Sudiarto Raharjo <willysr@slackbuilds.org>
This commit is contained in:
Nathaniel Russell 2022-11-25 13:19:20 +07:00 committed by Willy Sudiarto Raharjo
parent 1a47e3579b
commit ad891c7416
7 changed files with 545 additions and 0 deletions

View file

@ -0,0 +1,134 @@
From 508c0f94e5f182e50ff61be6e04f72574dee97cb Mon Sep 17 00:00:00 2001
From: Rico Tzschichholz <ricotz@ubuntu.com>
Date: Sat, 16 Jan 2021 13:50:27 +0100
Subject: [PATCH] Don't alter or try to write [GtkChild] fields
See https://gitlab.gnome.org/GNOME/vala/issues/1121
---
src/overlayed-list.vala | 38 +++++++++++++++++++-------------------
1 file changed, 19 insertions(+), 19 deletions(-)
diff --git a/src/overlayed-list.vala b/src/overlayed-list.vala
index ef5db6f..209b044 100644
--- a/src/overlayed-list.vala
+++ b/src/overlayed-list.vala
@@ -89,11 +89,11 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
internal void set_window_size (AdaptativeWidget.WindowSize new_size)
{
if (!AdaptativeWidget.WindowSize.is_extra_thin (new_size) && AdaptativeWidget.WindowSize.is_extra_flat (new_size))
- set_horizontal (ref main_context, ref edit_mode_box);
+ set_horizontal (ref main_context, edit_mode_box);
else
- set_vertical (ref main_context, ref edit_mode_box);
+ set_vertical (ref main_context, edit_mode_box);
}
- private static inline void set_horizontal (ref StyleContext main_context, ref Box edit_mode_box)
+ private static inline void set_horizontal (ref StyleContext main_context, Box edit_mode_box)
{
main_context.remove_class ("vertical");
edit_mode_box.halign = Align.END;
@@ -102,7 +102,7 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
edit_mode_box.width_request = 160;
main_context.add_class ("horizontal");
}
- private static inline void set_vertical (ref StyleContext main_context, ref Box edit_mode_box)
+ private static inline void set_vertical (ref StyleContext main_context, Box edit_mode_box)
{
main_context.remove_class ("horizontal");
edit_mode_box.halign = Align.CENTER;
@@ -118,9 +118,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
internal bool next_match ()
{
- return _next_match (ref main_list_box);
+ return _next_match (main_list_box);
}
- private static inline bool _next_match (ref ListBox main_list_box)
+ private static inline bool _next_match (ListBox main_list_box)
{
ListBoxRow? row = main_list_box.get_selected_row (); // TODO multiple rows and focus-only lists
if (row == null)
@@ -130,7 +130,7 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
if (row == null)
{
- _scroll_bottom (ref main_list_box);
+ _scroll_bottom (main_list_box);
return false;
}
main_list_box.select_row ((!) row);
@@ -140,9 +140,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
internal bool previous_match ()
{
- return _previous_match (ref main_list_box);
+ return _previous_match (main_list_box);
}
- private static inline bool _previous_match (ref ListBox main_list_box)
+ private static inline bool _previous_match (ListBox main_list_box)
{
uint n_items = main_list_box.get_children ().length (); // FIXME OverlayedList.n_items is unreliable
if (n_items == 0)
@@ -189,9 +189,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
protected int [] get_selected_rows_indices ()
{
- return _get_selected_rows_indices (ref main_list_box);
+ return _get_selected_rows_indices (main_list_box);
}
- private static inline int [] _get_selected_rows_indices (ref ListBox main_list_box)
+ private static inline int [] _get_selected_rows_indices (ListBox main_list_box)
{
int [] indices = new int [0];
main_list_box.selected_foreach ((_list_box, selected_row) => {
@@ -205,9 +205,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
protected void scroll_top ()
{
- _scroll_top (ref main_list_box);
+ _scroll_top (main_list_box);
}
- private static inline void _scroll_top (ref ListBox main_list_box)
+ private static inline void _scroll_top (ListBox main_list_box)
{
Adjustment adjustment = main_list_box.get_adjustment ();
adjustment.set_value (adjustment.get_lower ());
@@ -215,9 +215,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
protected void scroll_bottom ()
{
- _scroll_bottom (ref main_list_box);
+ _scroll_bottom (main_list_box);
}
- private static inline void _scroll_bottom (ref ListBox main_list_box)
+ private static inline void _scroll_bottom (ListBox main_list_box)
{
Adjustment adjustment = main_list_box.get_adjustment ();
adjustment.set_value (adjustment.get_upper ());
@@ -225,9 +225,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
internal bool handle_copy_text (out string copy_text)
{
- return _handle_copy_text (out copy_text, ref main_list_box);
+ return _handle_copy_text (out copy_text, main_list_box);
}
- private static inline bool _handle_copy_text (out string copy_text, ref ListBox main_list_box)
+ private static inline bool _handle_copy_text (out string copy_text, ListBox main_list_box)
{
List<weak ListBoxRow> selected_rows = main_list_box.get_selected_rows ();
OverlayedListRow row;
@@ -283,9 +283,9 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
internal SelectionState get_selection_state ()
{
- return _get_selection_state (ref main_list_box, ref main_list_store);
+ return _get_selection_state (main_list_box, ref main_list_store);
}
- private static inline SelectionState _get_selection_state (ref ListBox main_list_box, ref GLib.ListStore main_list_store)
+ private static inline SelectionState _get_selection_state (ListBox main_list_box, ref GLib.ListStore main_list_store)
{
List<weak ListBoxRow> selected_rows = main_list_box.get_selected_rows ();
uint n_selected_rows = selected_rows.length ();
--
2.31.1

View file

@ -0,0 +1,245 @@
From e8a0aeec350ea80349582142c0e8e3cd3f1bce38 Mon Sep 17 00:00:00 2001
From: Rico Tzschichholz <ricotz@ubuntu.com>
Date: Wed, 17 Mar 2021 11:48:39 +0100
Subject: [PATCH] Reference of [GtkChild] fields is handled by GtkBuilder, type
must be unowned
---
src/base-headerbar.vala | 14 +++++++-------
src/base-view.vala | 4 ++--
src/base-window.vala | 6 +++---
src/game-actionbar.vala | 6 +++---
src/game-headerbar.vala | 4 ++--
src/history-button.vala | 4 ++--
src/new-game-screen.vala | 18 +++++++++---------
src/notifications-revealer.vala | 2 +-
src/overlayed-list.vala | 10 +++++-----
src/registry-placeholder.vala | 4 ++--
10 files changed, 36 insertions(+), 36 deletions(-)
diff --git a/src/base-headerbar.vala b/src/base-headerbar.vala
index 075a3ef..256d761 100644
--- a/src/base-headerbar.vala
+++ b/src/base-headerbar.vala
@@ -20,7 +20,7 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/base-headerbar.ui")]
private class BaseHeaderBar : NightTimeAwareHeaderBar, AdaptativeWidget
{
- [GtkChild] protected Box center_box;
+ [GtkChild] protected unowned Box center_box;
construct
{
@@ -190,13 +190,13 @@ private class BaseHeaderBar : NightTimeAwareHeaderBar, AdaptativeWidget
* * default widgets
\*/
- [GtkChild] private Button go_back_button;
- [GtkChild] private Separator ltr_left_separator;
- [GtkChild] private Label title_label;
- [GtkChild] private MenuButton info_button;
- [GtkChild] private Separator ltr_right_separator;
+ [GtkChild] private unowned Button go_back_button;
+ [GtkChild] private unowned Separator ltr_left_separator;
+ [GtkChild] private unowned Label title_label;
+ [GtkChild] private unowned MenuButton info_button;
+ [GtkChild] private unowned Separator ltr_right_separator;
- [GtkChild] protected Stack quit_button_stack;
+ [GtkChild] protected unowned Stack quit_button_stack;
protected void set_default_widgets_states (string? title_label_text_or_null,
bool show_go_back_button,
diff --git a/src/base-view.vala b/src/base-view.vala
index af884df..0889eae 100644
--- a/src/base-view.vala
+++ b/src/base-view.vala
@@ -20,7 +20,7 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/base-view.ui")]
private class BaseView : Stack, AdaptativeWidget
{
- [GtkChild] protected Grid main_grid;
+ [GtkChild] protected unowned Grid main_grid;
internal virtual bool handle_copy_text (out string copy_text)
{
@@ -109,7 +109,7 @@ private class BaseView : Stack, AdaptativeWidget
* * notifications
\*/
- [GtkChild] private Overlay notifications_overlay;
+ [GtkChild] private unowned Overlay notifications_overlay;
private bool notifications_revealer_created = false;
private NotificationsRevealer notifications_revealer;
diff --git a/src/base-window.vala b/src/base-window.vala
index ed8e891..eccaba8 100644
--- a/src/base-window.vala
+++ b/src/base-window.vala
@@ -74,9 +74,9 @@ private class BaseWindow : AdaptativeWindow, AdaptativeWidget
* * main layout
\*/
- [GtkChild] private Grid main_grid;
- [GtkChild] private Button unfullscreen_button;
- [GtkChild] private Overlay main_overlay;
+ [GtkChild] private unowned Grid main_grid;
+ [GtkChild] private unowned Button unfullscreen_button;
+ [GtkChild] private unowned Overlay main_overlay;
protected void add_to_main_overlay (Widget widget)
{
diff --git a/src/game-actionbar.vala b/src/game-actionbar.vala
index e59bfdc..d1e9278 100644
--- a/src/game-actionbar.vala
+++ b/src/game-actionbar.vala
@@ -28,8 +28,8 @@ private class GameActionBar : Revealer, AdaptativeWidget
[CCode (notify = false)] public string window_name { private get; protected construct set; default = "" ; }
[CCode (notify = false)] public Widget? game_widget { private get; protected construct ; default = null ; }
- [GtkChild] private ActionBar action_bar;
- [GtkChild] private Label game_label;
+ [GtkChild] private unowned ActionBar action_bar;
+ [GtkChild] private unowned Label game_label;
construct
{
@@ -93,7 +93,7 @@ private class GameActionBar : Revealer, AdaptativeWidget
[GtkTemplate (ui = "/org/gnome/Reversi/ui/game-actionbar-placeholder.ui")]
private class GameActionBarPlaceHolder : Revealer, AdaptativeWidget
{
- [GtkChild] private Widget placeholder_child;
+ [GtkChild] private unowned Widget placeholder_child;
private GameActionBar actionbar;
internal GameActionBarPlaceHolder (GameActionBar _actionbar)
diff --git a/src/game-headerbar.vala b/src/game-headerbar.vala
index 8238b3d..8267d3d 100644
--- a/src/game-headerbar.vala
+++ b/src/game-headerbar.vala
@@ -23,8 +23,8 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/game-headerbar.ui")]
private class GameHeaderBar : BaseHeaderBar, AdaptativeWidget
{
- [GtkChild] private Button new_game_button;
- [GtkChild] private Button back_button;
+ [GtkChild] private unowned Button new_game_button;
+ [GtkChild] private unowned Button back_button;
[CCode (notify = false)] public bool window_has_name { private get; protected construct set; default = false; }
[CCode (notify = false)] public string window_name { private get; protected construct set; default = ""; }
diff --git a/src/history-button.vala b/src/history-button.vala
index 4cd3673..05a7b49 100644
--- a/src/history-button.vala
+++ b/src/history-button.vala
@@ -25,8 +25,8 @@ private class HistoryButton : MenuButton, AdaptativeWidget
{
[CCode (notify = false)] public ThemeManager theme_manager { private get; protected construct; }
- [GtkChild] private Stack stack;
- [GtkChild] private DrawingArea drawing;
+ [GtkChild] private unowned Stack stack;
+ [GtkChild] private unowned DrawingArea drawing;
internal HistoryButton (GLib.Menu menu, ThemeManager theme_manager)
{
diff --git a/src/new-game-screen.vala b/src/new-game-screen.vala
index 4cb7d31..8401c39 100644
--- a/src/new-game-screen.vala
+++ b/src/new-game-screen.vala
@@ -23,11 +23,11 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/new-game-screen.ui")]
private class NewGameScreen : Box, AdaptativeWidget
{
- [GtkChild] private ModelButton modelbutton_one;
- [GtkChild] private ModelButton modelbutton_two;
+ [GtkChild] private unowned ModelButton modelbutton_one;
+ [GtkChild] private unowned ModelButton modelbutton_two;
- [GtkChild] private Gtk.MenuButton menubutton_one;
- [GtkChild] private Gtk.MenuButton menubutton_two;
+ [GtkChild] private unowned Gtk.MenuButton menubutton_one;
+ [GtkChild] private unowned Gtk.MenuButton menubutton_two;
construct
{
@@ -106,12 +106,12 @@ private class NewGameScreen : Box, AdaptativeWidget
map.connect (() => games_box.show ());
}
- [GtkChild] private Box games_box;
- [GtkChild] private Box options_box;
+ [GtkChild] private unowned Box games_box;
+ [GtkChild] private unowned Box options_box;
- [GtkChild] private Label games_label;
- [GtkChild] private Label options_label;
- [GtkChild] private Separator options_separator;
+ [GtkChild] private unowned Label games_label;
+ [GtkChild] private unowned Label options_label;
+ [GtkChild] private unowned Separator options_separator;
private bool phone_size = false;
private bool extra_thin = false;
diff --git a/src/notifications-revealer.vala b/src/notifications-revealer.vala
index 85e96e9..8668ef2 100644
--- a/src/notifications-revealer.vala
+++ b/src/notifications-revealer.vala
@@ -20,7 +20,7 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/notifications-revealer.ui")]
private class NotificationsRevealer : Revealer, AdaptativeWidget
{
- [GtkChild] private Label notification_label;
+ [GtkChild] private unowned Label notification_label;
construct
{
diff --git a/src/overlayed-list.vala b/src/overlayed-list.vala
index 209b044..4ff47f1 100644
--- a/src/overlayed-list.vala
+++ b/src/overlayed-list.vala
@@ -20,12 +20,12 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/overlayed-list.ui")]
private abstract class OverlayedList : Overlay, AdaptativeWidget
{
- [GtkChild] protected ListBox main_list_box;
+ [GtkChild] protected unowned ListBox main_list_box;
private StyleContext main_list_box_context;
protected GLib.ListStore main_list_store = new GLib.ListStore (typeof (Widget));
- [GtkChild] private ScrolledWindow scrolled;
- [GtkChild] private Box edit_mode_box;
+ [GtkChild] private unowned ScrolledWindow scrolled;
+ [GtkChild] private unowned Box edit_mode_box;
/*\
* * differed construct
@@ -45,8 +45,8 @@ private abstract class OverlayedList : Overlay, AdaptativeWidget
}
- [GtkChild] private ModelButton enter_edit_mode_button;
- [GtkChild] private ModelButton leave_edit_mode_button;
+ [GtkChild] private unowned ModelButton enter_edit_mode_button;
+ [GtkChild] private unowned ModelButton leave_edit_mode_button;
[CCode (notify = false)] public string edit_mode_action_prefix
{
construct
diff --git a/src/registry-placeholder.vala b/src/registry-placeholder.vala
index fdd8283..dc7bbaa 100644
--- a/src/registry-placeholder.vala
+++ b/src/registry-placeholder.vala
@@ -20,8 +20,8 @@ using Gtk;
[GtkTemplate (ui = "/org/gnome/Reversi/ui/registry-placeholder.ui")]
private class RegistryPlaceholder : Grid
{
- [GtkChild] private Label placeholder_label;
- [GtkChild] private Image placeholder_image;
+ [GtkChild] private unowned Label placeholder_label;
+ [GtkChild] private unowned Image placeholder_image;
[CCode (notify = false)] public string label { internal construct set { placeholder_label.label = value; }}
[CCode (notify = false)] public string icon_name { private get; internal construct; }
--
2.31.1

6
games/iagno/README Normal file
View file

@ -0,0 +1,6 @@
Iagno is a computer version of the game Reversi, more popularly called
Othello. Iagno is a two player strategy game similar to Go. The board is
8- 8 with tiles that are black on one side and white on the other side.
The object of Iagno is to flip as many of your opponent's tiles to your
color as possible without your opponent flipping your tiles. This is
by trapping your opponent's tiles between two tiles of your own color.

14
games/iagno/doinst.sh Normal file
View file

@ -0,0 +1,14 @@
if [ -x /usr/bin/update-desktop-database ]; then
/usr/bin/update-desktop-database -q usr/share/applications >/dev/null 2>&1
fi
if [ -e usr/share/icons/hicolor/icon-theme.cache ]; then
if [ -x /usr/bin/gtk-update-icon-cache ]; then
/usr/bin/gtk-update-icon-cache usr/share/icons/hicolor >/dev/null 2>&1
fi
fi
if [ -e usr/share/glib-2.0/schemas ]; then
if [ -x /usr/bin/glib-compile-schemas ]; then
/usr/bin/glib-compile-schemas usr/share/glib-2.0/schemas >/dev/null 2>&1
fi
fi

View file

@ -0,0 +1,117 @@
#!/bin/bash
# Slackware build script for iango
# Copyright 2022 Nathaniel Russell
# All rights reserved.
#
# Redistribution and use of this script, with or without modification, is
# permitted provided that the following conditions are met:
#
# 1. Redistributions of this script must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR "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 THE AUTHOR 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.
cd $(dirname $0) ; CWD=$(pwd)
PRGNAM=iagno
VERSION=${VERSION:-3.38.1}
BUILD=${BUILD:-1}
TAG=${TAG:-_SBo}
PKGTYPE=${PKGTYPE:-tgz}
if [ -z "$ARCH" ]; then
case "$( uname -m )" in
i?86) ARCH=i586 ;;
arm*) ARCH=arm ;;
*) ARCH=$( uname -m ) ;;
esac
fi
TMP=${TMP:-/tmp/SBo}
PKG=$TMP/package-$PRGNAM
OUTPUT=${OUTPUT:-/tmp}
if [ ! -z "${PRINT_PACKAGE_NAME}" ]; then
echo "$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE"
exit 0
fi
if [ "$ARCH" = "i586" ]; then
SLKCFLAGS="-O2 -march=i586 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "i686" ]; then
SLKCFLAGS="-O2 -march=i686 -mtune=i686"
LIBDIRSUFFIX=""
elif [ "$ARCH" = "x86_64" ]; then
SLKCFLAGS="-O2 -fPIC"
LIBDIRSUFFIX="64"
else
SLKCFLAGS="-O2"
LIBDIRSUFFIX=""
fi
set -e
rm -rf $PKG
mkdir -p $TMP $PKG $OUTPUT
cd $TMP
rm -rf $PRGNAM-$VERSION
tar xvf $CWD/$PRGNAM-$VERSION.tar.xz
cd $PRGNAM-$VERSION
cat $CWD/0001-Reference-of-GtkChild-fields-is-handled-by-GtkBuilde.patch | patch -p1
cat $CWD/0001-Don-t-alter-or-try-to-write-GtkChild-fields.patch | patch -p1
chown -R root:root .
find -L . \
\( -perm 777 -o -perm 775 -o -perm 750 -o -perm 711 -o -perm 555 \
-o -perm 511 \) -exec chmod 755 {} \; -o \
\( -perm 666 -o -perm 664 -o -perm 640 -o -perm 600 -o -perm 444 \
-o -perm 440 -o -perm 400 \) -exec chmod 644 {} \;
mkdir build
cd build
CFLAGS="$SLKCFLAGS" \
CXXFLAGS="$SLKCFLAGS" \
meson .. \
--buildtype=release \
--libdir=/usr/lib${LIBDIRSUFFIX} \
--localstatedir=/var \
--mandir=/usr/man \
--prefix=/usr \
--sysconfdir=/etc \
-Dstrip=true
ninja
DESTDIR=$PKG ninja install
cd ..
# Don't ship .la files:
rm -f $PKG/{,usr/}lib${LIBDIRSUFFIX}/*.la
find $PKG -print0 | xargs -0 file | grep -e "executable" -e "shared object" | grep ELF \
| cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
find $PKG/usr/man -type f -exec gzip -9 {} \;
for i in $( find $PKG/usr/man -type l ) ; do ln -s $( readlink $i ).gz $i.gz ; rm $i ; done
mkdir -p $PKG/usr/doc/$PRGNAM-$VERSION
DOCS="COPYING* NEWS"
cp -a $DOCS $PKG/usr/doc/$PRGNAM-$VERSION
cat $CWD/$PRGNAM.SlackBuild > $PKG/usr/doc/$PRGNAM-$VERSION/$PRGNAM.SlackBuild
mkdir -p $PKG/install
cat $CWD/slack-desc > $PKG/install/slack-desc
cat $CWD/doinst.sh > $PKG/install/doinst.sh
cd $PKG
/sbin/makepkg -l y -c n $OUTPUT/$PRGNAM-$VERSION-$ARCH-$BUILD$TAG.$PKGTYPE

10
games/iagno/iagno.info Normal file
View file

@ -0,0 +1,10 @@
PRGNAM="iagno"
VERSION="3.38.1"
HOMEPAGE="https://wiki.gnome.org/Apps/Iagno"
DOWNLOAD="https://download.gnome.org/sources/iagno/3.38/iagno-3.38.1.tar.xz"
MD5SUM="20b96b6f5863224a118994207c19ebd8"
DOWNLOAD_x86_64=""
MD5SUM_x86_64=""
REQUIRES="gsound"
MAINTAINER="Nathaniel Russell"
EMAIL="naterussell83@gmail.com"

19
games/iagno/slack-desc Normal file
View file

@ -0,0 +1,19 @@
# HOW TO EDIT THIS FILE:
# The "handy ruler" below makes it easier to edit a package description. Line
# up the first '|' above the ':' following the base package name, and the '|' on
# the right side marks the last column you can put a character in. You must make
# exactly 11 lines for the formatting to be correct. It's also customary to
# leave one space after the ':'.
|-----handy-ruler------------------------------------------------------|
iagno: iagno (reversi)
iagno:
iagno: The goal is to control the most disks on the board.
iagno: Iagno is a computer version of the game Reversi, more popularly
iagno: called Othello. Iagno is a two player strategy game similar to Go.
iagno:
iagno:
iagno:
iagno:
iagno:
iagno: