Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package os-autoinst for openSUSE:Factory checked in at 2025-12-01 11:12:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/os-autoinst (Old) and /work/SRC/openSUSE:Factory/.os-autoinst.new.14147 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "os-autoinst" Mon Dec 1 11:12:59 2025 rev:549 rq:1320535 version:5.1764330105.c5cfd48 Changes: -------- --- /work/SRC/openSUSE:Factory/os-autoinst/os-autoinst.changes 2025-11-24 14:11:58.144283383 +0100 +++ /work/SRC/openSUSE:Factory/.os-autoinst.new.14147/os-autoinst.changes 2025-12-01 11:13:28.230885335 +0100 @@ -1,0 +2,10 @@ +Fri Nov 28 21:20:17 UTC 2025 - [email protected] + +- Update to version 5.1764330105.c5cfd48: + * Add port forwarding example for NICTYPE_USER_OPTIONS + * Fix regression from abcaa66b by disabling virtio-keyboard by default + * Add IPv6 support for multi machine tests + * distribution: Add "disable_key_repeat" + * Use 'virtio-keyboard' by default to allow fixing key repetition errors + +------------------------------------------------------------------- Old: ---- os-autoinst-5.1763561851.03e049d.obscpio New: ---- os-autoinst-5.1764330105.c5cfd48.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ os-autoinst-devel-test.spec ++++++ --- /var/tmp/diff_new_pack.3XiTfk/_old 2025-12-01 11:13:29.566941850 +0100 +++ /var/tmp/diff_new_pack.3XiTfk/_new 2025-12-01 11:13:29.570942020 +0100 @@ -18,7 +18,7 @@ %define short_name os-autoinst-devel Name: %{short_name}-test -Version: 5.1763561851.03e049d +Version: 5.1764330105.c5cfd48 Release: 0 Summary: Test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-openvswitch-test.spec ++++++ --- /var/tmp/diff_new_pack.3XiTfk/_old 2025-12-01 11:13:29.610943711 +0100 +++ /var/tmp/diff_new_pack.3XiTfk/_new 2025-12-01 11:13:29.610943711 +0100 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst-openvswitch Name: %{short_name}%{?name_ext} -Version: 5.1763561851.03e049d +Version: 5.1764330105.c5cfd48 Release: 0 Summary: test package for %{short_name} License: GPL-2.0-or-later ++++++ os-autoinst-test.spec ++++++ --- /var/tmp/diff_new_pack.3XiTfk/_old 2025-12-01 11:13:29.670946250 +0100 +++ /var/tmp/diff_new_pack.3XiTfk/_new 2025-12-01 11:13:29.674946419 +0100 @@ -19,7 +19,7 @@ %define name_ext -test %define short_name os-autoinst Name: %{short_name}%{?name_ext} -Version: 5.1763561851.03e049d +Version: 5.1764330105.c5cfd48 Release: 0 Summary: test package for os-autoinst License: GPL-2.0-or-later ++++++ os-autoinst.spec ++++++ --- /var/tmp/diff_new_pack.3XiTfk/_old 2025-12-01 11:13:29.710947942 +0100 +++ /var/tmp/diff_new_pack.3XiTfk/_new 2025-12-01 11:13:29.710947942 +0100 @@ -17,7 +17,7 @@ Name: os-autoinst -Version: 5.1763561851.03e049d +Version: 5.1764330105.c5cfd48 Release: 0 Summary: OS-level test automation License: GPL-2.0-or-later ++++++ os-autoinst-5.1763561851.03e049d.obscpio -> os-autoinst-5.1764330105.c5cfd48.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/OpenQA/Isotovideo/Interface.pm new/os-autoinst-5.1764330105.c5cfd48/OpenQA/Isotovideo/Interface.pm --- old/os-autoinst-5.1763561851.03e049d/OpenQA/Isotovideo/Interface.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/OpenQA/Isotovideo/Interface.pm 2025-11-28 12:41:45.000000000 +0100 @@ -9,7 +9,7 @@ # -> increment on every change of such APIs # -> never move that variable to another place (when refactoring) # because it may be accessed by the tests itself -our $version = 46; +our $version = 48; # major version of the (web socket) API relevant to the developer mode # -> increment when making non-backward compatible changes to that API diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/backend/qemu.pm new/os-autoinst-5.1764330105.c5cfd48/backend/qemu.pm --- old/os-autoinst-5.1763561851.03e049d/backend/qemu.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/backend/qemu.pm 2025-11-28 12:41:45.000000000 +0100 @@ -797,7 +797,6 @@ # misc my $arch_supports_boot_order = $vars->{UEFI} ? 0 : 1; # UEFI/OVMF supports ",bootindex=N", but not "-boot order=X" my $use_usb_kbd; - my $use_virtio_kbd; if (is_arm($arch) || is_riscv($arch)) { $arch_supports_boot_order = 0; @@ -805,7 +804,6 @@ } elsif (is_s390x($arch)) { $arch_supports_boot_order = 0; - $use_virtio_kbd = 1; } elsif ($vars->{OFW}) { $use_usb_kbd = $self->qemu_params_ofw; @@ -1005,7 +1003,9 @@ } sp('device', 'usb-kbd') if $use_usb_kbd; - sp('device', 'virtio-keyboard') if $use_virtio_kbd; + # Enable virtio-keyboard by default on s390x qemu but not on others + # See https://progress.opensuse.org/issues/193258 + sp('device', 'virtio-keyboard') if $vars->{QEMU_VIRTIO_KEYBOARD} // is_s390x($arch); sp("device", "canokey,file=canokey") if $vars->{FIDO2}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/consoles/VNC.pm new/os-autoinst-5.1764330105.c5cfd48/consoles/VNC.pm --- old/os-autoinst-5.1763561851.03e049d/consoles/VNC.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/consoles/VNC.pm 2025-11-28 12:41:45.000000000 +0100 @@ -653,8 +653,13 @@ } -sub map_and_send_key ($self, $keys, $down_flag, $press_release_delay) { - die "need delay" unless $press_release_delay; +sub map_and_send_key ($self, $keys, $down_flag, $delay) { + die "need delay" unless $delay; + my $down_delay = $delay * 0.5; + # the key down delay is capped because if it's too long, we risk + # unintended repeat inputs + $down_delay = 0.008 if ($down_delay > 0.008); + my $up_delay = $delay - $down_delay; if ($self->ikvm) { $self->init_ikvm_keymap; @@ -688,13 +693,13 @@ if (!defined $down_flag || $down_flag == 1) { for my $key (@events) { $self->send_key_event_down($key); - sleep($press_release_delay); + sleep($down_delay); } } if (!defined $down_flag || $down_flag == 0) { for my $key (reverse @events) { $self->send_key_event_up($key); - sleep($press_release_delay); + sleep($up_delay); } } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/consoles/video_base.pm new/os-autoinst-5.1764330105.c5cfd48/consoles/video_base.pm --- old/os-autoinst-5.1763561851.03e049d/consoles/video_base.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/consoles/video_base.pm 2025-11-28 12:41:45.000000000 +0100 @@ -27,7 +27,7 @@ sub _typing_limit () { $bmwqemu::vars{TYPING_LIMIT} // TYPING_LIMIT_DEFAULT || 1 } -sub send_key_event ($key, $press_release_delay) { } +sub send_key_event ($key, $delay) { } sub type_string ($self, $args) { my $seconds_per_keypress = 1 / _typing_limit; @@ -53,8 +53,8 @@ for my $letter (split("", $args->{text})) { next if ($letter eq "\r"); $letter = $CHARMAP->{$letter} || $letter; - # 25% is spent hitting the key, 25% releasing it, 50% searching the next key - $self->send_key_event($letter, $seconds_per_keypress * 0.25); + # 50% of the delay used on key press, 50% searching the next key + $self->send_key_event($letter, $seconds_per_keypress * 0.5); $self->{backend}->run_capture_loop($seconds_per_keypress * 0.5); } return {}; @@ -63,9 +63,9 @@ sub send_key ($self, $args) { # send_key rate must be limited to take into account VNC_TYPING_LIMIT- poo#55703 # map_and_send_key: do not be faster than default - my $press_release_delay = 1 / _typing_limit; + my $delay = 1 / _typing_limit; - $self->send_key_event($args->{key}, $press_release_delay); + $self->send_key_event($args->{key}, $delay); $self->backend->run_capture_loop(.2); return {}; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/consoles/video_stream.pm new/os-autoinst-5.1764330105.c5cfd48/consoles/video_stream.pm --- old/os-autoinst-5.1763561851.03e049d/consoles/video_stream.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/consoles/video_stream.pm 2025-11-28 12:41:45.000000000 +0100 @@ -454,7 +454,7 @@ } } -sub send_key_event ($self, $key, $press_release_delay) { +sub send_key_event ($self, $key, $delay) { return unless $self->{input_pipe}; $self->{input_pipe}->write($key . "\n") or die "failed to send '$key' input event"; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/consoles/vnc_base.pm new/os-autoinst-5.1764330105.c5cfd48/consoles/vnc_base.pm --- old/os-autoinst-5.1763561851.03e049d/consoles/vnc_base.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/consoles/vnc_base.pm 2025-11-28 12:41:45.000000000 +0100 @@ -62,9 +62,9 @@ return $self->{vnc}->_framebuffer; } -sub send_key_event ($self, $key, $press_release_delay) { +sub send_key_event ($self, $key, $delay) { die "No VNC console connection available" unless $self->{vnc}; - $self->{vnc}->map_and_send_key($key, undef, $press_release_delay); + $self->{vnc}->map_and_send_key($key, undef, $delay); } sub hold_key ($self, $args) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/distribution.pm new/os-autoinst-5.1764330105.c5cfd48/distribution.pm --- old/os-autoinst-5.1763561851.03e049d/distribution.pm 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/distribution.pm 2025-11-28 12:41:45.000000000 +0100 @@ -84,6 +84,24 @@ testapi::enter_cmd('cd /tmp'); } +=head 2 disable_key_repeat + + disable_key_repeat() + +Disable the key repetition in a Linux tty. Needs to be called in each newly +activated tty, e.g. in C<activate_console> in the distribution implementation. + +kbdrate can control the key repeat rate and delay but only if Linux controls +the input stream. For this suggested way is to use "virtio-keyboard" which is +enabled in os-autoinst by default. Alternatively set the Linux kernel parameter +"atkbd.softrepeat=1". + +=cut + +sub disable_key_repeat ($self) { + testapi::enter_cmd('kbdrate -s -d99999'); +} + =head2 script_run script_run($cmd [, timeout => $timeout] [, output => $output] [,quiet => $quiet] [,max_interval => $max_interval]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/doc/backend_vars.asciidoc new/os-autoinst-5.1764330105.c5cfd48/doc/backend_vars.asciidoc --- old/os-autoinst-5.1763561851.03e049d/doc/backend_vars.asciidoc 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/doc/backend_vars.asciidoc 2025-11-28 12:41:45.000000000 +0100 @@ -132,7 +132,7 @@ NICMAC;any MAC address;52:54:00:12:34:56;MAC address to be assigned to virtual network card NICMODEL;see qemu -device ?;virtio-net;Network device virtual NIC. NICTYPE;user|tap|vde;user;Instruct QEMU to either use user networking or to connect virtual NIC to existin system TAP device -NICTYPE_USER_OPTIONS;string;undef;Arbitrary options for NICTYPE +NICTYPE_USER_OPTIONS;string;undef;Arbitrary options for NICTYPE, e.g when set to `hostfwd=tcp::2223-:22` would enable port forwarding. NICVLAN;integer;undef;Comma-separated list of network (vlan) numbers to which the NIC should be connected, assigned by scheduler to jobs with NICTYPE != user NICPCIADDR;integer;undef;Assign NIC device a specific address on the PCI bus NUMDISKS;integer;1;Number of disks to be created and attached to VM, can be 0 to disable disks, if using RAIDLEVEL, will be set to 4 @@ -170,6 +170,7 @@ QEMU_NO_KVM;boolean;0;Don't use KVM acceleration. QEMU_NO_TABLET;boolean;0;Don't use USB tablet. QEMU_VIRTIO_RNG;boolean;1;Enable virtio random number generator +QEMU_VIRTIO_KEYBOARD;boolean;0;Enable virtio-keyboard. The virtio-keyboard is a paravirtualized device with no emulation, higher performance and for example allows the use of `kbdrate` in SUTs to disable (or tweak) key repetition to prevent mistyping errors. QEMU_NUMA;boolean;0;Enable NUMA simulation, requires QEMUCPUS to be greater than one QEMU_SMBIOS;see qemu -smbios ?;undef;pass this value to qemu -smbios QEMU_SOUNDHW;see qemu -soundhw ?;had;pass this value to qemu -soundhw (for qemu < 4.2) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/script/os-autoinst-openvswitch new/os-autoinst-5.1764330105.c5cfd48/script/os-autoinst-openvswitch --- old/os-autoinst-5.1763561851.03e049d/script/os-autoinst-openvswitch 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/script/os-autoinst-openvswitch 2025-11-28 12:41:45.000000000 +0100 @@ -72,9 +72,13 @@ my $local_ip = $ENV{OS_AUTOINST_BRIDGE_LOCAL_IP} // '10.0.2.2'; my $netmask = $ENV{OS_AUTOINST_BRIDGE_NETMASK} // 15; my $rewrite_target = $ENV{OS_AUTOINST_BRIDGE_REWRITE_TARGET} // '10.1.0.0'; + my $local_ipv6 = $ENV{OS_AUTOINST_BRIDGE_LOCAL_IPV6} // 'fec0::2'; + my $netmask_ipv6 = $ENV{OS_AUTOINST_BRIDGE_NETMASK_IPV6} // 63; # we also need a hex-converted form of the rewrite target, thanks # https://www.perlmonks.org/?node_id=704295 my $rewrite_target_hex = unpack('H*', pack('C*', split('\.', $rewrite_target))); + my $rewrite_target_hex_ipv6 = "fec0:0000:0000:0001:0000:0000:0000:0000"; + $rewrite_target_hex_ipv6 =~ s/://g; # the VM have unique MAC that differs in the last 16 bits (see /usr/lib/os-autoinst/backend/qemu.pm) # the IP can conflict across vlans @@ -92,6 +96,8 @@ # LOCAL = br0 # 1,2,3 ... tap devices + # for what is going on here, refer to the man pages ovs-fields and ovs-actions + # default: normal action 'table=0,priority=0,action=normal', @@ -116,6 +122,23 @@ # tcp to $self->{MAC} other - rewrite source IP to e.g. 10.1.x.x range and send to local "table=0,priority=99,dl_type=0x0800,dl_dst=$self->{MAC},actions=" . "mod_nw_src:$rewrite_target,move:NXM_OF_ETH_SRC[0..$netmask]->NXM_OF_IP_SRC[0..$netmask],local", + + # IPv6 translate from fec0::x to fec0:0:0:1::aabb:ccdd:eeff where aa:bb:cc:dd:ee:ff is the VM's MAC address + # IPv6 ND Solicit (ARP) v IPv6 v ICMP6 v Neigh Sol + "table=0,priority=100,eth_type=0x86dd,ip_proto=58,icmpv6_type=135,icmpv6_code=0,nd_target=$local_ipv6,actions=" . +'learn(table=1,priority=100,in_port=LOCAL,eth_type=0x86dd,ip_proto=58,icmpv6_type=136,icmpv6_code=0,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_IPV6_SRC[]->NXM_NX_IPV6_DST[],output:NXM_OF_IN_PORT[]),' . + "load:0x$rewrite_target_hex_ipv6->NXM_NX_IPV6_SRC[],move:NXM_OF_ETH_SRC[0..47]->NXM_NX_IPV6_SRC[0..47]," . + 'local', + + # IPv6 TCP syn to $self->{MAC} + "table=0,priority=100,dl_type=0x86dd,tcp_flags=+syn-ack,dl_dst=$self->{MAC},actions=" . +'learn(table=1,priority=100,in_port=LOCAL,dl_type=0x86dd,NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:NXM_NX_IPV6_SRC[]->NXM_NX_IPV6_DST[],output:NXM_OF_IN_PORT[]),' . + "load:0x$rewrite_target_hex_ipv6->NXM_NX_IPV6_SRC[],move:NXM_OF_ETH_SRC[0..47]->NXM_NX_IPV6_SRC[0..47]," . + 'local', + + # IPv6 to $self->{MAC} other + "table=0,priority=99,dl_type=0x86dd,dl_dst=$self->{MAC},actions=" . + "load:0x$rewrite_target_hex_ipv6->NXM_NX_IPV6_SRC[],move:NXM_OF_ETH_SRC[0..47]->NXM_NX_IPV6_SRC[0..47],local", ) { $self->_add_flow($rule); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/script/os-autoinst-setup-multi-machine new/os-autoinst-5.1764330105.c5cfd48/script/os-autoinst-setup-multi-machine --- old/os-autoinst-5.1763561851.03e049d/script/os-autoinst-setup-multi-machine 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/script/os-autoinst-setup-multi-machine 2025-11-28 12:41:45.000000000 +0100 @@ -99,8 +99,10 @@ flush ruleset - -table ip nat { +EOF + for proto in ip ip6; do + cat >> /etc/firewall.nft << EOF +table $proto nat { chain postrouting { type nat hook postrouting priority 100; policy accept; oifname "$ethernet" masquerade @@ -108,7 +110,9 @@ oifname "ovs-system" masquerade } } + EOF + done systemctl daemon-reload systemctl enable --now nftables } @@ -134,7 +138,7 @@ # Create bridge, port and interface connection nmcli con add type ovs-bridge con.int "$bridge" nmcli con add type ovs-port con.int "$bridge" con.master "$bridge" - nmcli con add type ovs-interface con.int "$bridge" con.master "$bridge" ipv4.method manual ipv4.address 10.0.2.2/15 ethernet.mtu "$mtu" con.zone "$zone" + nmcli con add type ovs-interface con.int "$bridge" con.master "$bridge" ipv4.method manual ipv4.address 10.0.2.2/15 ipv6.method manual ipv6.address fec0::2/63 ethernet.mtu "$mtu" con.zone "$zone" # Create tap interfaces for i in 0 $( seq 1 "$instances" @@ -154,6 +158,7 @@ cat > "/etc/sysconfig/network/ifcfg-$bridge" << EOF BOOTPROTO='static' IPADDR='10.0.2.2/15' +IPADDR_1='fec0::2/63' STARTMODE='auto' ZONE="$zone" OVS_BRIDGE='yes' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/t/05-distribution.t new/os-autoinst-5.1764330105.c5cfd48/t/05-distribution.t --- old/os-autoinst-5.1763561851.03e049d/t/05-distribution.t 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/t/05-distribution.t 2025-11-28 12:41:45.000000000 +0100 @@ -99,6 +99,15 @@ is_deeply($d->{autoinst_failures}, _generate_failures('Hard', %hard_failure), 'Expected Hard autoinst_failures matched'); }; +subtest 'disable_key_repeat' => sub { + my $mock_testapi = Test::MockModule->new('testapi'); + my @called; + $mock_testapi->redefine(enter_cmd => sub { push @called, @_ }); + $mock_testapi->noop('type_string'); + distribution->new->disable_key_repeat; + like "@called", qr/kbdrate/, 'disable_key_repeat calls kbdrate'; +}; + done_testing; 1; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/os-autoinst-5.1763561851.03e049d/t/18-backend-qemu.t new/os-autoinst-5.1764330105.c5cfd48/t/18-backend-qemu.t --- old/os-autoinst-5.1763561851.03e049d/t/18-backend-qemu.t 2025-11-19 15:17:31.000000000 +0100 +++ new/os-autoinst-5.1764330105.c5cfd48/t/18-backend-qemu.t 2025-11-28 12:41:45.000000000 +0100 @@ -317,9 +317,9 @@ subtest s390x_options => sub { my $cmdline = qemu_cmdline(ARCH => 's390x', QEMU_VIDEO_DEVICE => 'virtio-gpu', OFW => 0); + like $cmdline, qr/-device virtio-keyboard/, '-device virtio-keyboard option added by default'; like $cmdline, qr/-device virtio-gpu,edid=on/, '-device virtio-gpu,edid=on option added'; unlike $cmdline, qr/-boot.*/, '-boot options not added'; - like $cmdline, qr/-device virtio-keyboard/, '-device virtio-keyboard option added'; unlike $cmdline, qr/(audiodev|soundhw)/, 'audio options not added'; unlike $cmdline, qr/isa-fdc.fdtypeA=none/, 'isa-fdc.fdtypeA=none option is not added'; like $cmdline, qr/-device virtio-rng/, '-device virtio-rng option added'; ++++++ os-autoinst.obsinfo ++++++ --- /var/tmp/diff_new_pack.3XiTfk/_old 2025-12-01 11:13:32.483065278 +0100 +++ /var/tmp/diff_new_pack.3XiTfk/_new 2025-12-01 11:13:32.491065617 +0100 @@ -1,5 +1,5 @@ name: os-autoinst -version: 5.1763561851.03e049d -mtime: 1763561851 -commit: 03e049d2b8ce1f12e8b6f43d9eff2763df226fed +version: 5.1764330105.c5cfd48 +mtime: 1764330105 +commit: c5cfd48b19ddccceb356c4080b163d775381741d
