diff options
133 files changed, 18753 insertions, 3786 deletions
@@ -71,6 +71,7 @@ kexgen.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat kexgex.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h kexgexc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h kexgexs.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h +kexmlkem768x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h sshkey.h kex.h mac.h crypto_api.h sshbuf.h digest.h ssherr.h log.h kexsntrup761x25519.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ssherr.h krl.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h sshbuf.h ssherr.h sshkey.h authfile.h misc.h log.h digest.h bitmap.h utf8.h krl.h log.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h match.h @@ -80,7 +81,7 @@ mac.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h match.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h match.h misc.h misc.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h xmalloc.h misc.h log.h ssherr.h ssh.h sshbuf.h moduli.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h -monitor.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h dh.h packet.h dispatch.h auth-options.h sshpty.h channels.h session.h sshlogin.h canohost.h log.h ssherr.h misc.h servconf.h monitor.h monitor_wrap.h monitor_fdpass.h compat.h ssh2.h authfd.h match.h sk-api.h +monitor.o: chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h dh.h packet.h dispatch.h auth-options.h sshpty.h channels.h session.h sshlogin.h canohost.h log.h ssherr.h misc.h servconf.h monitor.h monitor_wrap.h monitor_fdpass.h compat.h ssh2.h authfd.h match.h sk-api.h srclimit.h monitor.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h ./openbsd-compat/sys-tree.h openbsd-compat/sys-queue.h openbsd-compat/openssl-compat.h atomicio.h xmalloc.h ssh.h sshkey.h sshbuf.h hostfile.h auth.h auth-pam.h audit.h loginrec.h cipher.h cipher-chachapoly.h monitor_fdpass.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h log.h ssherr.h monitor_fdpass.h monitor_wrap.o: includes.h config.h defines.h platform.h openbsd-compat/openbsd-compat.h openbsd-compat/base64.h openbsd-compat/sigact.h openbsd-compat/readpassphrase.h openbsd-compat/vis.h openbsd-compat/getrrsetbyname.h openbsd-compat/sha1.h openbsd-compat/sha2.h openbsd-compat/md5.h openbsd-compat/blf.h openbsd-compat/fnmatch.h openbsd-compat/getopt.h openbsd-compat/bsd-signal.h openbsd-compat/bsd-misc.h openbsd-compat/bsd-setres_id.h openbsd-compat/bsd-statvfs.h openbsd-compat/bsd-waitpid.h openbsd-compat/bsd-poll.h openbsd-compat/fake-rfc2553.h openbsd-compat/bsd-cygwin_util.h openbsd-compat/port-aix.h openbsd-compat/port-irix.h openbsd-compat/port-linux.h openbsd-compat/port-solaris.h openbsd-compat/port-net.h openbsd-compat/port-uw.h openbsd-compat/bsd-nextstep.h entropy.h openbsd-compat/sys-queue.h xmalloc.h ssh.h sshbuf.h sshkey.h cipher.h cipher-chachapoly.h chacha.h poly1305.h cipher-aesctr.h rijndael.h kex.h mac.h crypto_api.h hostfile.h auth.h auth-pam.h audit.h diff --git a/.github/ci-status.md b/.github/ci-status.md index fbf7c5f..4fa7389 100644 --- a/.github/ci-status.md +++ b/.github/ci-status.md @@ -6,6 +6,10 @@ master : [![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/openssh.svg)](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:openssh) [![Coverity Status](https://scan.coverity.com/projects/21341/badge.svg)](https://scan.coverity.com/projects/openssh-portable) +9.8 : +[![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg?branch=V_9_8)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml?query=branch:V_9_8) +[![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_9_8)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_9_8) + 9.7 : [![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg?branch=V_9_7)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml?query=branch:V_9_7) [![C/C++ CI self-hosted](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml/badge.svg?branch=V_9_7)](https://github.com/openssh/openssh-portable-selfhosted/actions/workflows/selfhosted.yml?query=branch:V_9_7) diff --git a/.github/configs b/.github/configs index 6134cb6..4f47f82 100755 --- a/.github/configs +++ b/.github/configs @@ -187,7 +187,7 @@ case "$config" in LIBCRYPTOFLAGS="--without-openssl" TEST_TARGET=t-exec ;; - valgrind-[1-5]|valgrind-unit) + valgrind-[1-4]|valgrind-unit) # rlimit sandbox and FORTIFY_SOURCE confuse Valgrind. CONFIGFLAGS="--without-sandbox --without-hardening" CONFIGFLAGS="$CONFIGFLAGS --with-cppflags=-D_FORTIFY_SOURCE=0" @@ -197,10 +197,9 @@ case "$config" in # Valgrind slows things down enough that the agent timeout test # won't reliably pass, and the unit tests run longer than allowed # by github so split into separate tests. - tests2="integrity try-ciphers" + tests2="integrity try-ciphers rekey" tests3="krl forward-control sshsig agent-restrict kextype sftp" tests4="cert-userkey cert-hostkey kextype sftp-perm keygen-comment percent" - tests5="rekey" case "$config" in valgrind-1) # All tests except agent-timeout (which is flaky under valgrind), @@ -220,9 +219,6 @@ case "$config" in valgrind-4) LTESTS="${tests4}" ;; - valgrind-5) - LTESTS="${tests5}" - ;; valgrind-unit) TEST_TARGET="unit USE_VALGRIND=1" ;; diff --git a/.github/setup_ci.sh b/.github/setup_ci.sh index f0f2761..7e1beca 100755 --- a/.github/setup_ci.sh +++ b/.github/setup_ci.sh @@ -14,7 +14,7 @@ case "$host" in echo Removing extended ACLs so umask works as expected. setfacl -b . regress PACKAGES="$PACKAGES,autoconf,automake,cygwin-devel,gcc-core" - PACKAGES="$PACKAGES,make,openssl-devel,zlib-devel" + PACKAGES="$PACKAGES,make,openssl,libssl-devel,zlib-devel" ;; *-darwin*) PACKAGER=brew diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml index 6090287..c179f73 100644 --- a/.github/workflows/c-cpp.yml +++ b/.github/workflows/c-cpp.yml @@ -32,7 +32,6 @@ jobs: - { target: ubuntu-20.04, config: valgrind-2 } - { target: ubuntu-20.04, config: valgrind-3 } - { target: ubuntu-20.04, config: valgrind-4 } - - { target: ubuntu-20.04, config: valgrind-5 } - { target: ubuntu-20.04, config: valgrind-unit } - { target: ubuntu-20.04, config: c89 } - { target: ubuntu-20.04, config: clang-6.0 } diff --git a/.github/workflows/selfhosted.yml b/.github/workflows/selfhosted.yml index 1672973..755bb0c 100644 --- a/.github/workflows/selfhosted.yml +++ b/.github/workflows/selfhosted.yml @@ -52,6 +52,7 @@ jobs: - obsd74 - obsdsnap - obsdsnap-i386 + - omnios - openindiana - ubuntu-2204 config: @@ -75,6 +76,7 @@ jobs: - { target: dfly58, config: pam, host: libvirt } - { target: dfly60, config: pam, host: libvirt } - { target: dfly62, config: pam, host: libvirt } + - { target: dfly64, config: pam, host: libvirt } - { target: fbsd10, config: pam, host: libvirt } - { target: fbsd12, config: pam, host: libvirt } - { target: fbsd13, config: pam, host: libvirt } @@ -82,6 +84,7 @@ jobs: - { target: nbsd8, config: pam, host: libvirt } - { target: nbsd9, config: pam, host: libvirt } - { target: nbsd10, config: pam, host: libvirt } + - { target: omnios, config: pam, host: libvirt } # ARM64 VMs - { target: obsd-arm64, config: default, host: libvirt-arm64 } # VMs with persistent disks that have their own runner. @@ -1,3 +1,1078 @@ +commit 46d1fb16b20e971b9ac15e86a3d3e350b49c9ad6 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Sep 20 08:20:13 2024 +1000 + + update version numbers + +commit 0bdca1f218971b38728a0a129f482476baff0968 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Sep 19 22:17:44 2024 +0000 + + upstream: openssh-9.9 + + OpenBSD-Commit-ID: 303417285f1a73b9cb7a2ae78d3f493bbbe31f98 + +commit ef2d7f2d3e1b4c9ae71bacf963e76a92ab8be543 +Author: Damien Miller <djm@mindrot.org> +Date: Wed Sep 18 16:03:23 2024 +1000 + + include openbsd-compat/base64.c license in LICENSE + +commit 7ef362b989c8d1f7596f557f22e5924b9c08f0ea +Author: Damien Miller <djm@mindrot.org> +Date: Wed Sep 18 09:01:23 2024 +1000 + + conditionally include mman.h in arc4random code + +commit 5fb2b5ad0e748732a27fd8cc16a7ca3c21770806 +Author: Damien Miller <djm@mindrot.org> +Date: Tue Sep 17 11:53:24 2024 +1000 + + fix bug in recently-added sntrup761 fuzzer + + key values need to be static to persist across invocations; + spotted by the Qualys Security Advisory team. + +commit 0ca128c9ee894f1b0067abd473bfb33171df67f8 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Sep 16 05:37:05 2024 +0000 + + upstream: use 64 bit math to avoid signed underflow. upstream code + + relies on using -fwrapv to provide defined over/underflow behaviour, but we + use -ftrapv to catch integer errors and abort the program. ok dtucker@ + + OpenBSD-Commit-ID: 8933369b33c17b5f02479503d0a92d87bc3a574b + +commit f82e5e22cad88c81d8a117de74241328c7b101c3 +Author: jmc@openbsd.org <jmc@openbsd.org> +Date: Sun Sep 15 08:27:38 2024 +0000 + + upstream: minor grammar/sort fixes for refuseconnection; ok djm + + OpenBSD-Commit-ID: 1c81f37b138b8b66abba811fec836388a0f3e6da + +commit 0c1165fc78e8fe69b5df71f81a8f944554a68b53 +Author: Damien Miller <djm@mindrot.org> +Date: Sun Sep 15 13:30:13 2024 +1000 + + avoid gcc warning in fuzz test + +commit ce171d0718104b643854b53443ff72f7283d33f2 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 03:09:44 2024 +0000 + + upstream: bad whitespace in config dump output + + OpenBSD-Commit-ID: d899c13b0e8061d209298eaf58fe53e3643e967c + +commit 671c440786a5a66216922f15d0007b60f1e6733f +Author: Damien Miller <djm@mindrot.org> +Date: Sun Sep 15 12:53:59 2024 +1000 + + use construct_utmp to construct btmp records + + Simpler and removes some code with the old-style BSD license. + +commit 930cb02b6113df72fbc732b9feb8e4f490952a81 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 02:20:51 2024 +0000 + + upstream: update the Streamlined NTRU Prime code from the "ref" + + implementation in SUPERCOP 20201130 to the "compact" implementation in + SUPERCOP 20240808. The new version is substantially faster. Thanks to Daniel + J Bernstein for pointing out the new implementation (and of course for + writing it). + + tested in snaps/ok deraadt@ + + OpenBSD-Commit-ID: bf1a77924c125ecdbf03e2f3df8ad13bd3dafdcb + +commit 9306d6017e0ce5dea6824c29ca5ba5673c2923ad +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 01:19:56 2024 +0000 + + upstream: document Match invalid-user + + OpenBSD-Commit-ID: 2c84a9b517283e9711e2812c1f268081dcb02081 + +commit 0118a4da21147a88a56dc8b90bbc2849fefd5c1e +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 01:18:26 2024 +0000 + + upstream: add a "Match invalid-user" predicate to sshd_config Match + + options. + + This allows writing Match conditions that trigger for invalid username. + E.g. + + PerSourcePenalties refuseconnection:90s + Match invalid-user + RefuseConnection yes + + Will effectively penalise bots try to guess passwords for bogus accounts, + at the cost of implicitly revealing which accounts are invalid. + + feedback markus@ + + OpenBSD-Commit-ID: 93d3a46ca04bbd9d84a94d1e1d9d3a21073fbb07 + +commit 7875975136f275619427604900cb0ffd7020e845 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 01:11:26 2024 +0000 + + upstream: Add a "refuseconnection" penalty class to sshd_config + + PerSourcePenalties + + This allows penalising connection sources that have had connections + dropped by the RefuseConnection option. ok markus@ + + OpenBSD-Commit-ID: 3c8443c427470bb3eac1880aa075cb4864463cb6 + +commit 8d21713b669b8516ca6d43424a356fccc37212bb +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 01:09:40 2024 +0000 + + upstream: Add a sshd_config "RefuseConnection" option + + If set, this will terminate the connection at the first authentication + request (this is the earliest we can evaluate sshd_config Match blocks) + + ok markus@ + + OpenBSD-Commit-ID: 43cc2533984074c44d0d2f92eb93f661e7a0b09c + +commit acad117e66018fe1fa5caf41b36e6dfbd61f76a1 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 00:58:01 2024 +0000 + + upstream: switch sshd_config Match processing to the argv tokeniser + + too; ok markus@ + + OpenBSD-Commit-ID: b74b5b0385f2e0379670e2b869318a65b0bc3923 + +commit baec3f7f4c60cd5aa1bb9adbeb6dfa4a172502a8 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 00:57:36 2024 +0000 + + upstream: switch "Match" directive processing over to the argv + + string tokeniser, making it possible to use shell-like quoting in Match + directives, particularly "Match exec". ok markus@ + + OpenBSD-Commit-ID: 0877309650b76f624b2194c35dbacaf065e769a5 + +commit dd424d7c382c2074ab70f1b8ad4f169a10f60ee7 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 00:47:01 2024 +0000 + + upstream: include pathname in some of the ssh-keygen passphrase + + prompts. Helps the user know what's going on when ssh-keygen is invoked via + other tools. Requested in GHPR503 + + OpenBSD-Commit-ID: 613b0bb6cf845b7e787d69a5b314057ceda6a8b6 + +commit 62bbf8f825cc390ecb0523752ddac1435006f206 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sun Sep 15 00:41:18 2024 +0000 + + upstream: Do not apply authorized_keys options when signature + + verification fails. Prevents restrictive key options being incorrectly + applied to subsequent keys in authorized_keys. bz3733, ok markus@ + + OpenBSD-Commit-ID: ba3776d9da4642443c19dbc015a1333622eb5a4e + +commit 49f325fd47af4e53fcd7aafdbcc280e53f5aa5ce +Author: Wu Weixin <wuweixin@gmail.com> +Date: Fri Aug 2 22:16:40 2024 +0800 + + Fix without_openssl always being set to 1 + + In Fedora systems, %{?rhel} is empty. In RHEL systems, %{?fedora} is + empty. Therefore, the original code always sets without_openssl to 1. + +commit c21c3a2419bbc1c59cb1a16ea356e703e99a90d9 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Sep 12 00:36:27 2024 +0000 + + upstream: Relax absolute path requirement back to what it was prior to + + OpenSSH 9.8, which incorrectly required that sshd was started with an + absolute path in inetd mode. bz3717, patch from Colin Wilson + + OpenBSD-Commit-ID: 25c57f22764897242d942853f8cccc5e991ea058 + +commit 1bc426f51b0a5cfdcfbd205218f0b6839ffe91e9 +Author: naddy@openbsd.org <naddy@openbsd.org> +Date: Mon Sep 9 14:41:21 2024 +0000 + + upstream: document the mlkem768x25519-sha256 key exchange algorithm + + OpenBSD-Commit-ID: fa18dccdd9753dd287e62ecab189b3de45672521 + +commit 0a2db61a5ffc64d2e2961c52964f933879952fc7 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Sep 10 21:11:14 2024 +1000 + + Spell omnios test host correctly. + +commit 059ed698a47c9af541a49cf754fd09f984ac5a21 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Sep 10 18:52:02 2024 +1000 + + Add omnios test target. + +commit f4ff91575a448b19176ceaa8fd6843a25f39d572 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Tue Sep 10 18:45:55 2024 +1000 + + Wrap stdint.h in ifdef. + +commit ff714f001d20a9c843ee1fd9d92a16d40567d264 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Mon Sep 9 19:31:54 2024 +1000 + + Also test PAM on dfly64. + +commit 509b757c052ea969b3a41fc36818b44801caf1cf +Author: Damien Miller <djm@mindrot.org> +Date: Mon Sep 9 21:50:14 2024 +1000 + + stubs for ML-KEM KEX functions + + used for C89 compilers + +commit 273581210c99ce7275b8efdefbb9f89e1c22e341 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Sep 9 17:30:38 2024 +1000 + + declare defeat trying to detect C89 compilers + + I can't find a reliable way to detect the features the ML-KEM code + requires in configure. Give up for now and use VLA support (that we + can detect) as a proxy for "old compiler" and turn off ML-KEM if + it isn't supported. + +commit e8a0f19b56dfa20f98ea9876d7171ec315fb338a +Author: Damien Miller <djm@mindrot.org> +Date: Mon Sep 9 16:46:40 2024 +1000 + + fix previous; check for C99 compound literals + + The previous commit was incorrect (or at least insufficient), the + ML-KEM code is actually using compound literals, so test for them. + +commit 7c07bec1446978bebe0780ed822c8fedfb377ae8 +Author: Damien Miller <djm@mindrot.org> +Date: Mon Sep 9 16:06:21 2024 +1000 + + test for compiler feature needed for ML-KEM + + The ML-KEM implementation we uses need the compiler to support + C99-style named struct initialisers (e.g foo = {.bar = 1}). We + still support (barely) building OpenSSH with older compilers, so + add a configure test for this. + +commit d469d5f348772058789d35332d1ccb0b109c28ef +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Sep 9 03:13:39 2024 +0000 + + upstream: test mlkem768x25519-sha256 + + OpenBSD-Regress-ID: 7baf6bc39ae55648db1a2bfdc55a624954847611 + +commit 62fb2b51bb7f6863c3ab697f397b2068da1c993f +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Sep 9 02:39:57 2024 +0000 + + upstream: pull post-quantum ML-KEM/x25519 key exchange out from + + compile-time flag now than an IANA codepoint has been assigned for the + algorithm. + + Add mlkem768x25519-sha256 in 2nd KexAlgorithms preference slot. + + ok markus@ + + OpenBSD-Commit-ID: 9f50a0fae7d7ae8b27fcca11f8dc6f979207451a + +commit a8ad7a2952111c6ce32949a775df94286550af6b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Sep 6 02:30:44 2024 +0000 + + upstream: make parsing user@host consistently look for the last '@' in + + the string rather than the first. This makes it possible to use usernames + that contain '@' characters. + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + Prompted by Max Zettlmeißl; feedback/ok millert@ + + OpenBSD-Commit-ID: 0b16eec246cda15469ebdcf3b1e2479810e394c5 + +commit 13cc78d016b67a74a67f1c97c7c348084cd9212c +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Sep 4 05:33:34 2024 +0000 + + upstream: be more strict in parsing key type names. Only allow + + shortnames (e.g "rsa") in user-interface code and require full SSH protocol + names (e.g. "ssh-rsa") everywhere else. + + Prompted by bz3725; ok markus@ + + OpenBSD-Commit-ID: b3d8de9dac37992eab78adbf84fab2fe0d84b187 + +commit ef8472309a68e319018def6f8ea47aeb40d806f5 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Sep 4 05:11:33 2024 +0000 + + upstream: fix RCSID in output + + OpenBSD-Commit-ID: 889ae07f2d2193ddc4351711919134664951dd76 + +commit ba2ef20c75c5268d4d1257adfc2ac11c930d31e1 +Author: jmc@openbsd.org <jmc@openbsd.org> +Date: Tue Sep 3 06:17:48 2024 +0000 + + upstream: envrionment -> environment; + + OpenBSD-Commit-ID: b719f39c20e8c671ec6135c832d6cc67a595af9c + +commit e66c0c5673a4304a3a9fbf8305c6a19f8653740f +Author: Damien Miller <djm@mindrot.org> +Date: Wed Sep 4 15:35:29 2024 +1000 + + add basic fuzzers for our import of sntrup761 + +commit d19dea6330ecd4eb403fef2423bd7e127f4c9828 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Sep 3 05:58:56 2024 +0000 + + upstream: regression test for Include variable expansion + + OpenBSD-Regress-ID: 35477da3ba1abd9ca64bc49080c50a9c1350c6ca + +commit 8c4d6a628051e318bae2f283e8dc38b896400862 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Sep 3 05:29:55 2024 +0000 + + upstream: allow the "Include" directive to expand the same set of + + %-tokens that "Match Exec" and environment variables. + + ok dtucker@ + + OpenBSD-Commit-ID: 12ef521eaa966a9241e684258564f52f1f3c5d37 + +commit 51b82648b6827675fc0cde21175fd1ed8e89aab2 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Sep 2 12:18:35 2024 +0000 + + upstream: missing ifdef + + OpenBSD-Commit-ID: 85f09da957dd39fd0abe08fe5ee19393f25c2021 + +commit f68312eb593943127b39ba79a4d7fa438c34c153 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Sep 2 12:13:56 2024 +0000 + + upstream: Add experimental support for hybrid post-quantum key exchange + + ML-KEM768 with ECDH/X25519 from the Internet-draft: + https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03 + + This is based on previous patches from markus@ but adapted to use the + final FIPS203 standard ML-KEM using a formally-verified implementation + from libcrux. + + Note this key exchange method is still a draft and thus subject to + change. It is therefore disabled by default; set MLKEM=yes to build it. + We're making it available now to make it easy for other SSH + implementations to test against it. + + ok markus@ deraadt@ + + OpenBSD-Commit-ID: 02a8730a570b63fa8acd9913ec66353735dea42c + +commit 05f2b141cfcc60c7cdedf9450d2b9d390c19eaad +Author: Antonio Larrosa <alarrosa@suse.com> +Date: Fri Aug 23 12:21:06 2024 +0200 + + Don't skip audit before exitting cleanup_exit + + This fixes an issue where the SSH_CONNECTION_ABANDON event is not + audited because cleanup_exit overrides the regular _exit too soon and + as a result, failed auth attempts are not logged correctly. + + The problem was introduced in 81c1099d22b81ebfd20a334ce986c4f753b0db29 + where the code from upstream was merged before the audit_event call when + it should have been merged right before the _exit call in order to honor + the comment that just mentions an override of the exit value. + +commit 16eaf9d401e70996f89f3f417738a8db421aa959 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Aug 28 12:08:26 2024 +0000 + + upstream: fix test: -F is the argument to specify a non-default + + ssh_config, not -f (this is sadly not a new bug) + + OpenBSD-Regress-ID: 45a7bda4cf33f2cea218507d8b6a55cddbcfb322 + +commit 10ccf611ab8ecba9ce6b0548c5ccd8c1220baf92 +Author: deraadt@openbsd.org <deraadt@openbsd.org> +Date: Fri Aug 23 04:51:00 2024 +0000 + + upstream: As defined in the RFC, the SSH protocol has negotiable + + compression support (which is requested as the name "zlib"). Compression + starts very early in the session. Relative early in OpenSSH lifetime, privsep + was added to sshd, and this required a shared-memory hack so the two + processes could see what was going on in the dataflow. This shared-memory + hack was soon recognized as a tremendous complexity risk, because it put libz + (which very much trusts it's memory) in a dangerous place, and a new option + ("zlib@openssh.com") was added begins compression after authentication (aka + delayed-compression). That change also permitted removal of the + shared-memory hack. Despite removal from the server, the old "zlib" support + remained in the client, to allow negotiation with non-OpenSSH daemons which + lack the delayed-compression option. This commit deletes support for the + older "zlib" option in the client. It reduces our featureset in a small way, + and encourages other servers to move to a better design. The SSH protocol is + different enough that compressed-key-material attacks like BEAST are + unlikely, but who wants to take the chance? We encourage other ssh servers + who care about optional compression support to add delayed-zlib support. + (Some already do "zlib@openssh.com") ok djm markus + + OpenBSD-Commit-ID: 6df986f38e4ab389f795a6e39e7c6857a763ba72 + +commit aee54878255d71bf93aa6e91bbd4eb1825c0d1b9 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Aug 22 23:11:30 2024 +0000 + + upstream: sntrup761x25519-sha512 now has an IANA codepoint assigned, so + + we can make the algorithm available without the @openssh.com suffix too. ok + markus@ deraadt@ + + OpenBSD-Commit-ID: eeed8fcde688143a737729d3d56d20ab4353770f + +commit a76a6b85108e3032c8175611ecc5746e7131f876 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Aug 22 20:36:12 2024 +1000 + + Move rekey test into valgrind-2. + + Now that the rekey test has been optimized it's fast enough to not be in + its own valgrind test, so move it into valgrind-2, which is currently + the quickest of the others, bringing all of them to roughly the same + runtime of ~1.1 hours. + +commit 7e75e3f57c41b9a6e6401e7674d7c2ff5c33975b +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Thu Aug 22 10:21:02 2024 +0000 + + upstream: Use aes128-ctr for MAC tests since default has implicit MAC. + + Also verify that the Cipher or MAC we intended to use is actually the one + selected during the test. + + OpenBSD-Regress-ID: ff43fed30552afe23d1364526fe8cf88cbfafe1d + +commit ebc890b8b4ba08c84cd1066b7b94b2b11f6c4cb4 +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 22 09:45:49 2024 +1000 + + fix incorrect default for PasswordAuthentication + + merge botch spotted by gsgleason + +commit 15ace435ea1c2fab2a1cc7d9c3157fe20c776b80 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed Aug 21 10:33:27 2024 +0000 + + upstream: Some awks won't match on the \r so delete it instead. Fixes + + regress in portable on, eg Solaris. + + OpenBSD-Regress-ID: 44a96d6d2f8341d89b7d5fff777502b92ac9e9ba + +commit 51c96b6ed627779a04493a8fe25747996a37f3c2 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed Aug 21 07:06:27 2024 +0000 + + upstream: Import regenerated moduli. + + OpenBSD-Commit-ID: 5db7049ad5558dee5b2079d3422e8ddab187c1cc + +commit 25c52f37a82c4da48ec537de37d7c168982b8d6d +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Wed Aug 21 06:59:08 2024 +0000 + + upstream: Use curve25519-sha256 kex where possible. + + Except where we're explicitly testing a different kex, use + curve25519-sha256 since it's faster than the default and supported even + when configured without OpenSSL. Add a check to ensure that the kex we + intended to test is the one we actually tested. Speeds test up by ~5%. + + OpenBSD-Regress-ID: 3b27fcc2ae953cb08fd82a0d3155c498b226d6e0 + +commit 3eb62b7ba49483c309b483eb9002a679014f3887 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 12:36:59 2024 +0000 + + upstream: Send only as much data as needed to trigger rekeying. Speeds + + up tests by about 10% in the common case, hopefully more when instrumented + with something like valgrind. + + OpenBSD-Regress-ID: 7bf9292b4803357efcf0baf7cfbdc8521f212da1 + +commit cbd3f034bbf7853618fac99d7d868a2250154ea7 +Author: Damien Miller <djm@mindrot.org> +Date: Wed Aug 21 09:18:29 2024 +1000 + + simplify sshkey_prekey_alloc(); always use mmap + +commit 4442bbc2fc661277a6dabfedb756a7e15ee8b8b8 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 09:15:49 2024 +0000 + + upstream: Merge AEAD test into main test loop. + + Removes 3 duplicate tests and speeds overall test up by about 1%. + + OpenBSD-Regress-ID: 5e5c9ff3f7588091ed369e34ac28520490ad2619 + +commit 829976a63fd1efae3a4c3e7c16fded59d92edb67 +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 09:02:45 2024 +0000 + + upstream: Set a default RekeyLimit of 256k. + + Used unless overridden by a command-line flag, which simplifies some of + the ssh command lines. + + OpenBSD-Regress-ID: e7cffa57027088e10336e412b34113969f88cb87 + +commit 57d02c9ea36aebad4e7146d46e041b6b2e582f7f +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 07:52:43 2024 +0000 + + upstream: Add Compression=no to default ssh_config. + + All of the rekey tests use it (otherwise the encrypted byte counts would + not match) so this lets us simplify the command lines. + + OpenBSD-Regress-ID: dab7ce10f4cf6c68827eb8658141272aab3ea262 + +commit 7254eb26f7c0772c4b47c3b32f6d1b15855cdd8c +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 07:41:35 2024 +0000 + + upstream: Remove duplicate curve25519-sha256 kex. + + curve25519-sha256@libssh.org is the pre-standardization name for the same + thing, so remove it as a duplicate. Speeds up test by a tiny amount. + + OpenBSD-Regress-ID: 5a5ee5fa1595a6e140b1cc16040bedf5996a5715 + +commit 749896b874928c2785256cae4d75161dc3bfcc7d +Author: dtucker@openbsd.org <dtucker@openbsd.org> +Date: Tue Aug 20 07:27:25 2024 +0000 + + upstream: Unnest rekey param parsing test and use ssh not sshd. + + ssh uses the same parsing code, now has "-G" to dump its config and is + slightly faster to start up. This speeds up the test slightly (~5%) in the + common case but should help more during instrumented tests, eg under + valgrind, where startup costs are magnified. + + OpenBSD-Regress-ID: 07c3acaf4c728e641033071f4441afc88141b0d0 + +commit 2b1762115481ff2b7a60fd4db2ae69b725437462 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Aug 20 11:10:04 2024 +0000 + + upstream: actually use the length parameter that was passed in rather + + than a constant (this makes no difference in practice because the length is + always the same); reported by martin AT nmkd.net + + OpenBSD-Commit-ID: 4aecce232c2fe9b16e9217ff6bcb3c848d853e7e + +commit d922762ca16a7381131b242f49d7376c41fabcb5 +Author: Damien Miller <djm@mindrot.org> +Date: Tue Aug 20 13:55:30 2024 +1000 + + private key coredump protection for Linux/FreeBSD + + platforms not supporting coredump exclusion using mmap/madvise flags + fall back to plain old malloc(3). + +commit cc048ca536d6bed6f2285b07040b0d57cd559ba5 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Tue Aug 20 03:48:30 2024 +0000 + + upstream: place shielded keys (i.e. keys at rest in RAM) into memory + + allocated using mmap(3) with MAP_CONCEAL set. This prevents exposure of the + key material in coredumps, etc (this is in addition to other measures we take + in this area). + + ok deraadt@ + + OpenBSD-Commit-ID: cbbae59f337a00c9858d6358bc65f74e62261369 + +commit a0b35c791cad1f85481b23ba46373060292e1c80 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sat Aug 17 08:35:04 2024 +0000 + + upstream: mention that ed25519 is the default key type generated and + + clarify that rsa-sha2-512 is the default signature scheme when RSA is in use. + Based on GHPR505 from SebastianRzk + + OpenBSD-Commit-ID: 1d90df71636a04601685d2a10a8233bcc8d4f4c5 + +commit 127a50f2c80572ed1a021feb11ecf941e92cbbef +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sat Aug 17 08:23:04 2024 +0000 + + upstream: fix minor memory leak in Subsystem option parsing; from + + Antonio Larrosa via GHPR515 + + OpenBSD-Commit-ID: fff3bbefd1b2c45c98cbe45c6b857b15d8a2d364 + +commit 171427261d2079941eb1041079dbae875da37cbc +Author: djm@openbsd.org <djm@openbsd.org> +Date: Sat Aug 17 08:09:50 2024 +0000 + + upstream: fix swapping of source and destination addresses in some sshd + + log messages + + OpenBSD-Commit-ID: 24d4cbb86325275df1f037545aa3b91456e52d25 + +commit 2a50a8f1fa57857a5e124a2280bcf61cc63c77f7 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Sat Aug 17 11:10:19 2024 +1000 + + Add compat functions for EVP_Digest{Sign,Verify}. + + This should make LibreSSL 3.1.x through 3.3.x work again. Code from + tb@, ok djm@. Restore the test configs covering those. + +commit 1c3a7145260e03037cc18715b883880836fd122d +Author: Philip Hands <phil@hands.com> +Date: Thu Aug 8 13:03:51 2024 +0200 + + make sure that usage & man page match + + SSH-Copy-ID-Upstream: da5b1abe55b72a16e0430e7598e1573da01779c0 + +commit cd0d681645b9adcf2467e7838bfd9d5142de4c4e +Author: Philip Hands <phil@hands.com> +Date: Thu Aug 8 13:01:47 2024 +0200 + + update copyright notices + + Bump the year to 2024, but also reflect the fact that hands.com Ltd. has + been wound up in the UK, and its assets (including this copyright) have + now reverted to its owner, Philip Hands. + + SSH-Copy-ID-Upstream: 0e4c4d072747a6568b11a790c29dd1b4ce663d7f + +commit 7fc9ccdce18841ebd0a97e31e43258512ab32a32 +Author: Philip Hands <phil@hands.com> +Date: Sun Aug 4 20:45:00 2024 +0200 + + restore optionality of -i's argument + + SSH-Copy-ID-Upstream: f70e3abb510e4eeb040b47894e41828246c1b720 + +commit c37aa7012b1a3c2c322fd19e71310aadc90fc674 +Author: Philip Hands <phil@hands.com> +Date: Fri Aug 2 15:52:07 2024 +0200 + + avoid exploring .ssh/id*.pub subdirectories + + SSH-Copy-ID-Upstream: 0b9e08b7707ad16de3c8e6a0410d9f42fbd56997 + +commit 777dce9e2e0d12f7e81e162f77749f30899869fe +Author: Philip Hands <phil@hands.com> +Date: Fri Aug 2 10:07:11 2024 +0200 + + ensure that we're always told the source of keys + + SSH-Copy-ID-Upstream: 1bee96f4793e8ec3fab9f9361204ae58f5cc7cae + +commit fb94fd2339848e40cad6c9bb42b822244cc1a7bc +Author: Philip Hands <phil@hands.com> +Date: Wed Jul 31 23:19:51 2024 +0200 + + add $HOME to ERROR if one cannot write to ~/.ssh + + SSH-Copy-ID-Upstream: ebef3e9c06e0447bff06e9d84b33023cf592e0ba + +commit eb5aafa1ffaeee75799141ec5ded406a65ec7d18 +Author: Philip Hands <phil@hands.com> +Date: Wed Jul 31 23:19:03 2024 +0200 + + assert that SCRATCH_DIR is a writable directory + + SSH-Copy-ID-Upstream: ecb2b9d10883b9a16df56c83896c9bb47a80cde2 + +commit abcc460a2af46f0d812f8433d97a8eae1d80724c +Author: Philip Hands <phil@hands.com> +Date: Wed Jul 31 23:17:54 2024 +0200 + + quote to avoid potential for word splitting + + SSH-Copy-ID-Upstream: f379adbe06ac2ef1daf0f130752234c7f8b97e3c + +commit b3f91411fd1473605f74c40c1a91a024c7171e27 +Author: Philip Hands <phil@hands.com> +Date: Wed Jul 31 23:15:11 2024 +0200 + + ensure ERROR output goes to STDERR + + SSH-Copy-ID-Upstream: ac394b05eead3b91feb7c2ae4129a3e9b892f1e2 + +commit 674b8f30f0dbacd787eb1e4e7e1ece34b5543d8f +Author: Philip Hands <phil@hands.com> +Date: Thu Aug 1 14:03:06 2024 +0200 + + avoid extra space when no arg given to -i option + + SSH-Copy-ID-Upstream: feca9e67e6e37c5653445d1c733569d7abb1770e + +commit 0efa0e1c41427c0c6ba839a18c72c1afcd7b7cc0 +Author: Philip Hands <phil@hands.com> +Date: Wed Jul 31 23:28:36 2024 +0200 + + put the -i before -[pP] (matching man pages) + + The man pages (ssh, sftp & ssh-copy-id) all list -i before the port + setting, so make the output match that order, which also seems more + natural with the port being next to the server. + + SSH-Copy-ID-Upstream: 34d5d614172c78f9a42249466c4b81975b8883a1 + +commit 87831345e9745f2d13bd7a4a7972809f6788f331 +Author: Shreyas Mahangade <smahanga@redhat.com> +Date: Mon Jul 29 15:26:05 2024 +0000 + + Minor space issue fixed + + SSH-Copy-ID-Upstream: 335e44d7be78b03962a54c3a5c99a2ff45294a54 + +commit 2f3010f4736b4b3f5c10a4be97a24e90ff04c5e7 +Author: Shreyas Mahangade <smahanga@redhat.com> +Date: Mon Jul 29 16:55:28 2024 +0530 + + Show identity file in 'ssh' command + + - Previously no identity file is shown in "ssh" command output on the line "Now try logging into the..." + - This commit makes sure whenever "ssh-copy-id" with "-i" is invoked, it also reflects in "ssh" command + + SSH-Copy-ID-Upstream: 58e022ec26cb2315eb3be581d01e0ba787082428 + +commit a13856374b894397a7682b32257ed0bf67cfede9 +Author: Damien Miller <djm@mindrot.org> +Date: Fri Aug 16 08:30:20 2024 +1000 + + more OPENSSL_HAS_ECC + +commit 4da2a1a7f648979bea6eaf3b17f5f250faed4afc +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 15 23:35:54 2024 +1000 + + fix merge botch that broke !OPENSSL_HAS_ECC + +commit 2c53d2f32b8e3992b61682c909ae5bc5122b6e5d +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 15 15:09:45 2024 +1000 + + missed OPENSSL_HAS_ECC case + +commit 342dd7a219f39119b8b686b5aaa99c8e15ede368 +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 15 15:06:55 2024 +1000 + + retire testing aginst older LibreSSL versions + + libressl prior to 3.4.x lack support for the EVP_DigestSign and + EVP_DigestVerify APIs that we need now that sshkey is converted + to EVP_PKEY. + + If someone makes a good case for why we should support these versions + then we could bring back support with wrappers. + +commit a7c6ea8eebe0f179141ec5dbf0c9e5354417930f +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 15 12:44:17 2024 +1000 + + sync TEST_MALLOC_OPTIONS for OpenBSD + +commit 60c2cf22e8f64f35d8b1175e4671257313f2e4d3 +Author: Damien Miller <djm@mindrot.org> +Date: Thu Aug 15 12:43:47 2024 +1000 + + remove gratuitious difference from OpenBSD + +commit 339c4fc60a6250429d41fa8713f783d82aad4551 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Aug 15 00:52:23 2024 +0000 + + upstream: adapt to EVP_PKEY conversion + + OpenBSD-Regress-ID: 0e2d4efb0ed0e392e23cd8fda183fe56531ac446 + +commit 63a94f99b9d7c8a48182a40192e45879d1ba8791 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Fri Jul 19 04:33:36 2024 +0000 + + upstream: test transfers in mux proxy mode too + + OpenBSD-Regress-ID: 2edfc980628cfef3550649cab8d69fa23b5cd6c4 + +commit 7bdfc20516e288b58c8c847958059c7b141eeff9 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Aug 15 00:51:51 2024 +0000 + + upstream: Convert RSA and ECDSA key to the libcrypto EVP_PKEY API. + + DSA remains unconverted as it will be removed within six months. + + Based on patches originally from Dmitry Belyavskiy, but significantly + reworked based on feedback from Bob Beck, Joel Sing and especially + Theo Buehler (apologies to anyone I've missed). + + ok tb@ + + OpenBSD-Commit-ID: d098744e89f1dc7e5952a6817bef234eced648b5 + +commit 0af06e2c5b898992a18c74333e75a0136506acc6 +Author: tobias@openbsd.org <tobias@openbsd.org> +Date: Wed Aug 14 15:42:18 2024 +0000 + + upstream: Reorder calloc arguments + + The first argument should be the amount, the second argument should be the + element size. Fixing this also silences some gcc compiler warnings for + portable. + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 711ad6f7bd7fb48bf52208f2cf9f108cddb6d41a + +commit 56ce0aa3c6cf28d9fcbce3207457abeac91b5050 +Author: tobias@openbsd.org <tobias@openbsd.org> +Date: Wed Aug 14 15:40:30 2024 +0000 + + upstream: Extend sshbuf validation + + Multiple sshbuf structs can be linked through a parent/child relationship. + Make sure that a single sshbuf cannot be its own parent. If this would ever + happen, it would result in reference counting issues. + + This is a cheap way of testing this with very little overhead. It does not + detect A->B->A linkages though for performance reason and the fact that it + takes a programming error for this to occur anyway. + + Authored with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: fb3fa9ee2cad3c7e842ebadfd7f5db220c4aaf16 + +commit fc48ddf6998188517af42dce807e2088b6a0c0be +Author: tobias@openbsd.org <tobias@openbsd.org> +Date: Wed Aug 14 15:37:11 2024 +0000 + + upstream: Use freezero for better readability + + It has the same meaning as the current pair of calling explicit_bzero + and free. Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 939fbe9ccf52d0d48c5fa53694d6f3bb9927970c + +commit 1ff6907ec26dac6ac59fe9fe232899a63b4c14d8 +Author: tobias@openbsd.org <tobias@openbsd.org> +Date: Wed Aug 14 15:35:23 2024 +0000 + + upstream: Fix typo in comment + + Spotted with Benny Baumann (BenBE at geshi dot org). + + ok djm@ + + OpenBSD-Commit-ID: 829160ac8ef3ad3409695ce3a3ade835061cae57 + +commit 487faaed8f3bb9ffb19e8f807a3da72895b16421 +Author: dlg@openbsd.org <dlg@openbsd.org> +Date: Wed Jul 31 12:00:18 2024 +0000 + + upstream: add a random amount of time (up to 4 seconds) to the + + grace login time. + + ok deraadt@ djm@ + + OpenBSD-Commit-ID: abd3c57aaa5861517529b322df79b6be35ee67f4 + +commit 2865f5b7520bed3e74fbbb5f8d7a44193d7a4314 +Author: naddy@openbsd.org <naddy@openbsd.org> +Date: Fri Jul 26 15:24:49 2024 +0000 + + upstream: document the reduced logingrace penalty + + OpenBSD-Commit-ID: 9b63e0e3599d524ddc10edc4f978081382c3548b + +commit 1ec0a64c5dc57b8a2053a93b5ef0d02ff8598e5c +Author: Darren Tucker <dtucker@dtucker.net> +Date: Sun Jul 28 21:26:51 2024 +1000 + + Explicitly install libssl-devel cygwin. + + Should fix CI tests for cygwin default config. + +commit 0bf6e5bb750b66b25c20a1c5a471f91850de3748 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Jul 25 23:44:01 2024 +0000 + + upstream: reduce logingrace penalty. + + A single forgotton login that times out should be below the penalty + threshold. + + ok deraadt/claudio + + OpenBSD-Commit-ID: cee1f7d17597c97bff8e5092af5d136fdb08f81d + +commit 29fb6f6d46b67770084b4f12bcf8a01bd535041b +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Jul 25 22:40:08 2024 +0000 + + upstream: Fix proxy multiplexing (-O proxy) bug + + If a mux started with ControlPersist then later has a forwarding added using + mux proxy connection and the forwarding was used, then when the mux proxy + session terminates, the mux master process will send a channel close to the + server with a bad channel ID and crash the connection. + + This was caused by my stupidly reusing c->remote_id for mux channel + associations when I should have just added another member to struct channel. + + ok markus@ + + OpenBSD-Commit-ID: c9f474e0124e3fe456c5e43749b97d75e65b82b2 + +commit 53d1d307438517805989c7d5616d752739a97e03 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Jul 18 01:47:27 2024 +0000 + + upstream: mention mux proxy mode + + OpenBSD-Commit-ID: fd77a77779f06d316a314e4540dc57c93fc3369a + +commit a9b90859d252c2f5a24142f985d38610ac74685f +Author: jsg@openbsd.org <jsg@openbsd.org> +Date: Sun Jul 14 10:19:23 2024 +0000 + + upstream: fix double word; ok dtucker@ + + OpenBSD-Commit-ID: e6aff005914fa350b896d2be030be3d3b56ec0e8 + +commit b05fda224bbcd2f641254534ed2175c42487f3c8 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Jul 25 17:59:35 2024 +1000 + + Check for SA_RESTART before using it. + + ok djm@ + +commit c276672fc0e99f0c4389988d54a84c203ce325b6 +Author: Yuichiro Naito <naito.yuichiro@gmail.com> +Date: Wed Sep 1 10:19:32 2021 +0900 + + Class-imposed login restrictions + + If the following functions are available, + add an additional check if users are allowed to login imposed by login class. + + * auth_hostok(3) + * auth_timeok(3) + + These functions are implemented on FreeBSD. + +commit 7717b9e9155209916cc6b4b4b54f4e8fa578e889 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Wed Jul 10 21:58:34 2024 +0000 + + upstream: correct keyword; from Yatao Su via GHPR509 + + OpenBSD-Commit-ID: 81c778c76dea7ef407603caa157eb0c381c52ad2 + +commit f2b78bb8f149d6b4d1f62c21aa1f06995dccf4ce +Author: djm@openbsd.org <djm@openbsd.org> +Date: Mon Jul 8 03:04:34 2024 +0000 + + upstream: don't need return at end of void function + + OpenBSD-Commit-ID: 42d322d37f13aa075ae7b1ad9eef591e20b89717 + +commit a395d37a813c0177cb5bfc4bebf5a52badb73cf0 +Author: djm@openbsd.org <djm@openbsd.org> +Date: Thu Jul 4 22:53:59 2024 +0000 + + upstream: fix grammar: "a pattern lists" -> "one or more pattern + + lists" + + OpenBSD-Commit-ID: f3c844763398faa9800687e8ff6621225498202a + +commit 8b664df75966e5aed8dabea00b8838303d3488b8 +Author: Darren Tucker <dtucker@dtucker.net> +Date: Sun Jul 7 18:46:19 2024 +1000 + + Cast to sockaddr * in systemd interface. + + Fixes build with musl libx. bz#3707. + +commit 30c8c81da2169e78357d08dbb0ddd823b60e93bc +Author: Darren Tucker <dtucker@dtucker.net> +Date: Thu Jul 4 20:12:26 2024 +1000 + + Add 9.8 branch to ci-status page. + +commit ee6b9e661633fcefd29dba0c811cecbc4d027f6f +Author: Samuel Thibault <samuel.thibault@ens-lyon.org> +Date: Tue Mar 26 22:15:08 2024 +0100 + + Fix detection of setres*id on GNU/Hurd + + Like Linux, proper _SOURCE macros need to be set to get declarations of + various standard functions, notably setres*id. Now that Debian is using + -Werror=implicit-function-declaration this is really required. While at + it, define other _SOURCE macros like on GNU/Linux, since GNU/Hurd uses + the same glibc. + commit fa41f6592ff1b6ead4a652ac75af31eabb05b912 Author: Damien Miller <djm@mindrot.org> Date: Mon Jul 1 14:33:26 2024 +1000 @@ -7599,1068 +8674,3 @@ Date: Mon Sep 19 21:39:16 2022 +0000 -o; spotted by jmc@ OpenBSD-Commit-ID: fe871408cf6f9d3699afeda876f8adbac86a035e - -commit 5f954929e9f173dd1e279e07d0e8b14fa845814d -Author: Damien Miller <djm@mindrot.org> -Date: Mon Sep 19 20:59:34 2022 +1000 - - no need for glob.h here - - it also causes portability problems - -commit 03d94a47207d58b3db37eba4f87eb6ae5a63168a -Author: Damien Miller <djm@mindrot.org> -Date: Mon Sep 19 20:59:04 2022 +1000 - - avoid Wuninitialized false positive in gcc-12ish - -commit 9d952529113831fb3071ab6e408d2726fd72e771 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Sep 19 10:46:00 2022 +0000 - - upstream: use users-groups-by-id@openssh.com sftp-server extension - - (when available) to fill in user/group names for directory listings. - Implement a client-side cache of see uid/gid=>user/group names. ok markus@ - - OpenBSD-Commit-ID: f239aeeadfa925a37ceee36ee8b256b8ccf4466e - -commit 8ff680368b0bccf88ae85d4c99de69387fbad7a6 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Sep 19 10:43:12 2022 +0000 - - upstream: sftp client library support for - - users-groups-by-id@openssh.com; ok markus@ - - OpenBSD-Commit-ID: ddb2f33a2da6349a9a89a8b5bcb9ca7c999394de - -commit 488f6e1c582212c2374a4bf8cd1b703d2e70fb8b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Sep 19 10:41:58 2022 +0000 - - upstream: extend sftp-common.c:extend ls_file() to support supplied - - user/group names; ok markus@ - - OpenBSD-Commit-ID: c70c70498b1fdcf158531117e405b6245863bfb0 - -commit 74b77f7497dba3a58315c8f308883de448078057 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Sep 19 10:40:52 2022 +0000 - - upstream: sftp-server(8): add a "users-groups-by-id@openssh.com" - - extension request that allows the client to obtain user/group names that - correspond to a set of uids/gids. - - Will be used to make directory listings more useful and consistent - in sftp(1). - - ok markus@ - - OpenBSD-Commit-ID: 7ebabde0bcb95ef949c4840fe89e697e30df47d3 - -commit 231a346c0c67cc7ca098360f9a554fa7d4f1eddb -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Sep 19 08:49:50 2022 +0000 - - upstream: better debugging for connect_next() - - OpenBSD-Commit-ID: d16a307a0711499c971807f324484ed3a6036640 - -commit 1875042c52a3b950ae5963c9ca3774a4cc7f0380 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Sep 17 10:34:29 2022 +0000 - - upstream: Add RequiredRSASize for sshd(8); RSA keys that fall - - beneath this limit will be ignored for user and host-based authentication. - - Feedback deraadt@ ok markus@ - - OpenBSD-Commit-ID: 187931dfc19d51873df5930a04f2d972adf1f7f1 - -commit 54b333d12e55e6560b328c737d514ff3511f1afd -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Sep 17 10:33:18 2022 +0000 - - upstream: add a RequiredRSASize for checking RSA key length in - - ssh(1). User authentication keys that fall beneath this limit will be - ignored. If a host presents a host key beneath this limit then the connection - will be terminated (unfortunately there are no fallbacks in the protocol for - host authentication). - - feedback deraadt, Dmitry Belyavskiy; ok markus@ - - OpenBSD-Commit-ID: 430e339b2a79fa9ecc63f2837b06fdd88a7da13a - -commit 07d8771bacfefbcfb37fa8a6dc6103bcc097e0ab -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Sep 17 10:30:45 2022 +0000 - - upstream: Add a sshkey_check_rsa_length() call for checking the - - length of an RSA key; ok markus@ - - OpenBSD-Commit-ID: de77cd5b11594297eda82edc594b0d32b8535134 - -commit 3991a0cf947cf3ae0f0373bcec5a90e86a7152f5 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Sat Sep 17 10:11:29 2022 +0000 - - upstream: actually hook up restrict_websafe; the command-line flag - - was never actually used. Spotted by Matthew Garrett - - OpenBSD-Commit-ID: 0b363518ac4c2819dbaa3dfad4028633ab9cdff1 - -commit 30b2a7e4291fb9e357f80a237931ff008d686d3b -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Sep 16 06:55:37 2022 +0000 - - upstream: correct error value - - OpenBSD-Commit-ID: 780efcbad76281f11f14b2a5ff04eb6db3dfdad4 - -commit ac1ec9545947d9f9657259f55d04cb49d3a94c8a -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Sep 16 03:33:14 2022 +0000 - - upstream: sftp: Be a bit more clever about completions - - There are commands (e.g. "get" or "put") that accept two - arguments, a local path and a remote path. However, the way - current completion is written doesn't take this distinction into - account and always completes remote or local paths. - - By expanding CMD struct and "cmds" array this distinction can be - reflected and with small adjustment to completer code the correct - path can be completed. - - By Michal Privoznik, ok dtucker@ - - OpenBSD-Commit-ID: 1396d921c4eb1befd531f5c4a8ab47e7a74b610b - -commit 590db83384f9d99fc51c84505792d26d1ef60df9 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Sep 16 03:13:34 2022 +0000 - - upstream: sftp: Don't attempt to complete arguments for - - non-existent commands - - If user entered a non-existent command (e.g. because they made a - typo) there is no point in trying to complete its arguments. Skip - calling complete_match() if that's the case. - - From Michal Privoznik - - OpenBSD-Commit-ID: cf39c811a68cde2aeb98fc85addea4000ef6b07a - -commit ff9809fdfd1d9a91067bb14a77d176002edb153c -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Sep 14 00:14:37 2022 +0000 - - upstream: sk_enroll: never drop SSH_SK_USER_VERIFICATION_REQD flag - - from response - - Now that all FIDO signing calls attempt first without PIN and then - fall back to trying PIN only if that attempt fails, we can remove the - hack^wtrick that removed the UV flag from the keys returned during - enroll. - - By Corinna Vinschen - - OpenBSD-Commit-ID: 684517608c8491503bf80cd175425f0178d91d7f - -commit 940dc10729cb5a95b7ee82c10184e2b9621c8a1d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Sep 14 00:13:13 2022 +0000 - - upstream: a little extra debugging - - OpenBSD-Commit-ID: edf1601c1d0905f6da4c713f4d9cecc7d1c0295a - -commit 4b5f91cb959358141181b934156513fcb8a6c1e3 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Sep 14 00:02:03 2022 +0000 - - upstream: ssh-agent: attempt FIDO key signing without PIN and use - - the error to determine whether a PIN is required and prompt only if - necessary. from Corinna Vinschen - - OpenBSD-Commit-ID: dd6be6a0b7148608e834ee737c3479b3270b00dd - -commit 113523bf0bc33600b07ebb083572c8c346b6fdf4 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Sun Sep 11 06:38:11 2022 +0000 - - upstream: .Li -> .Vt where appropriate; from josiah frentsos, - - tweaked by schwarze - - ok schwarze - - OpenBSD-Commit-ID: 565046e3ce68b46c2f440a93d67c2a92726de8ed - -commit 86af013b56cecb5ee58ae0bd9d495cd586fc5918 -Author: jsg@openbsd.org <jsg@openbsd.org> -Date: Sat Sep 10 08:50:53 2022 +0000 - - upstream: fix repeated words ok miod@ jmc@ - - OpenBSD-Commit-ID: 6765daefe26a6b648cc15cadbbe337596af709b7 - -commit 0ba39b93b326a7d5dfab776cc9b9d326161a9b16 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Sep 9 03:31:42 2022 +0000 - - upstream: notifier_complete(NULL, ...) is a noop, so no need to test - - that ctx!=NULL; from Corinna Vinschen - - OpenBSD-Commit-ID: ade2f2e9cc519d01a586800c25621d910bce384a - -commit be197635329feb839865fdc738e34e24afd1fca8 -Author: Sam James <sam@gentoo.org> -Date: Thu Sep 8 02:49:29 2022 +0100 - - openbsd-compat/bsd-asprintf: add <stdio.h> include for vsnprintf - - Fixes the following build failure with Clang 15 on musl: - ``` - bsd-asprintf.c:51:8: error: call to undeclared library function 'vsnprintf' with type 'int (char *, unsigned long, const char *, struct __va_list_tag *)'; ISO C99 and laterclang -O2 -pipe -fdiagnostics-color=always -frecord-gcc-switches -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -Wmisleading-indentation -Wbitwise-instead-of-logical -fno-strict-aliasing -mretpoline -ftrapv -fzero-call-used-regs=all -fno-builtin-memset -fstack-protector-strong -fPIE -I. -I. -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -DSSHDIR=\"/etc/ssh\" -D_PATH_SSH_PROGRAM=\"/usr/bin/ssh\" -D_PATH_SSH_ASKPASS_DEFAULT=\"/usr/lib/misc/ssh-askpass\" -D_PATH_SFTP_SERVER=\"/usr/lib/misc/sftp-server\" -D_PATH_SSH_KEY_SIGN=\"/usr/lib/misc/ssh-keysign\" -D_PATH_SSH_PKCS11_HELPER=\"/usr/lib/misc/ssh-pkcs11-helper\" -D_PATH_SSH_SK_HELPER=\"/usr/lib/misc/ssh-sk-helper\" -D_PATH_SSH_PIDDIR=\"/run\" -D_PATH_PRIVSEP_CHROOT_DIR=\"/var/empty\" -DHAVE_CONFIG_H -c cipher-aes.c -o cipher-aes.o - do not support - implicit function declarations [-Wimplicit-function-declaration] - ret = vsnprintf(string, INIT_SZ, fmt, ap2); - ^ - bsd-asprintf.c:51:8: note: include the header <stdio.h> or explicitly provide a declaration for 'vsnprintf' - 1 error generated. - ``` - -commit 6cb6f660bb35f77a0456dd2581ddf39c29398a5e -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Sep 2 16:43:27 2022 +1000 - - Remove DEF_WEAK, it's already in defines.h. - -commit ce39e7d8b70c4726defde5d3bc4cb7d40d131153 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Sep 2 14:28:14 2022 +1000 - - Resync arc4random with OpenBSD. - - This brings us up to current, including djm's random-reseeding change, - as prompted by logan at cyberstorm.mu in bz#3467. It brings the - platform-specific hooks from LibreSSL Portable, simplified to match our - use case. ok djm@. - -commit beaddde26f30e2195b8aa4f3193970e140e17305 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Sep 2 14:20:04 2022 +1000 - - Move OPENBSD ORIGINAL marker. - - Putting this after the copyright statement (which doesn't change) - instead of before the version identifier (which does) prevents merge - conflicts when resyncing changes. - -commit c83e467ead67a8cb48ef4bec8085d6fb880a2ff4 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Sep 2 14:17:28 2022 +1000 - - Remove arc4random_uniform from arc4random.c - - This was previously moved into its own file (matching OpenBSD) which - prematurely committed in commit 73541f2. - -commit 5f45c2395c60865e59fa44152ff1d003a128c5bc -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Sep 2 04:20:02 2022 +0000 - - upstream: sk-usbhid: fix key_lookup() on tokens with built-in UV - - explicitly test whether the token performs built-in UV (e.g. biometric - tokens) and enable UV in that case. From Pedro Martelletto via GHPR#388 - - OpenBSD-Commit-ID: 007eb7e387d27cf3029ab06b88224e03eca62ccd - -commit 03277a4aa49b80af541a3e691f264c0c0d8f9cec -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Aug 31 20:26:30 2022 +1000 - - Move sftp from valgrind-2 to 3 to rebalance. - -commit fcf5365da69c516817321ba89c3a91df98d098df -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Aug 31 02:56:40 2022 +0000 - - upstream: whitespace - - OpenBSD-Commit-ID: c2bcbf93610d3d62ed206cdf9bf9ff98c6aaf232 - -commit e60136a3d7a223dd8e84ba8a6895bc3142360993 -Author: Damien Miller <djm@mindrot.org> -Date: Mon Aug 29 13:27:45 2022 +1000 - - additional keys - -commit 2b02dcb505288c462d1b5dd1ac04e603d01340eb -Author: Damien Miller <djm@mindrot.org> -Date: Mon Aug 29 13:23:43 2022 +1000 - - cross-sign allowed_signers with PGP key - - Provides continuity of trust from legacy PGP release key to - the SSHSIG signing keys that we will use henceforth for git - signing. - -commit 51b345f177ae981b8755f6bdf8358b1cc5e83d67 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sat Aug 27 21:49:27 2022 +1000 - - Add libcrypt-devel to cygwin-release deps. - - Based on feedback from vinschen at redhat.com. - -commit 9f81736cf16dd8dda1c8942f1973a5f80b8cd78c -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sat Aug 27 09:37:40 2022 +1000 - - Add Windows 2022 test targets. - -commit 85e1a69243f12be8520438ad6a3cfdc0b7fcbb2d -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 26 16:26:06 2022 +1000 - - Add cygwin-release test target. - - This also moves the cygwin package install from the workflow file to - setup_ci.sh so that we can install different sets of Cygwin packages - for different test configs. - -commit 92382dbe8bf9ea1225b16858f9b9b208c15c7e8d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 26 08:16:27 2022 +0000 - - upstream: whitespace - - OpenBSD-Commit-ID: a5d015efbfd228dc598ffdef612d2da3a579e5d8 - -commit 70a5de0a50e84d7250eb4e4537f765599f64c4af -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 26 08:12:56 2022 +0000 - - upstream: whitespace - - OpenBSD-Commit-ID: d297e4387935d4aef091c5e9432578c2e513f538 - -commit 3a683a19fd116ea15ebf8aa13d02646cceb302a9 -Author: Damien Miller <djm@mindrot.org> -Date: Fri Aug 26 14:23:55 2022 +1000 - - initial list of allowed signers - -commit 6851f4b8c3fc1b3e1114c56106e4dc31369c8513 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 19 17:22:18 2022 +1000 - - Install Cygwin packages based on OS not config. - -commit f96480906893ed93665df8cdf9065865c51c1475 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 19 06:07:47 2022 +0000 - - upstream: attemp FIDO key signing without PIN and use the error - - code returned to fall back only if necessary. Avoids PIN prompts for FIDO - tokens that don't require them; part of GHPR#302 - - OpenBSD-Commit-ID: 4f752aaf9f2e7c28bcaaf3d4f8fc290131bd038e - -commit 5453333b5d28e313284cb9aae82899704103f98d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 19 05:53:28 2022 +0000 - - upstream: remove incorrect check that can break enrolling a - - resident key (introduced in r1.40) - - OpenBSD-Commit-ID: 4cab364d518470e29e624af3d3f9ffa9c92b6f01 - -commit ff89b1bed80721295555bd083b173247a9c0484e -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Fri Aug 19 04:02:46 2022 +0000 - - upstream: Strictly enforce the maximum allowed SSH2 banner size in - - ssh-keyscan and prevent a one-byte buffer overflow. Patch from Qualys, ok - djm@ - - OpenBSD-Commit-ID: 6ae664f9f4db6e8a0589425f74cd0bbf3aeef4e4 - -commit 1b470b9036639cef4f32fb303bb35ea0b711178d -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 19 15:18:09 2022 +1000 - - Fix cygwin conditional steps. - -commit fd6ee741ab16714b7035d60aca924123ba28135a -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 19 15:12:57 2022 +1000 - - Add a bit more debug output. - -commit a9305c4c739f4d91a3d3a92c0b6d4949404a36c5 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 12 15:08:47 2022 +1000 - - Add Cygwin (on windows-2019) test target. - - In addition to installing the requisite Cygwin packages, we also need to - explicitly invoke "sh" for steps that run other scripts since the runner - environment doesn't understand #! paths. - -commit 5062ad48814b06162511c4f5924a33d97b6b2566 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 19 03:06:30 2022 +0000 - - upstream: double free() in error path; from Eusgor via GHPR333 - - OpenBSD-Commit-ID: 39f35e16ba878c8d02b4d01d8826d9b321be26d4 - -commit 5a5c580b48fc6006bdfa731fc2f6d4945c2c0e4e -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 18 21:36:39 2022 +1000 - - Check for perms to run agent-getpeereid test. - - Ubuntu 22.04 defaults to private home dirs which prevents "nobody" - running ssh-add during the agent-getpeereid test. Check for this and - add the necessary permissions. - -commit cd06a76b7ccc706e2bb4f1cc4aa9e9796a28a812 -Author: Damien Miller <djm@mindrot.org> -Date: Wed Aug 17 16:04:16 2022 +1000 - - on Cygwin, prefer WinHello FIDO device - - If no FIDO device was explictly specified, then prefer the - windows://hello FIDO device. An exception to this is when - probing resident FIDO keys, in which case hardware FIDO - devices are preferred. - -commit 47f72f534ac5cc2cd3027675a3df7b00a8f77575 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Aug 17 06:01:57 2022 +0000 - - upstream: add an extra flag to sk_probe() to indicate whether we're - - probing for a FIDO resident key or not. Unused here, but will make like - easier for portable - - OpenBSD-Commit-ID: 432c8ff70e270378df9dbceb9bdeaa5b43b5a832 - -commit edb0bcb3c79b16031dc87a8e57aecc3c4a3414f0 -Author: jmc@openbsd.org <jmc@openbsd.org> -Date: Tue Aug 16 20:24:08 2022 +0000 - - upstream: use .Cm for "sign"; from josiah frentsos - - OpenBSD-Commit-ID: 7f80a53d54857ac6ae49ea6ad93c5bd12231d1e4 - -commit cccb011e130cbbac538b1689d10e4a067298df8b -Author: Corinna Vinschen <vinschen@redhat.com> -Date: Thu Aug 11 20:19:35 2022 +0200 - - Revert "check_sk_options: add temporary WinHello workaround" - - Cygwin now comes with libfido2 1.11.0, so this workaround - isn't required anymore. - - This reverts commit 242c044ab111a37aad3b0775727c36a4c5f0102c. - - Signed-off-by: Corinna Vinschen <vinschen@redhat.com> - -commit 9468cd7cf9d989dfa2ac20e2a0268ba6e93bfa5a -Author: Corinna Vinschen <vinschen@redhat.com> -Date: Thu Aug 11 20:18:17 2022 +0200 - - fido_dev_is_winhello: return 0, not "false" - - "false" is not used anywhere in OpenSSH, so return 0 like - everywhere else. - - Signed-off-by: Corinna Vinschen <vinschen@redhat.com> - -commit 730a80609472ee0451c99482d75c9c41f3ebc42d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 12 05:20:28 2022 +0000 - - upstream: sftp-server: support home-directory request - - Add support to the sftp-server for the home-directory extension defined - in draft-ietf-secsh-filexfer-extensions-00. This overlaps a bit with the - existing expand-path@openssh.com, but uses a more official protocol name, - and so is a bit more likely to be implemented by non-OpenSSH clients. - - From Mike Frysinger, ok dtucker@ - - OpenBSD-Commit-ID: bfc580d05cc0c817831ae7ecbac4a481c23566ab - -commit 5e820bf79ce3ce99ef7e98b0ab642b0a0a4f396c -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 12 14:56:55 2022 +1000 - - Replace deprecated ubuntu-18.04 runners with 22.04 - -commit 87b0d9c1b789d3ff958ec45df2ac912e24461bae -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 11 22:48:23 2022 +1000 - - Add a timegm implementation from Heimdal via Samba. - - Fixes build on (at least Solaris 10). - -commit d0c4fa58594577994921b593f10037c5282597ca -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 11 14:23:58 2022 +1000 - - Rerun tests if any .github config file changes. - -commit 113fe6c77ab43769fc61e953d07cb619fd7ea54b -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 11 13:33:51 2022 +1000 - - Skip hostbased during Valgrind tests. - - Valgrind doesn't let ssh exec ssh-keysign (because it's setuid) so skip - it during the Valgrind based tests. - - See https://bugs.kde.org/show_bug.cgi?id=119404 for a discussion of this - (ironically there the problematic binary was ssh(1) back when it could - still be setuid). - -commit b98a42afb69d60891eb0488935990df6ee571c4d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Aug 11 01:57:50 2022 +0000 - - upstream: add some tests for parse_absolute_time(), including cases - - where it is forced to the UTC timezone. bz3468 ok dtucker - - OpenBSD-Regress-ID: ea07ca31c2f3847a38df028ca632763ae44e8759 - -commit ec1ddb72a146fd66d18df9cd423517453a5d8044 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Thu Aug 11 01:56:51 2022 +0000 - - upstream: allow certificate validity intervals, sshsig verification - - times and authorized_keys expiry-time options to accept dates in the UTC time - zone in addition to the default of interpreting them in the system time zone. - YYYYMMDD and YYMMDDHHMM[SS] dates/times will be interpreted as UTC if - suffixed with a 'Z' character. - - Also allow certificate validity intervals to be specified in raw - seconds-since-epoch as hex value, e.g. -V 0x1234:0x4567890. This - is intended for use by regress tests and other tools that call - ssh-keygen as part of a CA workflow. - - bz3468 ok dtucker - - OpenBSD-Commit-ID: 454db1cdffa9fa346aea5211223a2ce0588dfe13 - -commit 4df246ec75751da7eb925e1880498300d8bda187 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 11 10:23:55 2022 +1000 - - Fix conditional for running hostbased tests. - -commit 2580916e48721802220c61ce9e0df1297c00bc07 -Author: Damien Miller <djm@mindrot.org> -Date: Thu Aug 11 08:58:28 2022 +1000 - - fix SANDBOX_SECCOMP_FILTER_DEBUG - -commit fdbd5bf507fc271ff813714fab8a72ff2c6cb5ca -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Aug 10 17:35:52 2022 +1000 - - Test hostbased auth on github runners. - -commit 7e2f51940ba48a1c0fae1107801ea643fa83c971 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Aug 10 17:25:24 2022 +1000 - - Rename our getentropy to prevent possible loops. - - Since arc4random seeds from getentropy, and we use OpenSSL for that - if enabled, there's the possibility that if we build on a system that - does not have getentropy then run on a system that does have it, then - OpenSSL could end up calling our getentropy and getting stuck in a loop. - Pointed out by deraadt@, ok djm@ - -commit 7a01f61be8d0aca0e975e7417f26371495fe7674 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Mon Aug 8 12:17:04 2022 +1000 - - Actually put HAVE_STDINT_H around the stdint.h. - -commit 73541f29f0b50480da6c20dceb7a7191bd8ea7d3 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Mon Aug 8 10:30:34 2022 +1000 - - Give unused param a name. - - Fixes builds on platforms that do have fido2 but don't have - fido_dev_is_winhello. - -commit 2a108c0ea960381bd9b14ee0d84e818a23df4482 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Aug 5 05:01:40 2022 +0000 - - upstream: don't prompt for FIDO passphrase before attempting to enroll - - the credential, just let the enroll operating fail and we'll attempt to get a - PIN anyway. Might avoid some unneccessary PIN prompts. - - Part of GHPR#302 from Corinna Vinschen; ok dtucker@ - - OpenBSD-Commit-ID: bd5342ffc353ee37d39617906867c305564d1ce2 - -commit 2886975c0ad9244e60dc5e4be34fde3aa573a4b5 -Author: Corinna Vinschen <vinschen@redhat.com> -Date: Fri Feb 11 14:33:41 2022 +0100 - - sk_sign: set FIDO2 uv attribute explicitely for WinHello - - WinHello via libfido2 performs user verification by default. - However, if we stick to that, there's no way to differentiate - between keys created with or without "-O verify-required". - Set FIDO2 uv attribute explicitely to FIDO_OPT_FALSE, then check - if user verification has been requested. - - Signed-off-by: Corinna Vinschen <vinschen@redhat.com> - -commit 242c044ab111a37aad3b0775727c36a4c5f0102c -Author: Corinna Vinschen <vinschen@redhat.com> -Date: Tue Feb 15 11:28:08 2022 +0100 - - check_sk_options: add temporary WinHello workaround - - Up to libfido 1.10.0, WinHello advertises "clientPin" rather - than "uv" capability. This is fixed in 1.11.0. For the time - being, workaround it here. - - Signed-off-by: Corinna Vinschen <vinschen@redhat.com> - -commit 78774c08cc4b4997382975b0f414a86e06b6780c -Author: Corinna Vinschen <vinschen@redhat.com> -Date: Thu Feb 10 18:19:29 2022 +0100 - - compat code for fido_dev_is_winhello() - - Signed-off-by: Corinna Vinschen <vinschen@redhat.com> - -commit 3d3a932a019aedfb891e0779bb4990cd5008a390 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Aug 5 13:12:27 2022 +1000 - - Factor out getrnd() and rename to getentropy(). - - Factor out the arc4random seeding into its own file and change the - interface to match getentropy. Use native getentropy if available. - This will make it easier to resync OpenBSD changes to arc4random. - Prompted by bz#3467, ok djm@. - -commit 9385d277b787403be9dfcb229cf372202496d2f3 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Aug 4 18:55:48 2022 +1000 - - Include CHANNEL and FIDO2 libs in configure output - -commit 141535b904b6fba01724444f38193a8599201f82 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Mon Aug 1 11:09:26 2022 +0000 - - upstream: avoid double-free in error path introduced in r1.70; report - - and fix based on GHPR#332 by v-rzh ok dtucker@ - - OpenBSD-Commit-ID: 3d21aa127b1f37cfc5bdc21461db369a663a951f - -commit dba7099ffcba3ca07b3946f017ba6a4c3158d9b1 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jul 27 18:40:12 2022 +1000 - - Remove deprecated MacOS 10.15 runners. - -commit 722a56439aa5972c830e4a9a724cf52aff4a950a -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jul 27 18:31:14 2022 +1000 - - Move stale-configure check as early as possible. - - We added a check in Makefile to catch the case where configure needs to - be rebuilt, however this did not happen until a build was attempted in - which case all of the work done by configure was wasted. Move this check - to the start of configure to catch it as early as possible. ok djm@ - -commit 099d6b56288b421ba38531d26dc1bd6bb685e311 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 22 10:47:19 2022 +1000 - - Move libcrypto into CHANNELLIBS. - - This will result in sftp, sftp-server and scp no longer being linked - against libcrypto. ok djm@ - -commit 1bdf86725b77733bb5f17c54888b88a10b2f6538 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 22 10:45:47 2022 +1000 - - Remove seed_rng calls from scp, sftp, sftp-server. - - These binaries don't use OpenSSL's random functions. The next step - will be to stop linking them against libcrypto. ok djm@ - -commit d73f77b8cb9b422f1ac4facee7890aa10ff2bc21 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 22 09:51:51 2022 +1000 - - Group libcrypto and PRNGD checks together. - - They're related more than the libcrypt or libiaf checks which are - currently between them. ok djm@ - -commit f117e372b3f42f2fbdb0a578d063b2609ab58e1f -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 22 09:24:45 2022 +1000 - - Do not link scp, sftp and sftp-server w/ zlib. - - Some of our binaries (eg sftp, sftp-server, scp) do not interact with - the channels code and thus do use libraries such as zlib and libcrypto - although they are linked with them. This adds a CHANNELLIBS and starts - by moving zlib into it, which means the aformentioned binaries are no - longer linked against zlib. ok djm@ - -commit 800c2483e68db38bd1566ff69677124be974aceb -Author: Darren Tucker <dtucker@dtucker.net> -Date: Mon Jul 25 21:49:04 2022 +1000 - - Remove workarounds for OpenSSL missing AES-CTR. - - We have some compatibility hacks that were added to support OpenSSL - versions that do not support AES CTR mode. Since that time, however, - the minimum OpenSSL version that we support has moved to 1.0.1 which - *does* have CTR, so this is no longer needed. ok djm@ - -commit b7c56b65c12f51fe0dbae798d19c8f58224a5d95 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Mon Jul 25 21:43:00 2022 +1000 - - Remove workarounds for OpenSSL missing AES-GCM. - - We have some compatibility hacks that were added to support OpenSSL - versions that do not support AES GCM mode. Since that time, however, - the minimum OpenSSL version that we support has moved to 1.0.1 which - *does* have GCM, so this is no longer needed. ok djm@ - -commit 5a4a9f7a968fbf92cc1eac519c65638e79ae9f1f -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Mon Jul 25 07:12:45 2022 +0000 - - upstream: Restore missing "!" in TEST_SSH_ELAPSED_TIMES test. - - OpenBSD-Regress-ID: 38783f9676ec348c5a792caecee9a16e354b37b0 - -commit 0ff886be132299386cc29d87c2aa16ff68a1aa08 -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Sun Jul 24 23:29:10 2022 +0000 - - upstream: Test TEST_SSH_ELAPSED_TIMES for empty string not - - executable. No-op on most platforms but should prevent warnings in -portable - on systems that don't have 'date %s'. - - OpenBSD-Regress-ID: e39d79867b8065e33d0c5926fa1a31f85659d2a4 - -commit f69319ad8ad1dd50f90bbcf5912e11cc8ed3e037 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sat Jul 23 14:38:22 2022 +1000 - - Convert "have_prog" function into "which". - - "which" and its behaviour is not standardized, so convert the existing - have_prog function into "which" so we can rely on it being available - and what its semantics are. Add a have_prog wrapper that maintains the - existing behaviour. - -commit ea7ecc2c3ae39fdf5c6ad97b7bc0b47a98847f43 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sat Jul 23 14:36:38 2022 +1000 - - Skip scp3 test if there's no scp on remote path. - - scp -3 ends up using the scp that's in the remote path and will fail if - one is not available. Based on a patch from rapier at psc.edu. - -commit c46f6fed419167c1671e4227459e108036c760f8 -Author: Damien Miller <djm@mindrot.org> -Date: Wed Jul 20 13:39:14 2022 +1000 - - crank SSH_SK_VERSION_MAJOR in sk-dummy.so - -commit f208e3b9ffb5ee76cf9c95df7ff967adc7f51c7d -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jul 20 03:33:22 2022 +0000 - - upstream: ssh-keygen: fix touch prompt, pin retries; - - part of GHPR329 from Pedro Martelletto - - OpenBSD-Commit-ID: 75d1005bd2ef8f29fa834c90d2684e73556fffe8 - -commit 8638a2ce7e90c8a51d9af3143404282126c524f8 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jul 20 03:31:42 2022 +0000 - - upstream: sk-usbhid: preserve error code returned by key_lookup() - - it conveys useful information, such as the supplied pin being wrong. - - Part of GHPR329 from Pedro Martelletto - - OpenBSD-Commit-ID: c0647eb9290f793add363d81378439b273756c1b - -commit 9ab929ca2d820520327b41929372bcb9e261534c -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jul 20 03:29:14 2022 +0000 - - upstream: when enrolling a resident key on a security token, check - - if a credential with matching application and user ID strings already exists. - if so, prompt the user for confirmation before overwriting the credential. - - patch from Pedro Martelletto via GHPR329 - - NB. cranks SSH_SK_VERSION_MAJOR, so any third-party FIDO middleware - implementations will need to adjust - - OpenBSD-Commit-ID: e45e9f1bf2b2f32d9850669e7a8dbd64acc5fca4 - -commit 5bcfc788b38d5b64e4c347bdc04bd9a01bbc36da -Author: djm@openbsd.org <djm@openbsd.org> -Date: Wed Jul 20 03:13:04 2022 +0000 - - upstream: pull passphrase reading and confirmation into a separate - - function so it can be used for FIDO2 PINs; no functional change - - OpenBSD-Commit-ID: bf34f76b8283cc1d3f54633e0d4f13613d87bb2f - -commit eb679e2959bdb15454eb94751930eb4c9110da94 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 15 21:31:48 2022 +1000 - - Move vmshutdown to first step. - - If a previous run on a physical runner has failed to clean up, the next - run will fail because it'll try to check out the code to a broken - directory mount. Make cleanup the first step. - -commit 46b91b70ff3cb9c147e2875ef5dc609fd64c0c96 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 15 20:25:27 2022 +1000 - - Rename bbone test target to ARM. - -commit 751d22cdeffed9fe921db78eedc32a29f9e80510 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Fri Jul 15 13:37:29 2022 +1000 - - Add AUDIT_ARCH_PPC to supported seccomp arches. - - Patch from dries.deschout at dodeco.eu. - -commit a061792a6e8d235fc40a9b5d4c22a1762bb75a7b -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jul 14 19:20:24 2022 +1000 - - Remove unintended changes. - - I inadvertently included a couple of local changes with the OpenSSL - 3.0.4 change. Revert, anything that should be there will be committed - separately. - -commit 527cb43fa1b4e55df661feabbac51b8e608b6519 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jul 14 11:22:08 2022 +1000 - - Return ERANGE from getcwd() if buffer size is 1. - - If getcwd() is supplied a buffer size of exactly 1 and a path of "/", it - could result in a nul byte being written out of array bounds. POSIX says - it should return ERANGE if the path will not fit in the available buffer - (with terminating nul). 1 byte cannot fit any possible path with its nul, - so immediately return ERANGE in that case. - - OpenSSH never uses getcwd() with this buffer size, and all current - (and even quite old) platforms that we are currently known to work - on have a native getcwd() so this code is not used on those anyway. - Reported by Qualys, ok djm@ - -commit 36857fefd8849c4b0e877cfd9d1eb22f79b76650 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jul 14 10:02:35 2022 +1000 - - Split README.platform into its own line. - - README.platform has general platform-specific information, having it - following text about FIDO2 on the same line could imply that it only - has information about FIDO2. - -commit 00a496c6c14f2d41f2a9365714d494dd5f3aac9f -Author: Darren Tucker <dtucker@dtucker.net> -Date: Thu Jul 14 09:56:01 2022 +1000 - - Clarify README.md text. - - Clarify the text about the implications of building without OpenSSL, and - prefix the "configure --help" example command with a "./" so it's likely - to work as-is in more shells. From bz#3461. - -commit f40b52f21fbc52eb513279168a49d3285c65256c -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 12 19:48:44 2022 +1000 - - Remove special casing of crypt(). - - Configure goes to some lengths to pick crypt() from either libcrypt - or OpenSSL's libcrypto because they can more or less featureful (eg - supporting md5-style passwords). - - OpenSSL removed its crypt() interface in 2002: - https://github.com/openssl/openssl/commit/69deec58 so these hijinks - should no longer be necessary. This also only links sshd with libcrypt - which is the only thing that needs it. ok djm@ - -commit 76f4e48631d7b09fb243b47d7b393d100d3741b7 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jul 13 13:17:47 2022 +1000 - - Only refuse to use OpenSSL 3.0.4 on x86_64. - - The potential RCE only impacts x86_64, so only refuse to use it if we're - targetting a potentially impacted architecture. ok djm@ - -commit e75bbc1d88491fa85e61b2cc8783d4bbd00cd131 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 12 14:37:15 2022 +1000 - - Capture stderr output from configure. - -commit d9eaea4bea6271bcee6a2b9428f1271faf2d033b -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 12 12:54:49 2022 +1000 - - Refuse to use OpenSSL 3.0.4 due to potential RCE. - - OpenSSL has a potential RCE in its RSA implementation (CVE-2022-2274) - so refuse to use that specific version. - -commit fb2f3a61bf3d28fff285524535f7ffcd177c9235 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 12 12:54:24 2022 +1000 - - Move unset to before we set anything. - -commit c483a5c0fb8e8b8915fad85c5f6113386a4341ca -Author: Darren Tucker <dtucker@dtucker.net> -Date: Wed Jul 6 11:52:54 2022 +1000 - - Test against openssl-3.0.5. - -commit 669a56bcfe73f8b985f2bba476ba834d55253acf -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 5 18:35:53 2022 +1000 - - Update sanitizer test targets: - - - remove clang-sanitize-memory for now. It takes so long that the test - times out. - - add gcc sanitize-address and sanitize-undefined test targets. - -commit 48cc68b69118b3ce8d07fd4f82e00d58667d5379 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 5 16:23:28 2022 +1000 - - Add GCC address sanitizer build/test. - -commit 55c60bdd39b82457e92efa77da8d16cfa6a49391 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Tue Jul 5 12:02:33 2022 +1000 - - Move sanitizer logs into regress for collection. - -commit 35ef2b3b6ef198f8574904a45780487ec2f17858 -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Mon Jul 4 09:10:31 2022 +0000 - - upstream: Add TEST_REGRESS_CACHE_DIR. - - If set, it is used to cache regress test names that have succeeded and - skip those on a re-run. - - OpenBSD-Regress-ID: a7570dd29a58df59f2cca647c3c2ec989b49f247 - -commit 7394ed80c4de8b228a43c8956cf2fa1b9c6b2622 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sun Jul 3 21:46:44 2022 +1000 - - Add clang sanitizer tests. - -commit bfce0e66b6017a9bfab450b9dc7d4b16f90de817 -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sun Jul 3 18:14:09 2022 +1000 - - Skip all rlimit tests when sandboxing disabled. - - The rlimit tests can hang when being run with some compiler sanitizers - so skip all of them if sandbox=no. - -commit 6208d611520f9ea94d5369f9da404b709930029d -Author: Darren Tucker <dtucker@dtucker.net> -Date: Sun Jul 3 17:54:49 2022 +1000 - - Move checks for pollfd.fd and nfds_t. - - Move the checks for struct pollfd.fd and nfds_t to before the sandboxing - checks. This groups all the sandbox checks together so we can skip them - all when sandboxing is disabled. - -commit 322964f8f2e9c321e77ebae1e4d2cd0ccc5c5a0b -Author: dtucker@openbsd.org <dtucker@openbsd.org> -Date: Fri Jul 1 05:08:23 2022 +0000 - - upstream: Remove leftover line. - - Remove extra line leftover from merge conflict. ok djm@ - - OpenBSD-Commit-ID: 460e2290875d7ae64971a7e669c244b1d1c0ae2e - -commit 7ec81daad0e03a64e8d91c5590960c48c1a899a3 -Author: djm@openbsd.org <djm@openbsd.org> -Date: Fri Jul 1 04:45:50 2022 +0000 - - upstream: use consistent field names (s/char/byte) - - in format description - - OpenBSD-Commit-ID: 3de33572733ee7fcfd7db33d37db23d2280254f0 @@ -367,5 +367,46 @@ OpenSSH contains no GPL code. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. + The replacement base64 implementation has the following MIT-style + licenses: + + * Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + + * Portions Copyright (c) 1995 by International Business Machines, Inc. + * + * International Business Machines, Inc. (hereinafter called IBM) grants + * permission under its copyrights to use, copy, modify, and distribute this + * Software with or without fee, provided that the above copyright notice and + * all paragraphs of this notice appear in all copies, and that the name of IBM + * not be used in connection with the marketing of any product incorporating + * the Software or modifications thereof, without specific, written prior + * permission. + * + * To the extent it has a right to do so, IBM grants an immunity from suit + * under its patents, if any, for the use, sale or manufacture of products to + * the extent that such products are used for performing Domain Name System + * dynamic updates in TCP/IP networks by means of the Software. No immunity is + * granted for any product per se or for any other function of any product. + * + * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A + * PARTICULAR PURPOSE. IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL, + * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING + * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN + * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES. + ------ $OpenBSD: LICENCE,v 1.20 2017/04/30 23:26:16 djm Exp $ diff --git a/Makefile.in b/Makefile.in index e1b77eb..4243006 100644 --- a/Makefile.in +++ b/Makefile.in @@ -111,7 +111,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ hmac.o ed25519.o hash.o \ kex.o kex-names.o kexdh.o kexgex.o kexecdh.o kexc25519.o \ kexgexc.o kexgexs.o \ - kexsntrup761x25519.o sntrup761.o kexgen.o \ + kexsntrup761x25519.o kexmlkem768x25519.o sntrup761.o kexgen.o \ sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \ sshbuf-io.o @@ -1,4 +1,4 @@ -See https://www.openssh.com/releasenotes.html#9.8p1 for the release +See https://www.openssh.com/releasenotes.html#9.9p1 for the release notes. Please read https://www.openssh.com/report.html for bug reporting @@ -1,4 +1,4 @@ -/* $OpenBSD: auth.c,v 1.161 2024/05/17 00:30:23 djm Exp $ */ +/* $OpenBSD: auth.c,v 1.162 2024/09/15 01:18:26 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * @@ -463,6 +463,9 @@ getpwnamallow(struct ssh *ssh, const char *user) { #ifdef HAVE_LOGIN_CAP extern login_cap_t *lc; +#ifdef HAVE_AUTH_HOSTOK + const char *from_host, *from_ip; +#endif #ifdef BSD_AUTH auth_session_t *as; #endif @@ -473,6 +476,7 @@ getpwnamallow(struct ssh *ssh, const char *user) ci = server_get_connection_info(ssh, 1, options.use_dns); ci->user = user; + ci->user_invalid = getpwnam(user) == NULL; parse_server_match_config(&options, &includes, ci); log_change_level(options.log_level); log_verbose_reset(); @@ -508,6 +512,21 @@ getpwnamallow(struct ssh *ssh, const char *user) debug("unable to get login class: %s", user); return (NULL); } +#ifdef HAVE_AUTH_HOSTOK + from_host = auth_get_canonical_hostname(ssh, options.use_dns); + from_ip = ssh_remote_ipaddr(ssh); + if (!auth_hostok(lc, from_host, from_ip)) { + debug("Denied connection for %.200s from %.200s [%.200s].", + pw->pw_name, from_host, from_ip); + return (NULL); + } +#endif /* HAVE_AUTH_HOSTOK */ +#ifdef HAVE_AUTH_TIMEOK + if (!auth_timeok(lc, time(NULL))) { + debug("LOGIN %.200s REFUSED (TIME)", pw->pw_name); + return (NULL); + } +#endif /* HAVE_AUTH_TIMEOK */ #ifdef BSD_AUTH if ((as = auth_open()) == NULL || auth_setpwd(as, pw) != 0 || auth_approval(as, lc, pw->pw_name, "ssh") <= 0) { @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.c,v 1.438 2024/05/17 00:30:23 djm Exp $ */ +/* $OpenBSD: channels.c,v 1.439 2024/07/25 22:40:08 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -1016,14 +1016,16 @@ channel_format_status(const Channel *c) { char *ret = NULL; - xasprintf(&ret, "t%d [%s] %s%u i%u/%zu o%u/%zu e[%s]/%zu " - "fd %d/%d/%d sock %d cc %d io 0x%02x/0x%02x", + xasprintf(&ret, "t%d [%s] %s%u %s%u i%u/%zu o%u/%zu e[%s]/%zu " + "fd %d/%d/%d sock %d cc %d %s%u io 0x%02x/0x%02x", c->type, c->xctype != NULL ? c->xctype : c->ctype, c->have_remote_id ? "r" : "nr", c->remote_id, + c->mux_ctx != NULL ? "m" : "nm", c->mux_downstream_id, c->istate, sshbuf_len(c->input), c->ostate, sshbuf_len(c->output), channel_format_extended_usage(c), sshbuf_len(c->extended), c->rfd, c->wfd, c->efd, c->sock, c->ctl_chan, + c->have_ctl_child_id ? "c" : "nc", c->ctl_child_id, c->io_want, c->io_ready); return ret; } @@ -1,4 +1,4 @@ -/* $OpenBSD: channels.h,v 1.156 2024/05/23 23:47:16 jsg Exp $ */ +/* $OpenBSD: channels.h,v 1.157 2024/07/25 22:40:08 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -139,6 +139,8 @@ struct Channel { u_int io_ready; /* bitmask of SSH_CHAN_IO_* */ int pfds[4]; /* pollfd entries for rfd/wfd/efd/sock */ int ctl_chan; /* control channel (multiplexed connections) */ + uint32_t ctl_child_id; /* child session for mux controllers */ + int have_ctl_child_id;/* non-zero if ctl_child_id is valid */ int isatty; /* rfd is a tty */ #ifdef _AIX int wfd_isatty; /* wfd is a tty */ @@ -1,4 +1,4 @@ -/* $OpenBSD: cipher.c,v 1.121 2024/05/17 02:39:11 jsg Exp $ */ +/* $OpenBSD: cipher.c,v 1.123 2024/08/23 04:51:00 deraadt Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -143,8 +143,8 @@ const char * compression_alg_list(int compression) { #ifdef WITH_ZLIB - return compression ? "zlib@openssh.com,zlib,none" : - "none,zlib@openssh.com,zlib"; + return compression ? "zlib@openssh.com,none" : + "none,zlib@openssh.com"; #else return "none"; #endif @@ -255,7 +255,7 @@ cipher_init(struct sshcipher_ctx **ccp, const struct sshcipher *cipher, #endif *ccp = NULL; - if ((cc = calloc(sizeof(*cc), 1)) == NULL) + if ((cc = calloc(1, sizeof(*cc))) == NULL) return SSH_ERR_ALLOC_FAIL; cc->plaintext = (cipher->flags & CFLAG_NONE) != 0; diff --git a/config.h.in b/config.h.in index ca9f7d8..d4dbb13 100644 --- a/config.h.in +++ b/config.h.in @@ -222,6 +222,12 @@ /* Define to 1 if you have the `aug_get_machine' function. */ #undef HAVE_AUG_GET_MACHINE +/* Define to 1 if you have the `auth_hostok' function. */ +#undef HAVE_AUTH_HOSTOK + +/* Define to 1 if you have the `auth_timeok' function. */ +#undef HAVE_AUTH_TIMEOK + /* Define to 1 if you have the `b64_ntop' function. */ #undef HAVE_B64_NTOP @@ -511,6 +517,12 @@ /* Define to 1 if you have the `EVP_DigestInit_ex' function. */ #undef HAVE_EVP_DIGESTINIT_EX +/* Define to 1 if you have the `EVP_DigestSign' function. */ +#undef HAVE_EVP_DIGESTSIGN + +/* Define to 1 if you have the `EVP_DigestVerify' function. */ +#undef HAVE_EVP_DIGESTVERIFY + /* Define to 1 if you have the `EVP_MD_CTX_cleanup' function. */ #undef HAVE_EVP_MD_CTX_CLEANUP @@ -12706,7 +12706,7 @@ printf "%s\n" "#define SSH_TUN_OPENBSD 1" >>confdefs.h printf "%s\n" "#define SYSLOG_R_SAFE_IN_SIGHAND 1" >>confdefs.h - TEST_MALLOC_OPTIONS="AFGJPRX" + TEST_MALLOC_OPTIONS="SJRU" ;; *-*-solaris*) if test "x$withval" != "xno" ; then @@ -13317,6 +13317,9 @@ EOD printf "%s\n" "#define BROKEN_SETVBUF 1" >>confdefs.h ;; +*-*-gnu*) + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_GNU_SOURCE" + ;; esac { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking compiler and flags for sanity" >&5 @@ -15875,6 +15878,18 @@ rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext CFLAGS="$SAVED_CFLAGS" +ac_fn_c_check_func "$LINENO" "auth_hostok" "ac_cv_func_auth_hostok" +if test "x$ac_cv_func_auth_hostok" = xyes +then : + printf "%s\n" "#define HAVE_AUTH_HOSTOK 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "auth_timeok" "ac_cv_func_auth_timeok" +if test "x$ac_cv_func_auth_timeok" = xyes +then : + printf "%s\n" "#define HAVE_AUTH_TIMEOK 1" >>confdefs.h + +fi ac_fn_c_check_func "$LINENO" "Blowfish_initstate" "ac_cv_func_Blowfish_initstate" if test "x$ac_cv_func_Blowfish_initstate" = xyes then : @@ -18945,6 +18960,18 @@ then : printf "%s\n" "#define HAVE_DSA_GENERATE_PARAMETERS_EX 1" >>confdefs.h fi +ac_fn_c_check_func "$LINENO" "EVP_DigestSign" "ac_cv_func_EVP_DigestSign" +if test "x$ac_cv_func_EVP_DigestSign" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTSIGN 1" >>confdefs.h + +fi +ac_fn_c_check_func "$LINENO" "EVP_DigestVerify" "ac_cv_func_EVP_DigestVerify" +if test "x$ac_cv_func_EVP_DigestVerify" = xyes +then : + printf "%s\n" "#define HAVE_EVP_DIGESTVERIFY 1" >>confdefs.h + +fi ac_fn_c_check_func "$LINENO" "EVP_DigestFinal_ex" "ac_cv_func_EVP_DigestFinal_ex" if test "x$ac_cv_func_EVP_DigestFinal_ex" = xyes then : diff --git a/configure.ac b/configure.ac index 5a865f8..591d5a3 100644 --- a/configure.ac +++ b/configure.ac @@ -1093,7 +1093,7 @@ mips-sony-bsd|mips-sony-newsos4) AC_DEFINE([SSH_TUN_OPENBSD], [1], [Open tunnel devices the OpenBSD way]) AC_DEFINE([SYSLOG_R_SAFE_IN_SIGHAND], [1], [syslog_r function is safe to use in in a signal handler]) - TEST_MALLOC_OPTIONS="AFGJPRX" + TEST_MALLOC_OPTIONS="SJRU" ;; *-*-solaris*) if test "x$withval" != "xno" ; then @@ -1348,6 +1348,13 @@ EOD AC_DEFINE([BROKEN_SETVBUF], [1], [LynxOS has broken setvbuf() implementation]) ;; +*-*-gnu*) + dnl GNU Hurd. Needs to be after the linux and the other *-gnu entries. + dnl Target SUSv3/POSIX.1-2001 plus BSD specifics. + dnl _DEFAULT_SOURCE is the new name for _BSD_SOURCE + dnl _GNU_SOURCE is needed for setres*id prototypes. + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -D_GNU_SOURCE" + ;; esac AC_MSG_CHECKING([compiler and flags for sanity]) @@ -1879,6 +1886,8 @@ AC_SUBST([PICFLAG]) dnl Checks for library functions. Please keep in alphabetical order AC_CHECK_FUNCS([ \ + auth_hostok \ + auth_timeok \ Blowfish_initstate \ Blowfish_expandstate \ Blowfish_expand0state \ @@ -2974,6 +2983,8 @@ if test "x$openssl" = "xyes" ; then BN_is_prime_ex \ DES_crypt \ DSA_generate_parameters_ex \ + EVP_DigestSign \ + EVP_DigestVerify \ EVP_DigestFinal_ex \ EVP_DigestInit_ex \ EVP_MD_CTX_cleanup \ diff --git a/contrib/redhat/openssh.spec b/contrib/redhat/openssh.spec index 8893f3a..802d64d 100644 --- a/contrib/redhat/openssh.spec +++ b/contrib/redhat/openssh.spec @@ -1,4 +1,4 @@ -%global ver 9.8p1 +%global ver 9.9p1 %global rel 1%{?dist} # OpenSSH privilege separation requires a user & group ID @@ -33,10 +33,10 @@ %global without_openssl 0 # build without openssl where 1.1.1 is not available -%if 0%{?fedora} <= 28 +%if %{defined fedora} && 0%{?fedora} <= 28 %global without_openssl 1 %endif -%if 0%{?rhel} <= 7 +%if %{defined rhel} && 0%{?rhel} <= 7 %global without_openssl 1 %endif diff --git a/contrib/ssh-copy-id b/contrib/ssh-copy-id index da6bd18..dcf5798 100644 --- a/contrib/ssh-copy-id +++ b/contrib/ssh-copy-id @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (c) 1999-2023 Philip Hands <phil@hands.com> +# Copyright (c) 1999-2024 Philip Hands <phil@hands.com> # 2021 Carlos Rodríguez Gili <carlos.rodriguez-gili@upc.edu> # 2020 Matthias Blümel <blaimi@blaimi.de> # 2017 Sebastien Boyron <seb@boyron.eu> @@ -56,19 +56,19 @@ then a bug describing your setup, and the shell you used to make it work. EOF - printf '%s: ERROR: Less dimwitted shell required.\n' "$0" + printf '%s: ERROR: Less dimwitted shell required.\n' "$0" >&2 exit 1 fi fi # shellcheck disable=SC2010 -DEFAULT_PUB_ID_FILE=$(ls -t "${HOME}"/.ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1) +DEFAULT_PUB_ID_FILE=$(ls -dt "${HOME}"/.ssh/id*.pub 2>/dev/null | grep -v -- '-cert.pub$' | head -n 1) SSH="ssh -a -x" TARGET_PATH=".ssh/authorized_keys" umask 0177 usage () { - printf 'Usage: %s [-h|-?|-f|-n|-s|-x] [-i [identity_file]] [-p port] [-F alternative ssh_config file] [-t target_path] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2 + printf 'Usage: %s [-h|-?|-f|-n|-s|-x] [-i [identity_file]] [-t target_path] [-F ssh_config] [[-o ssh_option] ...] [-p port] [user@]hostname\n' "$0" >&2 printf '\t-f: force mode -- copy keys without trying to check if they are already installed\n' >&2 printf '\t-n: dry run -- no keys are actually copied\n' >&2 printf '\t-s: use sftp -- use sftp instead of executing remote-commands. Can be useful if the remote only allows sftp\n' >&2 @@ -86,7 +86,7 @@ use_id_file() { L_ID_FILE="$1" if [ -z "$L_ID_FILE" ] ; then - printf '%s: ERROR: no ID file found\n' "$0" + printf '%s: ERROR: no ID file found\n' "$0" >&2 exit 1 fi @@ -103,11 +103,10 @@ use_id_file() { ErrMSG=$( { : < "$f" ; } 2>&1 ) || { L_PRIVMSG="" [ "$f" = "$PRIV_ID_FILE" ] && L_PRIVMSG=" (to install the contents of '$PUB_ID_FILE' anyway, look at the -f option)" - printf "\\n%s: ERROR: failed to open ID file '%s': %s\\n" "$0" "$f" "$(printf '%s\n%s\n' "$ErrMSG" "$L_PRIVMSG" | sed -e 's/.*: *//')" + printf "\\n%s: ERROR: failed to open ID file '%s': %s\\n" "$0" "$f" "$(printf '%s\n%s\n' "$ErrMSG" "$L_PRIVMSG" | sed -e 's/.*: *//')" >&2 exit 1 } done - printf '%s: INFO: Source of key(s) to be installed: "%s"\n' "$0" "$PUB_ID_FILE" >&2 GET_ID="cat \"$PUB_ID_FILE\"" } @@ -115,15 +114,31 @@ if [ -n "$SSH_AUTH_SOCK" ] && ssh-add -L >/dev/null 2>&1 ; then GET_ID="ssh-add -L" fi -while getopts "i:o:p:F:t:fnsxh?" OPT +OPTS="io:p:F:t:fnsxh?" + +while getopts "$OPTS" OPT do case "$OPT" in i) [ "${SEEN_OPT_I}" ] && { - printf '\n%s: ERROR: -i option must not be specified more than once\n\n' "$0" + printf '\n%s: ERROR: -i option must not be specified more than once\n\n' "$0" >&2 usage } SEEN_OPT_I="yes" + + # Check for -i's optional parameter + eval "nextarg=\${$OPTIND}" + # shellcheck disable=SC2154 + if [ $OPTIND = $# ]; then + if [ -r "$nextarg" ] && grep -iq ssh "$nextarg"; then + printf '\n%s: ERROR: Missing hostname. Use "-i -- %s" if you really mean to use this as the hostname\n\n' "$0" "$nextarg" >&2 + usage + fi + elif ! expr -- "$nextarg" : "-[$(echo "$OPTS" | tr -d :)-]" >/dev/null ; then + # when not at the last arg, and not followed by an option, -i has an argument + OPTARG="$nextarg" + OPTIND=$((OPTIND + 1)) + fi use_id_file "${OPTARG:-$DEFAULT_PUB_ID_FILE}" ;; o|F) @@ -176,16 +191,28 @@ if [ -z "$(eval $GET_ID)" ] && [ -r "${PUB_ID_FILE:=$DEFAULT_PUB_ID_FILE}" ] ; t use_id_file "$PUB_ID_FILE" fi +printf '%s: INFO: Source of key(s) to be installed: %s\n' "$0" "${GET_ID#cat }" >&2 + # shellcheck disable=SC2086 if [ -z "$(eval $GET_ID)" ] ; then printf '%s: ERROR: No identities found\n' "$0" >&2 exit 1 fi +# assert_scratch_ok() +# ensures that $SCRATCH_DIR is setup. +assert_scratch_ok() { + [ "$SCRATCH_DIR" ] && [ -d "$SCRATCH_DIR" ] && [ -w "$SCRATCH_DIR" ] && return 0 + + printf 'ERROR: Assertion failure: in %s(): scratch_dir was not correctly set up (SCRATCH_DIR = "%s")\n' "$1" "$SCRATCH_DIR" >&2 + return 1 +} + # filter_ids() # tries to log in using the keys piped to it, and filters out any that work filter_ids() { L_SUCCESS="$1" + assert_scratch_ok filter_ids || return L_TMP_ID_FILE="$SCRATCH_DIR"/popids_tmp_id L_OUTPUT_FILE="$SCRATCH_DIR"/popids_output @@ -288,23 +315,24 @@ installkeys_via_sftp() { # repopulate "$@" inside this function eval set -- "$SSH_OPTS" - L_KEYS=$SCRATCH_DIR/authorized_keys - L_SHARED_CON=$SCRATCH_DIR/master-conn + assert_scratch_ok installkeys_via_sftp || return 1 + L_KEYS="$SCRATCH_DIR"/authorized_keys + L_SHARED_CON="$SCRATCH_DIR"/master-conn $SSH -f -N -M -S "$L_SHARED_CON" "$@" - L_CLEANUP="$SSH -S $L_SHARED_CON -O exit 'ignored' >/dev/null 2>&1 ; $SCRATCH_CLEANUP" + L_CLEANUP="$SSH -S '$L_SHARED_CON' -O exit 'ignored' >/dev/null 2>&1 ; $SCRATCH_CLEANUP" #shellcheck disable=SC2064 trap "$L_CLEANUP" EXIT TERM INT QUIT - sftp -b - -o "ControlPath=$L_SHARED_CON" "ignored" <<-EOF || return 1 + sftp -b - -o "ControlPath='$L_SHARED_CON'" "ignored" <<-EOF || return 1 -get "$AUTH_KEY_FILE" "$L_KEYS" EOF # add a newline or create file if it's missing, same like above [ -z "$(tail -1c "$L_KEYS" 2>/dev/null)" ] || echo >> "$L_KEYS" # append the keys being piped in here cat >> "$L_KEYS" - sftp -b - -o "ControlPath=$L_SHARED_CON" "ignored" <<-EOF || return 1 + sftp -b - -o "ControlPath='$L_SHARED_CON'" "ignored" <<-EOF || return 1 -mkdir "$AUTH_KEY_DIR" chmod 700 "$AUTH_KEY_DIR" - put $L_KEYS "$AUTH_KEY_FILE" + put "$L_KEYS" "$AUTH_KEY_FILE" chmod 600 "$AUTH_KEY_FILE" EOF #shellcheck disable=SC2064 @@ -321,7 +349,7 @@ then #shellcheck disable=SC2064 trap "$SCRATCH_CLEANUP" EXIT TERM INT QUIT else - printf '%s: ERROR: failed to create required temporary directory under ~/.ssh\n' "$0" >&2 + printf '%s: ERROR: failed to create required temporary directory under ~/.ssh (HOME="%s")\n' "$0" "$HOME" >&2 exit 1 fi @@ -379,7 +407,7 @@ else Number of key(s) added: $ADDED - Now try logging into the machine, with: "${SFTP:-ssh}${SSH_PORT:+ -${PORT_OPT:-p} $SSH_PORT} ${OPTS_USER_HOST}" + Now try logging into the machine, with: "${SFTP:-ssh} ${SEEN_OPT_I:+-i${PRIV_ID_FILE:+ $PRIV_ID_FILE} }${SSH_PORT:+-${PORT_OPT:-p} $SSH_PORT }${OPTS_USER_HOST}" and check to make sure that only the key(s) you wanted were added. EOF diff --git a/contrib/ssh-copy-id.1 b/contrib/ssh-copy-id.1 index 74eec2f..dbdb45a 100644 --- a/contrib/ssh-copy-id.1 +++ b/contrib/ssh-copy-id.1 @@ -1,5 +1,5 @@ .ig \" -*- nroff -*- -Copyright (c) 1999-2023 hands.com Ltd. <http://hands.com/> +Copyright (c) 1999-2024 Philip Hands <phil@hands.com> Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -34,9 +34,10 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .Op Fl s .Op Fl x .Op Fl i Op Ar identity_file -.Op Fl p Ar port -.Op Fl o Ar ssh_option .Op Fl t Ar target_path +.Op Fl F Ar ssh_config +.Op Bo Fl o Ar ssh_option Bc ... +.Op Fl p Ar port .Op Ar user Ns @ Ns .Ar hostname .Nm @@ -67,7 +68,7 @@ command instead. .Pp The options are as follows: .Bl -tag -width Ds -.It Fl i Ar identity_file +.It Fl i Op Ar identity_file Use only the key(s) contained in .Ar identity_file (rather than looking for identities via @@ -104,11 +105,13 @@ on commands which can be used on the remote side. .It Fl t Ar target_path the path on the target system where the keys should be added (defaults to ".ssh/authorized_keys") -.It Fl p Ar port , Fl o Ar ssh_option -These two options are simply passed through untouched, along with their -argument, to allow one to set the port or other -.Xr ssh 1 -options, respectively. +.It Fl p Ar port +Specifies the port to connect to on the remote host. +.It Fl F Ar ssh_config , Fl o Ar ssh_option +These options are simply passed through untouched (with their argument) +to ssh/sftp, +allowing one to set an alternative config file, +or other options, respectively. .Pp Rather than specifying these as command line options, it is often better to use (per-host) settings in diff --git a/contrib/suse/openssh.spec b/contrib/suse/openssh.spec index 45815c9..0755833 100644 --- a/contrib/suse/openssh.spec +++ b/contrib/suse/openssh.spec @@ -13,7 +13,7 @@ Summary: OpenSSH, a free Secure Shell (SSH) protocol implementation Name: openssh -Version: 9.8p1 +Version: 9.9p1 URL: https://www.openssh.com/ Release: 1 Source0: openssh-%{version}.tar.gz diff --git a/crypto_api.h b/crypto_api.h index 5d552ef..8bbc3a0 100644 --- a/crypto_api.h +++ b/crypto_api.h @@ -1,4 +1,4 @@ -/* $OpenBSD: crypto_api.h,v 1.8 2023/01/15 23:05:32 djm Exp $ */ +/* $OpenBSD: crypto_api.h,v 1.9 2024/09/02 12:13:56 djm Exp $ */ /* * Assembled from generated headers and source files by Markus Friedl. @@ -53,4 +53,9 @@ int crypto_kem_sntrup761_dec(unsigned char *k, const unsigned char *cstr, const unsigned char *sk); int crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk); +#define crypto_kem_mlkem768_PUBLICKEYBYTES 1184 +#define crypto_kem_mlkem768_SECRETKEYBYTES 2400 +#define crypto_kem_mlkem768_CIPHERTEXTBYTES 1088 +#define crypto_kem_mlkem768_BYTES 32 + #endif /* crypto_api_h */ diff --git a/debian/.git-dpm b/debian/.git-dpm index 41261a9..10a9095 100644 --- a/debian/.git-dpm +++ b/debian/.git-dpm @@ -1,12 +1,12 @@ # see git-dpm(1) from git-dpm package -97c671bccd4f923e2bb814516ad7bf1d9261709c -97c671bccd4f923e2bb814516ad7bf1d9261709c -725afb3e99dbbda1d8c34a3dfc031dc9b0bb5dbe -725afb3e99dbbda1d8c34a3dfc031dc9b0bb5dbe -openssh_9.8p1.orig.tar.gz -a0bb501b11349f5c5c33a269351be091dc2c2727 -1910393 +2d1ea9f5f1100fa7c7e648ea976ceda005d5966c +2d1ea9f5f1100fa7c7e648ea976ceda005d5966c +7721b4ff7705034e809e2130d1a11be2bf42dbe9 +7721b4ff7705034e809e2130d1a11be2bf42dbe9 +openssh_9.9p1.orig.tar.gz +5ded7eb0add0b02b5d1a1c4bf5cb2c89d2117b53 +1964864 debianTag="debian/%e%%%V" patchedTag="patched/%e%%%V" upstreamTag="upstream/%U" -signature:2c8addecb3c6af8b3eb36742d2f6c66b8281c5c9:833:openssh_9.8p1.orig.tar.gz.asc +signature:6f100e4757e1942d7b5e01310fcaf624b71f6740:833:openssh_9.9p1.orig.tar.gz.asc diff --git a/debian/NEWS b/debian/NEWS index 2898018..2ed0d9c 100644 --- a/debian/NEWS +++ b/debian/NEWS @@ -1,3 +1,38 @@ +openssh (1:9.9p1-1) unstable; urgency=medium + + OpenSSH 9.9p1 includes a number of changes that may affect existing + configurations: + + * ssh(1): remove support for pre-authentication compression. OpenSSH has + only supported post-authentication compression in the server for some + years. Compression before authentication significantly increases the + attack surface of SSH servers and risks creating oracles that reveal + information about information sent during authentication. + + * ssh(1), sshd(8): processing of the arguments to the "Match" + configuration directive now follows more shell-like rules for quoted + strings, including allowing nested quotes and \-escaped characters. If + configurations contained workarounds for the previous simplistic quote + handling then they may need to be adjusted. If this is the case, it's + most likely to be in the arguments to a "Match exec" condition. In this + case, moving the command to be evaluated from the Match line to an + external shell script is the easiest way to preserve compatibility with + both the old and new versions. + + -- Colin Watson <cjwatson@debian.org> Mon, 23 Sep 2024 21:09:59 -0700 + +openssh (1:9.8p1-5) unstable; urgency=medium + + Future Debian releases will remove GSS-API authentication and key exchange + support from openssh-client and openssh-server; this adds + pre-authentication attack surface and should only be used where + specifically needed. Users of GSS-API authentication or key exchange + should install the new openssh-client-gssapi or openssh-server-gssapi + package now; these currently just depend on openssh-client and + openssh-server respectively, but this will change in the future. + + -- Colin Watson <cjwatson@debian.org> Thu, 29 Aug 2024 12:13:32 +0100 + openssh (1:9.8p1-1) unstable; urgency=medium OpenSSH 9.8p1 includes a number of changes that may affect existing diff --git a/debian/README.Debian b/debian/README.Debian index 6aab9cb..32b535f 100644 --- a/debian/README.Debian +++ b/debian/README.Debian @@ -209,6 +209,7 @@ follows (modifying ListenStream to match your requirements): mkdir -p /etc/systemd/system/ssh.socket.d cat >/etc/systemd/system/ssh.socket.d/listen.conf <<EOF [Socket] + ListenStream= ListenStream=2222 EOF systemctl daemon-reload diff --git a/debian/changelog b/debian/changelog index dc2c017..4db166e 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,215 @@ +openssh (1:9.9p1-1~progress7.99u1) graograman-backports; urgency=medium + + * Uploading to graograman-backports, remaining changes: + - Updating maintainer field. + - Updating uploaders field. + - Updating bugs field. + - Updating vcs fields. + - Enabling pam_access.so. + - Disabling pam_motd.so. + - Setting default RSA size in ssh-keygen to 4096. + - Setting default ECDSA size in ssh-keygen to 521. + - Removing small diffie-hellman moduli. + - Updating options in ssh_config. + - Including openssh-client configuration files for Progress Linux. + - Setting CASignatureAlgorithms in ssh_config to ED25519. + - Setting Ciphers in ssh_config to ChaCha20. + - Setting HostbasedKeyTypes in ssh_config to ED25519. + - Setting HostKeyAlgorithms in ssh_config to ED25519. + - Setting KexAlgorithms in ssh_config to + sntrup761x25519-sha512@openssh.com and Curve25519. + - Setting MACs in ssh_config to UMAC and HMAC. + - Setting PubkeyAcceptedKeyTypes in ssh_config to ED25519. + - Setting IdentityFile in ssh_config to ED25519. + - Setting openssh-server/permit-root-login to false. + - Setting openssh-server/password-authentication to false. + - Including openssh-server configuration files for Progress Linux. + - Setting CASignatureAlgorithms in ssh_config to ED25519. + - Setting Ciphers in sshd_config to ChaCha20. + - Setting HostbasedAcceptedKeyTypes in sshd_config to ED25519. + - Setting HostKeyAlgorithms in sshd_config to ED25519. + - Setting KexAlgorithms in sshd_config to + sntrup761x25519-sha512@openssh.com and Curve25519. + - Setting MACs in sshd_config to UMAC and HMAC. + - Setting PubkeyAcceptedKeyTypes in sshd_config to ED25519. + - Setting HostCertificate in sshd_config to ED25519. + - Setting HostKey in sshd_config to ED25519. + - Setting AuthorizedKeysFile in sshd_config to + /etc/ssh/authorized_keys/%u .ssh/authorized_keys. + - Setting AllowAgentForwarding in sshd_config to no. + - Setting DebianBanner in sshd_config to no. + - Setting LoginGraceTime in sshd_config to 1m. + - Setting MaxAuthTries in sshd_config to 3. + - Adding patches from Colin Evrard <colin.evrard.134@gmail.com> for + optional Multipath TCP support. + - Refreshing mptcp patches. + * Merging upstream version 1:9.9p1. + * Merging debian version 1:9.9p1-1. + + -- Daniel Baumann <daniel.baumann@progress-linux.org> Fri, 27 Sep 2024 10:43:05 +0200 + +openssh (1:9.9p1-1) unstable; urgency=medium + + * Alias the old Debian-specific SetupTimeOut client option to + ConnectTimeout rather than to ServerAliveInterval. + * New upstream release (https://www.openssh.com/releasenotes.html#9.9p1): + - ssh(1): remove support for pre-authentication compression. + - ssh(1), sshd(8): processing of the arguments to the "Match" + configuration directive now follows more shell-like rules for quoted + strings, including allowing nested quotes and \-escaped characters. + - ssh(1), sshd(8): add support for a new hybrid post-quantum key + exchange based on the FIPS 203 Module-Lattice Key Enapsulation + mechanism (ML-KEM) combined with X25519 ECDH as described by + https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03 + This algorithm "mlkem768x25519-sha256" is available by default. + - ssh(1): the ssh_config "Include" directive can now expand environment + as well as the same set of %-tokens "Match Exec" supports. + - sshd(8): add a sshd_config "RefuseConnection" option that, if set will + terminate the connection at the first authentication request. + - sshd(8): add a "refuseconnection" penalty class to sshd_config + PerSourcePenalties that is applied when a connection is dropped by the + new RefuseConnection keyword. + - sshd(8): add a "Match invalid-user" predicate to sshd_config Match + options that matches when the target username is not valid on the + server. + - ssh(1), sshd(8): update the Streamlined NTRUPrime code to a + substantially faster implementation. + - ssh(1), sshd(8): the hybrid Streamlined NTRUPrime/X25519 key exchange + algorithm now has an IANA-assigned name in addition to the + "@openssh.com" vendor extension name. This algorithm is now also + available under this name "sntrup761x25519-sha512" + - ssh(1), sshd(8), ssh-agent(1): prevent private keys from being + included in core dump files for most of their lifespans. This is in + addition to pre-existing controls in ssh-agent(1) and sshd(8) that + prevented coredumps. + - All: convert key handling to use the libcrypto EVP_PKEY API, with the + exception of DSA. + - sshd(8): add a random amount of jitter (up to 4 seconds) to the grace + login time to make its expiry unpredictable. + - sshd(8): fix regression introduced in openssh-9.8 that swapped the + order of source and destination addresses in some sshd log messages. + - sshd(8): do not apply authorized_keys options when signature + verification fails. Prevents more restrictive key options being + incorrectly applied to subsequent keys in authorized_keys. + - ssh-keygen(1): include pathname in some of ssh-keygen's passphrase + prompts. Helps the user know what's going on when ssh-keygen is + invoked via other tools. + - ssh(1), ssh-add(1): make parsing user@host consistently look for the + last '@' in the string rather than the first. This makes it possible + to more consistently use usernames that contain '@' characters. + - ssh(1), sshd(8): be more strict in parsing key type names. Only allow + short names (e.g "rsa") in user-interface code and require full SSH + protocol names (e.g. "ssh-rsa") everywhere else. + - regress: many performance and correctness improvements to the + re-keying regression test. + - ssh-keygen(1): clarify that ed25519 is the default key type generated + and clarify that rsa-sha2-512 is the default signature scheme when RSA + is in use. + - sshd(8): fix minor memory leak in Subsystem option parsing. + - All: additional hardening and consistency checks for the sshbuf code. + - sshd(8): reduce default logingrace penalty to ensure that a single + forgotten login that times out will be below the penalty threshold. + - ssh(1): fix proxy multiplexing (-O proxy) bug. If a mux started with + ControlPersist then later has a forwarding added using mux proxy + connection and the forwarding was used, then when the mux proxy + session terminated, the mux master process would issue a bad message + that terminated the connection. + - Sync contrib/ssh-copy-id to the latest upstream version. + - sshd(8): restore audit call before exit that regressed in openssh-9.8. + Fixes an issue where the SSH_CONNECTION_ABANDON event was not + recorded. + - Fix detection of setres*id on GNU/Hurd. + + -- Colin Watson <cjwatson@debian.org> Mon, 23 Sep 2024 21:09:59 -0700 + +openssh (1:9.8p1-8) unstable; urgency=medium + + * Source-only reupload. + + -- Colin Watson <cjwatson@debian.org> Fri, 30 Aug 2024 00:38:26 +0100 + +openssh (1:9.8p1-7) unstable; urgency=medium + + * Adjust description line-wrapping so that lintian recognizes that + openssh-client-gssapi is an intentionally empty package. + + -- Colin Watson <cjwatson@debian.org> Thu, 29 Aug 2024 14:17:13 +0100 + +openssh (1:9.8p1-6) unstable; urgency=medium + + * Upload with binaries to satisfy Debian archive NEW checks. + + -- Colin Watson <cjwatson@debian.org> Thu, 29 Aug 2024 13:46:57 +0100 + +openssh (1:9.8p1-5) unstable; urgency=medium + + * Add openssh-client-gssapi and openssh-server-gssapi packages; these + currently just depend on their non-gssapi counterparts, but will become + different in future. See + https://lists.debian.org/debian-devel/2024/04/msg00044.html. + + -- Colin Watson <cjwatson@debian.org> Thu, 29 Aug 2024 12:53:42 +0100 + +openssh (1:9.8p1-4) unstable; urgency=medium + + [ Grzegorz Szymaszek ] + * Disable listening on 22 in the port change example in README.Debian. + + [ Colin Watson ] + * sshd: Allow exec without absolute path in inetd mode (closes: #1078429). + * Add an autopkgtest for running sshd from xinetd. + + -- Colin Watson <cjwatson@debian.org> Mon, 26 Aug 2024 15:02:45 +0100 + +openssh (1:9.8p1-3~progress7.99u1) graograman-backports; urgency=medium + + * Uploading to graograman-backports, remaining changes: + - Updating maintainer field. + - Updating uploaders field. + - Updating bugs field. + - Updating vcs fields. + - Enabling pam_access.so. + - Disabling pam_motd.so. + - Setting default RSA size in ssh-keygen to 4096. + - Setting default ECDSA size in ssh-keygen to 521. + - Removing small diffie-hellman moduli. + - Updating options in ssh_config. + - Including openssh-client configuration files for Progress Linux. + - Setting CASignatureAlgorithms in ssh_config to ED25519. + - Setting Ciphers in ssh_config to ChaCha20. + - Setting HostbasedKeyTypes in ssh_config to ED25519. + - Setting HostKeyAlgorithms in ssh_config to ED25519. + - Setting KexAlgorithms in ssh_config to + sntrup761x25519-sha512@openssh.com and Curve25519. + - Setting MACs in ssh_config to UMAC and HMAC. + - Setting PubkeyAcceptedKeyTypes in ssh_config to ED25519. + - Setting IdentityFile in ssh_config to ED25519. + - Setting openssh-server/permit-root-login to false. + - Setting openssh-server/password-authentication to false. + - Including openssh-server configuration files for Progress Linux. + - Setting CASignatureAlgorithms in ssh_config to ED25519. + - Setting Ciphers in sshd_config to ChaCha20. + - Setting HostbasedAcceptedKeyTypes in sshd_config to ED25519. + - Setting HostKeyAlgorithms in sshd_config to ED25519. + - Setting KexAlgorithms in sshd_config to + sntrup761x25519-sha512@openssh.com and Curve25519. + - Setting MACs in sshd_config to UMAC and HMAC. + - Setting PubkeyAcceptedKeyTypes in sshd_config to ED25519. + - Setting HostCertificate in sshd_config to ED25519. + - Setting HostKey in sshd_config to ED25519. + - Setting AuthorizedKeysFile in sshd_config to + /etc/ssh/authorized_keys/%u .ssh/authorized_keys. + - Setting AllowAgentForwarding in sshd_config to no. + - Setting DebianBanner in sshd_config to no. + - Setting LoginGraceTime in sshd_config to 1m. + - Setting MaxAuthTries in sshd_config to 3. + - Adding patches from Colin Evrard <colin.evrard.134@gmail.com> for + optional Multipath TCP support. + - Refreshing mptcp patches. + * Merging debian version 1:9.8p1-3. + + -- Daniel Baumann <daniel.baumann@progress-linux.org> Mon, 26 Aug 2024 09:45:14 +0200 + openssh (1:9.8p1-3) unstable; urgency=medium [ Dirk Van Haerenborgh ] diff --git a/debian/control b/debian/control index a5eb670..b1e752c 100644 --- a/debian/control +++ b/debian/control @@ -82,6 +82,33 @@ Description: secure shell (SSH) client, for secure access to remote machines ssh replaces the insecure rsh, rcp and rlogin programs, which are obsolete for most purposes. +Package: openssh-client-gssapi +Priority: optional +Architecture: all +Depends: + openssh-client (>= ${binary:Version}), + ${misc:Depends}, +Multi-Arch: foreign +Description: secure shell (SSH) client, with GSS-API support + This is the portable version of OpenSSH, a free implementation of + the Secure Shell protocol as specified by the IETF secsh working + group. + . + Ssh (Secure Shell) is a program for logging into a remote machine + and for executing commands on a remote machine. + It provides secure encrypted communications between two untrusted + hosts over an insecure network. X11 connections and arbitrary TCP/IP + ports can also be forwarded over the secure channel. + It can be used to provide applications with a secure communication + channel. + . + This package provides versions of the ssh client and related programs + built with support for GSS-API authentication and key exchange, which + can be used with systems such as Kerberos. + It is currently an empty package depending on openssh-client, but + future releases will remove GSS-API support from openssh-client, so + users who need it should install this package. + Package: openssh-server Priority: optional Architecture: any @@ -142,6 +169,34 @@ Description: secure shell (SSH) server, for secure access from remote machines sshd replaces the insecure rshd program, which is obsolete for most purposes. +Package: openssh-server-gssapi +Priority: optional +Architecture: all +Depends: + openssh-client-gssapi (>= ${binary:Version}), + openssh-server (>= ${binary:Version}), + ${misc:Depends}, +Multi-Arch: foreign +Description: secure shell (SSH) server, with GSS-API key exchange + This is the portable version of OpenSSH, a free implementation of + the Secure Shell protocol as specified by the IETF secsh working + group. + . + Ssh (Secure Shell) is a program for logging into a remote machine + and for executing commands on a remote machine. + It provides secure encrypted communications between two untrusted + hosts over an insecure network. X11 connections and arbitrary TCP/IP + ports can also be forwarded over the secure channel. + It can be used to provide applications with a secure communication + channel. + . + This package provides a version of the sshd server built with support + for GSS-API authentication and key exchange, which can be used with + systems such as Kerberos. + It is currently an empty package depending on openssh-server, but + future releases will remove GSS-API support from openssh-server, so + users who need it should install this package. + Package: openssh-sftp-server Priority: optional Architecture: any diff --git a/debian/patches/authorized-keys-man-symlink.patch b/debian/patches/authorized-keys-man-symlink.patch index e014ae5..15229e0 100644 --- a/debian/patches/authorized-keys-man-symlink.patch +++ b/debian/patches/authorized-keys-man-symlink.patch @@ -1,4 +1,4 @@ -From fa2050cccface30a90effecf902ac69779e684a5 Mon Sep 17 00:00:00 2001 +From ec27bea14d45b10b31cc0cc8b8808977678890ad Mon Sep 17 00:00:00 2001 From: Tomas Pospisek <tpo_deb@sourcepole.ch> Date: Sun, 9 Feb 2014 16:10:07 +0000 Subject: Install authorized_keys(5) as a symlink to sshd(8) @@ -13,10 +13,10 @@ Patch-Name: authorized-keys-man-symlink.patch 1 file changed, 1 insertion(+) diff --git a/Makefile.in b/Makefile.in -index 6635b5518..f08dd03d9 100644 +index e92bf3e31..eeea95410 100644 --- a/Makefile.in +++ b/Makefile.in -@@ -427,6 +427,7 @@ install-files: +@@ -426,6 +426,7 @@ install-files: $(INSTALL) -m 644 sshd_config.5.out $(DESTDIR)$(mandir)/$(mansubdir)5/sshd_config.5 $(INSTALL) -m 644 ssh_config.5.out $(DESTDIR)$(mandir)/$(mansubdir)5/ssh_config.5 $(INSTALL) -m 644 sshd.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/sshd.8 diff --git a/debian/patches/configure-cache-vars.patch b/debian/patches/configure-cache-vars.patch index 86481d7..cf7c732 100644 --- a/debian/patches/configure-cache-vars.patch +++ b/debian/patches/configure-cache-vars.patch @@ -1,4 +1,4 @@ -From 322f3ff14422182dff32e0dc51c1d0b23b8cba0e Mon Sep 17 00:00:00 2001 +From 36643abfa8abe5cb3f8c52cecadb1e6675d1fe23 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Wed, 3 Apr 2024 11:52:04 +0100 Subject: Add Autoconf cache variables for OSSH_CHECK_*FLAG_* diff --git a/debian/patches/debian-banner.patch b/debian/patches/debian-banner.patch index fd0443b..9bbcf9d 100644 --- a/debian/patches/debian-banner.patch +++ b/debian/patches/debian-banner.patch @@ -1,4 +1,4 @@ -From 6bed4d1be79474891ebaa62259919f14acf28273 Mon Sep 17 00:00:00 2001 +From b054afdc85f743749259187c2cd8e396d76f442b Mon Sep 17 00:00:00 2001 From: Kees Cook <kees@debian.org> Date: Sun, 9 Feb 2014 16:10:06 +0000 Subject: Add DebianBanner server configuration option @@ -8,7 +8,7 @@ initial protocol handshake, for those scared by package-versioning.patch. Bug-Debian: http://bugs.debian.org/562048 Forwarded: not-needed -Last-Update: 2024-07-03 +Last-Update: 2024-09-22 Patch-Name: debian-banner.patch --- @@ -22,10 +22,10 @@ Patch-Name: debian-banner.patch 7 files changed, 23 insertions(+), 5 deletions(-) diff --git a/kex.c b/kex.c -index 744fb27fb..e872ab02e 100644 +index 19b1fcaa8..ca6d5b53d 100644 --- a/kex.c +++ b/kex.c -@@ -1239,7 +1239,7 @@ send_error(struct ssh *ssh, char *msg) +@@ -1237,7 +1237,7 @@ send_error(struct ssh *ssh, char *msg) */ int kex_exchange_identification(struct ssh *ssh, int timeout_ms, @@ -34,7 +34,7 @@ index 744fb27fb..e872ab02e 100644 { int remote_major, remote_minor, mismatch, oerrno = 0; size_t len, n; -@@ -1257,7 +1257,8 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms, +@@ -1255,7 +1255,8 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms, if (version_addendum != NULL && *version_addendum == '\0') version_addendum = NULL; if ((r = sshbuf_putf(our_version, "SSH-%d.%d-%s%s%s\r\n", @@ -45,10 +45,10 @@ index 744fb27fb..e872ab02e 100644 version_addendum == NULL ? "" : version_addendum)) != 0) { oerrno = errno; diff --git a/kex.h b/kex.h -index d3c57a329..5ca4f9a5e 100644 +index cd6a40333..6a08023d0 100644 --- a/kex.h +++ b/kex.h -@@ -213,7 +213,7 @@ void kex_proposal_populate_entries(struct ssh *, char *prop[PROPOSAL_MAX], +@@ -215,7 +215,7 @@ void kex_proposal_populate_entries(struct ssh *, char *prop[PROPOSAL_MAX], const char *, const char *, const char *, const char *, const char *); void kex_proposal_free_entries(char *prop[PROPOSAL_MAX]); @@ -58,45 +58,45 @@ index d3c57a329..5ca4f9a5e 100644 struct kex *kex_new(void); int kex_ready(struct ssh *, char *[PROPOSAL_MAX]); diff --git a/servconf.c b/servconf.c -index 169b9ff07..81511bc86 100644 +index 1d5c143ba..49a066df8 100644 --- a/servconf.c +++ b/servconf.c -@@ -217,6 +217,7 @@ initialize_server_options(ServerOptions *options) - options->num_channel_timeouts = 0; +@@ -219,6 +219,7 @@ initialize_server_options(ServerOptions *options) options->unused_connection_timeout = -1; options->sshd_session_path = NULL; + options->refuse_connection = -1; + options->debian_banner = -1; } /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ -@@ -501,6 +502,8 @@ fill_default_server_options(ServerOptions *options) - options->unused_connection_timeout = 0; - if (options->sshd_session_path == NULL) +@@ -507,6 +508,8 @@ fill_default_server_options(ServerOptions *options) options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION); + if (options->refuse_connection == -1) + options->refuse_connection = 0; + if (options->debian_banner == -1) + options->debian_banner = 1; assemble_algorithms(options); -@@ -585,6 +588,7 @@ typedef enum { +@@ -591,6 +594,7 @@ typedef enum { sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout, - sSshdSessionPath, + sSshdSessionPath, sRefuseConnection, + sDebianBanner, sDeprecated, sIgnore, sUnsupported } ServerOpCodes; -@@ -763,6 +767,7 @@ static struct { - { "channeltimeout", sChannelTimeout, SSHCFG_ALL }, +@@ -770,6 +774,7 @@ static struct { { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL }, { "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL }, + { "refuseconnection", sRefuseConnection, SSHCFG_ALL }, + { "debianbanner", sDebianBanner, SSHCFG_GLOBAL }, { NULL, sBadOption, 0 } }; -@@ -2702,6 +2707,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, - charptr = &options->sshd_session_path; - goto parse_filename; +@@ -2725,6 +2730,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, + multistate_ptr = multistate_flag; + goto parse_multistate; + case sDebianBanner: + intptr = &options->debian_banner; @@ -105,22 +105,22 @@ index 169b9ff07..81511bc86 100644 case sDeprecated: case sIgnore: case sUnsupported: -@@ -3251,6 +3260,7 @@ dump_config(ServerOptions *o) - dump_cfg_fmtint(sStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink); +@@ -3278,6 +3287,7 @@ dump_config(ServerOptions *o) dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash); dump_cfg_fmtint(sExposeAuthInfo, o->expose_userauth_info); + dump_cfg_fmtint(sRefuseConnection, o->refuse_connection); + dump_cfg_fmtint(sDebianBanner, o->debian_banner); /* string arguments */ dump_cfg_string(sPidFile, o->pid_file); diff --git a/servconf.h b/servconf.h -index c1e2751ee..1532e5420 100644 +index 26819aa92..00c834403 100644 --- a/servconf.h +++ b/servconf.h -@@ -251,6 +251,8 @@ typedef struct { - int unused_connection_timeout; - +@@ -254,6 +254,8 @@ typedef struct { char *sshd_session_path; + + int refuse_connection; + + int debian_banner; } ServerOptions; @@ -140,12 +140,12 @@ index cbfc20735..f9d3a1ff2 100644 /* Put the connection into non-blocking mode. */ diff --git a/sshd-session.c b/sshd-session.c -index b6e544108..2a512dd74 100644 +index 1d7cdd00a..a9e1cf4f6 100644 --- a/sshd-session.c +++ b/sshd-session.c -@@ -1303,7 +1303,7 @@ main(int ac, char **av) - if (!debug_flag) - alarm(options.login_grace_time); +@@ -1314,7 +1314,7 @@ main(int ac, char **av) + fatal("login grace time setitimer failed"); + } - if ((r = kex_exchange_identification(ssh, -1, + if ((r = kex_exchange_identification(ssh, -1, options.debian_banner, @@ -153,7 +153,7 @@ index b6e544108..2a512dd74 100644 sshpkt_fatal(ssh, r, "banner exchange"); diff --git a/sshd_config.5 b/sshd_config.5 -index 5dd656869..81671fb99 100644 +index 11a8e922f..ed2f74060 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -629,6 +629,11 @@ or diff --git a/debian/patches/debian-config.patch b/debian/patches/debian-config.patch index ee3b297..f3840d9 100644 --- a/debian/patches/debian-config.patch +++ b/debian/patches/debian-config.patch @@ -1,4 +1,4 @@ -From 8b067a754bdeac8fcdab1fbb2010651cf07b1b61 Mon Sep 17 00:00:00 2001 +From f0e3f2f89d93cc90cd2e03acb5294fba07058b27 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:18 +0000 Subject: Various Debian-specific configuration changes @@ -48,10 +48,10 @@ Patch-Name: debian-config.patch 7 files changed, 100 insertions(+), 10 deletions(-) diff --git a/readconf.c b/readconf.c -index eaca29ace..1b64b7af5 100644 +index d3c3056ef..90bf74f32 100644 --- a/readconf.c +++ b/readconf.c -@@ -2739,7 +2739,7 @@ fill_default_options(Options * options) +@@ -2773,7 +2773,7 @@ fill_default_options(Options * options) if (options->forward_x11 == -1) options->forward_x11 = 0; if (options->forward_x11_trusted == -1) @@ -73,10 +73,10 @@ index 7afc28072..02b122a85 100644 # This may be necessary if /usr/src and/or /usr/obj are group-writable, diff --git a/ssh.1 b/ssh.1 -index c8c5558e5..0697ec77d 100644 +index 3ad246c27..9ca6e18e2 100644 --- a/ssh.1 +++ b/ssh.1 -@@ -861,6 +861,16 @@ directive in +@@ -863,6 +863,16 @@ directive in .Xr ssh_config 5 for more information. .Pp @@ -93,7 +93,7 @@ index c8c5558e5..0697ec77d 100644 .It Fl x Disables X11 forwarding. .Pp -@@ -869,6 +879,20 @@ Enables trusted X11 forwarding. +@@ -871,6 +881,20 @@ Enables trusted X11 forwarding. Trusted X11 forwardings are not subjected to the X11 SECURITY extension controls. .Pp @@ -140,7 +140,7 @@ index 16197d15d..92d06ef38 100644 + HashKnownHosts yes + GSSAPIAuthentication yes diff --git a/ssh_config.5 b/ssh_config.5 -index cb1bba1a7..091b933b4 100644 +index 86258eb4f..9adc0fdb7 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -71,6 +71,29 @@ Since the first obtained value for each parameter is used, more @@ -173,7 +173,7 @@ index cb1bba1a7..091b933b4 100644 The file contains keyword-argument pairs, one per line. Lines starting with .Ql # -@@ -901,11 +924,12 @@ elapsed. +@@ -903,11 +926,12 @@ elapsed. .It Cm ForwardX11Trusted If this option is set to .Cm yes , @@ -246,7 +246,7 @@ index ecfe8d026..677f97d5d 100644 # Example of overriding settings on a per-user basis #Match User anoncvs diff --git a/sshd_config.5 b/sshd_config.5 -index 9d33cb472..1f6c42523 100644 +index e177e4af8..2887ed531 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -56,6 +56,35 @@ Arguments may optionally be enclosed in double quotes @@ -285,7 +285,7 @@ index 9d33cb472..1f6c42523 100644 The possible keywords and their meanings are as follows (note that keywords are case-insensitive and arguments are case-sensitive): -@@ -1840,7 +1869,7 @@ Overrides the default path to the +@@ -1865,7 +1894,7 @@ Overrides the default path to the .Cm sshd-session binary that is invoked to handle each connection. The default is diff --git a/debian/patches/dnssec-sshfp.patch b/debian/patches/dnssec-sshfp.patch index 6e78215..fd60549 100644 --- a/debian/patches/dnssec-sshfp.patch +++ b/debian/patches/dnssec-sshfp.patch @@ -1,4 +1,4 @@ -From 0d8aedb659c1c3892a9ba071ea003530ea8ca1b3 Mon Sep 17 00:00:00 2001 +From 2b058d79e79790dd2991ccd74463e7f28703dd05 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:01 +0000 Subject: Force use of DNSSEC even if "options edns0" isn't in resolv.conf diff --git a/debian/patches/doc-hash-tab-completion.patch b/debian/patches/doc-hash-tab-completion.patch index 3c2b05b..c4d24be 100644 --- a/debian/patches/doc-hash-tab-completion.patch +++ b/debian/patches/doc-hash-tab-completion.patch @@ -1,4 +1,4 @@ -From cceb89a954534c1bed67d20613fe8aa82bec37e4 Mon Sep 17 00:00:00 2001 +From ae3314e7c7ba0ad3dfcb49e2dc2913b442a5f33c Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:11 +0000 Subject: Document that HashKnownHosts may break tab-completion @@ -13,10 +13,10 @@ Patch-Name: doc-hash-tab-completion.patch 1 file changed, 3 insertions(+) diff --git a/ssh_config.5 b/ssh_config.5 -index d1b1da95a..cb1bba1a7 100644 +index 073ef69e2..86258eb4f 100644 --- a/ssh_config.5 +++ b/ssh_config.5 -@@ -1020,6 +1020,9 @@ Note that existing names and addresses in known hosts files +@@ -1022,6 +1022,9 @@ Note that existing names and addresses in known hosts files will not be converted automatically, but may be manually hashed using .Xr ssh-keygen 1 . diff --git a/debian/patches/gnome-ssh-askpass2-icon.patch b/debian/patches/gnome-ssh-askpass2-icon.patch index b10014b..cfbb175 100644 --- a/debian/patches/gnome-ssh-askpass2-icon.patch +++ b/debian/patches/gnome-ssh-askpass2-icon.patch @@ -1,4 +1,4 @@ -From fac5d188210df34ace8c8f1f6f47c2a72e01c535 Mon Sep 17 00:00:00 2001 +From 9f8d5d786d80ef632c1531eb11ff83cc97b1d19c Mon Sep 17 00:00:00 2001 From: Vincent Untz <vuntz@ubuntu.com> Date: Sun, 9 Feb 2014 16:10:16 +0000 Subject: Give the ssh-askpass-gnome window a default icon diff --git a/debian/patches/gssapi.patch b/debian/patches/gssapi.patch index 5f5f9ce..4950a16 100644 --- a/debian/patches/gssapi.patch +++ b/debian/patches/gssapi.patch @@ -1,4 +1,4 @@ -From 19f6afb4e07135a843c2f5caaa663a1d3f3db6f1 Mon Sep 17 00:00:00 2001 +From 25a0d098399b79a2ee544f17947829c01f13932c Mon Sep 17 00:00:00 2001 From: Simon Wilkinson <simon@sxw.org.uk> Date: Sun, 9 Feb 2014 16:09:48 +0000 Subject: GSSAPI key exchange support @@ -21,11 +21,11 @@ Author: Colin Watson <cjwatson@debian.org> Author: Jakub Jelen <jjelen@redhat.com> Origin: other, https://github.com/openssh-gsskex/openssh-gsskex/pull/23 Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1242 -Last-Updated: 2024-07-31 +Last-Updated: 2024-09-22 Patch-Name: gssapi.patch --- - Makefile.in | 5 +- + Makefile.in | 6 +- README.md | 36 +++ auth.c | 3 +- auth2-gss.c | 54 ++++- @@ -65,16 +65,16 @@ Patch-Name: gssapi.patch sshd_config.5 | 30 +++ sshkey.c | 8 +- sshkey.h | 1 + - 40 files changed, 2667 insertions(+), 71 deletions(-) + 40 files changed, 2667 insertions(+), 72 deletions(-) create mode 100644 kexgssc.c create mode 100644 kexgsss.c create mode 100644 ssh-null.c diff --git a/Makefile.in b/Makefile.in -index e1b77ebc6..6635b5518 100644 +index 4243006b0..e92bf3e31 100644 --- a/Makefile.in +++ b/Makefile.in -@@ -103,7 +103,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ +@@ -103,14 +103,14 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ readpass.o ttymodes.o xmalloc.o addr.o addrmatch.o \ atomicio.o dispatch.o mac.o misc.o utf8.o \ monitor_fdpass.o rijndael.o ssh-dss.o ssh-ecdsa.o ssh-ecdsa-sk.o \ @@ -83,15 +83,15 @@ index e1b77ebc6..6635b5518 100644 msg.o progressmeter.o dns.o entropy.o gss-genr.o umac.o umac128.o \ ssh-pkcs11.o smult_curve25519_ref.o \ poly1305.o chacha.o cipher-chachapoly.o cipher-chachapoly-libcrypto.o \ -@@ -112,6 +112,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ + ssh-ed25519.o digest-openssl.o digest-libc.o \ + hmac.o ed25519.o hash.o \ kex.o kex-names.o kexdh.o kexgex.o kexecdh.o kexc25519.o \ - kexgexc.o kexgexs.o \ - kexsntrup761x25519.o sntrup761.o kexgen.o \ -+ kexgssc.o \ +- kexgexc.o kexgexs.o \ ++ kexgexc.o kexgexs.o kexgssc.o \ + kexsntrup761x25519.o kexmlkem768x25519.o sntrup761.o kexgen.o \ sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \ sshbuf-io.o - -@@ -134,7 +135,7 @@ SSHD_SESSION_OBJS=sshd-session.o auth-rhosts.o auth-passwd.o \ +@@ -134,7 +134,7 @@ SSHD_SESSION_OBJS=sshd-session.o auth-rhosts.o auth-passwd.o \ auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \ auth2-none.o auth2-passwd.o auth2-pubkey.o auth2-pubkeyfile.o \ monitor.o monitor_wrap.o auth-krb5.o \ @@ -145,7 +145,7 @@ index 9431b0ffd..e5051828c 100644 [![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml) diff --git a/auth.c b/auth.c -index 2e4cbef07..407b32e78 100644 +index 9a6e5a319..e4578169b 100644 --- a/auth.c +++ b/auth.c @@ -356,7 +356,8 @@ auth_root_allowed(struct ssh *ssh, const char *method) @@ -334,7 +334,7 @@ index 8ed8b1c34..6d57339a1 100644 if (conn_in_ready) client_process_net_input(ssh); diff --git a/configure.ac b/configure.ac -index 5a865f8e1..dc274329f 100644 +index 591d5a388..6a0140a9d 100644 --- a/configure.ac +++ b/configure.ac @@ -774,6 +774,30 @@ int main(void) { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) @@ -1171,7 +1171,7 @@ index 00e3d118b..b761d12aa 100644 /* Privileged */ diff --git a/kex-names.c b/kex-names.c -index 339eb1c23..f077520bb 100644 +index ec840c1f9..081f78c94 100644 --- a/kex-names.c +++ b/kex-names.c @@ -45,6 +45,10 @@ @@ -1185,7 +1185,7 @@ index 339eb1c23..f077520bb 100644 struct kexalg { char *name; u_int type; -@@ -83,15 +87,28 @@ static const struct kexalg kexalgs[] = { +@@ -89,15 +93,28 @@ static const struct kexalg kexalgs[] = { #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */ { NULL, 0, -1, -1}, }; @@ -1217,7 +1217,7 @@ index 339eb1c23..f077520bb 100644 if (ret != NULL) ret[rlen++] = sep; nlen = strlen(k->name); -@@ -106,6 +123,18 @@ kex_alg_list(char sep) +@@ -112,6 +129,18 @@ kex_alg_list(char sep) return ret; } @@ -1236,7 +1236,7 @@ index 339eb1c23..f077520bb 100644 static const struct kexalg * kex_alg_by_name(const char *name) { -@@ -115,6 +144,10 @@ kex_alg_by_name(const char *name) +@@ -121,6 +150,10 @@ kex_alg_by_name(const char *name) if (strcmp(k->name, name) == 0) return k; } @@ -1247,7 +1247,7 @@ index 339eb1c23..f077520bb 100644 return NULL; } -@@ -177,6 +210,29 @@ kex_names_valid(const char *names) +@@ -183,6 +216,29 @@ kex_names_valid(const char *names) return 1; } @@ -1278,7 +1278,7 @@ index 339eb1c23..f077520bb 100644 int kex_has_any_alg(const char *proposal, const char *algs) diff --git a/kex.c b/kex.c -index 63aae5d71..fd018021e 100644 +index 6b957e5e1..f09e79e6b 100644 --- a/kex.c +++ b/kex.c @@ -58,6 +58,7 @@ @@ -1300,13 +1300,13 @@ index 63aae5d71..fd018021e 100644 free(kex->hostkey_alg); free(kex->name); diff --git a/kex.h b/kex.h -index 34665eb20..d3c57a329 100644 +index d08988b3e..cd6a40333 100644 --- a/kex.h +++ b/kex.h -@@ -102,6 +102,15 @@ enum kex_exchange { - KEX_ECDH_SHA2, +@@ -103,6 +103,15 @@ enum kex_exchange { KEX_C25519_SHA256, KEX_KEM_SNTRUP761X25519_SHA512, + KEX_KEM_MLKEM768X25519_SHA256, +#ifdef GSSAPI + KEX_GSS_GRP1_SHA1, + KEX_GSS_GRP14_SHA1, @@ -1319,7 +1319,7 @@ index 34665eb20..d3c57a329 100644 KEX_MAX }; -@@ -164,6 +173,12 @@ struct kex { +@@ -165,6 +174,12 @@ struct kex { u_int flags; int hash_alg; int ec_nid; @@ -1332,7 +1332,7 @@ index 34665eb20..d3c57a329 100644 char *failed_choice; int (*verify_host_key)(struct sshkey *, struct ssh *); struct sshkey *(*load_host_public_key)(int, int, struct ssh *); -@@ -188,7 +203,9 @@ u_int kex_type_from_name(const char *); +@@ -190,7 +205,9 @@ u_int kex_type_from_name(const char *); int kex_hash_from_name(const char *); int kex_nid_from_name(const char *); int kex_names_valid(const char *); @@ -1342,7 +1342,7 @@ index 34665eb20..d3c57a329 100644 char *kex_names_cat(const char *, const char *); int kex_has_any_alg(const char *, const char *); int kex_assemble_names(char **, const char *, const char *); -@@ -224,6 +241,12 @@ int kexgex_client(struct ssh *); +@@ -226,6 +243,12 @@ int kexgex_client(struct ssh *); int kexgex_server(struct ssh *); int kex_gen_client(struct ssh *); int kex_gen_server(struct ssh *); @@ -1355,7 +1355,7 @@ index 34665eb20..d3c57a329 100644 int kex_dh_keypair(struct kex *); int kex_dh_enc(struct kex *, const struct sshbuf *, struct sshbuf **, -@@ -256,6 +279,12 @@ int kexgex_hash(int, const struct sshbuf *, const struct sshbuf *, +@@ -264,6 +287,12 @@ int kexgex_hash(int, const struct sshbuf *, const struct sshbuf *, const BIGNUM *, const u_char *, size_t, u_char *, size_t *); @@ -1397,7 +1397,7 @@ index c1084f214..0faab21b0 100644 break; case KEX_DH_GRP18_SHA512: diff --git a/kexgen.c b/kexgen.c -index 20f3c5711..ca704844e 100644 +index 40d688d62..15df591ca 100644 --- a/kexgen.c +++ b/kexgen.c @@ -44,7 +44,7 @@ @@ -2502,10 +2502,10 @@ index 000000000..1fd1d1e48 +} +#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */ diff --git a/monitor.c b/monitor.c -index 9e0e03ea2..92e2ca107 100644 +index 5966b4f96..ad7fef5a9 100644 --- a/monitor.c +++ b/monitor.c -@@ -140,6 +140,8 @@ int mm_answer_gss_setup_ctx(struct ssh *, int, struct sshbuf *); +@@ -141,6 +141,8 @@ int mm_answer_gss_setup_ctx(struct ssh *, int, struct sshbuf *); int mm_answer_gss_accept_ctx(struct ssh *, int, struct sshbuf *); int mm_answer_gss_userok(struct ssh *, int, struct sshbuf *); int mm_answer_gss_checkmic(struct ssh *, int, struct sshbuf *); @@ -2514,7 +2514,7 @@ index 9e0e03ea2..92e2ca107 100644 #endif #ifdef SSH_AUDIT_EVENTS -@@ -213,11 +215,18 @@ struct mon_table mon_dispatch_proto20[] = { +@@ -214,11 +216,18 @@ struct mon_table mon_dispatch_proto20[] = { {MONITOR_REQ_GSSSTEP, 0, mm_answer_gss_accept_ctx}, {MONITOR_REQ_GSSUSEROK, MON_ONCE|MON_AUTHDECIDE, mm_answer_gss_userok}, {MONITOR_REQ_GSSCHECKMIC, MON_ONCE, mm_answer_gss_checkmic}, @@ -2533,7 +2533,7 @@ index 9e0e03ea2..92e2ca107 100644 #ifdef WITH_OPENSSL {MONITOR_REQ_MODULI, 0, mm_answer_moduli}, #endif -@@ -286,6 +295,10 @@ monitor_child_preauth(struct ssh *ssh, struct monitor *pmonitor) +@@ -287,6 +296,10 @@ monitor_child_preauth(struct ssh *ssh, struct monitor *pmonitor) /* Permit requests for moduli and signatures */ monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1); monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1); @@ -2544,7 +2544,7 @@ index 9e0e03ea2..92e2ca107 100644 /* The first few requests do not require asynchronous access */ while (!authenticated) { -@@ -407,6 +420,10 @@ monitor_child_postauth(struct ssh *ssh, struct monitor *pmonitor) +@@ -408,6 +421,10 @@ monitor_child_postauth(struct ssh *ssh, struct monitor *pmonitor) monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1); monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1); monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1); @@ -2555,7 +2555,7 @@ index 9e0e03ea2..92e2ca107 100644 if (auth_opts->permit_pty_flag) { monitor_permit(mon_dispatch, MONITOR_REQ_PTY, 1); -@@ -1760,6 +1777,17 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor) +@@ -1770,6 +1787,17 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor) # ifdef OPENSSL_HAS_ECC kex->kex[KEX_ECDH_SHA2] = kex_gen_server; # endif @@ -2573,7 +2573,7 @@ index 9e0e03ea2..92e2ca107 100644 #endif /* WITH_OPENSSL */ kex->kex[KEX_C25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; -@@ -1852,8 +1880,8 @@ mm_answer_gss_setup_ctx(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1863,8 +1891,8 @@ mm_answer_gss_setup_ctx(struct ssh *ssh, int sock, struct sshbuf *m) u_char *p; int r; @@ -2584,7 +2584,7 @@ index 9e0e03ea2..92e2ca107 100644 if ((r = sshbuf_get_string(m, &p, &len)) != 0) fatal_fr(r, "parse"); -@@ -1885,8 +1913,8 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1896,8 +1924,8 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m) OM_uint32 flags = 0; /* GSI needs this */ int r; @@ -2595,7 +2595,7 @@ index 9e0e03ea2..92e2ca107 100644 if ((r = ssh_gssapi_get_buffer_desc(m, &in)) != 0) fatal_fr(r, "ssh_gssapi_get_buffer_desc"); -@@ -1906,6 +1934,7 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1917,6 +1945,7 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m) monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0); monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1); @@ -2603,7 +2603,7 @@ index 9e0e03ea2..92e2ca107 100644 } return (0); } -@@ -1917,8 +1946,8 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1928,8 +1957,8 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m) OM_uint32 ret; int r; @@ -2614,7 +2614,7 @@ index 9e0e03ea2..92e2ca107 100644 if ((r = ssh_gssapi_get_buffer_desc(m, &gssbuf)) != 0 || (r = ssh_gssapi_get_buffer_desc(m, &mic)) != 0) -@@ -1944,13 +1973,17 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1955,13 +1984,17 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m) int mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m) { @@ -2636,7 +2636,7 @@ index 9e0e03ea2..92e2ca107 100644 sshbuf_reset(m); if ((r = sshbuf_put_u32(m, authenticated)) != 0) -@@ -1959,7 +1992,11 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1970,7 +2003,11 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m) debug3_f("sending result %d", authenticated); mm_request_send(sock, MONITOR_ANS_GSSUSEROK, m); @@ -2649,7 +2649,7 @@ index 9e0e03ea2..92e2ca107 100644 if ((displayname = ssh_gssapi_displayname()) != NULL) auth2_record_info(authctxt, "%s", displayname); -@@ -1967,5 +2004,83 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1978,5 +2015,83 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m) /* Monitor loop will terminate if authenticated */ return (authenticated); } @@ -2845,7 +2845,7 @@ index e768036ed..09b0ccaaa 100644 #ifdef USE_PAM diff --git a/readconf.c b/readconf.c -index 4e3791cb7..8bdeb9d08 100644 +index 3d9cc6dbb..0ce392538 100644 --- a/readconf.c +++ b/readconf.c @@ -70,6 +70,7 @@ @@ -2888,7 +2888,7 @@ index 4e3791cb7..8bdeb9d08 100644 #endif #ifdef ENABLE_PKCS11 { "pkcs11provider", oPKCS11Provider }, -@@ -1227,10 +1242,46 @@ parse_time: +@@ -1256,10 +1271,46 @@ parse_time: intptr = &options->gss_authentication; goto parse_flag; @@ -2935,7 +2935,7 @@ index 4e3791cb7..8bdeb9d08 100644 case oBatchMode: intptr = &options->batch_mode; goto parse_flag; -@@ -2542,7 +2593,13 @@ initialize_options(Options * options) +@@ -2576,7 +2627,13 @@ initialize_options(Options * options) options->fwd_opts.streamlocal_bind_unlink = -1; options->pubkey_authentication = -1; options->gss_authentication = -1; @@ -2949,7 +2949,7 @@ index 4e3791cb7..8bdeb9d08 100644 options->password_authentication = -1; options->kbd_interactive_authentication = -1; options->kbd_interactive_devices = NULL; -@@ -2705,8 +2762,18 @@ fill_default_options(Options * options) +@@ -2739,8 +2796,18 @@ fill_default_options(Options * options) options->pubkey_authentication = SSH_PUBKEY_AUTH_ALL; if (options->gss_authentication == -1) options->gss_authentication = 0; @@ -2968,7 +2968,7 @@ index 4e3791cb7..8bdeb9d08 100644 if (options->password_authentication == -1) options->password_authentication = 1; if (options->kbd_interactive_authentication == -1) -@@ -3533,7 +3600,14 @@ dump_client_config(Options *o, const char *host) +@@ -3567,7 +3634,14 @@ dump_client_config(Options *o, const char *host) dump_cfg_fmtint(oGatewayPorts, o->fwd_opts.gateway_ports); #ifdef GSSAPI dump_cfg_fmtint(oGssAuthentication, o->gss_authentication); @@ -3002,7 +3002,7 @@ index 9447d5d6e..f039c11bd 100644 * authentication. */ int kbd_interactive_authentication; /* Try keyboard-interactive auth. */ diff --git a/servconf.c b/servconf.c -index 5b32f0bfc..c1bfca258 100644 +index 89b8413e8..731f208be 100644 --- a/servconf.c +++ b/servconf.c @@ -68,6 +68,7 @@ @@ -3025,7 +3025,7 @@ index 5b32f0bfc..c1bfca258 100644 options->password_authentication = -1; options->kbd_interactive_authentication = -1; options->permit_empty_passwd = -1; -@@ -376,10 +380,18 @@ fill_default_server_options(ServerOptions *options) +@@ -378,10 +382,18 @@ fill_default_server_options(ServerOptions *options) options->kerberos_get_afs_token = 0; if (options->gss_authentication == -1) options->gss_authentication = 0; @@ -3044,7 +3044,7 @@ index 5b32f0bfc..c1bfca258 100644 if (options->password_authentication == -1) options->password_authentication = 1; if (options->kbd_interactive_authentication == -1) -@@ -558,6 +570,7 @@ typedef enum { +@@ -564,6 +576,7 @@ typedef enum { sPerSourcePenalties, sPerSourcePenaltyExemptList, sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile, sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor, @@ -3052,7 +3052,7 @@ index 5b32f0bfc..c1bfca258 100644 sAcceptEnv, sSetEnv, sPermitTunnel, sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory, sUsePrivilegeSeparation, sAllowAgentForwarding, -@@ -643,12 +656,22 @@ static struct { +@@ -649,12 +662,22 @@ static struct { #ifdef GSSAPI { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL }, { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL }, @@ -3075,7 +3075,7 @@ index 5b32f0bfc..c1bfca258 100644 { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL }, { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, { "challengeresponseauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */ -@@ -1585,6 +1608,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, +@@ -1605,6 +1628,10 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->gss_authentication; goto parse_flag; @@ -3086,7 +3086,7 @@ index 5b32f0bfc..c1bfca258 100644 case sGssCleanupCreds: intptr = &options->gss_cleanup_creds; goto parse_flag; -@@ -1593,6 +1620,22 @@ process_server_config_line_depth(ServerOptions *options, char *line, +@@ -1613,6 +1640,22 @@ process_server_config_line_depth(ServerOptions *options, char *line, intptr = &options->gss_strict_acceptor; goto parse_flag; @@ -3109,7 +3109,7 @@ index 5b32f0bfc..c1bfca258 100644 case sPasswordAuthentication: intptr = &options->password_authentication; goto parse_flag; -@@ -3178,6 +3221,10 @@ dump_config(ServerOptions *o) +@@ -3204,6 +3247,10 @@ dump_config(ServerOptions *o) #ifdef GSSAPI dump_cfg_fmtint(sGssAuthentication, o->gss_authentication); dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds); @@ -3121,10 +3121,10 @@ index 5b32f0bfc..c1bfca258 100644 dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication); dump_cfg_fmtint(sKbdInteractiveAuthentication, diff --git a/servconf.h b/servconf.h -index 22b158d10..c1e2751ee 100644 +index 5089bc9ea..26819aa92 100644 --- a/servconf.h +++ b/servconf.h -@@ -149,8 +149,11 @@ typedef struct { +@@ -150,8 +150,11 @@ typedef struct { int kerberos_get_afs_token; /* If true, try to get AFS token if * authenticated with Kerberos. */ int gss_authentication; /* If true, permit GSSAPI authentication */ @@ -3401,10 +3401,10 @@ index 000000000..a934bda77 + +#endif /* GSSAPI */ diff --git a/ssh.1 b/ssh.1 -index f871ff4e4..dc382cd49 100644 +index 710d3d4e6..8f78b3a1e 100644 --- a/ssh.1 +++ b/ssh.1 -@@ -536,7 +536,13 @@ For full details of the options listed below, and their possible values, see +@@ -538,7 +538,13 @@ For full details of the options listed below, and their possible values, see .It GatewayPorts .It GlobalKnownHostsFile .It GSSAPIAuthentication @@ -3418,7 +3418,7 @@ index f871ff4e4..dc382cd49 100644 .It HashKnownHosts .It Host .It HostbasedAcceptedAlgorithms -@@ -624,6 +630,8 @@ flag), +@@ -626,6 +632,8 @@ flag), (supported message integrity codes), .Ar kex (key exchange algorithms), @@ -3465,7 +3465,7 @@ index cc5663562..16197d15d 100644 # CheckHostIP no # AddressFamily any diff --git a/ssh_config.5 b/ssh_config.5 -index 2e1902283..255577462 100644 +index 7c7c5c50d..4a48c5775 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -938,10 +938,67 @@ The default is @@ -3537,7 +3537,7 @@ index 2e1902283..255577462 100644 Indicates that .Xr ssh 1 diff --git a/sshconnect2.c b/sshconnect2.c -index e63bb5ec6..e27139adf 100644 +index 11fcdea8a..d809a6507 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -222,6 +222,11 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, @@ -3595,7 +3595,7 @@ index e63bb5ec6..e27139adf 100644 /* start key exchange */ if ((r = kex_setup(ssh, myproposal)) != 0) fatal_r(r, "kex_setup"); -@@ -271,11 +312,31 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, +@@ -271,12 +312,32 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, # ifdef OPENSSL_HAS_ECC ssh->kex->kex[KEX_ECDH_SHA2] = kex_gen_client; # endif @@ -3614,6 +3614,7 @@ index e63bb5ec6..e27139adf 100644 +#endif /* WITH_OPENSSL */ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ssh->kex->verify_host_key=&verify_host_key_callback; +#if defined(GSSAPI) && defined(WITH_OPENSSL) @@ -3628,7 +3629,7 @@ index e63bb5ec6..e27139adf 100644 ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &ssh->kex->done); kex_proposal_free_entries(myproposal); -@@ -368,6 +429,7 @@ static int input_gssapi_response(int type, u_int32_t, struct ssh *); +@@ -369,6 +430,7 @@ static int input_gssapi_response(int type, u_int32_t, struct ssh *); static int input_gssapi_token(int type, u_int32_t, struct ssh *); static int input_gssapi_error(int, u_int32_t, struct ssh *); static int input_gssapi_errtok(int, u_int32_t, struct ssh *); @@ -3636,7 +3637,7 @@ index e63bb5ec6..e27139adf 100644 #endif void userauth(struct ssh *, char *); -@@ -384,6 +446,11 @@ static char *authmethods_get(void); +@@ -385,6 +447,11 @@ static char *authmethods_get(void); Authmethod authmethods[] = { #ifdef GSSAPI @@ -3648,7 +3649,7 @@ index e63bb5ec6..e27139adf 100644 {"gssapi-with-mic", userauth_gssapi, userauth_gssapi_cleanup, -@@ -755,12 +822,32 @@ userauth_gssapi(struct ssh *ssh) +@@ -756,12 +823,32 @@ userauth_gssapi(struct ssh *ssh) OM_uint32 min; int r, ok = 0; gss_OID mech = NULL; @@ -3682,7 +3683,7 @@ index e63bb5ec6..e27139adf 100644 /* Check to see whether the mechanism is usable before we offer it */ while (authctxt->mech_tried < authctxt->gss_supported_mechs->count && -@@ -769,13 +856,15 @@ userauth_gssapi(struct ssh *ssh) +@@ -770,13 +857,15 @@ userauth_gssapi(struct ssh *ssh) elements[authctxt->mech_tried]; /* My DER encoding requires length<128 */ if (mech->length < 128 && ssh_gssapi_check_mechanism(&gssctxt, @@ -3699,7 +3700,7 @@ index e63bb5ec6..e27139adf 100644 if (!ok || mech == NULL) return 0; -@@ -1009,6 +1098,55 @@ input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh) +@@ -1010,6 +1099,55 @@ input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh) free(lang); return r; } @@ -3756,10 +3757,10 @@ index e63bb5ec6..e27139adf 100644 static int diff --git a/sshd-session.c b/sshd-session.c -index fe6ae7f32..ab88db7c5 100644 +index 4b79b9ba6..03a028c82 100644 --- a/sshd-session.c +++ b/sshd-session.c -@@ -656,8 +656,8 @@ notify_hostkeys(struct ssh *ssh) +@@ -658,8 +658,8 @@ notify_hostkeys(struct ssh *ssh) } debug3_f("sent %u hostkeys", nkeys); if (nkeys == 0) @@ -3770,7 +3771,7 @@ index fe6ae7f32..ab88db7c5 100644 sshpkt_fatal(ssh, r, "%s: send", __func__); sshbuf_free(buf); } -@@ -1431,6 +1431,48 @@ do_ssh2_kex(struct ssh *ssh) +@@ -1445,6 +1445,48 @@ do_ssh2_kex(struct ssh *ssh) free(hkalgs); @@ -3819,7 +3820,7 @@ index fe6ae7f32..ab88db7c5 100644 /* start key exchange */ if ((r = kex_setup(ssh, myproposal)) != 0) fatal_r(r, "kex_setup"); -@@ -1448,7 +1490,18 @@ do_ssh2_kex(struct ssh *ssh) +@@ -1462,7 +1504,18 @@ do_ssh2_kex(struct ssh *ssh) #ifdef OPENSSL_HAS_ECC kex->kex[KEX_ECDH_SHA2] = kex_gen_server; #endif @@ -3838,12 +3839,12 @@ index fe6ae7f32..ab88db7c5 100644 +#endif /* WITH_OPENSSL */ kex->kex[KEX_C25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; - kex->load_host_public_key=&get_hostkey_public_by_type; + kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; diff --git a/sshd.c b/sshd.c -index ed54fc6d6..54c65dfe6 100644 +index df76dc78c..48b334c68 100644 --- a/sshd.c +++ b/sshd.c -@@ -1551,7 +1551,8 @@ main(int ac, char **av) +@@ -1558,7 +1558,8 @@ main(int ac, char **av) free(fp); } accumulate_host_timing_secret(cfg, NULL); @@ -3867,7 +3868,7 @@ index 36894ace5..ecfe8d026 100644 # Set this to 'yes' to enable PAM authentication, account processing, # and session processing. If this is enabled, PAM authentication will diff --git a/sshd_config.5 b/sshd_config.5 -index 1ab0f41d9..5e41f0478 100644 +index dbed44f2a..6959d5f6c 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -739,6 +739,11 @@ Specifies whether to automatically destroy the user's credentials cache @@ -3915,10 +3916,10 @@ index 1ab0f41d9..5e41f0478 100644 Specifies the signature algorithms that will be accepted for hostbased authentication as a list of comma-separated patterns. diff --git a/sshkey.c b/sshkey.c -index d4356e72c..c7abbe298 100644 +index 1db83788d..c3acd4e09 100644 --- a/sshkey.c +++ b/sshkey.c -@@ -130,6 +130,9 @@ extern const struct sshkey_impl sshkey_dsa_cert_impl; +@@ -131,6 +131,9 @@ extern const struct sshkey_impl sshkey_dsa_cert_impl; extern const struct sshkey_impl sshkey_xmss_impl; extern const struct sshkey_impl sshkey_xmss_cert_impl; #endif @@ -3928,7 +3929,7 @@ index d4356e72c..c7abbe298 100644 const struct sshkey_impl * const keyimpls[] = { &sshkey_ed25519_impl, -@@ -169,6 +172,9 @@ const struct sshkey_impl * const keyimpls[] = { +@@ -170,6 +173,9 @@ const struct sshkey_impl * const keyimpls[] = { &sshkey_xmss_impl, &sshkey_xmss_cert_impl, #endif @@ -3938,7 +3939,7 @@ index d4356e72c..c7abbe298 100644 NULL }; -@@ -324,7 +330,7 @@ sshkey_alg_list(int certs_only, int plain_only, int include_sigonly, char sep) +@@ -339,7 +345,7 @@ sshkey_alg_list(int certs_only, int plain_only, int include_sigonly, char sep) for (i = 0; keyimpls[i] != NULL; i++) { impl = keyimpls[i]; @@ -3948,10 +3949,10 @@ index d4356e72c..c7abbe298 100644 if (!include_sigonly && impl->sigonly) continue; diff --git a/sshkey.h b/sshkey.h -index 32933bbbd..dc5d3051b 100644 +index d0cdea0ce..cce4b93c0 100644 --- a/sshkey.h +++ b/sshkey.h -@@ -71,6 +71,7 @@ enum sshkey_types { +@@ -73,6 +73,7 @@ enum sshkey_types { KEY_ECDSA_SK_CERT, KEY_ED25519_SK, KEY_ED25519_SK_CERT, diff --git a/debian/patches/keepalive-extensions.patch b/debian/patches/keepalive-extensions.patch index a5f8c57..c38b7d7 100644 --- a/debian/patches/keepalive-extensions.patch +++ b/debian/patches/keepalive-extensions.patch @@ -1,4 +1,4 @@ -From 92c7e83658c40484aa7a0fa977a45de38461beef Mon Sep 17 00:00:00 2001 +From 1f9b181b1f2af9c29468f7a3ab2f51fb354e51ec Mon Sep 17 00:00:00 2001 From: Richard Kettlewell <rjk@greenend.org.uk> Date: Sun, 9 Feb 2014 16:09:52 +0000 Subject: Various keepalive extensions @@ -16,7 +16,7 @@ keepalives. Author: Ian Jackson <ian@chiark.greenend.org.uk> Author: Matthew Vernon <matthew@debian.org> Author: Colin Watson <cjwatson@debian.org> -Last-Update: 2023-12-18 +Last-Update: 2024-09-13 Patch-Name: keepalive-extensions.patch --- @@ -26,7 +26,7 @@ Patch-Name: keepalive-extensions.patch 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/readconf.c b/readconf.c -index cd1ebc85d..7d7296960 100644 +index 08342f2a2..f78786964 100644 --- a/readconf.c +++ b/readconf.c @@ -182,6 +182,7 @@ typedef enum { @@ -46,16 +46,23 @@ index cd1ebc85d..7d7296960 100644 { NULL, oBadOption } }; -@@ -1886,6 +1889,8 @@ parse_pubkey_algos: +@@ -1166,6 +1169,7 @@ process_config_line_depth(Options *options, struct passwd *pw, const char *host, + argv_consume(&ac); + break; + case oConnectTimeout: ++ case oSetupTimeOut: /* Debian-specific compatibility alias */ + intptr = &options->connection_timeout; + parse_time: + arg = argv_next(&ac, &av); +@@ -1908,6 +1912,7 @@ parse_pubkey_algos: goto parse_flag; case oServerAliveInterval: + case oProtocolKeepAlives: /* Debian-specific compatibility alias */ -+ case oSetupTimeOut: /* Debian-specific compatibility alias */ intptr = &options->server_alive_interval; goto parse_time; -@@ -2859,8 +2864,13 @@ fill_default_options(Options * options) +@@ -2893,8 +2898,13 @@ fill_default_options(Options * options) options->rekey_interval = 0; if (options->verify_host_key_dns == -1) options->verify_host_key_dns = 0; @@ -72,7 +79,7 @@ index cd1ebc85d..7d7296960 100644 options->server_alive_count_max = 3; if (options->control_master == -1) diff --git a/ssh_config.5 b/ssh_config.5 -index 255577462..c6041339b 100644 +index 4a48c5775..31142f8c5 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -297,9 +297,13 @@ If set to @@ -90,7 +97,16 @@ index 255577462..c6041339b 100644 The argument must be .Cm yes or -@@ -1927,7 +1931,14 @@ from the server, +@@ -620,6 +624,8 @@ Specifies the timeout (in seconds) used when connecting to the + SSH server, instead of using the default system TCP timeout. + This timeout is applied both to establishing the connection and to performing + the initial SSH protocol handshake and key exchange. ++.Cm SetupTimeOut ++is a Debian-specific compatibility alias for this option. + .It Cm ControlMaster + Enables the sharing of multiple sessions over a single network connection. + When set to +@@ -1933,7 +1939,12 @@ from the server, will send a message through the encrypted channel to request a response from the server. The default @@ -100,13 +116,11 @@ index 255577462..c6041339b 100644 +.Cm BatchMode +option is set (Debian-specific). +.Cm ProtocolKeepAlives -+and -+.Cm SetupTimeOut -+are Debian-specific compatibility aliases for this option. ++is a Debian-specific compatibility alias for this option. .It Cm SessionType May be used to either request invocation of a subsystem on the remote system, or to prevent the execution of a remote command at all. -@@ -2041,6 +2052,12 @@ Specifies whether the system should send TCP keepalive messages to the +@@ -2047,6 +2058,12 @@ Specifies whether the system should send TCP keepalive messages to the other side. If they are sent, death of the connection or crash of one of the machines will be properly noticed. @@ -120,10 +134,10 @@ index 255577462..c6041339b 100644 connections will die if the route is down temporarily, and some people find it annoying. diff --git a/sshd_config.5 b/sshd_config.5 -index 5e41f0478..5dd656869 100644 +index 6959d5f6c..11a8e922f 100644 --- a/sshd_config.5 +++ b/sshd_config.5 -@@ -1959,6 +1959,9 @@ This avoids infinitely hanging sessions. +@@ -1984,6 +1984,9 @@ This avoids infinitely hanging sessions. .Pp To disable TCP keepalive messages, the value should be set to .Cm no . diff --git a/debian/patches/maxhostnamelen.patch b/debian/patches/maxhostnamelen.patch index af2bf16..b34d772 100644 --- a/debian/patches/maxhostnamelen.patch +++ b/debian/patches/maxhostnamelen.patch @@ -1,4 +1,4 @@ -From 5ffb02dd0478b1ceb24dd356d0ccad7cb7ec728b Mon Sep 17 00:00:00 2001 +From d4e17cdc03d060ca67e4f6628c90cc40c2eaa022 Mon Sep 17 00:00:00 2001 From: Svante Signell <svante.signell@gmail.com> Date: Fri, 5 Nov 2021 23:22:53 +0000 Subject: Define MAXHOSTNAMELEN on GNU/Hurd @@ -12,7 +12,7 @@ Patch-Name: maxhostnamelen.patch 1 file changed, 6 insertions(+) diff --git a/defines.h b/defines.h -index 279e509aa..7225cbfab 100644 +index ed860e78b..aa3518732 100644 --- a/defines.h +++ b/defines.h @@ -136,6 +136,12 @@ enum diff --git a/debian/patches/mention-ssh-keygen-on-keychange.patch b/debian/patches/mention-ssh-keygen-on-keychange.patch index 393de6f..6df2e8f 100644 --- a/debian/patches/mention-ssh-keygen-on-keychange.patch +++ b/debian/patches/mention-ssh-keygen-on-keychange.patch @@ -1,4 +1,4 @@ -From 1c3c2c02b1d68675b121d87d1ffee84113659c93 Mon Sep 17 00:00:00 2001 +From 7001f10dfce73dfee2a9d56c63eca74bebdbebb1 Mon Sep 17 00:00:00 2001 From: Scott Moser <smoser@ubuntu.com> Date: Sun, 9 Feb 2014 16:10:03 +0000 Subject: Mention ssh-keygen in ssh fingerprint changed warning diff --git a/debian/patches/no-openssl-version-status.patch b/debian/patches/no-openssl-version-status.patch index 3f2ca27..86550be 100644 --- a/debian/patches/no-openssl-version-status.patch +++ b/debian/patches/no-openssl-version-status.patch @@ -1,4 +1,4 @@ -From d03bde90030a339d7e4e39273cb3eadadfb99320 Mon Sep 17 00:00:00 2001 +From f1374ee189355c4ff510c5b817ecccb5306a1410 Mon Sep 17 00:00:00 2001 From: Kurt Roeckx <kurt@roeckx.be> Date: Sun, 9 Feb 2014 16:10:14 +0000 Subject: Don't check the status field of the OpenSSL version @@ -23,7 +23,7 @@ Patch-Name: no-openssl-version-status.patch 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c -index 6c65003f2..30e97c464 100644 +index 14865077e..0cea08c03 100644 --- a/openbsd-compat/openssl-compat.c +++ b/openbsd-compat/openssl-compat.c @@ -49,18 +49,18 @@ ssh_compatible_openssl(long headerver, long libver) diff --git a/debian/patches/openbsd-docs.patch b/debian/patches/openbsd-docs.patch index 8774599..f1fa958 100644 --- a/debian/patches/openbsd-docs.patch +++ b/debian/patches/openbsd-docs.patch @@ -1,4 +1,4 @@ -From 169d164b95c9f068cbf5fc9860029690f9bf19d3 Mon Sep 17 00:00:00 2001 +From 672018a74977e165fc82c47d64b8cbd420b95fb8 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:09 +0000 Subject: Adjust various OpenBSD-specific references in manual pages @@ -42,7 +42,7 @@ index 5086a6d42..6dffdc7e6 100644 .Sh SEE ALSO .Xr ssh-keygen 1 , diff --git a/ssh-keygen.1 b/ssh-keygen.1 -index df6803fd9..0617d0dc2 100644 +index 06f0555a4..76239bcdf 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -211,9 +211,7 @@ key in @@ -86,7 +86,7 @@ index df6803fd9..0617d0dc2 100644 The file format is described in .Xr moduli 5 . diff --git a/sshd.8 b/sshd.8 -index e2a621950..2469bfff8 100644 +index 464d402f6..bd1117bfe 100644 --- a/sshd.8 +++ b/sshd.8 @@ -64,7 +64,7 @@ over an insecure network. @@ -98,7 +98,7 @@ index e2a621950..2469bfff8 100644 It forks a new daemon for each incoming connection. The forked daemons handle -@@ -932,7 +932,7 @@ This file is for host-based authentication (see +@@ -936,7 +936,7 @@ This file is for host-based authentication (see .Xr ssh 1 ) . It should only be writable by root. .Pp @@ -107,7 +107,7 @@ index e2a621950..2469bfff8 100644 Contains Diffie-Hellman groups used for the "Diffie-Hellman Group Exchange" key exchange method. The file format is described in -@@ -1030,7 +1030,6 @@ The content of this file is not sensitive; it can be world-readable. +@@ -1034,7 +1034,6 @@ The content of this file is not sensitive; it can be world-readable. .Xr ssh-keyscan 1 , .Xr chroot 2 , .Xr hosts_access 5 , @@ -116,7 +116,7 @@ index e2a621950..2469bfff8 100644 .Xr sshd_config 5 , .Xr inetd 8 , diff --git a/sshd_config.5 b/sshd_config.5 -index 81671fb99..9d33cb472 100644 +index ed2f74060..e177e4af8 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -1001,9 +1001,6 @@ for interactive sessions and @@ -129,7 +129,7 @@ index 81671fb99..9d33cb472 100644 The default is .Cm yes . The argument to this keyword must be -@@ -1112,45 +1109,33 @@ The following forms may be used: +@@ -1117,45 +1114,33 @@ The following forms may be used: .Sm off .Ar hostname | address .Sm on @@ -176,7 +176,7 @@ index 81671fb99..9d33cb472 100644 .It Cm LoginGraceTime The server disconnects after this time if the user has not successfully logged in. -@@ -1276,14 +1261,8 @@ The available criteria are +@@ -1283,14 +1268,8 @@ The available criteria are .Cm Host , .Cm LocalAddress , .Cm LocalPort , @@ -192,15 +192,15 @@ index 81671fb99..9d33cb472 100644 .Pp The match patterns may consist of single entries or comma-separated lists and may use the wildcard and negation operators described in the -@@ -1356,7 +1335,6 @@ Available keywords are - .Cm PubkeyAuthOptions , +@@ -1364,7 +1343,6 @@ Available keywords are + .Cm RefuseConnection , .Cm RekeyLimit , .Cm RevokedKeys , -.Cm RDomain , .Cm SetEnv , .Cm StreamLocalBindMask , .Cm StreamLocalBindUnlink , -@@ -1838,15 +1816,6 @@ an OpenSSH Key Revocation List (KRL) as generated by +@@ -1863,15 +1841,6 @@ an OpenSSH Key Revocation List (KRL) as generated by .Xr ssh-keygen 1 . For more information on KRLs, see the KEY REVOCATION LISTS section in .Xr ssh-keygen 1 . @@ -216,7 +216,7 @@ index 81671fb99..9d33cb472 100644 .It Cm SecurityKeyProvider Specifies a path to a library that will be used when loading FIDO authenticator-hosted keys, overriding the default of using -@@ -2180,8 +2149,6 @@ A literal +@@ -2205,8 +2174,6 @@ A literal Identifies the connection endpoints, containing four space-separated values: client address, client port number, server address, and server port number. @@ -225,7 +225,7 @@ index 81671fb99..9d33cb472 100644 .It %F The fingerprint of the CA key. .It %f -@@ -2220,9 +2187,6 @@ accepts the tokens %%, %h, %U, and %u. +@@ -2245,9 +2212,6 @@ accepts the tokens %%, %h, %U, and %u. .Pp .Cm ChrootDirectory accepts the tokens %%, %h, %U, and %u. diff --git a/debian/patches/package-versioning.patch b/debian/patches/package-versioning.patch index 0caca0d..d3d4810 100644 --- a/debian/patches/package-versioning.patch +++ b/debian/patches/package-versioning.patch @@ -1,4 +1,4 @@ -From 184037a22103428f83d1e8d14c09631aef14dc2f Mon Sep 17 00:00:00 2001 +From 756ba4bb63a1d4a7547ae0a2ba1fdc135b8c829f Mon Sep 17 00:00:00 2001 From: Matthew Vernon <matthew@debian.org> Date: Sun, 9 Feb 2014 16:10:05 +0000 Subject: Include the Debian version in our identification @@ -18,10 +18,10 @@ Patch-Name: package-versioning.patch 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/kex.c b/kex.c -index fd018021e..744fb27fb 100644 +index f09e79e6b..19b1fcaa8 100644 --- a/kex.c +++ b/kex.c -@@ -1257,7 +1257,7 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms, +@@ -1255,7 +1255,7 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms, if (version_addendum != NULL && *version_addendum == '\0') version_addendum = NULL; if ((r = sshbuf_putf(our_version, "SSH-%d.%d-%s%s%s\r\n", @@ -31,11 +31,11 @@ index fd018021e..744fb27fb 100644 version_addendum == NULL ? "" : version_addendum)) != 0) { oerrno = errno; diff --git a/version.h b/version.h -index 81b7645a7..3b43b47e5 100644 +index 8c7e37e7d..7e0cac99f 100644 --- a/version.h +++ b/version.h @@ -3,4 +3,9 @@ - #define SSH_VERSION "OpenSSH_9.8" + #define SSH_VERSION "OpenSSH_9.9" #define SSH_PORTABLE "p1" -#define SSH_RELEASE SSH_VERSION SSH_PORTABLE diff --git a/debian/patches/pam-avoid-unknown-host.patch b/debian/patches/pam-avoid-unknown-host.patch index 8c8d78a..234cb1d 100644 --- a/debian/patches/pam-avoid-unknown-host.patch +++ b/debian/patches/pam-avoid-unknown-host.patch @@ -1,4 +1,4 @@ -From 97c671bccd4f923e2bb814516ad7bf1d9261709c Mon Sep 17 00:00:00 2001 +From 2d1ea9f5f1100fa7c7e648ea976ceda005d5966c Mon Sep 17 00:00:00 2001 From: Daan De Meyer <daan.j.demeyer@gmail.com> Date: Mon, 20 Mar 2023 20:22:14 +0100 Subject: Only set PAM_RHOST if the remote host is not "UNKNOWN" diff --git a/debian/patches/regress-conch-dev-zero.patch b/debian/patches/regress-conch-dev-zero.patch index 95f7aab..51f4557 100644 --- a/debian/patches/regress-conch-dev-zero.patch +++ b/debian/patches/regress-conch-dev-zero.patch @@ -1,4 +1,4 @@ -From e3d47eadb58dda63a125eecaa722ce7891c75356 Mon Sep 17 00:00:00 2001 +From e307b199fed9b07cfaf92ab3d653fab49108c0e0 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 31 Mar 2024 00:24:11 +0000 Subject: regress: Redirect conch stdin from /dev/zero diff --git a/debian/patches/restore-authorized_keys2.patch b/debian/patches/restore-authorized_keys2.patch index b061307..b68b44b 100644 --- a/debian/patches/restore-authorized_keys2.patch +++ b/debian/patches/restore-authorized_keys2.patch @@ -1,4 +1,4 @@ -From 69f63b1e4919e4a51cb199fa81fa318bc517bbd2 Mon Sep 17 00:00:00 2001 +From 5bba205e4762e28f6b127f64fd30870aedae3fd1 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 5 Mar 2017 02:02:11 +0000 Subject: Restore reading authorized_keys2 by default diff --git a/debian/patches/restore-tcp-wrappers.patch b/debian/patches/restore-tcp-wrappers.patch index fdd3c61..b4a8543 100644 --- a/debian/patches/restore-tcp-wrappers.patch +++ b/debian/patches/restore-tcp-wrappers.patch @@ -1,4 +1,4 @@ -From 0ff8d4f5356adbdebdbdbf951713d22b1e8e264e Mon Sep 17 00:00:00 2001 +From 20df52e18eb28e8e50e475d85bb652e8fdc5f588 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Tue, 7 Oct 2014 13:22:41 +0100 Subject: Restore TCP wrappers support @@ -28,10 +28,10 @@ Patch-Name: restore-tcp-wrappers.patch 3 files changed, 89 insertions(+) diff --git a/configure.ac b/configure.ac -index dc274329f..f6bca2631 100644 +index 6a0140a9d..90548dcfc 100644 --- a/configure.ac +++ b/configure.ac -@@ -1686,6 +1686,62 @@ else +@@ -1693,6 +1693,62 @@ else AC_MSG_RESULT([no]) fi @@ -94,7 +94,7 @@ index dc274329f..f6bca2631 100644 # Check whether user wants to use ldns LDNS_MSG="no" AC_ARG_WITH(ldns, -@@ -5723,6 +5779,7 @@ echo " PAM support: $PAM_MSG" +@@ -5734,6 +5790,7 @@ echo " PAM support: $PAM_MSG" echo " OSF SIA support: $SIA_MSG" echo " KerberosV support: $KRB5_MSG" echo " SELinux support: $SELINUX_MSG" @@ -103,7 +103,7 @@ index dc274329f..f6bca2631 100644 echo " libldns support: $LDNS_MSG" echo " Solaris process contract support: $SPC_MSG" diff --git a/sshd-session.c b/sshd-session.c -index ab88db7c5..dff1fefbe 100644 +index 03a028c82..f36d58b1b 100644 --- a/sshd-session.c +++ b/sshd-session.c @@ -110,6 +110,13 @@ @@ -120,7 +120,7 @@ index ab88db7c5..dff1fefbe 100644 /* Re-exec fds */ #define REEXEC_DEVCRYPTO_RESERVED_FD (STDERR_FILENO + 1) #define REEXEC_STARTUP_PIPE_FD (STDERR_FILENO + 2) -@@ -1254,6 +1261,24 @@ main(int ac, char **av) +@@ -1256,6 +1263,24 @@ main(int ac, char **av) #ifdef SSH_AUDIT_EVENTS audit_connection_from(remote_ip, remote_port); #endif @@ -146,10 +146,10 @@ index ab88db7c5..dff1fefbe 100644 rdomain = ssh_packet_rdomain_in(ssh); diff --git a/sshd.8 b/sshd.8 -index c0f095ca4..e2a621950 100644 +index 08ebf53a1..464d402f6 100644 --- a/sshd.8 +++ b/sshd.8 -@@ -921,6 +921,12 @@ the user's home directory becomes accessible. +@@ -925,6 +925,12 @@ the user's home directory becomes accessible. This file should be writable only by the user, and need not be readable by anyone else. .Pp @@ -162,7 +162,7 @@ index c0f095ca4..e2a621950 100644 .It Pa /etc/hosts.equiv This file is for host-based authentication (see .Xr ssh 1 ) . -@@ -1023,6 +1029,7 @@ The content of this file is not sensitive; it can be world-readable. +@@ -1027,6 +1033,7 @@ The content of this file is not sensitive; it can be world-readable. .Xr ssh-keygen 1 , .Xr ssh-keyscan 1 , .Xr chroot 2 , diff --git a/debian/patches/revert-ipqos-defaults.patch b/debian/patches/revert-ipqos-defaults.patch index 2758571..0ad35c6 100644 --- a/debian/patches/revert-ipqos-defaults.patch +++ b/debian/patches/revert-ipqos-defaults.patch @@ -1,4 +1,4 @@ -From 91663a43be78a3b33c0cc055033d648269a4f98c Mon Sep 17 00:00:00 2001 +From 5fefa8a7853e96cb7a143432690212f4d1fbfc1a Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Mon, 8 Apr 2019 10:46:29 +0100 Subject: Revert "upstream: Update default IPQoS in ssh(1), sshd(8) to DSCP @@ -24,10 +24,10 @@ Patch-Name: revert-ipqos-defaults.patch 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/readconf.c b/readconf.c -index 1b64b7af5..a60aed047 100644 +index 90bf74f32..a321e6d8f 100644 --- a/readconf.c +++ b/readconf.c -@@ -2891,9 +2891,9 @@ fill_default_options(Options * options) +@@ -2925,9 +2925,9 @@ fill_default_options(Options * options) if (options->visual_host_key == -1) options->visual_host_key = 0; if (options->ip_qos_interactive == -1) @@ -40,10 +40,10 @@ index 1b64b7af5..a60aed047 100644 options->request_tty = REQUEST_TTY_AUTO; if (options->session_type == -1) diff --git a/servconf.c b/servconf.c -index 81511bc86..86c798b34 100644 +index 49a066df8..3c7ca3287 100644 --- a/servconf.c +++ b/servconf.c -@@ -479,9 +479,9 @@ fill_default_server_options(ServerOptions *options) +@@ -483,9 +483,9 @@ fill_default_server_options(ServerOptions *options) if (options->permit_tun == -1) options->permit_tun = SSH_TUNMODE_NO; if (options->ip_qos_interactive == -1) @@ -56,10 +56,10 @@ index 81511bc86..86c798b34 100644 options->version_addendum = xstrdup(""); if (options->fwd_opts.streamlocal_bind_mask == (mode_t)-1) diff --git a/ssh_config.5 b/ssh_config.5 -index 091b933b4..98a2ef60b 100644 +index 9adc0fdb7..14042dce5 100644 --- a/ssh_config.5 +++ b/ssh_config.5 -@@ -1322,11 +1322,9 @@ If one argument is specified, it is used as the packet class unconditionally. +@@ -1329,11 +1329,9 @@ If one argument is specified, it is used as the packet class unconditionally. If two values are specified, the first is automatically selected for interactive sessions and the second for non-interactive sessions. The default is @@ -74,7 +74,7 @@ index 091b933b4..98a2ef60b 100644 .It Cm KbdInteractiveAuthentication Specifies whether to use keyboard-interactive authentication. diff --git a/sshd_config.5 b/sshd_config.5 -index 1f6c42523..1edd6c812 100644 +index 2887ed531..70d57bfdb 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -1022,11 +1022,9 @@ If one argument is specified, it is used as the packet class unconditionally. diff --git a/debian/patches/scp-quoting.patch b/debian/patches/scp-quoting.patch index 2c64f53..ce8ce8d 100644 --- a/debian/patches/scp-quoting.patch +++ b/debian/patches/scp-quoting.patch @@ -1,4 +1,4 @@ -From 75bbbbd155147a06ebf5bcc1b2ae9bf08c127cf0 Mon Sep 17 00:00:00 2001 +From 9435f6fe82fc57fac0e6efb9c76923eeee80fe22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Valc=C3=A1rcel?= <nvalcarcel@ubuntu.com> Date: Sun, 9 Feb 2014 16:09:59 +0000 Subject: Adjust scp quoting in verbose mode diff --git a/debian/patches/selinux-role.patch b/debian/patches/selinux-role.patch index c481c3b..c28562a 100644 --- a/debian/patches/selinux-role.patch +++ b/debian/patches/selinux-role.patch @@ -1,4 +1,4 @@ -From 1003c8e9926862f7f01fad4a9004766aa47948d1 Mon Sep 17 00:00:00 2001 +From 7b503b507e60ba714732f10ea46a00fd0896baa9 Mon Sep 17 00:00:00 2001 From: Manoj Srivastava <srivasta@debian.org> Date: Sun, 9 Feb 2014 16:09:49 +0000 Subject: Handle SELinux authorisation roles @@ -80,10 +80,10 @@ index f75f1d20d..44558851e 100644 if ((r = kex_server_update_ext_info(ssh)) != 0) fatal_fr(r, "kex_server_update_ext_info failed"); diff --git a/monitor.c b/monitor.c -index 92e2ca107..62cc2da6b 100644 +index ad7fef5a9..05d63a8ee 100644 --- a/monitor.c +++ b/monitor.c -@@ -117,6 +117,7 @@ int mm_answer_sign(struct ssh *, int, struct sshbuf *); +@@ -118,6 +118,7 @@ int mm_answer_sign(struct ssh *, int, struct sshbuf *); int mm_answer_pwnamallow(struct ssh *, int, struct sshbuf *); int mm_answer_auth2_read_banner(struct ssh *, int, struct sshbuf *); int mm_answer_authserv(struct ssh *, int, struct sshbuf *); @@ -91,7 +91,7 @@ index 92e2ca107..62cc2da6b 100644 int mm_answer_authpassword(struct ssh *, int, struct sshbuf *); int mm_answer_bsdauthquery(struct ssh *, int, struct sshbuf *); int mm_answer_bsdauthrespond(struct ssh *, int, struct sshbuf *); -@@ -191,6 +192,7 @@ struct mon_table mon_dispatch_proto20[] = { +@@ -192,6 +193,7 @@ struct mon_table mon_dispatch_proto20[] = { {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, @@ -99,7 +99,7 @@ index 92e2ca107..62cc2da6b 100644 {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, #ifdef USE_PAM -@@ -832,6 +834,7 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -842,6 +844,7 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m) /* Allow service/style information on the auth context */ monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); @@ -107,7 +107,7 @@ index 92e2ca107..62cc2da6b 100644 monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); #ifdef USE_PAM -@@ -865,15 +868,42 @@ mm_answer_authserv(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -875,15 +878,42 @@ mm_answer_authserv(struct ssh *ssh, int sock, struct sshbuf *m) monitor_permit_authentications(1); if ((r = sshbuf_get_cstring(m, &authctxt->service, NULL)) != 0 || @@ -152,7 +152,7 @@ index 92e2ca107..62cc2da6b 100644 return (0); } -@@ -1594,7 +1624,7 @@ mm_answer_pty(struct ssh *ssh, int sock, struct sshbuf *m) +@@ -1604,7 +1634,7 @@ mm_answer_pty(struct ssh *ssh, int sock, struct sshbuf *m) res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty)); if (res == 0) goto error; @@ -243,7 +243,7 @@ index 09b0ccaaa..2493da591 100644 char *mm_auth2_read_banner(void); int mm_auth_password(struct ssh *, char *); diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c -index 4c024c6d2..4fe61f020 100644 +index 8adfec5a7..61e239561 100644 --- a/openbsd-compat/port-linux.c +++ b/openbsd-compat/port-linux.c @@ -65,7 +65,7 @@ ssh_selinux_enabled(void) @@ -414,10 +414,10 @@ index 344a1ddf9..20ea822a7 100644 const char *session_get_remote_name_or_ip(struct ssh *, u_int, int); diff --git a/sshd-session.c b/sshd-session.c -index dff1fefbe..b6e544108 100644 +index f36d58b1b..1d7cdd00a 100644 --- a/sshd-session.c +++ b/sshd-session.c -@@ -438,7 +438,7 @@ privsep_postauth(struct ssh *ssh, Authctxt *authctxt) +@@ -440,7 +440,7 @@ privsep_postauth(struct ssh *ssh, Authctxt *authctxt) /* Drop privileges */ if (!skip_privdrop) diff --git a/debian/patches/series b/debian/patches/series index 42daae2..adfd333 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -30,6 +30,3 @@ pam-avoid-unknown-host.patch progress-linux/0001-ssh-keygen-default-rsa-size.patch progress-linux/0002-ssh-keygen-default-ecdsa-size.patch progress-linux/0003-ssh_config-update.patch -progress-linux/0004-mptcp-support.patch -progress-linux/0005-mptcp-manpages.patch -progress-linux/0006-mptcp-headers.patch diff --git a/debian/patches/shell-path.patch b/debian/patches/shell-path.patch index 0fb8602..9819925 100644 --- a/debian/patches/shell-path.patch +++ b/debian/patches/shell-path.patch @@ -1,4 +1,4 @@ -From 693e1ad72a8bc084f804451beaad6f941921b435 Mon Sep 17 00:00:00 2001 +From 4d7555c76af470ce9c85600497629e3ffe8c6448 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:00 +0000 Subject: Look for $SHELL on the path for ProxyCommand/LocalCommand diff --git a/debian/patches/skip-utimensat-test-on-zfs.patch b/debian/patches/skip-utimensat-test-on-zfs.patch index 5a9a489..055b12b 100644 --- a/debian/patches/skip-utimensat-test-on-zfs.patch +++ b/debian/patches/skip-utimensat-test-on-zfs.patch @@ -1,4 +1,4 @@ -From 1cf8791cab882050d43f539da1464eb308eca92e Mon Sep 17 00:00:00 2001 +From dadf16cb45c44f62f1c6c66bc537f6bda066292c Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Mon, 11 Mar 2024 16:24:49 +0000 Subject: Skip utimensat test on ZFS diff --git a/debian/patches/ssh-agent-setgid.patch b/debian/patches/ssh-agent-setgid.patch index 4c5641e..da82776 100644 --- a/debian/patches/ssh-agent-setgid.patch +++ b/debian/patches/ssh-agent-setgid.patch @@ -1,4 +1,4 @@ -From 2e73396b1e30fed205ad9daf4575f26e24b6cf63 Mon Sep 17 00:00:00 2001 +From 0c398b704de5f588e6c41cf21d2d1f2cbfda5f11 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:13 +0000 Subject: Document consequences of ssh-agent being setgid in ssh-agent(1) diff --git a/debian/patches/ssh-argv0.patch b/debian/patches/ssh-argv0.patch index 7b45493..a108a70 100644 --- a/debian/patches/ssh-argv0.patch +++ b/debian/patches/ssh-argv0.patch @@ -1,4 +1,4 @@ -From b53a7a6dc0eb0375ef367780fd66c86e182bc67c Mon Sep 17 00:00:00 2001 +From aba90adf0199191cca06cea519233ef9cf67df75 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:10:10 +0000 Subject: ssh(1): Refer to ssh-argv0(1) @@ -18,10 +18,10 @@ Patch-Name: ssh-argv0.patch 1 file changed, 1 insertion(+) diff --git a/ssh.1 b/ssh.1 -index 55bc1faef..c8c5558e5 100644 +index d80ce6bfc..3ad246c27 100644 --- a/ssh.1 +++ b/ssh.1 -@@ -1666,6 +1666,7 @@ if an error occurred. +@@ -1668,6 +1668,7 @@ if an error occurred. .Xr sftp 1 , .Xr ssh-add 1 , .Xr ssh-agent 1 , diff --git a/debian/patches/ssh-vulnkey-compat.patch b/debian/patches/ssh-vulnkey-compat.patch index b63fe3c..329841e 100644 --- a/debian/patches/ssh-vulnkey-compat.patch +++ b/debian/patches/ssh-vulnkey-compat.patch @@ -1,4 +1,4 @@ -From 127ffecd39fa5f1b61506e6060c4a4cdec64f019 Mon Sep 17 00:00:00 2001 +From 439f5f7701cfc92af75c471df81e269dce8ab321 Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@ubuntu.com> Date: Sun, 9 Feb 2014 16:09:50 +0000 Subject: Accept obsolete ssh-vulnkey configuration options @@ -17,7 +17,7 @@ Patch-Name: ssh-vulnkey-compat.patch 2 files changed, 2 insertions(+) diff --git a/readconf.c b/readconf.c -index 8bdeb9d08..cd1ebc85d 100644 +index 0ce392538..08342f2a2 100644 --- a/readconf.c +++ b/readconf.c @@ -197,6 +197,7 @@ static struct { @@ -29,10 +29,10 @@ index 8bdeb9d08..cd1ebc85d 100644 { "useroaming", oDeprecated }, { "usersh", oDeprecated }, diff --git a/servconf.c b/servconf.c -index c1bfca258..169b9ff07 100644 +index 731f208be..1d5c143ba 100644 --- a/servconf.c +++ b/servconf.c -@@ -692,6 +692,7 @@ static struct { +@@ -698,6 +698,7 @@ static struct { { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL }, { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL }, { "strictmodes", sStrictModes, SSHCFG_GLOBAL }, diff --git a/debian/patches/syslog-level-silent.patch b/debian/patches/syslog-level-silent.patch index e32e7fd..bd386c5 100644 --- a/debian/patches/syslog-level-silent.patch +++ b/debian/patches/syslog-level-silent.patch @@ -1,4 +1,4 @@ -From 297eb3e9ae97bdd2e944efd9fdbdcf7f78514b79 Mon Sep 17 00:00:00 2001 +From 55ee34a4dce90532d19dddc56cb77d11703f0288 Mon Sep 17 00:00:00 2001 From: Natalie Amery <nmamery@chiark.greenend.org.uk> Date: Sun, 9 Feb 2014 16:09:54 +0000 Subject: "LogLevel SILENT" compatibility diff --git a/debian/patches/systemd-socket-activation.patch b/debian/patches/systemd-socket-activation.patch index 7a9c0ca..9a8fd42 100644 --- a/debian/patches/systemd-socket-activation.patch +++ b/debian/patches/systemd-socket-activation.patch @@ -1,4 +1,4 @@ -From 05c8e02a8f6df17722a95fc11cf315865f90e024 Mon Sep 17 00:00:00 2001 +From 8616cd415d778b058f6c27064e52364e90fc6418 Mon Sep 17 00:00:00 2001 From: Steve Langasek <steve.langasek@ubuntu.com> Date: Thu, 1 Sep 2022 16:03:37 +0100 Subject: Support systemd socket activation @@ -19,7 +19,7 @@ Patch-Name: systemd-socket-activation.patch 2 files changed, 119 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac -index f6bca2631..ee6aca972 100644 +index 90548dcfc..8b3a9776b 100644 --- a/configure.ac +++ b/configure.ac @@ -940,6 +940,7 @@ int main(void) { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16)) @@ -31,7 +31,7 @@ index f6bca2631..ee6aca972 100644 case `uname -r` in 1.*|2.0.*) diff --git a/sshd.c b/sshd.c -index 54c65dfe6..51d5357b9 100644 +index 48b334c68..142310c07 100644 --- a/sshd.c +++ b/sshd.c @@ -93,10 +93,18 @@ @@ -57,7 +57,7 @@ index 54c65dfe6..51d5357b9 100644 extern char *__progname; -@@ -733,6 +741,88 @@ send_rexec_state(int fd, struct sshbuf *conf) +@@ -740,6 +748,88 @@ send_rexec_state(int fd, struct sshbuf *conf) debug3_f("done"); } @@ -146,7 +146,7 @@ index 54c65dfe6..51d5357b9 100644 /* * Listen for TCP connections */ -@@ -812,6 +902,9 @@ static void +@@ -819,6 +909,9 @@ static void server_listen(void) { u_int i; @@ -156,7 +156,7 @@ index 54c65dfe6..51d5357b9 100644 /* Initialise per-source limit tracking. */ srclimit_init(options.max_startups, -@@ -821,17 +914,27 @@ server_listen(void) +@@ -828,17 +921,27 @@ server_listen(void) &options.per_source_penalty, options.per_source_penalty_exempt); @@ -194,8 +194,8 @@ index 54c65dfe6..51d5357b9 100644 if (!num_listen_socks) fatal("Cannot bind any address."); } -@@ -1344,7 +1447,7 @@ main(int ac, char **av) - if (!test_flag && !do_dump_cfg && !path_absolute(av[0])) +@@ -1351,7 +1454,7 @@ main(int ac, char **av) + if (!test_flag && !inetd_flag && !do_dump_cfg && !path_absolute(av[0])) fatal("sshd requires execution with an absolute path"); - closefrom(STDERR_FILENO + 1); diff --git a/debian/patches/user-group-modes.patch b/debian/patches/user-group-modes.patch index b649927..8b53864 100644 --- a/debian/patches/user-group-modes.patch +++ b/debian/patches/user-group-modes.patch @@ -1,4 +1,4 @@ -From c02212390140a127d47873d8d27081466bd5daeb Mon Sep 17 00:00:00 2001 +From 2bf33ed3e0d641de721a055f7ea6af01be212cff Mon Sep 17 00:00:00 2001 From: Colin Watson <cjwatson@debian.org> Date: Sun, 9 Feb 2014 16:09:58 +0000 Subject: Allow harmless group-writability @@ -51,7 +51,7 @@ index d5d2c7a12..13c3c201b 100644 "bad modes for %.200s", pw->pw_name, path); auth_debug_add("Bad file modes for %.200s", path); diff --git a/auth.c b/auth.c -index 407b32e78..ec692715e 100644 +index e4578169b..4b878865f 100644 --- a/auth.c +++ b/auth.c @@ -430,8 +430,7 @@ check_key_in_hostfiles(struct passwd *pw, struct sshkey *key, const char *host, @@ -169,10 +169,10 @@ index 113403896..4681f79f7 100644 #define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b)) #define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y)) diff --git a/readconf.c b/readconf.c -index 7d7296960..eaca29ace 100644 +index f78786964..d3c3056ef 100644 --- a/readconf.c +++ b/readconf.c -@@ -2518,8 +2518,7 @@ read_config_file_depth(const char *filename, struct passwd *pw, +@@ -2552,8 +2552,7 @@ read_config_file_depth(const char *filename, struct passwd *pw, if (fstat(fileno(f), &sb) == -1) fatal("fstat %s: %s", filename, strerror(errno)); @@ -183,10 +183,10 @@ index 7d7296960..eaca29ace 100644 } diff --git a/ssh.1 b/ssh.1 -index dc382cd49..55bc1faef 100644 +index 8f78b3a1e..d80ce6bfc 100644 --- a/ssh.1 +++ b/ssh.1 -@@ -1570,6 +1570,8 @@ The file format and configuration options are described in +@@ -1572,6 +1572,8 @@ The file format and configuration options are described in .Xr ssh_config 5 . Because of the potential for abuse, this file must have strict permissions: read/write for the user, and not writable by others. @@ -196,10 +196,10 @@ index dc382cd49..55bc1faef 100644 .It Pa ~/.ssh/environment Contains additional definitions for environment variables; see diff --git a/ssh_config.5 b/ssh_config.5 -index c6041339b..d1b1da95a 100644 +index 31142f8c5..073ef69e2 100644 --- a/ssh_config.5 +++ b/ssh_config.5 -@@ -2409,6 +2409,8 @@ The format of this file is described above. +@@ -2417,6 +2417,8 @@ The format of this file is described above. This file is used by the SSH client. Because of the potential for abuse, this file must have strict permissions: read/write for the user, and not writable by others. diff --git a/debian/tests/control b/debian/tests/control index 0f5a493..a09633a 100644 --- a/debian/tests/control +++ b/debian/tests/control @@ -24,7 +24,7 @@ Restrictions: Depends: krb5-admin-server, krb5-kdc, - openssh-server, + openssh-server-gssapi, Tests: socket-activation, @@ -35,3 +35,14 @@ Restrictions: Depends: openssh-server, sudo, + +Tests: + xinetd, +Restrictions: + allow-stderr, + isolation-container, + needs-root, +Depends: + openssh-server, + sudo, + xinetd, diff --git a/debian/tests/xinetd b/debian/tests/xinetd new file mode 100755 index 0000000..b63fbd7 --- /dev/null +++ b/debian/tests/xinetd @@ -0,0 +1,52 @@ +#! /bin/sh +set -e + +testuser="testuser$$" +adduser --quiet --disabled-password --gecos "" "$testuser" +sudo -u "$testuser" mkdir -m700 "/home/$testuser/.ssh" +sudo -u "$testuser" \ + ssh-keygen -t ed25519 -N '' -f "/home/$testuser/.ssh/id_ed25519" +sudo -u "$testuser" \ + cp "/home/$testuser/.ssh/id_ed25519.pub" \ + "/home/$testuser/.ssh/authorized_keys" + +cleanup () { + if [ $? -ne 0 ]; then + echo "## Something failed" + echo + echo "## ssh server log" + journalctl -b -u ssh.service --lines 100 + fi +} + +trap cleanup EXIT + +cat >/etc/xinetd.d/sshd <<EOF +service ssh +{ + id = sshd + disable = no + type = UNLISTED + port = 22 + socket_type = stream + wait = no + user = root + server = /usr/sbin/sshd + server_args = -i -4 + log_on_success += DURATION USERID + log_on_failure += USERID + nice = 10 +} +EOF + +mkdir -p /etc/systemd/system/xinetd.service.d +cat >/etc/systemd/system/xinetd.service.d/sshd.conf <<EOF +[Service] +RuntimeDirectory=sshd +EOF + +systemctl daemon-reload +systemctl disable --now ssh.service +systemctl reload xinetd.service +sudo -u "$testuser" \ + ssh -oStrictHostKeyChecking=accept-new "$testuser@localhost" date @@ -940,6 +940,8 @@ struct winsize { * so only enable if the compiler supports them. */ #if defined(VARIABLE_LENGTH_ARRAYS) && defined(VARIABLE_DECLARATION_AFTER_CODE) -# define USE_SNTRUP761X25519 1 +# define USE_SNTRUP761X25519 1 +/* The ML-KEM768 implementation also uses C89 features */ +# define USE_MLKEM768X25519 1 #endif #endif /* _DEFINES_H */ diff --git a/kex-names.c b/kex-names.c index 339eb1c..ec840c1 100644 --- a/kex-names.c +++ b/kex-names.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kex-names.c,v 1.1 2024/05/17 00:32:32 djm Exp $ */ +/* $OpenBSD: kex-names.c,v 1.4 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -79,6 +79,12 @@ static const struct kexalg kexalgs[] = { #ifdef USE_SNTRUP761X25519 { KEX_SNTRUP761X25519_SHA512, KEX_KEM_SNTRUP761X25519_SHA512, 0, SSH_DIGEST_SHA512 }, + { KEX_SNTRUP761X25519_SHA512_OLD, KEX_KEM_SNTRUP761X25519_SHA512, 0, + SSH_DIGEST_SHA512 }, +#endif +#ifdef USE_MLKEM768X25519 + { KEX_MLKEM768X25519_SHA256, KEX_KEM_MLKEM768X25519_SHA256, 0, + SSH_DIGEST_SHA256 }, #endif #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */ { NULL, 0, -1, -1}, @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.c,v 1.186 2024/05/17 00:30:23 djm Exp $ */ +/* $OpenBSD: kex.c,v 1.187 2024/08/23 04:51:00 deraadt Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * @@ -842,8 +842,6 @@ choose_comp(struct sshcomp *comp, char *client, char *server) #ifdef WITH_ZLIB if (strcmp(name, "zlib@openssh.com") == 0) { comp->type = COMP_DELAYED; - } else if (strcmp(name, "zlib") == 0) { - comp->type = COMP_ZLIB; } else #endif /* WITH_ZLIB */ if (strcmp(name, "none") == 0) { @@ -1,4 +1,4 @@ -/* $OpenBSD: kex.h,v 1.123 2024/05/17 00:30:23 djm Exp $ */ +/* $OpenBSD: kex.h,v 1.126 2024/09/02 12:13:56 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -62,11 +62,11 @@ #define KEX_ECDH_SHA2_NISTP521 "ecdh-sha2-nistp521" #define KEX_CURVE25519_SHA256 "curve25519-sha256" #define KEX_CURVE25519_SHA256_OLD "curve25519-sha256@libssh.org" -#define KEX_SNTRUP761X25519_SHA512 "sntrup761x25519-sha512@openssh.com" +#define KEX_SNTRUP761X25519_SHA512 "sntrup761x25519-sha512" +#define KEX_SNTRUP761X25519_SHA512_OLD "sntrup761x25519-sha512@openssh.com" +#define KEX_MLKEM768X25519_SHA256 "mlkem768x25519-sha256" #define COMP_NONE 0 -/* pre-auth compression (COMP_ZLIB) is only supported in the client */ -#define COMP_ZLIB 1 #define COMP_DELAYED 2 #define CURVE25519_SIZE 32 @@ -102,6 +102,7 @@ enum kex_exchange { KEX_ECDH_SHA2, KEX_C25519_SHA256, KEX_KEM_SNTRUP761X25519_SHA512, + KEX_KEM_MLKEM768X25519_SHA256, KEX_MAX }; @@ -180,6 +181,7 @@ struct kex { u_char c25519_client_key[CURVE25519_SIZE]; /* 25519 + KEM */ u_char c25519_client_pubkey[CURVE25519_SIZE]; /* 25519 */ u_char sntrup761_client_key[crypto_kem_sntrup761_SECRETKEYBYTES]; /* KEM */ + u_char mlkem768_client_key[crypto_kem_mlkem768_SECRETKEYBYTES]; /* KEM */ struct sshbuf *client_pub; }; @@ -246,6 +248,12 @@ int kex_kem_sntrup761x25519_enc(struct kex *, const struct sshbuf *, int kex_kem_sntrup761x25519_dec(struct kex *, const struct sshbuf *, struct sshbuf **); +int kex_kem_mlkem768x25519_keypair(struct kex *); +int kex_kem_mlkem768x25519_enc(struct kex *, const struct sshbuf *, + struct sshbuf **, struct sshbuf **); +int kex_kem_mlkem768x25519_dec(struct kex *, const struct sshbuf *, + struct sshbuf **); + int kex_dh_keygen(struct kex *); int kex_dh_compute_key(struct kex *, BIGNUM *, struct sshbuf *); diff --git a/kexc25519.c b/kexc25519.c index f13d766..e106521 100644 --- a/kexc25519.c +++ b/kexc25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexc25519.c,v 1.17 2019/01/21 10:40:11 djm Exp $ */ +/* $OpenBSD: kexc25519.c,v 1.18 2024/09/02 12:13:56 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -71,7 +71,7 @@ kexc25519_shared_key_ext(const u_char key[CURVE25519_SIZE], return SSH_ERR_KEY_INVALID_EC_VALUE; #ifdef DEBUG_KEXECDH - dump_digest("shared secret", shared_key, CURVE25519_SIZE); + dump_digest("shared secret 25519", shared_key, CURVE25519_SIZE); #endif if (raw) r = sshbuf_put(out, shared_key, CURVE25519_SIZE); @@ -1,4 +1,4 @@ -/* $OpenBSD: kexgen.c,v 1.8 2021/12/19 22:08:06 djm Exp $ */ +/* $OpenBSD: kexgen.c,v 1.10 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl. All rights reserved. * @@ -120,6 +120,9 @@ kex_gen_client(struct ssh *ssh) case KEX_KEM_SNTRUP761X25519_SHA512: r = kex_kem_sntrup761x25519_keypair(kex); break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_keypair(kex); + break; default: r = SSH_ERR_INVALID_ARGUMENT; break; @@ -192,6 +195,10 @@ input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh) r = kex_kem_sntrup761x25519_dec(kex, server_blob, &shared_secret); break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_dec(kex, server_blob, + &shared_secret); + break; default: r = SSH_ERR_INVALID_ARGUMENT; break; @@ -243,6 +250,8 @@ out: explicit_bzero(kex->c25519_client_key, sizeof(kex->c25519_client_key)); explicit_bzero(kex->sntrup761_client_key, sizeof(kex->sntrup761_client_key)); + explicit_bzero(kex->mlkem768_client_key, + sizeof(kex->mlkem768_client_key)); sshbuf_free(server_host_key_blob); free(signature); sshbuf_free(tmp); @@ -310,6 +319,10 @@ input_kex_gen_init(int type, u_int32_t seq, struct ssh *ssh) r = kex_kem_sntrup761x25519_enc(kex, client_pubkey, &server_pubkey, &shared_secret); break; + case KEX_KEM_MLKEM768X25519_SHA256: + r = kex_kem_mlkem768x25519_enc(kex, client_pubkey, + &server_pubkey, &shared_secret); + break; default: r = SSH_ERR_INVALID_ARGUMENT; break; diff --git a/kexmlkem768x25519.c b/kexmlkem768x25519.c new file mode 100644 index 0000000..679446e --- /dev/null +++ b/kexmlkem768x25519.c @@ -0,0 +1,280 @@ +/* $OpenBSD: kexmlkem768x25519.c,v 1.1 2024/09/02 12:13:56 djm Exp $ */ +/* + * Copyright (c) 2023 Markus Friedl. 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 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. + */ + +#include "includes.h" + +#include <sys/types.h> + +#include <stdio.h> +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif +#include <stdbool.h> +#include <string.h> +#include <signal.h> + +#include "sshkey.h" +#include "kex.h" +#include "sshbuf.h" +#include "digest.h" +#include "ssherr.h" +#include "log.h" + +#ifdef USE_MLKEM768X25519 + +#include "libcrux_mlkem768_sha3.h" + +int +kex_kem_mlkem768x25519_keypair(struct kex *kex) +{ + struct sshbuf *buf = NULL; + u_char rnd[LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN], *cp = NULL; + size_t need; + int r = SSH_ERR_INTERNAL_ERROR; + struct libcrux_mlkem768_keypair keypair; + + if ((buf = sshbuf_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + if ((r = sshbuf_reserve(buf, need, &cp)) != 0) + goto out; + arc4random_buf(rnd, sizeof(rnd)); + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(rnd); + memcpy(cp, keypair.pk.value, crypto_kem_mlkem768_PUBLICKEYBYTES); + memcpy(kex->mlkem768_client_key, keypair.sk.value, + sizeof(kex->mlkem768_client_key)); +#ifdef DEBUG_KEXECDH + dump_digest("client public key mlkem768:", cp, + crypto_kem_mlkem768_PUBLICKEYBYTES); +#endif + cp += crypto_kem_mlkem768_PUBLICKEYBYTES; + kexc25519_keygen(kex->c25519_client_key, cp); +#ifdef DEBUG_KEXECDH + dump_digest("client public key c25519:", cp, CURVE25519_SIZE); +#endif + /* success */ + r = 0; + kex->client_pub = buf; + buf = NULL; + out: + explicit_bzero(&keypair, sizeof(keypair)); + explicit_bzero(rnd, sizeof(rnd)); + sshbuf_free(buf); + return r; +} + +int +kex_kem_mlkem768x25519_enc(struct kex *kex, + const struct sshbuf *client_blob, struct sshbuf **server_blobp, + struct sshbuf **shared_secretp) +{ + struct sshbuf *server_blob = NULL; + struct sshbuf *buf = NULL; + const u_char *client_pub; + u_char rnd[LIBCRUX_ML_KEM_ENC_PRNG_LEN]; + u_char server_pub[CURVE25519_SIZE], server_key[CURVE25519_SIZE]; + u_char hash[SSH_DIGEST_MAX_LENGTH]; + size_t need; + int r = SSH_ERR_INTERNAL_ERROR; + struct libcrux_mlkem768_enc_result enc; + struct libcrux_mlkem768_pk mlkem_pub; + + *server_blobp = NULL; + *shared_secretp = NULL; + memset(&mlkem_pub, 0, sizeof(mlkem_pub)); + + /* client_blob contains both KEM and ECDH client pubkeys */ + need = crypto_kem_mlkem768_PUBLICKEYBYTES + CURVE25519_SIZE; + if (sshbuf_len(client_blob) != need) { + r = SSH_ERR_SIGNATURE_INVALID; + goto out; + } + client_pub = sshbuf_ptr(client_blob); +#ifdef DEBUG_KEXECDH + dump_digest("client public key mlkem768:", client_pub, + crypto_kem_mlkem768_PUBLICKEYBYTES); + dump_digest("client public key 25519:", + client_pub + crypto_kem_mlkem768_PUBLICKEYBYTES, + CURVE25519_SIZE); +#endif + /* check public key validity */ + memcpy(mlkem_pub.value, client_pub, crypto_kem_mlkem768_PUBLICKEYBYTES); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&mlkem_pub)) { + r = SSH_ERR_SIGNATURE_INVALID; + goto out; + } + + /* allocate buffer for concatenation of KEM key and ECDH shared key */ + /* the buffer will be hashed and the result is the shared secret */ + if ((buf = sshbuf_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + /* allocate space for encrypted KEM key and ECDH pub key */ + if ((server_blob = sshbuf_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + /* generate and encrypt KEM key with client key */ + arc4random_buf(rnd, sizeof(rnd)); + enc = libcrux_ml_kem_mlkem768_portable_encapsulate(&mlkem_pub, rnd); + /* generate ECDH key pair, store server pubkey after ciphertext */ + kexc25519_keygen(server_key, server_pub); + if ((r = sshbuf_put(buf, enc.snd, sizeof(enc.snd))) != 0 || + (r = sshbuf_put(server_blob, enc.fst.value, sizeof(enc.fst.value))) != 0 || + (r = sshbuf_put(server_blob, server_pub, sizeof(server_pub))) != 0) + goto out; + /* append ECDH shared key */ + client_pub += crypto_kem_mlkem768_PUBLICKEYBYTES; + if ((r = kexc25519_shared_key_ext(server_key, client_pub, buf, 1)) < 0) + goto out; + if ((r = ssh_digest_buffer(kex->hash_alg, buf, hash, sizeof(hash))) != 0) + goto out; +#ifdef DEBUG_KEXECDH + dump_digest("server public key 25519:", server_pub, CURVE25519_SIZE); + dump_digest("server cipher text:", + enc.fst.value, sizeof(enc.fst.value)); + dump_digest("server kem key:", enc.snd, sizeof(enc.snd)); + dump_digest("concatenation of KEM key and ECDH shared key:", + sshbuf_ptr(buf), sshbuf_len(buf)); +#endif + /* string-encoded hash is resulting shared secret */ + sshbuf_reset(buf); + if ((r = sshbuf_put_string(buf, hash, + ssh_digest_bytes(kex->hash_alg))) != 0) + goto out; +#ifdef DEBUG_KEXECDH + dump_digest("encoded shared secret:", sshbuf_ptr(buf), sshbuf_len(buf)); +#endif + /* success */ + r = 0; + *server_blobp = server_blob; + *shared_secretp = buf; + server_blob = NULL; + buf = NULL; + out: + explicit_bzero(hash, sizeof(hash)); + explicit_bzero(server_key, sizeof(server_key)); + explicit_bzero(rnd, sizeof(rnd)); + explicit_bzero(&enc, sizeof(enc)); + sshbuf_free(server_blob); + sshbuf_free(buf); + return r; +} + +int +kex_kem_mlkem768x25519_dec(struct kex *kex, + const struct sshbuf *server_blob, struct sshbuf **shared_secretp) +{ + struct sshbuf *buf = NULL; + u_char mlkem_key[crypto_kem_mlkem768_BYTES]; + const u_char *ciphertext, *server_pub; + u_char hash[SSH_DIGEST_MAX_LENGTH]; + size_t need; + int r; + struct libcrux_mlkem768_sk mlkem_priv; + struct libcrux_mlkem768_ciphertext mlkem_ciphertext; + + *shared_secretp = NULL; + memset(&mlkem_priv, 0, sizeof(mlkem_priv)); + memset(&mlkem_ciphertext, 0, sizeof(mlkem_ciphertext)); + + need = crypto_kem_mlkem768_CIPHERTEXTBYTES + CURVE25519_SIZE; + if (sshbuf_len(server_blob) != need) { + r = SSH_ERR_SIGNATURE_INVALID; + goto out; + } + ciphertext = sshbuf_ptr(server_blob); + server_pub = ciphertext + crypto_kem_mlkem768_CIPHERTEXTBYTES; + /* hash concatenation of KEM key and ECDH shared key */ + if ((buf = sshbuf_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + memcpy(mlkem_priv.value, kex->mlkem768_client_key, + sizeof(kex->mlkem768_client_key)); + memcpy(mlkem_ciphertext.value, ciphertext, + sizeof(mlkem_ciphertext.value)); +#ifdef DEBUG_KEXECDH + dump_digest("server cipher text:", mlkem_ciphertext.value, + sizeof(mlkem_ciphertext.value)); + dump_digest("server public key c25519:", server_pub, CURVE25519_SIZE); +#endif + libcrux_ml_kem_mlkem768_portable_decapsulate(&mlkem_priv, + &mlkem_ciphertext, mlkem_key); + if ((r = sshbuf_put(buf, mlkem_key, sizeof(mlkem_key))) != 0) + goto out; + if ((r = kexc25519_shared_key_ext(kex->c25519_client_key, server_pub, + buf, 1)) < 0) + goto out; + if ((r = ssh_digest_buffer(kex->hash_alg, buf, + hash, sizeof(hash))) != 0) + goto out; +#ifdef DEBUG_KEXECDH + dump_digest("client kem key:", mlkem_key, sizeof(mlkem_key)); + dump_digest("concatenation of KEM key and ECDH shared key:", + sshbuf_ptr(buf), sshbuf_len(buf)); +#endif + sshbuf_reset(buf); + if ((r = sshbuf_put_string(buf, hash, + ssh_digest_bytes(kex->hash_alg))) != 0) + goto out; +#ifdef DEBUG_KEXECDH + dump_digest("encoded shared secret:", sshbuf_ptr(buf), sshbuf_len(buf)); +#endif + /* success */ + r = 0; + *shared_secretp = buf; + buf = NULL; + out: + explicit_bzero(hash, sizeof(hash)); + explicit_bzero(&mlkem_priv, sizeof(mlkem_priv)); + explicit_bzero(&mlkem_ciphertext, sizeof(mlkem_ciphertext)); + explicit_bzero(mlkem_key, sizeof(mlkem_key)); + sshbuf_free(buf); + return r; +} +#else /* USE_MLKEM768X25519 */ +int +kex_kem_mlkem768x25519_keypair(struct kex *kex) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} + +int +kex_kem_mlkem768x25519_enc(struct kex *kex, + const struct sshbuf *client_blob, struct sshbuf **server_blobp, + struct sshbuf **shared_secretp) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} + +int +kex_kem_mlkem768x25519_dec(struct kex *kex, + const struct sshbuf *server_blob, struct sshbuf **shared_secretp) +{ + return SSH_ERR_SIGN_ALG_UNSUPPORTED; +} +#endif /* USE_MLKEM768X25519 */ diff --git a/kexsntrup761x25519.c b/kexsntrup761x25519.c index 6afb1ba..6bbca71 100644 --- a/kexsntrup761x25519.c +++ b/kexsntrup761x25519.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kexsntrup761x25519.c,v 1.2 2021/12/05 12:28:27 jsg Exp $ */ +/* $OpenBSD: kexsntrup761x25519.c,v 1.3 2024/09/15 02:20:51 djm Exp $ */ /* * Copyright (c) 2019 Markus Friedl. All rights reserved. * @@ -39,6 +39,10 @@ #include "digest.h" #include "ssherr.h" +volatile crypto_int16 crypto_int16_optblocker = 0; +volatile crypto_int32 crypto_int32_optblocker = 0; +volatile crypto_int64 crypto_int64_optblocker = 0; + int kex_kem_sntrup761x25519_keypair(struct kex *kex) { diff --git a/libcrux_mlkem768_sha3.h b/libcrux_mlkem768_sha3.h new file mode 100644 index 0000000..a82d60e --- /dev/null +++ b/libcrux_mlkem768_sha3.h @@ -0,0 +1,12332 @@ +/* $OpenBSD: libcrux_mlkem768_sha3.h,v 1.1 2024/09/02 12:13:56 djm Exp $ */ +/* Extracted from libcrux revision 84c5d87b3092c59294345aa269ceefe0eb97cc35 */ + +/* + * MIT License + * + * Copyright (c) 2024 Cryspen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#if !defined(__GNUC__) || (__GNUC__ < 2) +# define __attribute__(x) +#endif +#define KRML_MUSTINLINE inline +#define KRML_NOINLINE __attribute__((noinline, unused)) +#define KRML_HOST_EPRINTF(...) +#define KRML_HOST_EXIT(x) fatal_f("internal error") + +/* from libcrux/libcrux-ml-kem/cg/eurydice_glue.h */ +/* + * SPDX-FileCopyrightText: 2024 Eurydice Contributors + * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + */ + +#pragma once + +#if defined(__cplusplus) +extern "C" { +#endif + + + +// SLICES, ARRAYS, ETC. + +// The MSVC C++ compiler does not support compound literals. +// This CLITERAL is used to turn `(type){...}` into `type{...}` when using a C++ +// compiler. +#if defined(__cplusplus) +#define CLITERAL(type) type +#else +#define CLITERAL(type) (type) +#endif + +// We represent a slice as a pair of an (untyped) pointer, along with the length +// of the slice, i.e. the number of elements in the slice (this is NOT the +// number of bytes). This design choice has two important consequences. +// - if you need to use `ptr`, you MUST cast it to a proper type *before* +// performing pointer +// arithmetic on it (remember that C desugars pointer arithmetic based on the +// type of the address) +// - if you need to use `len` for a C style function (e.g. memcpy, memcmp), you +// need to multiply it +// by sizeof t, where t is the type of the elements. +// +// Empty slices have `len == 0` and `ptr` always needs to be valid pointer that +// is not NULL (otherwise the construction in EURYDICE_SLICE computes `NULL + +// start`). +typedef struct { + void *ptr; + size_t len; +} Eurydice_slice; + +// Helper macro to create a slice out of a pointer x, a start index in x +// (included), and an end index in x (excluded). The argument x must be suitably +// cast to something that can decay (see remark above about how pointer +// arithmetic works in C), meaning either pointer or array type. +#define EURYDICE_SLICE(x, start, end) \ + (CLITERAL(Eurydice_slice){.ptr = (void *)(x + start), .len = end - start}) +#define EURYDICE_SLICE_LEN(s, _) s.len +// This macro is a pain because in case the dereferenced element type is an +// array, you cannot simply write `t x` as it would yield `int[4] x` instead, +// which is NOT correct C syntax, so we add a dedicated phase in Eurydice that +// adds an extra argument to this macro at the last minute so that we have the +// correct type of *pointers* to elements. +#define Eurydice_slice_index(s, i, t, t_ptr_t) (((t_ptr_t)s.ptr)[i]) +#define Eurydice_slice_subslice(s, r, t, _) \ + EURYDICE_SLICE((t *)s.ptr, r.start, r.end) +// Variant for when the start and end indices are statically known (i.e., the +// range argument `r` is a literal). +#define Eurydice_slice_subslice2(s, start, end, t) \ + EURYDICE_SLICE((t *)s.ptr, start, end) +#define Eurydice_slice_subslice_to(s, subslice_end_pos, t, _) \ + EURYDICE_SLICE((t *)s.ptr, 0, subslice_end_pos) +#define Eurydice_slice_subslice_from(s, subslice_start_pos, t, _) \ + EURYDICE_SLICE((t *)s.ptr, subslice_start_pos, s.len) +#define Eurydice_array_to_slice(end, x, t) \ + EURYDICE_SLICE(x, 0, \ + end) /* x is already at an array type, no need for cast */ +#define Eurydice_array_to_subslice(_arraylen, x, r, t, _) \ + EURYDICE_SLICE((t *)x, r.start, r.end) +// Same as above, variant for when start and end are statically known +#define Eurydice_array_to_subslice2(x, start, end, t) \ + EURYDICE_SLICE((t *)x, start, end) +#define Eurydice_array_to_subslice_to(_size, x, r, t, _range_t) \ + EURYDICE_SLICE((t *)x, 0, r) +#define Eurydice_array_to_subslice_from(size, x, r, t, _range_t) \ + EURYDICE_SLICE((t *)x, r, size) +#define Eurydice_slice_len(s, t) EURYDICE_SLICE_LEN(s, t) +#define Eurydice_slice_copy(dst, src, t) \ + memcpy(dst.ptr, src.ptr, dst.len * sizeof(t)) +#define core_array___Array_T__N__23__as_slice(len_, ptr_, t, _ret_t) \ + ((Eurydice_slice){.ptr = ptr_, .len = len_}) + +#define core_array___core__clone__Clone_for__Array_T__N___20__clone( \ + len, src, dst, elem_type, _ret_t) \ + (memcpy(dst, src, len * sizeof(elem_type))) +#define TryFromSliceError uint8_t + +#define Eurydice_array_eq(sz, a1, a2, t, _) \ + (memcmp(a1, a2, sz * sizeof(t)) == 0) +#define core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, a2, t, _) +#define core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( \ + sz, a1, a2, t, _, _ret_t) \ + Eurydice_array_eq(sz, a1, ((a2)->ptr), t, _) + +#define Eurydice_slice_split_at(slice, mid, element_type, ret_t) \ + (CLITERAL(ret_t){ \ + .fst = EURYDICE_SLICE((element_type *)slice.ptr, 0, mid), \ + .snd = EURYDICE_SLICE((element_type *)slice.ptr, mid, slice.len)}) +#define Eurydice_slice_split_at_mut(slice, mid, element_type, ret_t) \ + (CLITERAL(ret_t){ \ + .fst = {.ptr = slice.ptr, .len = mid}, \ + .snd = {.ptr = (char *)slice.ptr + mid * sizeof(element_type), \ + .len = slice.len - mid}}) + +// Conversion of slice to an array, rewritten (by Eurydice) to name the +// destination array, since arrays are not values in C. +// N.B.: see note in karamel/lib/Inlining.ml if you change this. +#define Eurydice_slice_to_array2(dst, src, _, t_arr) \ + Eurydice_slice_to_array3(&(dst)->tag, (char *)&(dst)->val.case_Ok, src, \ + sizeof(t_arr)) + +static inline void Eurydice_slice_to_array3(uint8_t *dst_tag, char *dst_ok, + Eurydice_slice src, size_t sz) { + *dst_tag = 0; + memcpy(dst_ok, src.ptr, sz); +} + +// CORE STUFF (conversions, endianness, ...) + +static inline void core_num__u64_9__to_le_bytes(uint64_t v, uint8_t buf[8]) { + memcpy(buf, &v, sizeof(v)); +} +static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t buf[8]) { + uint64_t v; + memcpy(&v, buf, sizeof(v)); + return v; +} + +static inline uint32_t core_num__u32_8__from_le_bytes(uint8_t buf[4]) { + uint32_t v; + memcpy(&v, buf, sizeof(v)); + return v; +} + +static inline uint32_t core_num__u8_6__count_ones(uint8_t x0) { +#ifdef _MSC_VER + return __popcnt(x0); +#else + return __builtin_popcount(x0); +#endif +} + +// unsigned overflow wraparound semantics in C +static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x, uint16_t y) { + return x + y; +} +static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x, uint8_t y) { + return x - y; +} + +// ITERATORS + +#define Eurydice_range_iter_next(iter_ptr, t, ret_t) \ + (((iter_ptr)->start == (iter_ptr)->end) \ + ? (CLITERAL(ret_t){.tag = None}) \ + : (CLITERAL(ret_t){.tag = Some, .f0 = (iter_ptr)->start++})) + +#define core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next \ + Eurydice_range_iter_next + +// See note in karamel/lib/Inlining.ml if you change this +#define Eurydice_into_iter(x, t, _ret_t) (x) +#define core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter \ + Eurydice_into_iter + +#if defined(__cplusplus) +} +#endif + +/* from libcrux/libcrux-ml-kem/cg/libcrux_core.h */ +/* + * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4 + * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb + * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908 + * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty + * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee + */ + +#ifndef __libcrux_core_H +#define __libcrux_core_H + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** +A monomorphic instance of core.ops.range.Range +with types size_t + +*/ +typedef struct core_ops_range_Range_b3_s { + size_t start; + size_t end; +} core_ops_range_Range_b3; + +#define Ok 0 +#define Err 1 + +typedef uint8_t Result_86_tags; + +#define None 0 +#define Some 1 + +typedef uint8_t Option_ef_tags; + +/** +A monomorphic instance of core.option.Option +with types size_t + +*/ +typedef struct Option_b3_s { + Option_ef_tags tag; + size_t f0; +} Option_b3; + +static inline uint16_t core_num__u16_7__wrapping_add(uint16_t x0, uint16_t x1); + +#define CORE_NUM__U32_8__BITS (32U) + +static inline uint64_t core_num__u64_9__from_le_bytes(uint8_t x0[8U]); + +static inline void core_num__u64_9__to_le_bytes(uint64_t x0, uint8_t x1[8U]); + +static inline uint32_t core_num__u8_6__count_ones(uint8_t x0); + +static inline uint8_t core_num__u8_6__wrapping_sub(uint8_t x0, uint8_t x1); + +#define LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT ((size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT ((size_t)256U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT \ + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * (size_t)12U) + +#define LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT \ + (LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE ((size_t)32U) + +#define LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE ((size_t)32U) + +typedef struct libcrux_ml_kem_utils_extraction_helper_Keypair768_s { + uint8_t fst[1152U]; + uint8_t snd[1184U]; +} libcrux_ml_kem_utils_extraction_helper_Keypair768; + +/** +A monomorphic instance of core.result.Result +with types uint8_t[24size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_6f_s { + Result_86_tags tag; + union { + uint8_t case_Ok[24U]; + TryFromSliceError case_Err; + } val; +} Result_6f; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types uint8_t[24size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_1c(Result_6f self, uint8_t ret[24U]) { + if (self.tag == Ok) { + uint8_t f0[24U]; + memcpy(f0, self.val.case_Ok, (size_t)24U * sizeof(uint8_t)); + memcpy(ret, f0, (size_t)24U * sizeof(uint8_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of core.result.Result +with types uint8_t[20size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_7a_s { + Result_86_tags tag; + union { + uint8_t case_Ok[20U]; + TryFromSliceError case_Err; + } val; +} Result_7a; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types uint8_t[20size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_34(Result_7a self, uint8_t ret[20U]) { + if (self.tag == Ok) { + uint8_t f0[20U]; + memcpy(f0, self.val.case_Ok, (size_t)20U * sizeof(uint8_t)); + memcpy(ret, f0, (size_t)20U * sizeof(uint8_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of core.result.Result +with types uint8_t[10size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_cd_s { + Result_86_tags tag; + union { + uint8_t case_Ok[10U]; + TryFromSliceError case_Err; + } val; +} Result_cd; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types uint8_t[10size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_e8(Result_cd self, uint8_t ret[10U]) { + if (self.tag == Ok) { + uint8_t f0[10U]; + memcpy(f0, self.val.case_Ok, (size_t)10U * sizeof(uint8_t)); + memcpy(ret, f0, (size_t)10U * sizeof(uint8_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +typedef struct Eurydice_slice_uint8_t_4size_t__x2_s { + Eurydice_slice fst[4U]; + Eurydice_slice snd[4U]; +} Eurydice_slice_uint8_t_4size_t__x2; + +typedef struct libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s { + uint8_t value[1088U]; +} libcrux_ml_kem_mlkem768_MlKem768Ciphertext; + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemCiphertext<SIZE>#6} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_d4 +with const generics +- SIZE= 1088 +*/ +static inline uint8_t *libcrux_ml_kem_types_as_slice_d4_1d( + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { + return self->value; +} + +/** +A monomorphic instance of libcrux_ml_kem.types.MlKemPublicKey +with const generics +- $1184size_t +*/ +typedef struct libcrux_ml_kem_types_MlKemPublicKey_15_s { + uint8_t value[1184U]; +} libcrux_ml_kem_types_MlKemPublicKey_15; + +/** +This function found in impl {(core::convert::From<@Array<u8, SIZE>> for +libcrux_ml_kem::types::MlKemPublicKey<SIZE>)#14} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_b6 +with const generics +- SIZE= 1184 +*/ +static inline libcrux_ml_kem_types_MlKemPublicKey_15 +libcrux_ml_kem_types_from_b6_da(uint8_t value[1184U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_value[1184U]; + memcpy(copy_of_value, value, (size_t)1184U * sizeof(uint8_t)); + libcrux_ml_kem_types_MlKemPublicKey_15 lit; + memcpy(lit.value, copy_of_value, (size_t)1184U * sizeof(uint8_t)); + return lit; +} + +/** +A monomorphic instance of libcrux_ml_kem.types.MlKemPrivateKey +with const generics +- $2400size_t +*/ +typedef struct libcrux_ml_kem_types_MlKemPrivateKey_55_s { + uint8_t value[2400U]; +} libcrux_ml_kem_types_MlKemPrivateKey_55; + +typedef struct libcrux_ml_kem_mlkem768_MlKem768KeyPair_s { + libcrux_ml_kem_types_MlKemPrivateKey_55 sk; + libcrux_ml_kem_types_MlKemPublicKey_15 pk; +} libcrux_ml_kem_mlkem768_MlKem768KeyPair; + +/** + Create a new [`MlKemKeyPair`] from the secret and public key. +*/ +/** +This function found in impl +{libcrux_ml_kem::types::MlKemKeyPair<PRIVATE_KEY_SIZE, PUBLIC_KEY_SIZE>} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_17 +with const generics +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_types_from_17_35(libcrux_ml_kem_types_MlKemPrivateKey_55 sk, + libcrux_ml_kem_types_MlKemPublicKey_15 pk) { + return ( + CLITERAL(libcrux_ml_kem_mlkem768_MlKem768KeyPair){.sk = sk, .pk = pk}); +} + +/** +This function found in impl {(core::convert::From<@Array<u8, SIZE>> for +libcrux_ml_kem::types::MlKemPrivateKey<SIZE>)#8} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_05 +with const generics +- SIZE= 2400 +*/ +static inline libcrux_ml_kem_types_MlKemPrivateKey_55 +libcrux_ml_kem_types_from_05_f2(uint8_t value[2400U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_value[2400U]; + memcpy(copy_of_value, value, (size_t)2400U * sizeof(uint8_t)); + libcrux_ml_kem_types_MlKemPrivateKey_55 lit; + memcpy(lit.value, copy_of_value, (size_t)2400U * sizeof(uint8_t)); + return lit; +} + +/** +A monomorphic instance of core.result.Result +with types uint8_t[32size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_00_s { + Result_86_tags tag; + union { + uint8_t case_Ok[32U]; + TryFromSliceError case_Err; + } val; +} Result_00; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types uint8_t[32size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_83(Result_00 self, uint8_t ret[32U]) { + if (self.tag == Ok) { + uint8_t f0[32U]; + memcpy(f0, self.val.case_Ok, (size_t)32U * sizeof(uint8_t)); + memcpy(ret, f0, (size_t)32U * sizeof(uint8_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of K. +with types libcrux_ml_kem_types_MlKemCiphertext[[$1088size_t]], +uint8_t[32size_t] + +*/ +typedef struct tuple_3c_s { + libcrux_ml_kem_mlkem768_MlKem768Ciphertext fst; + uint8_t snd[32U]; +} tuple_3c; + +/** +This function found in impl {(core::convert::From<@Array<u8, SIZE>> for +libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#2} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.from_01 +with const generics +- SIZE= 1088 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768Ciphertext +libcrux_ml_kem_types_from_01_9f(uint8_t value[1088U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_value[1088U]; + memcpy(copy_of_value, value, (size_t)1088U * sizeof(uint8_t)); + libcrux_ml_kem_mlkem768_MlKem768Ciphertext lit; + memcpy(lit.value, copy_of_value, (size_t)1088U * sizeof(uint8_t)); + return lit; +} + +/** + A reference to the raw byte slice. +*/ +/** +This function found in impl {libcrux_ml_kem::types::MlKemPublicKey<SIZE>#18} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_slice_cb +with const generics +- SIZE= 1184 +*/ +static inline uint8_t *libcrux_ml_kem_types_as_slice_cb_50( + libcrux_ml_kem_types_MlKemPublicKey_15 *self) { + return self->value; +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 33 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea2( + Eurydice_slice slice, uint8_t ret[33U]) { + uint8_t out[33U] = {0U}; + uint8_t *uu____0 = out; + Eurydice_slice_copy( + Eurydice_array_to_subslice2(uu____0, (size_t)0U, + Eurydice_slice_len(slice, uint8_t), uint8_t), + slice, uint8_t); + memcpy(ret, out, (size_t)33U * sizeof(uint8_t)); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 34 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea1( + Eurydice_slice slice, uint8_t ret[34U]) { + uint8_t out[34U] = {0U}; + uint8_t *uu____0 = out; + Eurydice_slice_copy( + Eurydice_array_to_subslice2(uu____0, (size_t)0U, + Eurydice_slice_len(slice, uint8_t), uint8_t), + slice, uint8_t); + memcpy(ret, out, (size_t)34U * sizeof(uint8_t)); +} + +/** +This function found in impl {(core::convert::AsRef<@Slice<u8>> for +libcrux_ml_kem::types::MlKemCiphertext<SIZE>)#1} +*/ +/** +A monomorphic instance of libcrux_ml_kem.types.as_ref_00 +with const generics +- SIZE= 1088 +*/ +static inline Eurydice_slice libcrux_ml_kem_types_as_ref_00_24( + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *self) { + return Eurydice_array_to_slice((size_t)1088U, self->value, uint8_t); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 1120 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea0( + Eurydice_slice slice, uint8_t ret[1120U]) { + uint8_t out[1120U] = {0U}; + uint8_t *uu____0 = out; + Eurydice_slice_copy( + Eurydice_array_to_subslice2(uu____0, (size_t)0U, + Eurydice_slice_len(slice, uint8_t), uint8_t), + slice, uint8_t); + memcpy(ret, out, (size_t)1120U * sizeof(uint8_t)); +} + +/** + Pad the `slice` with `0`s at the end. +*/ +/** +A monomorphic instance of libcrux_ml_kem.utils.into_padded_array +with const generics +- LEN= 64 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_utils_into_padded_array_ea( + Eurydice_slice slice, uint8_t ret[64U]) { + uint8_t out[64U] = {0U}; + uint8_t *uu____0 = out; + Eurydice_slice_copy( + Eurydice_array_to_subslice2(uu____0, (size_t)0U, + Eurydice_slice_len(slice, uint8_t), uint8_t), + slice, uint8_t); + memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of core.result.Result +with types int16_t[16size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_c0_s { + Result_86_tags tag; + union { + int16_t case_Ok[16U]; + TryFromSliceError case_Err; + } val; +} Result_c0; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types int16_t[16size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_f9(Result_c0 self, int16_t ret[16U]) { + if (self.tag == Ok) { + int16_t f0[16U]; + memcpy(f0, self.val.case_Ok, (size_t)16U * sizeof(int16_t)); + memcpy(ret, f0, (size_t)16U * sizeof(int16_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +/** +A monomorphic instance of core.result.Result +with types uint8_t[8size_t], core_array_TryFromSliceError + +*/ +typedef struct Result_56_s { + Result_86_tags tag; + union { + uint8_t case_Ok[8U]; + TryFromSliceError case_Err; + } val; +} Result_56; + +/** +This function found in impl {core::result::Result<T, E>} +*/ +/** +A monomorphic instance of core.result.unwrap_41 +with types uint8_t[8size_t], core_array_TryFromSliceError + +*/ +static inline void unwrap_41_ac(Result_56 self, uint8_t ret[8U]) { + if (self.tag == Ok) { + uint8_t f0[8U]; + memcpy(f0, self.val.case_Ok, (size_t)8U * sizeof(uint8_t)); + memcpy(ret, f0, (size_t)8U * sizeof(uint8_t)); + } else { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "unwrap not Ok"); + KRML_HOST_EXIT(255U); + } +} + +typedef struct Eurydice_slice_uint8_t_x2_s { + Eurydice_slice fst; + Eurydice_slice snd; +} Eurydice_slice_uint8_t_x2; + +typedef struct Eurydice_slice_uint8_t_1size_t__x2_s { + Eurydice_slice fst[1U]; + Eurydice_slice snd[1U]; +} Eurydice_slice_uint8_t_1size_t__x2; + +#if defined(__cplusplus) +} +#endif + +#define __libcrux_core_H_DEFINED +#endif + +/* from libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h */ +/* + * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4 + * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb + * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908 + * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty + * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee + */ + +#ifndef __libcrux_ct_ops_H +#define __libcrux_ct_ops_H + +#if defined(__cplusplus) +extern "C" { +#endif + + +/** + Return 1 if `value` is not zero and 0 otherwise. +*/ +static inline uint8_t libcrux_ml_kem_constant_time_ops_inz(uint8_t value) { + uint16_t value0 = (uint16_t)value; + uint16_t result = (((uint32_t)value0 | + (uint32_t)core_num__u16_7__wrapping_add(~value0, 1U)) & + 0xFFFFU) >> + 8U & + 1U; + return (uint8_t)result; +} + +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_is_non_zero(uint8_t value) { + return libcrux_ml_kem_constant_time_ops_inz(value); +} + +/** + Return 1 if the bytes of `lhs` and `rhs` do not exactly + match and 0 otherwise. +*/ +static inline uint8_t libcrux_ml_kem_constant_time_ops_compare( + Eurydice_slice lhs, Eurydice_slice rhs) { + uint8_t r = 0U; + for (size_t i = (size_t)0U; i < Eurydice_slice_len(lhs, uint8_t); i++) { + size_t i0 = i; + r = (uint32_t)r | + ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) ^ + (uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *)); + } + return libcrux_ml_kem_constant_time_ops_is_non_zero(r); +} + +static KRML_NOINLINE uint8_t +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( + Eurydice_slice lhs, Eurydice_slice rhs) { + return libcrux_ml_kem_constant_time_ops_compare(lhs, rhs); +} + +/** + If `selector` is not zero, return the bytes in `rhs`; return the bytes in + `lhs` otherwise. +*/ +static inline void libcrux_ml_kem_constant_time_ops_select_ct( + Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, + uint8_t ret[32U]) { + uint8_t mask = core_num__u8_6__wrapping_sub( + libcrux_ml_kem_constant_time_ops_is_non_zero(selector), 1U); + uint8_t out[32U] = {0U}; + for (size_t i = (size_t)0U; i < LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE; + i++) { + size_t i0 = i; + out[i0] = ((uint32_t)Eurydice_slice_index(lhs, i0, uint8_t, uint8_t *) & + (uint32_t)mask) | + ((uint32_t)Eurydice_slice_index(rhs, i0, uint8_t, uint8_t *) & + (uint32_t)~mask); + } + memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); +} + +static KRML_NOINLINE void +libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( + Eurydice_slice lhs, Eurydice_slice rhs, uint8_t selector, + uint8_t ret[32U]) { + libcrux_ml_kem_constant_time_ops_select_ct(lhs, rhs, selector, ret); +} + +static inline void +libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( + Eurydice_slice lhs_c, Eurydice_slice rhs_c, Eurydice_slice lhs_s, + Eurydice_slice rhs_s, uint8_t ret[32U]) { + uint8_t selector = + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_in_constant_time( + lhs_c, rhs_c); + uint8_t ret0[32U]; + libcrux_ml_kem_constant_time_ops_select_shared_secret_in_constant_time( + lhs_s, rhs_s, selector, ret0); + memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); +} + +#if defined(__cplusplus) +} +#endif + +#define __libcrux_ct_ops_H_DEFINED +#endif + +/* from libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h */ +/* + * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4 + * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb + * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908 + * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty + * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee + */ + +#ifndef __libcrux_sha3_portable_H +#define __libcrux_sha3_portable_H + +#if defined(__cplusplus) +extern "C" { +#endif + + +static const uint64_t libcrux_sha3_generic_keccak_ROUNDCONSTANTS[24U] = { + 1ULL, + 32898ULL, + 9223372036854808714ULL, + 9223372039002292224ULL, + 32907ULL, + 2147483649ULL, + 9223372039002292353ULL, + 9223372036854808585ULL, + 138ULL, + 136ULL, + 2147516425ULL, + 2147483658ULL, + 2147516555ULL, + 9223372036854775947ULL, + 9223372036854808713ULL, + 9223372036854808579ULL, + 9223372036854808578ULL, + 9223372036854775936ULL, + 32778ULL, + 9223372039002259466ULL, + 9223372039002292353ULL, + 9223372036854808704ULL, + 2147483649ULL, + 9223372039002292232ULL}; + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_zero_5a(void) { + return 0ULL; +} + +static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak__veor5q_u64( + uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { + uint64_t ab = a ^ b; + uint64_t cd = c ^ d; + uint64_t abcd = ab ^ cd; + return abcd ^ e; +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_xor5_5a( + uint64_t a, uint64_t b, uint64_t c, uint64_t d, uint64_t e) { + return libcrux_sha3_portable_keccak__veor5q_u64(a, b, c, d, e); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb(uint64_t x) { + return x << (uint32_t)(int32_t)1 | x >> (uint32_t)(int32_t)63; +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vrax1q_u64(uint64_t a, uint64_t b) { + uint64_t uu____0 = a; + return uu____0 ^ libcrux_sha3_portable_keccak_rotate_left_cb(b); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vrax1q_u64(a, b); +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vbcaxq_u64(uint64_t a, uint64_t b, uint64_t c) { + return a ^ (b & ~c); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t libcrux_sha3_portable_keccak_and_not_xor_5a( + uint64_t a, uint64_t b, uint64_t c) { + return libcrux_sha3_portable_keccak__vbcaxq_u64(a, b, c); +} + +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__veorq_n_u64(uint64_t a, uint64_t c) { + return a ^ c; +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_constant_5a(uint64_t a, uint64_t c) { + return libcrux_sha3_portable_keccak__veorq_n_u64(a, c); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_5a(uint64_t a, uint64_t b) { + return a ^ b; +} + +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_1( + Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) { + ret[0U] = Eurydice_slice_subslice2(a[0U], start, start + len, uint8_t); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_slice_n_5a( + Eurydice_slice a[1U], size_t start, size_t len, Eurydice_slice ret[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_a[1U]; + memcpy(copy_of_a, a, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret0[1U]; + libcrux_sha3_portable_keccak_slice_1(copy_of_a, start, len, ret0); + memcpy(ret, ret0, (size_t)1U * sizeof(Eurydice_slice)); +} + +static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2 +libcrux_sha3_portable_keccak_split_at_mut_1(Eurydice_slice out[1U], + size_t mid) { + Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at_mut( + out[0U], mid, uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice out00 = uu____0.fst; + Eurydice_slice out01 = uu____0.snd; + Eurydice_slice_uint8_t_1size_t__x2 lit; + lit.fst[0U] = out00; + lit.snd[0U] = out01; + return lit; +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +static KRML_MUSTINLINE Eurydice_slice_uint8_t_1size_t__x2 +libcrux_sha3_portable_keccak_split_at_mut_n_5a(Eurydice_slice a[1U], + size_t mid) { + return libcrux_sha3_portable_keccak_split_at_mut_1(a, mid); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.KeccakState +with types uint64_t +with const generics +- $1size_t +*/ +typedef struct libcrux_sha3_generic_keccak_KeccakState_48_s { + uint64_t st[5U][5U]; +} libcrux_sha3_generic_keccak_KeccakState_48; + +/** + Create a new Shake128 x4 state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakState<T, +N>[TraitClause@0]#1} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.new_1e +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48 +libcrux_sha3_generic_keccak_new_1e_f4(void) { + libcrux_sha3_generic_keccak_KeccakState_48 lit; + lit.st[0U][0U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[0U][1U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[0U][2U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[0U][3U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[0U][4U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[1U][0U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[1U][1U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[1U][2U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[1U][3U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[1U][4U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[2U][0U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[2U][1U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[2U][2U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[2U][3U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[2U][4U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[3U][0U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[3U][1U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[3U][2U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[3U][3U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[3U][4U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[4U][0U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[4U][1U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[4U][2U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[4U][3U] = libcrux_sha3_portable_keccak_zero_5a(); + lit.st[4U][4U] = libcrux_sha3_portable_keccak_zero_5a(); + return lit; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c( + uint64_t (*s)[5U], Eurydice_slice blocks[1U]) { + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { + size_t i0 = i; + uint8_t uu____0[8U]; + Result_56 dst; + Eurydice_slice_to_array2( + &dst, + Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_slice, uint8_t[8U]); + unwrap_41_ac(dst, uu____0); + size_t uu____1 = i0 / (size_t)5U; + size_t uu____2 = i0 % (size_t)5U; + s[uu____1][uu____2] = + s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b8( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_b[1U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_2c(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb0(uint64_t x) { + return x << (uint32_t)(int32_t)36 | x >> (uint32_t)(int32_t)28; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_42(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb0(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 36 +- RIGHT= 28 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_42(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb1(uint64_t x) { + return x << (uint32_t)(int32_t)3 | x >> (uint32_t)(int32_t)61; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_420(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb1(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 3 +- RIGHT= 61 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_420(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb2(uint64_t x) { + return x << (uint32_t)(int32_t)41 | x >> (uint32_t)(int32_t)23; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_421(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb2(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 41 +- RIGHT= 23 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_421(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb3(uint64_t x) { + return x << (uint32_t)(int32_t)18 | x >> (uint32_t)(int32_t)46; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_422(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb3(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 18 +- RIGHT= 46 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_422(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_423(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 1 +- RIGHT= 63 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_423(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb4(uint64_t x) { + return x << (uint32_t)(int32_t)44 | x >> (uint32_t)(int32_t)20; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_424(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb4(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 44 +- RIGHT= 20 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_424(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb5(uint64_t x) { + return x << (uint32_t)(int32_t)10 | x >> (uint32_t)(int32_t)54; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_425(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb5(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 10 +- RIGHT= 54 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_425(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb6(uint64_t x) { + return x << (uint32_t)(int32_t)45 | x >> (uint32_t)(int32_t)19; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_426(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb6(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 45 +- RIGHT= 19 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_426(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb7(uint64_t x) { + return x << (uint32_t)(int32_t)2 | x >> (uint32_t)(int32_t)62; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_427(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb7(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 2 +- RIGHT= 62 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_427(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb8(uint64_t x) { + return x << (uint32_t)(int32_t)62 | x >> (uint32_t)(int32_t)2; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_428(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb8(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 62 +- RIGHT= 2 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_428(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb9(uint64_t x) { + return x << (uint32_t)(int32_t)6 | x >> (uint32_t)(int32_t)58; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_429(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb9(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 6 +- RIGHT= 58 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_429(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb10(uint64_t x) { + return x << (uint32_t)(int32_t)43 | x >> (uint32_t)(int32_t)21; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4210(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb10(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 43 +- RIGHT= 21 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4210(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb11(uint64_t x) { + return x << (uint32_t)(int32_t)15 | x >> (uint32_t)(int32_t)49; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4211(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb11(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 15 +- RIGHT= 49 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4211(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb12(uint64_t x) { + return x << (uint32_t)(int32_t)61 | x >> (uint32_t)(int32_t)3; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4212(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb12(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 61 +- RIGHT= 3 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4212(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb13(uint64_t x) { + return x << (uint32_t)(int32_t)28 | x >> (uint32_t)(int32_t)36; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4213(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb13(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 28 +- RIGHT= 36 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4213(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb14(uint64_t x) { + return x << (uint32_t)(int32_t)55 | x >> (uint32_t)(int32_t)9; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4214(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb14(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 55 +- RIGHT= 9 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4214(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb15(uint64_t x) { + return x << (uint32_t)(int32_t)25 | x >> (uint32_t)(int32_t)39; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4215(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb15(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 25 +- RIGHT= 39 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4215(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb16(uint64_t x) { + return x << (uint32_t)(int32_t)21 | x >> (uint32_t)(int32_t)43; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4216(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb16(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 21 +- RIGHT= 43 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4216(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb17(uint64_t x) { + return x << (uint32_t)(int32_t)56 | x >> (uint32_t)(int32_t)8; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4217(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb17(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 56 +- RIGHT= 8 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4217(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb18(uint64_t x) { + return x << (uint32_t)(int32_t)27 | x >> (uint32_t)(int32_t)37; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4218(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb18(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 27 +- RIGHT= 37 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4218(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb19(uint64_t x) { + return x << (uint32_t)(int32_t)20 | x >> (uint32_t)(int32_t)44; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4219(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb19(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 20 +- RIGHT= 44 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4219(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb20(uint64_t x) { + return x << (uint32_t)(int32_t)39 | x >> (uint32_t)(int32_t)25; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4220(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb20(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 39 +- RIGHT= 25 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4220(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb21(uint64_t x) { + return x << (uint32_t)(int32_t)8 | x >> (uint32_t)(int32_t)56; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4221(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb21(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 8 +- RIGHT= 56 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4221(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.rotate_left +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_rotate_left_cb22(uint64_t x) { + return x << (uint32_t)(int32_t)14 | x >> (uint32_t)(int32_t)50; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak._vxarq_u64 +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak__vxarq_u64_4222(uint64_t a, uint64_t b) { + uint64_t ab = a ^ b; + return libcrux_sha3_portable_keccak_rotate_left_cb22(ab); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.xor_and_rotate_5a +with const generics +- LEFT= 14 +- RIGHT= 50 +*/ +static KRML_MUSTINLINE uint64_t +libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(uint64_t a, uint64_t b) { + return libcrux_sha3_portable_keccak__vxarq_u64_4222(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.theta_rho +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_theta_rho_16( + libcrux_sha3_generic_keccak_KeccakState_48 *s) { + uint64_t c[5U] = { + libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][0U], s->st[1U][0U], + s->st[2U][0U], s->st[3U][0U], + s->st[4U][0U]), + libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][1U], s->st[1U][1U], + s->st[2U][1U], s->st[3U][1U], + s->st[4U][1U]), + libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][2U], s->st[1U][2U], + s->st[2U][2U], s->st[3U][2U], + s->st[4U][2U]), + libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][3U], s->st[1U][3U], + s->st[2U][3U], s->st[3U][3U], + s->st[4U][3U]), + libcrux_sha3_portable_keccak_xor5_5a(s->st[0U][4U], s->st[1U][4U], + s->st[2U][4U], s->st[3U][4U], + s->st[4U][4U])}; + uint64_t uu____0 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a( + c[((size_t)0U + (size_t)4U) % (size_t)5U], + c[((size_t)0U + (size_t)1U) % (size_t)5U]); + uint64_t uu____1 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a( + c[((size_t)1U + (size_t)4U) % (size_t)5U], + c[((size_t)1U + (size_t)1U) % (size_t)5U]); + uint64_t uu____2 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a( + c[((size_t)2U + (size_t)4U) % (size_t)5U], + c[((size_t)2U + (size_t)1U) % (size_t)5U]); + uint64_t uu____3 = libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a( + c[((size_t)3U + (size_t)4U) % (size_t)5U], + c[((size_t)3U + (size_t)1U) % (size_t)5U]); + uint64_t t[5U] = {uu____0, uu____1, uu____2, uu____3, + libcrux_sha3_portable_keccak_rotate_left1_and_xor_5a( + c[((size_t)4U + (size_t)4U) % (size_t)5U], + c[((size_t)4U + (size_t)1U) % (size_t)5U])}; + s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_5a(s->st[0U][0U], t[0U]); + s->st[1U][0U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb(s->st[1U][0U], t[0U]); + s->st[2U][0U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb0(s->st[2U][0U], t[0U]); + s->st[3U][0U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb1(s->st[3U][0U], t[0U]); + s->st[4U][0U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb2(s->st[4U][0U], t[0U]); + s->st[0U][1U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb3(s->st[0U][1U], t[1U]); + s->st[1U][1U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb4(s->st[1U][1U], t[1U]); + s->st[2U][1U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb5(s->st[2U][1U], t[1U]); + s->st[3U][1U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb6(s->st[3U][1U], t[1U]); + s->st[4U][1U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb7(s->st[4U][1U], t[1U]); + s->st[0U][2U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb8(s->st[0U][2U], t[2U]); + s->st[1U][2U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb9(s->st[1U][2U], t[2U]); + s->st[2U][2U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb10(s->st[2U][2U], t[2U]); + s->st[3U][2U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb11(s->st[3U][2U], t[2U]); + s->st[4U][2U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb12(s->st[4U][2U], t[2U]); + s->st[0U][3U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb13(s->st[0U][3U], t[3U]); + s->st[1U][3U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb14(s->st[1U][3U], t[3U]); + s->st[2U][3U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb15(s->st[2U][3U], t[3U]); + s->st[3U][3U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb16(s->st[3U][3U], t[3U]); + s->st[4U][3U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb17(s->st[4U][3U], t[3U]); + s->st[0U][4U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb18(s->st[0U][4U], t[4U]); + s->st[1U][4U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb19(s->st[1U][4U], t[4U]); + s->st[2U][4U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb20(s->st[2U][4U], t[4U]); + s->st[3U][4U] = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb21(s->st[3U][4U], t[4U]); + uint64_t uu____27 = + libcrux_sha3_portable_keccak_xor_and_rotate_5a_bb22(s->st[4U][4U], t[4U]); + s->st[4U][4U] = uu____27; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.pi +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_pi_1d( + libcrux_sha3_generic_keccak_KeccakState_48 *s) { + uint64_t old[5U][5U]; + memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U])); + s->st[0U][1U] = old[1U][1U]; + s->st[0U][2U] = old[2U][2U]; + s->st[0U][3U] = old[3U][3U]; + s->st[0U][4U] = old[4U][4U]; + s->st[1U][0U] = old[0U][3U]; + s->st[1U][1U] = old[1U][4U]; + s->st[1U][2U] = old[2U][0U]; + s->st[1U][3U] = old[3U][1U]; + s->st[1U][4U] = old[4U][2U]; + s->st[2U][0U] = old[0U][1U]; + s->st[2U][1U] = old[1U][2U]; + s->st[2U][2U] = old[2U][3U]; + s->st[2U][3U] = old[3U][4U]; + s->st[2U][4U] = old[4U][0U]; + s->st[3U][0U] = old[0U][4U]; + s->st[3U][1U] = old[1U][0U]; + s->st[3U][2U] = old[2U][1U]; + s->st[3U][3U] = old[3U][2U]; + s->st[3U][4U] = old[4U][3U]; + s->st[4U][0U] = old[0U][2U]; + s->st[4U][1U] = old[1U][3U]; + s->st[4U][2U] = old[2U][4U]; + s->st[4U][3U] = old[3U][0U]; + s->st[4U][4U] = old[4U][1U]; +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.chi +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_chi_12( + libcrux_sha3_generic_keccak_KeccakState_48 *s) { + uint64_t old[5U][5U]; + memcpy(old, s->st, (size_t)5U * sizeof(uint64_t[5U])); + for (size_t i0 = (size_t)0U; i0 < (size_t)5U; i0++) { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)5U; i++) { + size_t j = i; + s->st[i1][j] = libcrux_sha3_portable_keccak_and_not_xor_5a( + s->st[i1][j], old[i1][(j + (size_t)2U) % (size_t)5U], + old[i1][(j + (size_t)1U) % (size_t)5U]); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.iota +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_iota_62( + libcrux_sha3_generic_keccak_KeccakState_48 *s, size_t i) { + s->st[0U][0U] = libcrux_sha3_portable_keccak_xor_constant_5a( + s->st[0U][0U], libcrux_sha3_generic_keccak_ROUNDCONSTANTS[i]); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccakf1600 +with types uint64_t +with const generics +- N= 1 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccakf1600_21( + libcrux_sha3_generic_keccak_KeccakState_48 *s) { + for (size_t i = (size_t)0U; i < (size_t)24U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_theta_rho_16(s); + libcrux_sha3_generic_keccak_pi_1d(s); + libcrux_sha3_generic_keccak_chi_12(s); + libcrux_sha3_generic_keccak_iota_62(s, i0); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) { + uint64_t(*uu____0)[5U] = s->st; + Eurydice_slice uu____1[1U]; + memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b8(uu____0, uu____1); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df( + uint64_t (*s)[5U], uint8_t blocks[1U][200U]) { + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)}; + libcrux_sha3_portable_keccak_load_block_2c(s, buf); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d2( + uint64_t (*a)[5U], uint8_t b[1U][200U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_b[1U][200U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_df(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c7( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 6U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)72U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d2(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_58( + uint64_t (*s)[5U], Eurydice_slice out[1U]) { + for (size_t i = (size_t)0U; i < (size_t)72U / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d( + uint64_t (*s)[5U], uint8_t ret[1U][200U]) { + uint8_t out[200U] = {0U}; + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, out, uint8_t)}; + libcrux_sha3_portable_keccak_store_block_58(s, buf); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_out[200U]; + memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t)); + memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_5a_29( + uint64_t (*a)[5U], uint8_t ret[1U][200U]) { + libcrux_sha3_portable_keccak_store_block_full_2d(a, ret); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_and_last_c5( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_29(s->st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a +with const generics +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_59( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + libcrux_sha3_portable_keccak_store_block_58(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_84( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(s); + libcrux_sha3_portable_keccak_store_block_5a_59(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf( + libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(&s); + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_29(s.st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 72 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e9( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)72U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)72U, + (size_t)72U, ret); + libcrux_sha3_generic_keccak_absorb_block_df(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)72U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c7(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)72U; + size_t last = outlen - outlen % (size_t)72U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c5(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)72U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_84(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)72U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 72 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e9(copy_of_data, out); +} + +/** + A portable SHA3 512 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_sha512(Eurydice_slice digest, + Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce(buf0, buf); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c0( + uint64_t (*s)[5U], Eurydice_slice blocks[1U]) { + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { + size_t i0 = i; + uint8_t uu____0[8U]; + Result_56 dst; + Eurydice_slice_to_array2( + &dst, + Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_slice, uint8_t[8U]); + unwrap_41_ac(dst, uu____0); + size_t uu____1 = i0 / (size_t)5U; + size_t uu____2 = i0 % (size_t)5U; + s[uu____1][uu____2] = + s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b80( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_b[1U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_2c0(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df0( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) { + uint64_t(*uu____0)[5U] = s->st; + Eurydice_slice uu____1[1U]; + memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b80(uu____0, uu____1); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df0( + uint64_t (*s)[5U], uint8_t blocks[1U][200U]) { + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)}; + libcrux_sha3_portable_keccak_load_block_2c0(s, buf); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d20( + uint64_t (*a)[5U], uint8_t b[1U][200U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_b[1U][200U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_df0(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c70( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 6U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)136U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_580( + uint64_t (*s)[5U], Eurydice_slice out[1U]) { + for (size_t i = (size_t)0U; i < (size_t)136U / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d0( + uint64_t (*s)[5U], uint8_t ret[1U][200U]) { + uint8_t out[200U] = {0U}; + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, out, uint8_t)}; + libcrux_sha3_portable_keccak_store_block_580(s, buf); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_out[200U]; + memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t)); + memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_keccak_store_block_full_5a_290(uint64_t (*a)[5U], + uint8_t ret[1U][200U]) { + libcrux_sha3_portable_keccak_store_block_full_2d0(a, ret); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_and_last_c50( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_290(s->st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_590( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + libcrux_sha3_portable_keccak_store_block_580(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_840( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc0( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(s); + libcrux_sha3_portable_keccak_store_block_5a_590(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf0( + libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(&s); + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_290(s.st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e90( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U, + (size_t)136U, ret); + libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c70(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)136U; + size_t last = outlen - outlen % (size_t)136U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 136 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce0( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e90(copy_of_data, out); +} + +/** + A portable SHA3 256 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_sha256(Eurydice_slice digest, + Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce0(buf0, buf); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c71( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 31U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)136U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 136 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e91( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)136U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)136U, + (size_t)136U, ret); + libcrux_sha3_generic_keccak_absorb_block_df0(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)136U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c71(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)136U; + size_t last = outlen - outlen % (size_t)136U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c50(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)136U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_840(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)136U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc0(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf0(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 136 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce1( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e91(copy_of_data, out); +} + +/** + A portable SHAKE256 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_shake256( + Eurydice_slice digest, Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce1(buf0, buf); +} + +typedef libcrux_sha3_generic_keccak_KeccakState_48 + libcrux_sha3_portable_KeccakState; + +/** + Create a new SHAKE-128 state object. +*/ +static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48 +libcrux_sha3_portable_incremental_shake128_init(void) { + return libcrux_sha3_generic_keccak_new_1e_f4(); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c1( + uint64_t (*s)[5U], Eurydice_slice blocks[1U]) { + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { + size_t i0 = i; + uint8_t uu____0[8U]; + Result_56 dst; + Eurydice_slice_to_array2( + &dst, + Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_slice, uint8_t[8U]); + unwrap_41_ac(dst, uu____0); + size_t uu____1 = i0 / (size_t)5U; + size_t uu____2 = i0 % (size_t)5U; + s[uu____1][uu____2] = + s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0); + } +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df1( + uint64_t (*s)[5U], uint8_t blocks[1U][200U]) { + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)}; + libcrux_sha3_portable_keccak_load_block_2c1(s, buf); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d21( + uint64_t (*a)[5U], uint8_t b[1U][200U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_b[1U][200U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_df1(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c72( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 31U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)168U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** + Absorb +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_absorb_final( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data0) { + Eurydice_slice buf[1U] = {data0}; + libcrux_sha3_generic_keccak_absorb_final_c72(s, buf); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_581( + uint64_t (*s)[5U], Eurydice_slice out[1U]) { + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_591( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + libcrux_sha3_portable_keccak_store_block_581(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc1( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(s); + libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out); +} + +/** + Squeeze another block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_next_block( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) { + Eurydice_slice buf[1U] = {out0}; + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, buf); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_841( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_portable_keccak_store_block_5a_591(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_three_blocks +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + Eurydice_slice_uint8_t_1size_t__x2 uu____0 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o10[1U]; + memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0); + Eurydice_slice_uint8_t_1size_t__x2 uu____1 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U); + Eurydice_slice o1[1U]; + memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o2[1U]; + memcpy(o2, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2); +} + +/** + Squeeze three blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) { + Eurydice_slice buf[1U] = {out0}; + libcrux_sha3_generic_keccak_squeeze_first_three_blocks_cc(s, buf); +} + +#define libcrux_sha3_Sha224 0 +#define libcrux_sha3_Sha256 1 +#define libcrux_sha3_Sha384 2 +#define libcrux_sha3_Sha512 3 + +typedef uint8_t libcrux_sha3_Algorithm; + +/** + Returns the output size of a digest. +*/ +static inline size_t libcrux_sha3_digest_size(libcrux_sha3_Algorithm mode) { + size_t uu____0; + switch (mode) { + case libcrux_sha3_Sha224: { + uu____0 = (size_t)28U; + break; + } + case libcrux_sha3_Sha256: { + uu____0 = (size_t)32U; + break; + } + case libcrux_sha3_Sha384: { + uu____0 = (size_t)48U; + break; + } + case libcrux_sha3_Sha512: { + uu____0 = (size_t)64U; + break; + } + default: { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, + __LINE__); + KRML_HOST_EXIT(253U); + } + } + return uu____0; +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c2( + uint64_t (*s)[5U], Eurydice_slice blocks[1U]) { + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { + size_t i0 = i; + uint8_t uu____0[8U]; + Result_56 dst; + Eurydice_slice_to_array2( + &dst, + Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_slice, uint8_t[8U]); + unwrap_41_ac(dst, uu____0); + size_t uu____1 = i0 / (size_t)5U; + size_t uu____2 = i0 % (size_t)5U; + s[uu____1][uu____2] = + s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b81( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_b[1U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_2c2(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df1( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) { + uint64_t(*uu____0)[5U] = s->st; + Eurydice_slice uu____1[1U]; + memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b81(uu____0, uu____1); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df2( + uint64_t (*s)[5U], uint8_t blocks[1U][200U]) { + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)}; + libcrux_sha3_portable_keccak_load_block_2c2(s, buf); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d22( + uint64_t (*a)[5U], uint8_t b[1U][200U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_b[1U][200U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_df2(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c73( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 6U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)144U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d22(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_582( + uint64_t (*s)[5U], Eurydice_slice out[1U]) { + for (size_t i = (size_t)0U; i < (size_t)144U / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d1( + uint64_t (*s)[5U], uint8_t ret[1U][200U]) { + uint8_t out[200U] = {0U}; + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, out, uint8_t)}; + libcrux_sha3_portable_keccak_store_block_582(s, buf); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_out[200U]; + memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t)); + memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_keccak_store_block_full_5a_291(uint64_t (*a)[5U], + uint8_t ret[1U][200U]) { + libcrux_sha3_portable_keccak_store_block_full_2d1(a, ret); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_and_last_c51( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_291(s->st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a +with const generics +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_592( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + libcrux_sha3_portable_keccak_store_block_582(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_842( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc2( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(s); + libcrux_sha3_portable_keccak_store_block_5a_592(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf1( + libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(&s); + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_291(s.st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 144 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e92( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)144U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)144U, + (size_t)144U, ret); + libcrux_sha3_generic_keccak_absorb_block_df1(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)144U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c73(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)144U; + size_t last = outlen - outlen % (size_t)144U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c51(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)144U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_842(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)144U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc2(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf1(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 144 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce2( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e92(copy_of_data, out); +} + +/** + A portable SHA3 224 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_sha224(Eurydice_slice digest, + Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce2(buf0, buf); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_2c3( + uint64_t (*s)[5U], Eurydice_slice blocks[1U]) { + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { + size_t i0 = i; + uint8_t uu____0[8U]; + Result_56 dst; + Eurydice_slice_to_array2( + &dst, + Eurydice_slice_subslice2(blocks[0U], (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_slice, uint8_t[8U]); + unwrap_41_ac(dst, uu____0); + size_t uu____1 = i0 / (size_t)5U; + size_t uu____2 = i0 % (size_t)5U; + s[uu____1][uu____2] = + s[uu____1][uu____2] ^ core_num__u64_9__from_le_bytes(uu____0); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b82( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_b[1U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_2c3(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df2( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) { + uint64_t(*uu____0)[5U] = s->st; + Eurydice_slice uu____1[1U]; + memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b82(uu____0, uu____1); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_df3( + uint64_t (*s)[5U], uint8_t blocks[1U][200U]) { + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, blocks[0U], uint8_t)}; + libcrux_sha3_portable_keccak_load_block_2c3(s, buf); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_full_5a +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_full_5a_d23( + uint64_t (*a)[5U], uint8_t b[1U][200U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_b[1U][200U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_df3(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_c74( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice last[1U]) { + size_t last_len = Eurydice_slice_len(last[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (last_len > (size_t)0U) { + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, last_len, uint8_t); + Eurydice_slice_copy(uu____0, last[i0], uint8_t); + } + blocks[i0][last_len] = 6U; + size_t uu____1 = i0; + size_t uu____2 = (size_t)104U - (size_t)1U; + blocks[uu____1][uu____2] = (uint32_t)blocks[uu____1][uu____2] | 128U; + } + uint64_t(*uu____3)[5U] = s->st; + uint8_t uu____4[1U][200U]; + memcpy(uu____4, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d23(uu____3, uu____4); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_583( + uint64_t (*s)[5U], Eurydice_slice out[1U]) { + for (size_t i = (size_t)0U; i < (size_t)104U / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], (size_t)8U * i0, (size_t)8U * i0 + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(s[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d2( + uint64_t (*s)[5U], uint8_t ret[1U][200U]) { + uint8_t out[200U] = {0U}; + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, out, uint8_t)}; + libcrux_sha3_portable_keccak_store_block_583(s, buf); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_out[200U]; + memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t)); + memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_keccak_store_block_full_5a_292(uint64_t (*a)[5U], + uint8_t ret[1U][200U]) { + libcrux_sha3_portable_keccak_store_block_full_2d2(a, ret); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_and_last_c52( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_292(s->st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_5a +with const generics +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_5a_593( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + libcrux_sha3_portable_keccak_store_block_583(a, b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_block +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_first_block_843( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_next_block +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_next_block_fc3( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(s); + libcrux_sha3_portable_keccak_store_block_5a_593(s->st, out); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf2( + libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(&s); + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_292(s.st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 104 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e93( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)104U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)104U, + (size_t)104U, ret); + libcrux_sha3_generic_keccak_absorb_block_df2(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)104U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c74(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)104U; + size_t last = outlen - outlen % (size_t)104U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c52(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)104U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_843(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)104U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc3(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf2(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 104 +- DELIM= 6 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce3( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e93(copy_of_data, out); +} + +/** + A portable SHA3 384 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_sha384(Eurydice_slice digest, + Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce3(buf0, buf); +} + +/** + SHA3 224 + + Preconditions: + - `digest.len() == 28` +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha224_ema(Eurydice_slice digest, + Eurydice_slice payload) { + libcrux_sha3_portable_sha224(digest, payload); +} + +/** + SHA3 224 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha224(Eurydice_slice data, + uint8_t ret[28U]) { + uint8_t out[28U] = {0U}; + libcrux_sha3_sha224_ema(Eurydice_array_to_slice((size_t)28U, out, uint8_t), + data); + memcpy(ret, out, (size_t)28U * sizeof(uint8_t)); +} + +/** + SHA3 256 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha256_ema(Eurydice_slice digest, + Eurydice_slice payload) { + libcrux_sha3_portable_sha256(digest, payload); +} + +/** + SHA3 256 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha256(Eurydice_slice data, + uint8_t ret[32U]) { + uint8_t out[32U] = {0U}; + libcrux_sha3_sha256_ema(Eurydice_array_to_slice((size_t)32U, out, uint8_t), + data); + memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); +} + +/** + SHA3 384 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha384_ema(Eurydice_slice digest, + Eurydice_slice payload) { + libcrux_sha3_portable_sha384(digest, payload); +} + +/** + SHA3 384 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha384(Eurydice_slice data, + uint8_t ret[48U]) { + uint8_t out[48U] = {0U}; + libcrux_sha3_sha384_ema(Eurydice_array_to_slice((size_t)48U, out, uint8_t), + data); + memcpy(ret, out, (size_t)48U * sizeof(uint8_t)); +} + +/** + SHA3 512 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha512_ema(Eurydice_slice digest, + Eurydice_slice payload) { + libcrux_sha3_portable_sha512(digest, payload); +} + +/** + SHA3 512 +*/ +static KRML_MUSTINLINE void libcrux_sha3_sha512(Eurydice_slice data, + uint8_t ret[64U]) { + uint8_t out[64U] = {0U}; + libcrux_sha3_sha512_ema(Eurydice_array_to_slice((size_t)64U, out, uint8_t), + data); + memcpy(ret, out, (size_t)64U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.load_block_5a +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_load_block_5a_b83( + uint64_t (*a)[5U], Eurydice_slice b[1U]) { + uint64_t(*uu____0)[5U] = a; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_b[1U]; + memcpy(copy_of_b, b, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_2c1(uu____0, copy_of_b); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_block +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_block_df3( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice blocks[1U]) { + uint64_t(*uu____0)[5U] = s->st; + Eurydice_slice uu____1[1U]; + memcpy(uu____1, blocks, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b83(uu____0, uu____1); + libcrux_sha3_generic_keccak_keccakf1600_21(s); +} + +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_block_full_2d3( + uint64_t (*s)[5U], uint8_t ret[1U][200U]) { + uint8_t out[200U] = {0U}; + Eurydice_slice buf[1U] = { + Eurydice_array_to_slice((size_t)200U, out, uint8_t)}; + libcrux_sha3_portable_keccak_store_block_581(s, buf); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_out[200U]; + memcpy(copy_of_out, out, (size_t)200U * sizeof(uint8_t)); + memcpy(ret[0U], copy_of_out, (size_t)200U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_block_full_5a +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_keccak_store_block_full_5a_293(uint64_t (*a)[5U], + uint8_t ret[1U][200U]) { + libcrux_sha3_portable_keccak_store_block_full_2d3(a, ret); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_and_last +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_and_last_c53( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_293(s->st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_last +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_last_cf3( + libcrux_sha3_generic_keccak_KeccakState_48 s, Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_keccakf1600_21(&s); + uint8_t b[1U][200U]; + libcrux_sha3_portable_keccak_store_block_full_5a_293(s.st, b); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = out[i0]; + uint8_t *uu____1 = b[i0]; + core_ops_range_Range_b3 lit; + lit.start = (size_t)0U; + lit.end = Eurydice_slice_len(out[i0], uint8_t); + Eurydice_slice_copy( + uu____0, + Eurydice_array_to_subslice((size_t)200U, uu____1, lit, uint8_t, + core_ops_range_Range_b3), + uint8_t); + } +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.keccak +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_keccak_e94( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + libcrux_sha3_generic_keccak_KeccakState_48 s = + libcrux_sha3_generic_keccak_new_1e_f4(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(data[0U], uint8_t) / (size_t)168U; i++) { + size_t i0 = i; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____0 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a(copy_of_data, i0 * (size_t)168U, + (size_t)168U, ret); + libcrux_sha3_generic_keccak_absorb_block_df3(uu____0, ret); + } + size_t rem = Eurydice_slice_len(data[0U], uint8_t) % (size_t)168U; + libcrux_sha3_generic_keccak_KeccakState_48 *uu____2 = &s; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_data, Eurydice_slice_len(data[0U], uint8_t) - rem, rem, ret); + libcrux_sha3_generic_keccak_absorb_final_c72(uu____2, ret); + size_t outlen = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = outlen / (size_t)168U; + size_t last = outlen - outlen % (size_t)168U; + if (blocks == (size_t)0U) { + libcrux_sha3_generic_keccak_squeeze_first_and_last_c53(&s, out); + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____4 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____4.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o1[1U]; + memcpy(o1, uu____4.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_841(&s, o0); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____5 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o1, (size_t)168U); + Eurydice_slice o[1U]; + memcpy(o, uu____5.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice orest[1U]; + memcpy(orest, uu____5.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(&s, o); + memcpy(o1, orest, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < outlen) { + libcrux_sha3_generic_keccak_squeeze_last_cf3(s, o1); + } + } +} + +/** +A monomorphic instance of libcrux_sha3.portable.keccakx1 +with const generics +- RATE= 168 +- DELIM= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccakx1_ce4( + Eurydice_slice data[1U], Eurydice_slice out[1U]) { + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_data[1U]; + memcpy(copy_of_data, data, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccak_e94(copy_of_data, out); +} + +/** + A portable SHAKE128 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_shake128( + Eurydice_slice digest, Eurydice_slice data) { + Eurydice_slice buf0[1U] = {data}; + Eurydice_slice buf[1U] = {digest}; + libcrux_sha3_portable_keccakx1_ce4(buf0, buf); +} + +/** + SHAKE 128 + + Writes `out.len()` bytes. +*/ +static KRML_MUSTINLINE void libcrux_sha3_shake128_ema(Eurydice_slice out, + Eurydice_slice data) { + libcrux_sha3_portable_shake128(out, data); +} + +/** + SHAKE 256 + + Writes `out.len()` bytes. +*/ +static KRML_MUSTINLINE void libcrux_sha3_shake256_ema(Eurydice_slice out, + Eurydice_slice data) { + libcrux_sha3_portable_shake256(out, data); +} + +static const size_t libcrux_sha3_generic_keccak__PI[24U] = { + (size_t)6U, (size_t)12U, (size_t)18U, (size_t)24U, (size_t)3U, + (size_t)9U, (size_t)10U, (size_t)16U, (size_t)22U, (size_t)1U, + (size_t)7U, (size_t)13U, (size_t)19U, (size_t)20U, (size_t)4U, + (size_t)5U, (size_t)11U, (size_t)17U, (size_t)23U, (size_t)2U, + (size_t)8U, (size_t)14U, (size_t)15U, (size_t)21U}; + +static const size_t libcrux_sha3_generic_keccak__ROTC[24U] = { + (size_t)1U, (size_t)62U, (size_t)28U, (size_t)27U, (size_t)36U, + (size_t)44U, (size_t)6U, (size_t)55U, (size_t)20U, (size_t)3U, + (size_t)10U, (size_t)43U, (size_t)25U, (size_t)39U, (size_t)41U, + (size_t)45U, (size_t)15U, (size_t)21U, (size_t)8U, (size_t)18U, + (size_t)2U, (size_t)61U, (size_t)56U, (size_t)14U}; + +/** + A portable SHA3 224 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_neon_sha224(Eurydice_slice digest, + Eurydice_slice data) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + A portable SHA3 256 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_neon_sha256(Eurydice_slice digest, + Eurydice_slice data) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + A portable SHA3 384 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_neon_sha384(Eurydice_slice digest, + Eurydice_slice data) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + A portable SHA3 512 implementation. +*/ +static KRML_MUSTINLINE void libcrux_sha3_neon_sha512(Eurydice_slice digest, + Eurydice_slice data) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + Run SHAKE256 on both inputs in parallel. + + Writes the two results into `out0` and `out1` +*/ +static KRML_MUSTINLINE void libcrux_sha3_neon_x2_shake256(Eurydice_slice input0, + Eurydice_slice input1, + Eurydice_slice out0, + Eurydice_slice out1) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +typedef struct libcrux_sha3_neon_x2_incremental_KeccakState_s { + libcrux_sha3_generic_keccak_KeccakState_48 state[2U]; +} libcrux_sha3_neon_x2_incremental_KeccakState; + +/** + Initialise the `KeccakState2`. +*/ +static KRML_MUSTINLINE libcrux_sha3_neon_x2_incremental_KeccakState +libcrux_sha3_neon_x2_incremental_shake128_init(void) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + Shake128 absorb `data0` and `data1` in the [`KeccakState`] `s`. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_neon_x2_incremental_shake128_absorb_final( + libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice data0, + Eurydice_slice data1) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + Squeeze 2 times the first three blocks in parallel in the + [`KeccakState`] and return the output in `out0` and `out1`. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_neon_x2_incremental_shake128_squeeze_first_three_blocks( + libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0, + Eurydice_slice out1) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** + Squeeze 2 times the next block in parallel in the + [`KeccakState`] and return the output in `out0` and `out1`. +*/ +static KRML_MUSTINLINE void +libcrux_sha3_neon_x2_incremental_shake128_squeeze_next_block( + libcrux_sha3_neon_x2_incremental_KeccakState *s, Eurydice_slice out0, + Eurydice_slice out1) { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_first_five_blocks +with types uint64_t +with const generics +- N= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void +libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out[1U]) { + Eurydice_slice_uint8_t_1size_t__x2 uu____0 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, (size_t)168U); + Eurydice_slice o0[1U]; + memcpy(o0, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o10[1U]; + memcpy(o10, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_first_block_841(s, o0); + Eurydice_slice_uint8_t_1size_t__x2 uu____1 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o10, (size_t)168U); + Eurydice_slice o1[1U]; + memcpy(o1, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o20[1U]; + memcpy(o20, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o1); + Eurydice_slice_uint8_t_1size_t__x2 uu____2 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o20, (size_t)168U); + Eurydice_slice o2[1U]; + memcpy(o2, uu____2.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o30[1U]; + memcpy(o30, uu____2.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o2); + Eurydice_slice_uint8_t_1size_t__x2 uu____3 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(o30, (size_t)168U); + Eurydice_slice o3[1U]; + memcpy(o3, uu____3.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice o4[1U]; + memcpy(o4, uu____3.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o3); + libcrux_sha3_generic_keccak_squeeze_next_block_fc1(s, o4); +} + +/** + Squeeze five blocks +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake128_squeeze_first_five_blocks( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out0) { + Eurydice_slice buf[1U] = {out0}; + libcrux_sha3_generic_keccak_squeeze_first_five_blocks_4f(s, buf); +} + +/** + Absorb some data for SHAKE-256 for the last time +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_absorb_final( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice data) { + Eurydice_slice buf[1U] = {data}; + libcrux_sha3_generic_keccak_absorb_final_c71(s, buf); +} + +/** + Create a new SHAKE-256 state object. +*/ +static KRML_MUSTINLINE libcrux_sha3_generic_keccak_KeccakState_48 +libcrux_sha3_portable_incremental_shake256_init(void) { + return libcrux_sha3_generic_keccak_new_1e_f4(); +} + +/** + Squeeze the first SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_first_block( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) { + Eurydice_slice buf[1U] = {out}; + libcrux_sha3_generic_keccak_squeeze_first_block_840(s, buf); +} + +/** + Squeeze the next SHAKE-256 block +*/ +static KRML_MUSTINLINE void +libcrux_sha3_portable_incremental_shake256_squeeze_next_block( + libcrux_sha3_generic_keccak_KeccakState_48 *s, Eurydice_slice out) { + Eurydice_slice buf[1U] = {out}; + libcrux_sha3_generic_keccak_squeeze_next_block_fc0(s, buf); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $136size_t +*/ +typedef struct libcrux_sha3_generic_keccak_KeccakXofState_4f_s { + libcrux_sha3_generic_keccak_KeccakState_48 inner; + uint8_t buf[1U][136U]; + size_t buf_len; + bool sponge; +} libcrux_sha3_generic_keccak_KeccakXofState_4f; + +typedef libcrux_sha3_generic_keccak_KeccakXofState_4f + libcrux_sha3_portable_incremental_Shake256Absorb; + +/** + Consume the internal buffer and the required amount of the input to pad to + `RATE`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b0( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, + Eurydice_slice inputs[1U]) { + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + size_t consumed = (size_t)0U; + if (self->buf_len > (size_t)0U) { + if (self->buf_len + input_len >= (size_t)136U) { + consumed = (size_t)136U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( + (size_t)136U, self->buf[i0], self->buf_len, uint8_t, size_t); + Eurydice_slice_copy( + uu____0, + Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t), + uint8_t); + } + self->buf_len = self->buf_len + consumed; + } + } + return consumed; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f8( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs0[1U]; + memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_consumed = + libcrux_sha3_generic_keccak_fill_buffer_9d_b0(uu____0, copy_of_inputs0); + if (input_consumed > (size_t)0U) { + Eurydice_slice borrowed[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + uint8_t buf[136U] = {0U}; + borrowed[i] = core_array___Array_T__N__23__as_slice( + (size_t)136U, buf, uint8_t, Eurydice_slice); + } + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + borrowed[i0] = + Eurydice_array_to_slice((size_t)136U, self->buf[i0], uint8_t); + } + uint64_t(*uu____2)[5U] = self->inner.st; + Eurydice_slice uu____3[1U]; + memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b80(uu____2, uu____3); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = + Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; + size_t num_blocks = input_to_consume / (size_t)136U; + size_t remainder = input_to_consume % (size_t)136U; + for (size_t i = (size_t)0U; i < num_blocks; i++) { + size_t i0 = i; + uint64_t(*uu____4)[5U] = self->inner.st; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_inputs, input_consumed + i0 * (size_t)136U, (size_t)136U, ret); + libcrux_sha3_portable_keccak_load_block_5a_b80(uu____4, ret); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not + enough. The function assumes that all input slices in `blocks` have the same + length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_remainder_len = + libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs); + if (input_remainder_len > (size_t)0U) { + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____2 = Eurydice_array_to_subslice2( + self->buf[i0], self->buf_len, self->buf_len + input_remainder_len, + uint8_t); + Eurydice_slice_copy( + uu____2, + Eurydice_slice_subslice_from( + inputs[i0], input_len - input_remainder_len, uint8_t, size_t), + uint8_t); + } + self->buf_len = self->buf_len + input_remainder_len; + } +} + +/** + Shake256 absorb +*/ +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for +libcrux_sha3::portable::incremental::Shake256Absorb)#2} +*/ +static inline void libcrux_sha3_portable_incremental_absorb_7d( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice input) { + Eurydice_slice buf[1U] = {input}; + libcrux_sha3_generic_keccak_absorb_9d_7b(self, buf); +} + +typedef libcrux_sha3_generic_keccak_KeccakXofState_4f + libcrux_sha3_portable_incremental_Shake256Squeeze; + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_25( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_4f *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_remainder_len = + libcrux_sha3_generic_keccak_absorb_full_9d_f8(uu____0, copy_of_inputs); + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (self->buf_len > (size_t)0U) { + Eurydice_slice uu____2 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, self->buf_len, uint8_t); + Eurydice_slice_copy(uu____2, + Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U, + self->buf_len, uint8_t), + uint8_t); + } + if (input_remainder_len > (size_t)0U) { + Eurydice_slice uu____3 = Eurydice_array_to_subslice2( + blocks[i0], self->buf_len, self->buf_len + input_remainder_len, + uint8_t); + Eurydice_slice_copy( + uu____3, + Eurydice_slice_subslice_from( + inputs[i0], input_len - input_remainder_len, uint8_t, size_t), + uint8_t); + } + blocks[i0][self->buf_len + input_remainder_len] = 31U; + size_t uu____4 = i0; + size_t uu____5 = (size_t)136U - (size_t)1U; + blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U; + } + uint64_t(*uu____6)[5U] = self->inner.st; + uint8_t uu____7[1U][200U]; + memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d20(uu____6, uu____7); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); +} + +/** + Shake256 absorb final +*/ +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for +libcrux_sha3::portable::incremental::Shake256Absorb)#2} +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_4f +libcrux_sha3_portable_incremental_absorb_final_7d( + libcrux_sha3_generic_keccak_KeccakXofState_4f self, Eurydice_slice input) { + Eurydice_slice buf[1U] = {input}; + libcrux_sha3_generic_keccak_absorb_final_9d_25(&self, buf); + return self; +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline void libcrux_sha3_generic_keccak_zero_block_9d_e6( + uint8_t ret[136U]) { + ret[0U] = 0U; + ret[1U] = 0U; + ret[2U] = 0U; + ret[3U] = 0U; + ret[4U] = 0U; + ret[5U] = 0U; + ret[6U] = 0U; + ret[7U] = 0U; + ret[8U] = 0U; + ret[9U] = 0U; + ret[10U] = 0U; + ret[11U] = 0U; + ret[12U] = 0U; + ret[13U] = 0U; + ret[14U] = 0U; + ret[15U] = 0U; + ret[16U] = 0U; + ret[17U] = 0U; + ret[18U] = 0U; + ret[19U] = 0U; + ret[20U] = 0U; + ret[21U] = 0U; + ret[22U] = 0U; + ret[23U] = 0U; + ret[24U] = 0U; + ret[25U] = 0U; + ret[26U] = 0U; + ret[27U] = 0U; + ret[28U] = 0U; + ret[29U] = 0U; + ret[30U] = 0U; + ret[31U] = 0U; + ret[32U] = 0U; + ret[33U] = 0U; + ret[34U] = 0U; + ret[35U] = 0U; + ret[36U] = 0U; + ret[37U] = 0U; + ret[38U] = 0U; + ret[39U] = 0U; + ret[40U] = 0U; + ret[41U] = 0U; + ret[42U] = 0U; + ret[43U] = 0U; + ret[44U] = 0U; + ret[45U] = 0U; + ret[46U] = 0U; + ret[47U] = 0U; + ret[48U] = 0U; + ret[49U] = 0U; + ret[50U] = 0U; + ret[51U] = 0U; + ret[52U] = 0U; + ret[53U] = 0U; + ret[54U] = 0U; + ret[55U] = 0U; + ret[56U] = 0U; + ret[57U] = 0U; + ret[58U] = 0U; + ret[59U] = 0U; + ret[60U] = 0U; + ret[61U] = 0U; + ret[62U] = 0U; + ret[63U] = 0U; + ret[64U] = 0U; + ret[65U] = 0U; + ret[66U] = 0U; + ret[67U] = 0U; + ret[68U] = 0U; + ret[69U] = 0U; + ret[70U] = 0U; + ret[71U] = 0U; + ret[72U] = 0U; + ret[73U] = 0U; + ret[74U] = 0U; + ret[75U] = 0U; + ret[76U] = 0U; + ret[77U] = 0U; + ret[78U] = 0U; + ret[79U] = 0U; + ret[80U] = 0U; + ret[81U] = 0U; + ret[82U] = 0U; + ret[83U] = 0U; + ret[84U] = 0U; + ret[85U] = 0U; + ret[86U] = 0U; + ret[87U] = 0U; + ret[88U] = 0U; + ret[89U] = 0U; + ret[90U] = 0U; + ret[91U] = 0U; + ret[92U] = 0U; + ret[93U] = 0U; + ret[94U] = 0U; + ret[95U] = 0U; + ret[96U] = 0U; + ret[97U] = 0U; + ret[98U] = 0U; + ret[99U] = 0U; + ret[100U] = 0U; + ret[101U] = 0U; + ret[102U] = 0U; + ret[103U] = 0U; + ret[104U] = 0U; + ret[105U] = 0U; + ret[106U] = 0U; + ret[107U] = 0U; + ret[108U] = 0U; + ret[109U] = 0U; + ret[110U] = 0U; + ret[111U] = 0U; + ret[112U] = 0U; + ret[113U] = 0U; + ret[114U] = 0U; + ret[115U] = 0U; + ret[116U] = 0U; + ret[117U] = 0U; + ret[118U] = 0U; + ret[119U] = 0U; + ret[120U] = 0U; + ret[121U] = 0U; + ret[122U] = 0U; + ret[123U] = 0U; + ret[124U] = 0U; + ret[125U] = 0U; + ret[126U] = 0U; + ret[127U] = 0U; + ret[128U] = 0U; + ret[129U] = 0U; + ret[130U] = 0U; + ret[131U] = 0U; + ret[132U] = 0U; + ret[133U] = 0U; + ret[134U] = 0U; + ret[135U] = 0U; +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.new_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_4f +libcrux_sha3_generic_keccak_new_9d_7e(void) { + libcrux_sha3_generic_keccak_KeccakXofState_4f lit; + lit.inner = libcrux_sha3_generic_keccak_new_1e_f4(); + uint8_t ret[136U]; + libcrux_sha3_generic_keccak_zero_block_9d_e6(ret); + memcpy(lit.buf[0U], ret, (size_t)136U * sizeof(uint8_t)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** + Shake256 new state +*/ +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<136: usize> for +libcrux_sha3::portable::incremental::Shake256Absorb)#2} +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_4f +libcrux_sha3_portable_incremental_new_7d(void) { + return libcrux_sha3_generic_keccak_new_9d_7e(); +} + +/** +A monomorphic instance of libcrux_sha3.generic_keccak.KeccakXofState +with types uint64_t +with const generics +- $1size_t +- $168size_t +*/ +typedef struct libcrux_sha3_generic_keccak_KeccakXofState_78_s { + libcrux_sha3_generic_keccak_KeccakState_48 inner; + uint8_t buf[1U][168U]; + size_t buf_len; + bool sponge; +} libcrux_sha3_generic_keccak_KeccakXofState_78; + +typedef libcrux_sha3_generic_keccak_KeccakXofState_78 + libcrux_sha3_portable_incremental_Shake128Absorb; + +/** + Consume the internal buffer and the required amount of the input to pad to + `RATE`. + + Returns the `consumed` bytes from `inputs` if there's enough buffered + content to consume, and `0` otherwise. + If `consumed > 0` is returned, `self.buf` contains a full block to be + loaded. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.fill_buffer_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t libcrux_sha3_generic_keccak_fill_buffer_9d_b00( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, + Eurydice_slice inputs[1U]) { + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + size_t consumed = (size_t)0U; + if (self->buf_len > (size_t)0U) { + if (self->buf_len + input_len >= (size_t)168U) { + consumed = (size_t)168U - self->buf_len; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( + (size_t)168U, self->buf[i0], self->buf_len, uint8_t, size_t); + Eurydice_slice_copy( + uu____0, + Eurydice_slice_subslice_to(inputs[i0], consumed, uint8_t, size_t), + uint8_t); + } + self->buf_len = self->buf_len + consumed; + } + } + return consumed; +} + +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_full_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline size_t libcrux_sha3_generic_keccak_absorb_full_9d_f80( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs0[1U]; + memcpy(copy_of_inputs0, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_consumed = + libcrux_sha3_generic_keccak_fill_buffer_9d_b00(uu____0, copy_of_inputs0); + if (input_consumed > (size_t)0U) { + Eurydice_slice borrowed[1U]; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + uint8_t buf[168U] = {0U}; + borrowed[i] = core_array___Array_T__N__23__as_slice( + (size_t)168U, buf, uint8_t, Eurydice_slice); + } + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + borrowed[i0] = + Eurydice_array_to_slice((size_t)168U, self->buf[i0], uint8_t); + } + uint64_t(*uu____2)[5U] = self->inner.st; + Eurydice_slice uu____3[1U]; + memcpy(uu____3, borrowed, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_load_block_5a_b83(uu____2, uu____3); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + self->buf_len = (size_t)0U; + } + size_t input_to_consume = + Eurydice_slice_len(inputs[0U], uint8_t) - input_consumed; + size_t num_blocks = input_to_consume / (size_t)168U; + size_t remainder = input_to_consume % (size_t)168U; + for (size_t i = (size_t)0U; i < num_blocks; i++) { + size_t i0 = i; + uint64_t(*uu____4)[5U] = self->inner.st; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice ret[1U]; + libcrux_sha3_portable_keccak_slice_n_5a( + copy_of_inputs, input_consumed + i0 * (size_t)168U, (size_t)168U, ret); + libcrux_sha3_portable_keccak_load_block_5a_b83(uu____4, ret); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + } + return remainder; +} + +/** + Absorb + + This function takes any number of bytes to absorb and buffers if it's not + enough. The function assumes that all input slices in `blocks` have the same + length. + + Only a multiple of `RATE` blocks are absorbed. + For the remaining bytes [`absorb_final`] needs to be called. + + This works best with relatively small `inputs`. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_9d_7b0( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_remainder_len = + libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs); + if (input_remainder_len > (size_t)0U) { + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + Eurydice_slice uu____2 = Eurydice_array_to_subslice2( + self->buf[i0], self->buf_len, self->buf_len + input_remainder_len, + uint8_t); + Eurydice_slice_copy( + uu____2, + Eurydice_slice_subslice_from( + inputs[i0], input_len - input_remainder_len, uint8_t, size_t), + uint8_t); + } + self->buf_len = self->buf_len + input_remainder_len; + } +} + +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for +libcrux_sha3::portable::incremental::Shake128Absorb)} +*/ +static inline void libcrux_sha3_portable_incremental_absorb_1c( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice input) { + Eurydice_slice buf[1U] = {input}; + libcrux_sha3_generic_keccak_absorb_9d_7b0(self, buf); +} + +typedef libcrux_sha3_generic_keccak_KeccakXofState_78 + libcrux_sha3_portable_incremental_Shake128Squeeze; + +/** + Absorb a final block. + + The `inputs` block may be empty. Everything in the `inputs` block beyond + `RATE` bytes is ignored. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.absorb_final_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +- DELIMITER= 31 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_absorb_final_9d_250( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, + Eurydice_slice inputs[1U]) { + libcrux_sha3_generic_keccak_KeccakXofState_78 *uu____0 = self; + /* Passing arrays by value in Rust generates a copy in C */ + Eurydice_slice copy_of_inputs[1U]; + memcpy(copy_of_inputs, inputs, (size_t)1U * sizeof(Eurydice_slice)); + size_t input_remainder_len = + libcrux_sha3_generic_keccak_absorb_full_9d_f80(uu____0, copy_of_inputs); + size_t input_len = Eurydice_slice_len(inputs[0U], uint8_t); + uint8_t blocks[1U][200U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)1U; i++) { + size_t i0 = i; + if (self->buf_len > (size_t)0U) { + Eurydice_slice uu____2 = Eurydice_array_to_subslice2( + blocks[i0], (size_t)0U, self->buf_len, uint8_t); + Eurydice_slice_copy(uu____2, + Eurydice_array_to_subslice2(self->buf[i0], (size_t)0U, + self->buf_len, uint8_t), + uint8_t); + } + if (input_remainder_len > (size_t)0U) { + Eurydice_slice uu____3 = Eurydice_array_to_subslice2( + blocks[i0], self->buf_len, self->buf_len + input_remainder_len, + uint8_t); + Eurydice_slice_copy( + uu____3, + Eurydice_slice_subslice_from( + inputs[i0], input_len - input_remainder_len, uint8_t, size_t), + uint8_t); + } + blocks[i0][self->buf_len + input_remainder_len] = 31U; + size_t uu____4 = i0; + size_t uu____5 = (size_t)168U - (size_t)1U; + blocks[uu____4][uu____5] = (uint32_t)blocks[uu____4][uu____5] | 128U; + } + uint64_t(*uu____6)[5U] = self->inner.st; + uint8_t uu____7[1U][200U]; + memcpy(uu____7, blocks, (size_t)1U * sizeof(uint8_t[200U])); + libcrux_sha3_portable_keccak_load_block_full_5a_d21(uu____6, uu____7); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); +} + +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for +libcrux_sha3::portable::incremental::Shake128Absorb)} +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_78 +libcrux_sha3_portable_incremental_absorb_final_1c( + libcrux_sha3_generic_keccak_KeccakXofState_78 self, Eurydice_slice input) { + Eurydice_slice buf[1U] = {input}; + libcrux_sha3_generic_keccak_absorb_final_9d_250(&self, buf); + return self; +} + +/** + An all zero block +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.zero_block_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline void libcrux_sha3_generic_keccak_zero_block_9d_e60( + uint8_t ret[168U]) { + ret[0U] = 0U; + ret[1U] = 0U; + ret[2U] = 0U; + ret[3U] = 0U; + ret[4U] = 0U; + ret[5U] = 0U; + ret[6U] = 0U; + ret[7U] = 0U; + ret[8U] = 0U; + ret[9U] = 0U; + ret[10U] = 0U; + ret[11U] = 0U; + ret[12U] = 0U; + ret[13U] = 0U; + ret[14U] = 0U; + ret[15U] = 0U; + ret[16U] = 0U; + ret[17U] = 0U; + ret[18U] = 0U; + ret[19U] = 0U; + ret[20U] = 0U; + ret[21U] = 0U; + ret[22U] = 0U; + ret[23U] = 0U; + ret[24U] = 0U; + ret[25U] = 0U; + ret[26U] = 0U; + ret[27U] = 0U; + ret[28U] = 0U; + ret[29U] = 0U; + ret[30U] = 0U; + ret[31U] = 0U; + ret[32U] = 0U; + ret[33U] = 0U; + ret[34U] = 0U; + ret[35U] = 0U; + ret[36U] = 0U; + ret[37U] = 0U; + ret[38U] = 0U; + ret[39U] = 0U; + ret[40U] = 0U; + ret[41U] = 0U; + ret[42U] = 0U; + ret[43U] = 0U; + ret[44U] = 0U; + ret[45U] = 0U; + ret[46U] = 0U; + ret[47U] = 0U; + ret[48U] = 0U; + ret[49U] = 0U; + ret[50U] = 0U; + ret[51U] = 0U; + ret[52U] = 0U; + ret[53U] = 0U; + ret[54U] = 0U; + ret[55U] = 0U; + ret[56U] = 0U; + ret[57U] = 0U; + ret[58U] = 0U; + ret[59U] = 0U; + ret[60U] = 0U; + ret[61U] = 0U; + ret[62U] = 0U; + ret[63U] = 0U; + ret[64U] = 0U; + ret[65U] = 0U; + ret[66U] = 0U; + ret[67U] = 0U; + ret[68U] = 0U; + ret[69U] = 0U; + ret[70U] = 0U; + ret[71U] = 0U; + ret[72U] = 0U; + ret[73U] = 0U; + ret[74U] = 0U; + ret[75U] = 0U; + ret[76U] = 0U; + ret[77U] = 0U; + ret[78U] = 0U; + ret[79U] = 0U; + ret[80U] = 0U; + ret[81U] = 0U; + ret[82U] = 0U; + ret[83U] = 0U; + ret[84U] = 0U; + ret[85U] = 0U; + ret[86U] = 0U; + ret[87U] = 0U; + ret[88U] = 0U; + ret[89U] = 0U; + ret[90U] = 0U; + ret[91U] = 0U; + ret[92U] = 0U; + ret[93U] = 0U; + ret[94U] = 0U; + ret[95U] = 0U; + ret[96U] = 0U; + ret[97U] = 0U; + ret[98U] = 0U; + ret[99U] = 0U; + ret[100U] = 0U; + ret[101U] = 0U; + ret[102U] = 0U; + ret[103U] = 0U; + ret[104U] = 0U; + ret[105U] = 0U; + ret[106U] = 0U; + ret[107U] = 0U; + ret[108U] = 0U; + ret[109U] = 0U; + ret[110U] = 0U; + ret[111U] = 0U; + ret[112U] = 0U; + ret[113U] = 0U; + ret[114U] = 0U; + ret[115U] = 0U; + ret[116U] = 0U; + ret[117U] = 0U; + ret[118U] = 0U; + ret[119U] = 0U; + ret[120U] = 0U; + ret[121U] = 0U; + ret[122U] = 0U; + ret[123U] = 0U; + ret[124U] = 0U; + ret[125U] = 0U; + ret[126U] = 0U; + ret[127U] = 0U; + ret[128U] = 0U; + ret[129U] = 0U; + ret[130U] = 0U; + ret[131U] = 0U; + ret[132U] = 0U; + ret[133U] = 0U; + ret[134U] = 0U; + ret[135U] = 0U; + ret[136U] = 0U; + ret[137U] = 0U; + ret[138U] = 0U; + ret[139U] = 0U; + ret[140U] = 0U; + ret[141U] = 0U; + ret[142U] = 0U; + ret[143U] = 0U; + ret[144U] = 0U; + ret[145U] = 0U; + ret[146U] = 0U; + ret[147U] = 0U; + ret[148U] = 0U; + ret[149U] = 0U; + ret[150U] = 0U; + ret[151U] = 0U; + ret[152U] = 0U; + ret[153U] = 0U; + ret[154U] = 0U; + ret[155U] = 0U; + ret[156U] = 0U; + ret[157U] = 0U; + ret[158U] = 0U; + ret[159U] = 0U; + ret[160U] = 0U; + ret[161U] = 0U; + ret[162U] = 0U; + ret[163U] = 0U; + ret[164U] = 0U; + ret[165U] = 0U; + ret[166U] = 0U; + ret[167U] = 0U; +} + +/** + Generate a new keccak xof state. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.new_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_78 +libcrux_sha3_generic_keccak_new_9d_7e0(void) { + libcrux_sha3_generic_keccak_KeccakXofState_78 lit; + lit.inner = libcrux_sha3_generic_keccak_new_1e_f4(); + uint8_t ret[168U]; + libcrux_sha3_generic_keccak_zero_block_9d_e60(ret); + memcpy(lit.buf[0U], ret, (size_t)168U * sizeof(uint8_t)); + lit.buf_len = (size_t)0U; + lit.sponge = false; + return lit; +} + +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofAbsorb<168: usize> for +libcrux_sha3::portable::incremental::Shake128Absorb)} +*/ +static inline libcrux_sha3_generic_keccak_KeccakXofState_78 +libcrux_sha3_portable_incremental_new_1c(void) { + return libcrux_sha3_generic_keccak_new_9d_7e0(); +} + +/** + `out` has the exact size we want here. It must be less than or equal to `RATE`. +*/ +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_5a +with const generics +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c( + uint64_t (*state)[5U], Eurydice_slice out[1U]) { + size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U; + size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U; + for (size_t i = (size_t)0U; i < num_full_blocks; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } + if (last_block_len != (size_t)0U) { + Eurydice_slice uu____1 = Eurydice_slice_subslice2( + out[0U], num_full_blocks * (size_t)8U, + num_full_blocks * (size_t)8U + last_block_len, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes( + state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret); + Eurydice_slice_copy( + uu____1, + Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t), + uint8_t); + } +} + +/** + Squeeze `N` x `LEN` bytes. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 136 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_96( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, + Eurydice_slice out[1U]) { + if (self->sponge) { + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + } + size_t out_len = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = out_len / (size_t)136U; + size_t last = out_len - out_len % (size_t)136U; + size_t mid; + if ((size_t)136U >= out_len) { + mid = out_len; + } else { + mid = (size_t)136U; + } + Eurydice_slice_uint8_t_1size_t__x2 uu____0 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid); + Eurydice_slice out00[1U]; + memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice out_rest[1U]; + memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out00); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____1 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest, + (size_t)136U); + Eurydice_slice out0[1U]; + memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice tmp[1U]; + memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out0); + memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < out_len) { + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + libcrux_sha3_portable_keccak_store_5a_1c(self->inner.st, out_rest); + } + self->sponge = true; +} + +/** + Shake256 squeeze +*/ +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofSqueeze<136: usize> for +libcrux_sha3::portable::incremental::Shake256Squeeze)#3} +*/ +static inline void libcrux_sha3_portable_incremental_squeeze_8a( + libcrux_sha3_generic_keccak_KeccakXofState_4f *self, Eurydice_slice out) { + Eurydice_slice buf[1U] = {out}; + libcrux_sha3_generic_keccak_squeeze_9d_96(self, buf); +} + +/** + `out` has the exact size we want here. It must be less than or equal to `RATE`. +*/ +/** +This function found in impl {(libcrux_sha3::traits::internal::KeccakItem<1: +usize> for u64)} +*/ +/** +A monomorphic instance of libcrux_sha3.portable_keccak.store_5a +with const generics +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_portable_keccak_store_5a_1c0( + uint64_t (*state)[5U], Eurydice_slice out[1U]) { + size_t num_full_blocks = Eurydice_slice_len(out[0U], uint8_t) / (size_t)8U; + size_t last_block_len = Eurydice_slice_len(out[0U], uint8_t) % (size_t)8U; + for (size_t i = (size_t)0U; i < num_full_blocks; i++) { + size_t i0 = i; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out[0U], i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes(state[i0 / (size_t)5U][i0 % (size_t)5U], ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)8U, ret, uint8_t), uint8_t); + } + if (last_block_len != (size_t)0U) { + Eurydice_slice uu____1 = Eurydice_slice_subslice2( + out[0U], num_full_blocks * (size_t)8U, + num_full_blocks * (size_t)8U + last_block_len, uint8_t); + uint8_t ret[8U]; + core_num__u64_9__to_le_bytes( + state[num_full_blocks / (size_t)5U][num_full_blocks % (size_t)5U], ret); + Eurydice_slice_copy( + uu____1, + Eurydice_array_to_subslice2(ret, (size_t)0U, last_block_len, uint8_t), + uint8_t); + } +} + +/** + Squeeze `N` x `LEN` bytes. +*/ +/** +This function found in impl {libcrux_sha3::generic_keccak::KeccakXofState<STATE, +PARALLEL_LANES, RATE>[TraitClause@0]#2} +*/ +/** +A monomorphic instance of libcrux_sha3.generic_keccak.squeeze_9d +with types uint64_t +with const generics +- PARALLEL_LANES= 1 +- RATE= 168 +*/ +static KRML_MUSTINLINE void libcrux_sha3_generic_keccak_squeeze_9d_960( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, + Eurydice_slice out[1U]) { + if (self->sponge) { + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + } + size_t out_len = Eurydice_slice_len(out[0U], uint8_t); + size_t blocks = out_len / (size_t)168U; + size_t last = out_len - out_len % (size_t)168U; + size_t mid; + if ((size_t)168U >= out_len) { + mid = out_len; + } else { + mid = (size_t)168U; + } + Eurydice_slice_uint8_t_1size_t__x2 uu____0 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out, mid); + Eurydice_slice out00[1U]; + memcpy(out00, uu____0.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice out_rest[1U]; + memcpy(out_rest, uu____0.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out00); + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){.start = (size_t)1U, + .end = blocks}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + if (core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3) + .tag == None) { + break; + } else { + Eurydice_slice_uint8_t_1size_t__x2 uu____1 = + libcrux_sha3_portable_keccak_split_at_mut_n_5a(out_rest, + (size_t)168U); + Eurydice_slice out0[1U]; + memcpy(out0, uu____1.fst, (size_t)1U * sizeof(Eurydice_slice)); + Eurydice_slice tmp[1U]; + memcpy(tmp, uu____1.snd, (size_t)1U * sizeof(Eurydice_slice)); + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out0); + memcpy(out_rest, tmp, (size_t)1U * sizeof(Eurydice_slice)); + } + } + if (last < out_len) { + libcrux_sha3_generic_keccak_keccakf1600_21(&self->inner); + libcrux_sha3_portable_keccak_store_5a_1c0(self->inner.st, out_rest); + } + self->sponge = true; +} + +/** + Shake128 squeeze +*/ +/** +This function found in impl +{(libcrux_sha3::portable::incremental::XofSqueeze<168: usize> for +libcrux_sha3::portable::incremental::Shake128Squeeze)#1} +*/ +static inline void libcrux_sha3_portable_incremental_squeeze_10( + libcrux_sha3_generic_keccak_KeccakXofState_78 *self, Eurydice_slice out) { + Eurydice_slice buf[1U] = {out}; + libcrux_sha3_generic_keccak_squeeze_9d_960(self, buf); +} + +/** +This function found in impl {(core::clone::Clone for +libcrux_sha3::portable::KeccakState)} +*/ +static inline libcrux_sha3_generic_keccak_KeccakState_48 +libcrux_sha3_portable_clone_3d( + libcrux_sha3_generic_keccak_KeccakState_48 *self) { + return self[0U]; +} + +/** +This function found in impl {(core::convert::From<libcrux_sha3::Algorithm> for +u32)#1} +*/ +static inline uint32_t libcrux_sha3_from_eb(libcrux_sha3_Algorithm v) { + uint32_t uu____0; + switch (v) { + case libcrux_sha3_Sha224: { + uu____0 = 1U; + break; + } + case libcrux_sha3_Sha256: { + uu____0 = 2U; + break; + } + case libcrux_sha3_Sha384: { + uu____0 = 3U; + break; + } + case libcrux_sha3_Sha512: { + uu____0 = 4U; + break; + } + default: { + KRML_HOST_EPRINTF("KaRaMeL incomplete match at %s:%d\n", __FILE__, + __LINE__); + KRML_HOST_EXIT(253U); + } + } + return uu____0; +} + +/** +This function found in impl {(core::convert::From<u32> for +libcrux_sha3::Algorithm)} +*/ +static inline libcrux_sha3_Algorithm libcrux_sha3_from_2d(uint32_t v) { + libcrux_sha3_Algorithm uu____0; + switch (v) { + case 1U: { + uu____0 = libcrux_sha3_Sha224; + break; + } + case 2U: { + uu____0 = libcrux_sha3_Sha256; + break; + } + case 3U: { + uu____0 = libcrux_sha3_Sha384; + break; + } + case 4U: { + uu____0 = libcrux_sha3_Sha512; + break; + } + default: { + KRML_HOST_EPRINTF("KaRaMeL abort at %s:%d\n%s\n", __FILE__, __LINE__, + "panic!"); + KRML_HOST_EXIT(255U); + } + } + return uu____0; +} + +typedef uint8_t libcrux_sha3_Sha3_512Digest[64U]; + +typedef uint8_t libcrux_sha3_Sha3_384Digest[48U]; + +typedef uint8_t libcrux_sha3_Sha3_256Digest[32U]; + +typedef uint8_t libcrux_sha3_Sha3_224Digest[28U]; + +#if defined(__cplusplus) +} +#endif + +#define __libcrux_sha3_portable_H_DEFINED +#endif + +/* from libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h */ +/* + * SPDX-FileCopyrightText: 2024 Cryspen Sarl <info@cryspen.com> + * + * SPDX-License-Identifier: MIT or Apache-2.0 + * + * This code was generated with the following revisions: + * Charon: 6b5e110342a771a3e1c739b10294b1778e4be8b4 + * Eurydice: 31be7d65ca5d6acdacfb33652e478d24dd85c1cb + * Karamel: 3205d3365ea2790b02368f79fcee38e38d0b5908 + * F*: a32b316e521fa4f239b610ec8f1d15e78d62cbe8-dirty + * Libcrux: 4ad532b206174114dd4140b718e7794a28fc59ee + */ + +#ifndef __libcrux_mlkem768_portable_H +#define __libcrux_mlkem768_portable_H + +#if defined(__cplusplus) +extern "C" { +#endif + + +#define LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE ((size_t)168U) + +#define LIBCRUX_ML_KEM_HASH_FUNCTIONS_THREE_BLOCKS \ + (LIBCRUX_ML_KEM_HASH_FUNCTIONS_BLOCK_SIZE * (size_t)3U) + +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G( + Eurydice_slice input, uint8_t ret[64U]) { + uint8_t digest[64U] = {0U}; + libcrux_sha3_portable_sha512( + Eurydice_array_to_slice((size_t)64U, digest, uint8_t), input); + memcpy(ret, digest, (size_t)64U * sizeof(uint8_t)); +} + +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H( + Eurydice_slice input, uint8_t ret[32U]) { + uint8_t digest[32U] = {0U}; + libcrux_sha3_portable_sha256( + Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); + memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); +} + +#define LIBCRUX_ML_KEM_IND_CCA_ENCAPS_SEED_SIZE \ + (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) + +#define LIBCRUX_ML_KEM_IND_CCA_KEY_GENERATION_SEED_SIZE \ + (LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE + \ + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) + +typedef uint8_t libcrux_ml_kem_ind_cca_MlKemSharedSecret[32U]; + +static const int16_t libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[128U] = + {(int16_t)-1044, (int16_t)-758, (int16_t)-359, (int16_t)-1517, + (int16_t)1493, (int16_t)1422, (int16_t)287, (int16_t)202, + (int16_t)-171, (int16_t)622, (int16_t)1577, (int16_t)182, + (int16_t)962, (int16_t)-1202, (int16_t)-1474, (int16_t)1468, + (int16_t)573, (int16_t)-1325, (int16_t)264, (int16_t)383, + (int16_t)-829, (int16_t)1458, (int16_t)-1602, (int16_t)-130, + (int16_t)-681, (int16_t)1017, (int16_t)732, (int16_t)608, + (int16_t)-1542, (int16_t)411, (int16_t)-205, (int16_t)-1571, + (int16_t)1223, (int16_t)652, (int16_t)-552, (int16_t)1015, + (int16_t)-1293, (int16_t)1491, (int16_t)-282, (int16_t)-1544, + (int16_t)516, (int16_t)-8, (int16_t)-320, (int16_t)-666, + (int16_t)-1618, (int16_t)-1162, (int16_t)126, (int16_t)1469, + (int16_t)-853, (int16_t)-90, (int16_t)-271, (int16_t)830, + (int16_t)107, (int16_t)-1421, (int16_t)-247, (int16_t)-951, + (int16_t)-398, (int16_t)961, (int16_t)-1508, (int16_t)-725, + (int16_t)448, (int16_t)-1065, (int16_t)677, (int16_t)-1275, + (int16_t)-1103, (int16_t)430, (int16_t)555, (int16_t)843, + (int16_t)-1251, (int16_t)871, (int16_t)1550, (int16_t)105, + (int16_t)422, (int16_t)587, (int16_t)177, (int16_t)-235, + (int16_t)-291, (int16_t)-460, (int16_t)1574, (int16_t)1653, + (int16_t)-246, (int16_t)778, (int16_t)1159, (int16_t)-147, + (int16_t)-777, (int16_t)1483, (int16_t)-602, (int16_t)1119, + (int16_t)-1590, (int16_t)644, (int16_t)-872, (int16_t)349, + (int16_t)418, (int16_t)329, (int16_t)-156, (int16_t)-75, + (int16_t)817, (int16_t)1097, (int16_t)603, (int16_t)610, + (int16_t)1322, (int16_t)-1285, (int16_t)-1465, (int16_t)384, + (int16_t)-1215, (int16_t)-136, (int16_t)1218, (int16_t)-1335, + (int16_t)-874, (int16_t)220, (int16_t)-1187, (int16_t)-1659, + (int16_t)-1185, (int16_t)-1530, (int16_t)-1278, (int16_t)794, + (int16_t)-1510, (int16_t)-854, (int16_t)-870, (int16_t)478, + (int16_t)-108, (int16_t)-308, (int16_t)996, (int16_t)991, + (int16_t)958, (int16_t)-1460, (int16_t)1522, (int16_t)1628}; + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR ((size_t)16U) + +#define LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT \ + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / \ + LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS ((int16_t)3329) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS \ + ((int16_t)1353) + +#define LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R \ + (62209U) + +typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_s { + int16_t elements[16U]; +} libcrux_ml_kem_vector_portable_vector_type_PortableVector; + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_vector_type_from_i16_array( + Eurydice_slice array) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; + int16_t ret[16U]; + Result_c0 dst; + Eurydice_slice_to_array2( + &dst, Eurydice_slice_subslice2(array, (size_t)0U, (size_t)16U, int16_t), + Eurydice_slice, int16_t[16U]); + unwrap_41_f9(dst, ret); + memcpy(lit.elements, ret, (size_t)16U * sizeof(int16_t)); + return lit; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_from_i16_array_0d(Eurydice_slice array) { + return libcrux_ml_kem_vector_portable_vector_type_from_i16_array(array); +} + +typedef struct uint8_t_x11_s { + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; + uint8_t f4; + uint8_t f5; + uint8_t f6; + uint8_t f7; + uint8_t f8; + uint8_t f9; + uint8_t f10; +} uint8_t_x11; + +static KRML_MUSTINLINE uint8_t_x11 +libcrux_ml_kem_vector_portable_serialize_serialize_11_int(Eurydice_slice v) { + uint8_t r0 = (uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *); + uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, + int16_t *) & + (int16_t)31) + << 3U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, + int16_t *) >> + 8U); + uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, + int16_t *) & + (int16_t)3) + << 6U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, + int16_t *) >> + 5U); + uint8_t r3 = + (uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) >> 2U & + (int16_t)255); + uint8_t r4 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, + int16_t *) & + (int16_t)127) + << 1U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, + int16_t *) >> + 10U); + uint8_t r5 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t, + int16_t *) & + (int16_t)15) + << 4U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, + int16_t *) >> + 7U); + uint8_t r6 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, + int16_t *) & + (int16_t)1) + << 7U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)4U, int16_t, + int16_t *) >> + 4U); + uint8_t r7 = + (uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) >> 1U & + (int16_t)255); + uint8_t r8 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, + int16_t *) & + (int16_t)63) + << 2U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)5U, int16_t, + int16_t *) >> + 9U); + uint8_t r9 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t, + int16_t *) & + (int16_t)7) + << 5U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, + int16_t *) >> + 6U); + uint8_t r10 = + (uint8_t)(Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) >> 3U); + return (CLITERAL(uint8_t_x11){.fst = r0, + .snd = r1, + .thd = r2, + .f3 = r3, + .f4 = r4, + .f5 = r5, + .f6 = r6, + .f7 = r7, + .f8 = r8, + .f9 = r9, + .f10 = r10}); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_11( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[22U]) { + uint8_t_x11 r0_10 = libcrux_ml_kem_vector_portable_serialize_serialize_11_int( + Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t)); + uint8_t_x11 r11_21 = + libcrux_ml_kem_vector_portable_serialize_serialize_11_int( + Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U, + int16_t)); + uint8_t result[22U] = {0U}; + result[0U] = r0_10.fst; + result[1U] = r0_10.snd; + result[2U] = r0_10.thd; + result[3U] = r0_10.f3; + result[4U] = r0_10.f4; + result[5U] = r0_10.f5; + result[6U] = r0_10.f6; + result[7U] = r0_10.f7; + result[8U] = r0_10.f8; + result[9U] = r0_10.f9; + result[10U] = r0_10.f10; + result[11U] = r11_21.fst; + result[12U] = r11_21.snd; + result[13U] = r11_21.thd; + result[14U] = r11_21.f3; + result[15U] = r11_21.f4; + result[16U] = r11_21.f5; + result[17U] = r11_21.f6; + result[18U] = r11_21.f7; + result[19U] = r11_21.f8; + result[20U] = r11_21.f9; + result[21U] = r11_21.f10; + memcpy(ret, result, (size_t)22U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_11_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[22U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_11(a, ret); +} + +typedef struct int16_t_x8_s { + int16_t fst; + int16_t snd; + int16_t thd; + int16_t f3; + int16_t f4; + int16_t f5; + int16_t f6; + int16_t f7; +} int16_t_x8; + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_11_int( + Eurydice_slice bytes) { + int16_t r0 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) & + (int16_t)7) + << 8U | + (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *); + int16_t r1 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) & + (int16_t)63) + << 5U | + (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >> + 3U; + int16_t r2 = + (((int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) & + (int16_t)1) + << 10U | + (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) + << 2U) | + (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >> + 6U; + int16_t r3 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) & + (int16_t)15) + << 7U | + (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) >> + 1U; + int16_t r4 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) & + (int16_t)127) + << 4U | + (int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) >> + 4U; + int16_t r5 = + (((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) & + (int16_t)3) + << 9U | + (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) + << 1U) | + (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >> + 7U; + int16_t r6 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) & + (int16_t)31) + << 6U | + (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >> + 2U; + int16_t r7 = + (int16_t)Eurydice_slice_index(bytes, (size_t)10U, uint8_t, uint8_t *) + << 3U | + (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) >> + 5U; + return (CLITERAL(int16_t_x8){.fst = r0, + .snd = r1, + .thd = r2, + .f3 = r3, + .f4 = r4, + .f5 = r5, + .f6 = r6, + .f7 = r7}); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_vector_type_zero(void) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector lit; + lit.elements[0U] = (int16_t)0; + lit.elements[1U] = (int16_t)0; + lit.elements[2U] = (int16_t)0; + lit.elements[3U] = (int16_t)0; + lit.elements[4U] = (int16_t)0; + lit.elements[5U] = (int16_t)0; + lit.elements[6U] = (int16_t)0; + lit.elements[7U] = (int16_t)0; + lit.elements[8U] = (int16_t)0; + lit.elements[9U] = (int16_t)0; + lit.elements[10U] = (int16_t)0; + lit.elements[11U] = (int16_t)0; + lit.elements[12U] = (int16_t)0; + lit.elements[13U] = (int16_t)0; + lit.elements[14U] = (int16_t)0; + lit.elements[15U] = (int16_t)0; + return lit; +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_11(Eurydice_slice bytes) { + int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_11_int( + Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)11U, uint8_t)); + int16_t_x8 v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_11_int( + Eurydice_slice_subslice2(bytes, (size_t)11U, (size_t)22U, uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector v = + libcrux_ml_kem_vector_portable_vector_type_zero(); + v.elements[0U] = v0_7.fst; + v.elements[1U] = v0_7.snd; + v.elements[2U] = v0_7.thd; + v.elements[3U] = v0_7.f3; + v.elements[4U] = v0_7.f4; + v.elements[5U] = v0_7.f5; + v.elements[6U] = v0_7.f6; + v.elements[7U] = v0_7.f7; + v.elements[8U] = v8_15.fst; + v.elements[9U] = v8_15.snd; + v.elements[10U] = v8_15.thd; + v.elements[11U] = v8_15.f3; + v.elements[12U] = v8_15.f4; + v.elements[13U] = v8_15.f5; + v.elements[14U] = v8_15.f6; + v.elements[15U] = v8_15.f7; + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_11_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_11(a); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_vector_type_to_i16_array( + libcrux_ml_kem_vector_portable_vector_type_PortableVector x, + int16_t ret[16U]) { + memcpy(ret, x.elements, (size_t)16U * sizeof(int16_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_to_i16_array_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector x, + int16_t ret[16U]) { + libcrux_ml_kem_vector_portable_vector_type_to_i16_array(x, ret); +} + +static const uint8_t + libcrux_ml_kem_vector_rej_sample_table_REJECTION_SAMPLE_SHUFFLE_TABLE + [256U][16U] = {{255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 255U, + 255U, 255U, 255U}, + {12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 255U, + 255U, 255U, 255U}, + {10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, + 13U, 255U, 255U}, + {14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 14U, 15U, 255U, + 255U, 255U, 255U}, + {10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 14U, + 15U, 255U, 255U}, + {12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, 255U, 255U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 10U, 11U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, 255U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, 255U, + 255U, 255U, 255U, 255U, 255U}, + {0U, 1U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 2U, 3U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, 15U, + 255U, 255U, 255U, 255U}, + {0U, 1U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, 13U, 14U, + 15U, 255U, 255U}, + {0U, 1U, 2U, 3U, 4U, 5U, 6U, 7U, 8U, 9U, 10U, 11U, 12U, + 13U, 14U, 15U}}; + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ZERO_0d(void) { + return libcrux_ml_kem_vector_portable_vector_type_zero(); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_add( + libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + size_t uu____0 = i0; + lhs.elements[uu____0] = lhs.elements[uu____0] + rhs->elements[i0]; + } + return lhs; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_add_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { + return libcrux_ml_kem_vector_portable_arithmetic_add(lhs, rhs); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_sub( + libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + size_t uu____0 = i0; + lhs.elements[uu____0] = lhs.elements[uu____0] - rhs->elements[i0]; + } + return lhs; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_sub_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs) { + return libcrux_ml_kem_vector_portable_arithmetic_sub(lhs, rhs); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + size_t uu____0 = i0; + v.elements[uu____0] = v.elements[uu____0] * c; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_multiply_by_constant_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) { + return libcrux_ml_kem_vector_portable_arithmetic_multiply_by_constant(v, c); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + size_t uu____0 = i0; + v.elements[uu____0] = v.elements[uu____0] & c; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) { + return libcrux_ml_kem_vector_portable_arithmetic_bitwise_and_with_constant(v, + c); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + core_ops_range_Range_b3 iter = + core_iter_traits_collect___core__iter__traits__collect__IntoIterator_for_I__1__into_iter( + (CLITERAL(core_ops_range_Range_b3){ + .start = (size_t)0U, + .end = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR}), + core_ops_range_Range_b3, core_ops_range_Range_b3); + while (true) { + Option_b3 uu____0 = + core_iter_range___core__iter__traits__iterator__Iterator_for_core__ops__range__Range_A___6__next( + &iter, size_t, Option_b3); + if (!(uu____0.tag == None)) { + size_t i = uu____0.f0; + if (v.elements[i] >= (int16_t)3329) { + size_t uu____1 = i; + v.elements[uu____1] = v.elements[uu____1] - (int16_t)3329; + } + continue; + } + return v; + } +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_cond_subtract_3329_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_arithmetic_cond_subtract_3329(v); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER \ + ((int32_t)20159) + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT ((int32_t)26) + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R \ + ((int32_t)1 << (uint32_t) \ + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT) + +/** + Signed Barrett Reduction + + Given an input `value`, `barrett_reduce` outputs a representative `result` + such that: + + - result ≡ value (mod FIELD_MODULUS) + - the absolute value of `result` is bound as follows: + + `|result| ≤ FIELD_MODULUS / 2 · (|value|/BARRETT_R + 1) + + In particular, if `|value| < BARRETT_R`, then `|result| < FIELD_MODULUS`. +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( + int16_t value) { + int32_t t = (int32_t)value * + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_MULTIPLIER + + (LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_R >> 1U); + int16_t quotient = + (int16_t)(t >> + (uint32_t) + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_BARRETT_SHIFT); + return value - quotient * LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + v.elements[i0] = + libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( + v.elements[i0]); + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_barrett_reduce_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce(v); +} + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT (16U) + +#define LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_R \ + ((int32_t)1 << (uint32_t) \ + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT) + +/** + Signed Montgomery Reduction + + Given an input `value`, `montgomery_reduce` outputs a representative `o` + such that: + + - o ≡ value · MONTGOMERY_R^(-1) (mod FIELD_MODULUS) + - the absolute value of `o` is bound as follows: + + `|result| ≤ (|value| / MONTGOMERY_R) + (FIELD_MODULUS / 2) + + In particular, if `|value| ≤ FIELD_MODULUS * MONTGOMERY_R`, then `|o| < (3 · + FIELD_MODULUS) / 2`. +*/ +static inline int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( + int32_t value) { + int32_t k = + (int32_t)(int16_t)value * + (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_INVERSE_OF_MODULUS_MOD_MONTGOMERY_R; + int32_t k_times_modulus = + (int32_t)(int16_t)k * (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + int16_t c = + (int16_t)(k_times_modulus >> + (uint32_t) + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + int16_t value_high = + (int16_t)(value >> + (uint32_t) + LIBCRUX_ML_KEM_VECTOR_PORTABLE_ARITHMETIC_MONTGOMERY_SHIFT); + return value_high - c; +} + +/** + If `fe` is some field element 'x' of the Kyber field and `fer` is congruent to + `y · MONTGOMERY_R`, this procedure outputs a value that is congruent to + `x · y`, as follows: + + `fe · fer ≡ x · y · MONTGOMERY_R (mod FIELD_MODULUS)` + + `montgomery_reduce` takes the value `x · y · MONTGOMERY_R` and outputs a + representative `x · y · MONTGOMERY_R * MONTGOMERY_R^{-1} ≡ x · y (mod + FIELD_MODULUS)`. +*/ +static KRML_MUSTINLINE int16_t +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + int16_t fe, int16_t fer) { + return libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( + (int32_t)fe * (int32_t)fer); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t c) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + v.elements[i0] = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + v.elements[i0], c); + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t r) { + return libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_by_constant( + v, r); +} + +/** + The `compress_*` functions implement the `Compress` function specified in the + NIST FIPS 203 standard (Page 18, Expression 4.5), which is defined as: + + ```plaintext + Compress_d: ℤq -> ℤ_{2ᵈ} + Compress_d(x) = ⌈(2ᵈ/q)·x⌋ + ``` + + Since `⌈x⌋ = ⌊x + 1/2⌋` we have: + + ```plaintext + Compress_d(x) = ⌊(2ᵈ/q)·x + 1/2⌋ + = ⌊(2^{d+1}·x + q) / 2q⌋ + ``` + + For further information about the function implementations, consult the + `implementation_notes.pdf` document in this directory. + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +static inline uint8_t +libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( + uint16_t fe) { + int16_t shifted = (int16_t)1664 - (int16_t)fe; + int16_t mask = shifted >> 15U; + int16_t shifted_to_positive = mask ^ shifted; + int16_t shifted_positive_in_range = shifted_to_positive - (int16_t)832; + return (uint8_t)(shifted_positive_in_range >> 15U & (int16_t)1); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_compress_1( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + v.elements[i0] = (int16_t) + libcrux_ml_kem_vector_portable_compress_compress_message_coefficient( + (uint16_t)v.elements[i0]); + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_1_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_compress_1(v); +} + +static KRML_MUSTINLINE uint32_t +libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( + uint8_t n, uint32_t value) { + return value & ((1U << (uint32_t)n) - 1U); +} + +static inline int16_t +libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + uint8_t coefficient_bits, uint16_t fe) { + uint64_t compressed = (uint64_t)fe << (uint32_t)coefficient_bits; + compressed = compressed + 1664ULL; + compressed = compressed * 10321340ULL; + compressed = compressed >> 35U; + return (int16_t) + libcrux_ml_kem_vector_portable_arithmetic_get_n_least_significant_bits( + coefficient_bits, (uint32_t)compressed); +} + +static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_ntt_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta, + size_t i, size_t j) { + int16_t t = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + v->elements[j], zeta); + v->elements[j] = v->elements[i] - t; + v->elements[i] = v->elements[i] + t; +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0, + int16_t zeta1, int16_t zeta2, int16_t zeta3) { + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U, + (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U, + (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)4U, + (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)5U, + (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)8U, + (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta2, (size_t)9U, + (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)12U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta3, (size_t)13U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, + int16_t zeta1, int16_t zeta2, int16_t zeta3) { + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_1_step(a, zeta0, zeta1, + zeta2, zeta3); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0, + int16_t zeta1) { + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)0U, + (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)1U, + (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)2U, + (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta0, (size_t)3U, + (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)8U, + (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)9U, + (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)10U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta1, (size_t)11U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, + int16_t zeta1) { + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_2_step(a, zeta0, zeta1); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) { + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)0U, (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)1U, (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)2U, + (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)3U, + (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)4U, + (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)5U, + (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)6U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_ntt_step(&v, zeta, (size_t)7U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { + return libcrux_ml_kem_vector_portable_ntt_ntt_layer_3_step(a, zeta); +} + +static KRML_MUSTINLINE void libcrux_ml_kem_vector_portable_ntt_inv_ntt_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *v, int16_t zeta, + size_t i, size_t j) { + int16_t a_minus_b = v->elements[j] - v->elements[i]; + v->elements[i] = + libcrux_ml_kem_vector_portable_arithmetic_barrett_reduce_element( + v->elements[i] + v->elements[j]); + v->elements[j] = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_multiply_fe_by_fer( + a_minus_b, zeta); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0, + int16_t zeta1, int16_t zeta2, int16_t zeta3) { + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U, + (size_t)2U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U, + (size_t)3U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)4U, + (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)5U, + (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)8U, + (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta2, (size_t)9U, + (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)12U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta3, (size_t)13U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, + int16_t zeta1, int16_t zeta2, int16_t zeta3) { + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_1_step( + a, zeta0, zeta1, zeta2, zeta3); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta0, + int16_t zeta1) { + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)0U, + (size_t)4U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)1U, + (size_t)5U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)2U, + (size_t)6U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta0, (size_t)3U, + (size_t)7U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)8U, + (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)9U, + (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)10U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta1, (size_t)11U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta0, + int16_t zeta1) { + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_2_step(a, zeta0, + zeta1); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t zeta) { + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)0U, + (size_t)8U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)1U, + (size_t)9U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)2U, + (size_t)10U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)3U, + (size_t)11U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)4U, + (size_t)12U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)5U, + (size_t)13U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)6U, + (size_t)14U); + libcrux_ml_kem_vector_portable_ntt_inv_ntt_step(&v, zeta, (size_t)7U, + (size_t)15U); + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, int16_t zeta) { + return libcrux_ml_kem_vector_portable_ntt_inv_ntt_layer_3_step(a, zeta); +} + +/** + Compute the product of two Kyber binomials with respect to the + modulus `X² - zeta`. + + This function almost implements <strong>Algorithm 11</strong> of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: a₀, a₁, b₀, b₁ ∈ ℤq. + Input: γ ∈ ℤq. + Output: c₀, c₁ ∈ ℤq. + + c₀ ← a₀·b₀ + a₁·b₁·γ + c₁ ← a₀·b₁ + a₁·b₀ + return c₀, c₁ + ``` + We say "almost" because the coefficients output by this function are in + the Montgomery domain (unlike in the specification). + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *a, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *b, int16_t zeta, + size_t i, size_t j, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *out) { + int16_t o0 = libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( + (int32_t)a->elements[i] * (int32_t)b->elements[i] + + (int32_t) + libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( + (int32_t)a->elements[j] * (int32_t)b->elements[j]) * + (int32_t)zeta); + int16_t o1 = + libcrux_ml_kem_vector_portable_arithmetic_montgomery_reduce_element( + (int32_t)a->elements[i] * (int32_t)b->elements[j] + + (int32_t)a->elements[j] * (int32_t)b->elements[i]); + out->elements[i] = o0; + out->elements[j] = o1; +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_ntt_multiply( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, + int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector out = + libcrux_ml_kem_vector_portable_vector_type_zero(); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, zeta0, (size_t)0U, (size_t)1U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, -zeta0, (size_t)2U, (size_t)3U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, zeta1, (size_t)4U, (size_t)5U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, -zeta1, (size_t)6U, (size_t)7U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, zeta2, (size_t)8U, (size_t)9U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, -zeta2, (size_t)10U, (size_t)11U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, zeta3, (size_t)12U, (size_t)13U, &out); + libcrux_ml_kem_vector_portable_ntt_ntt_multiply_binomials( + lhs, rhs, -zeta3, (size_t)14U, (size_t)15U, &out); + return out; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_ntt_multiply_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *lhs, + libcrux_ml_kem_vector_portable_vector_type_PortableVector *rhs, + int16_t zeta0, int16_t zeta1, int16_t zeta2, int16_t zeta3) { + return libcrux_ml_kem_vector_portable_ntt_ntt_multiply(lhs, rhs, zeta0, zeta1, + zeta2, zeta3); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_1( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[2U]) { + uint8_t result[2U] = {0U}; + for (size_t i = (size_t)0U; i < (size_t)8U; i++) { + size_t i0 = i; + size_t uu____0 = (size_t)0U; + result[uu____0] = (uint32_t)result[uu____0] | + (uint32_t)(uint8_t)v.elements[i0] << (uint32_t)i0; + } + for (size_t i = (size_t)8U; i < (size_t)16U; i++) { + size_t i0 = i; + size_t uu____1 = (size_t)1U; + result[uu____1] = + (uint32_t)result[uu____1] | (uint32_t)(uint8_t)v.elements[i0] + << (uint32_t)(i0 - (size_t)8U); + } + memcpy(ret, result, (size_t)2U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_1_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[2U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_1(a, ret); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_1(Eurydice_slice v) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector result = + libcrux_ml_kem_vector_portable_vector_type_zero(); + for (size_t i = (size_t)0U; i < (size_t)8U; i++) { + size_t i0 = i; + result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index( + v, (size_t)0U, uint8_t, uint8_t *) >> + (uint32_t)i0 & + 1U); + } + for (size_t i = (size_t)8U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + result.elements[i0] = (int16_t)((uint32_t)Eurydice_slice_index( + v, (size_t)1U, uint8_t, uint8_t *) >> + (uint32_t)(i0 - (size_t)8U) & + 1U); + } + return result; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_1_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_1(a); +} + +typedef struct uint8_t_x4_s { + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; +} uint8_t_x4; + +static KRML_MUSTINLINE uint8_t_x4 +libcrux_ml_kem_vector_portable_serialize_serialize_4_int(Eurydice_slice v) { + uint8_t result0 = + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) + << 4U | + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)0U, int16_t, + int16_t *); + uint8_t result1 = + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) + << 4U | + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)2U, int16_t, + int16_t *); + uint8_t result2 = + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) + << 4U | + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)4U, int16_t, + int16_t *); + uint8_t result3 = + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) + << 4U | + (uint32_t)(uint8_t)Eurydice_slice_index(v, (size_t)6U, int16_t, + int16_t *); + return (CLITERAL(uint8_t_x4){ + .fst = result0, .snd = result1, .thd = result2, .f3 = result3}); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_4( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[8U]) { + uint8_t_x4 result0_3 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int( + Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, + int16_t)); + uint8_t_x4 result4_7 = + libcrux_ml_kem_vector_portable_serialize_serialize_4_int( + Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U, + int16_t)); + uint8_t result[8U] = {0U}; + result[0U] = result0_3.fst; + result[1U] = result0_3.snd; + result[2U] = result0_3.thd; + result[3U] = result0_3.f3; + result[4U] = result4_7.fst; + result[5U] = result4_7.snd; + result[6U] = result4_7.thd; + result[7U] = result4_7.f3; + memcpy(ret, result, (size_t)8U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_4_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[8U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_4(a, ret); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( + Eurydice_slice bytes) { + int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U, + uint8_t, uint8_t *) & + 15U); + int16_t v1 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U, + uint8_t, uint8_t *) >> + 4U & + 15U); + int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U, + uint8_t, uint8_t *) & + 15U); + int16_t v3 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U, + uint8_t, uint8_t *) >> + 4U & + 15U); + int16_t v4 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U, + uint8_t, uint8_t *) & + 15U); + int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)2U, + uint8_t, uint8_t *) >> + 4U & + 15U); + int16_t v6 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U, + uint8_t, uint8_t *) & + 15U); + int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U, + uint8_t, uint8_t *) >> + 4U & + 15U); + return (CLITERAL(int16_t_x8){.fst = v0, + .snd = v1, + .thd = v2, + .f3 = v3, + .f4 = v4, + .f5 = v5, + .f6 = v6, + .f7 = v7}); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_4(Eurydice_slice bytes) { + int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( + Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)4U, uint8_t)); + int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_4_int( + Eurydice_slice_subslice2(bytes, (size_t)4U, (size_t)8U, uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector v = + libcrux_ml_kem_vector_portable_vector_type_zero(); + v.elements[0U] = v0_7.fst; + v.elements[1U] = v0_7.snd; + v.elements[2U] = v0_7.thd; + v.elements[3U] = v0_7.f3; + v.elements[4U] = v0_7.f4; + v.elements[5U] = v0_7.f5; + v.elements[6U] = v0_7.f6; + v.elements[7U] = v0_7.f7; + v.elements[8U] = v8_15.fst; + v.elements[9U] = v8_15.snd; + v.elements[10U] = v8_15.thd; + v.elements[11U] = v8_15.f3; + v.elements[12U] = v8_15.f4; + v.elements[13U] = v8_15.f5; + v.elements[14U] = v8_15.f6; + v.elements[15U] = v8_15.f7; + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_4_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_4(a); +} + +typedef struct uint8_t_x5_s { + uint8_t fst; + uint8_t snd; + uint8_t thd; + uint8_t f3; + uint8_t f4; +} uint8_t_x5; + +static KRML_MUSTINLINE uint8_t_x5 +libcrux_ml_kem_vector_portable_serialize_serialize_5_int(Eurydice_slice v) { + uint8_t r0 = + (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) | + Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) << 5U); + uint8_t r1 = + (uint8_t)((Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 3U | + Eurydice_slice_index(v, (size_t)2U, int16_t, int16_t *) + << 2U) | + Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) << 7U); + uint8_t r2 = + (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 1U | + Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) << 4U); + uint8_t r3 = + (uint8_t)((Eurydice_slice_index(v, (size_t)4U, int16_t, int16_t *) >> 4U | + Eurydice_slice_index(v, (size_t)5U, int16_t, int16_t *) + << 1U) | + Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) << 6U); + uint8_t r4 = + (uint8_t)(Eurydice_slice_index(v, (size_t)6U, int16_t, int16_t *) >> 2U | + Eurydice_slice_index(v, (size_t)7U, int16_t, int16_t *) << 3U); + return (CLITERAL(uint8_t_x5){ + .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4}); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_5( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[10U]) { + uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int( + Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)8U, int16_t)); + uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_5_int( + Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)16U, + int16_t)); + uint8_t result[10U] = {0U}; + result[0U] = r0_4.fst; + result[1U] = r0_4.snd; + result[2U] = r0_4.thd; + result[3U] = r0_4.f3; + result[4U] = r0_4.f4; + result[5U] = r5_9.fst; + result[6U] = r5_9.snd; + result[7U] = r5_9.thd; + result[8U] = r5_9.f3; + result[9U] = r5_9.f4; + memcpy(ret, result, (size_t)10U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_5_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[10U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_5(a, ret); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_5_int( + Eurydice_slice bytes) { + int16_t v0 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)0U, + uint8_t, uint8_t *) & + 31U); + int16_t v1 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)1U, + uint8_t, uint8_t *) & + 3U) << 3U | + (uint32_t)Eurydice_slice_index(bytes, (size_t)0U, + uint8_t, uint8_t *) >> + 5U); + int16_t v2 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)1U, + uint8_t, uint8_t *) >> + 2U & + 31U); + int16_t v3 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)2U, + uint8_t, uint8_t *) & + 15U) + << 1U | + (uint32_t)Eurydice_slice_index(bytes, (size_t)1U, + uint8_t, uint8_t *) >> + 7U); + int16_t v4 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)3U, + uint8_t, uint8_t *) & + 1U) << 4U | + (uint32_t)Eurydice_slice_index(bytes, (size_t)2U, + uint8_t, uint8_t *) >> + 4U); + int16_t v5 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)3U, + uint8_t, uint8_t *) >> + 1U & + 31U); + int16_t v6 = (int16_t)(((uint32_t)Eurydice_slice_index(bytes, (size_t)4U, + uint8_t, uint8_t *) & + 7U) << 2U | + (uint32_t)Eurydice_slice_index(bytes, (size_t)3U, + uint8_t, uint8_t *) >> + 6U); + int16_t v7 = (int16_t)((uint32_t)Eurydice_slice_index(bytes, (size_t)4U, + uint8_t, uint8_t *) >> + 3U); + return (CLITERAL(int16_t_x8){.fst = v0, + .snd = v1, + .thd = v2, + .f3 = v3, + .f4 = v4, + .f5 = v5, + .f6 = v6, + .f7 = v7}); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_5(Eurydice_slice bytes) { + int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int( + Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)5U, uint8_t)); + int16_t_x8 v8_15 = libcrux_ml_kem_vector_portable_serialize_deserialize_5_int( + Eurydice_slice_subslice2(bytes, (size_t)5U, (size_t)10U, uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector v = + libcrux_ml_kem_vector_portable_vector_type_zero(); + v.elements[0U] = v0_7.fst; + v.elements[1U] = v0_7.snd; + v.elements[2U] = v0_7.thd; + v.elements[3U] = v0_7.f3; + v.elements[4U] = v0_7.f4; + v.elements[5U] = v0_7.f5; + v.elements[6U] = v0_7.f6; + v.elements[7U] = v0_7.f7; + v.elements[8U] = v8_15.fst; + v.elements[9U] = v8_15.snd; + v.elements[10U] = v8_15.thd; + v.elements[11U] = v8_15.f3; + v.elements[12U] = v8_15.f4; + v.elements[13U] = v8_15.f5; + v.elements[14U] = v8_15.f6; + v.elements[15U] = v8_15.f7; + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_5_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_5(a); +} + +static KRML_MUSTINLINE uint8_t_x5 +libcrux_ml_kem_vector_portable_serialize_serialize_10_int(Eurydice_slice v) { + uint8_t r0 = + (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & + (int16_t)255); + uint8_t r1 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, + int16_t *) & + (int16_t)63) + << 2U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, + int16_t *) >> + 8U & + (int16_t)3); + uint8_t r2 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, + int16_t *) & + (int16_t)15) + << 4U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, + int16_t *) >> + 6U & + (int16_t)15); + uint8_t r3 = (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, + int16_t *) & + (int16_t)3) + << 6U | + (uint32_t)(uint8_t)(Eurydice_slice_index(v, (size_t)2U, int16_t, + int16_t *) >> + 4U & + (int16_t)63); + uint8_t r4 = + (uint8_t)(Eurydice_slice_index(v, (size_t)3U, int16_t, int16_t *) >> 2U & + (int16_t)255); + return (CLITERAL(uint8_t_x5){ + .fst = r0, .snd = r1, .thd = r2, .f3 = r3, .f4 = r4}); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_10( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[20U]) { + uint8_t_x5 r0_4 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( + Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)4U, int16_t)); + uint8_t_x5 r5_9 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( + Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)8U, int16_t)); + uint8_t_x5 r10_14 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( + Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)12U, + int16_t)); + uint8_t_x5 r15_19 = libcrux_ml_kem_vector_portable_serialize_serialize_10_int( + Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)16U, + int16_t)); + uint8_t result[20U] = {0U}; + result[0U] = r0_4.fst; + result[1U] = r0_4.snd; + result[2U] = r0_4.thd; + result[3U] = r0_4.f3; + result[4U] = r0_4.f4; + result[5U] = r5_9.fst; + result[6U] = r5_9.snd; + result[7U] = r5_9.thd; + result[8U] = r5_9.f3; + result[9U] = r5_9.f4; + result[10U] = r10_14.fst; + result[11U] = r10_14.snd; + result[12U] = r10_14.thd; + result[13U] = r10_14.f3; + result[14U] = r10_14.f4; + result[15U] = r15_19.fst; + result[16U] = r15_19.snd; + result[17U] = r15_19.thd; + result[18U] = r15_19.f3; + result[19U] = r15_19.f4; + memcpy(ret, result, (size_t)20U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_10_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[20U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_10(a, ret); +} + +static KRML_MUSTINLINE int16_t_x8 +libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( + Eurydice_slice bytes) { + int16_t r0 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) & + (int16_t)3) + << 8U | + ((int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *) & + (int16_t)255); + int16_t r1 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) & + (int16_t)15) + << 6U | + (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *) >> + 2U; + int16_t r2 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) & + (int16_t)63) + << 4U | + (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *) >> + 4U; + int16_t r3 = + (int16_t)Eurydice_slice_index(bytes, (size_t)4U, uint8_t, uint8_t *) + << 2U | + (int16_t)Eurydice_slice_index(bytes, (size_t)3U, uint8_t, uint8_t *) >> + 6U; + int16_t r4 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) & + (int16_t)3) + << 8U | + ((int16_t)Eurydice_slice_index(bytes, (size_t)5U, uint8_t, uint8_t *) & + (int16_t)255); + int16_t r5 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) & + (int16_t)15) + << 6U | + (int16_t)Eurydice_slice_index(bytes, (size_t)6U, uint8_t, uint8_t *) >> + 2U; + int16_t r6 = + ((int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) & + (int16_t)63) + << 4U | + (int16_t)Eurydice_slice_index(bytes, (size_t)7U, uint8_t, uint8_t *) >> + 4U; + int16_t r7 = + (int16_t)Eurydice_slice_index(bytes, (size_t)9U, uint8_t, uint8_t *) + << 2U | + (int16_t)Eurydice_slice_index(bytes, (size_t)8U, uint8_t, uint8_t *) >> + 6U; + return (CLITERAL(int16_t_x8){.fst = r0, + .snd = r1, + .thd = r2, + .f3 = r3, + .f4 = r4, + .f5 = r5, + .f6 = r6, + .f7 = r7}); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_10(Eurydice_slice bytes) { + int16_t_x8 v0_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( + Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)10U, uint8_t)); + int16_t_x8 v8_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_10_int( + Eurydice_slice_subslice2(bytes, (size_t)10U, (size_t)20U, uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector v = + libcrux_ml_kem_vector_portable_vector_type_zero(); + v.elements[0U] = v0_7.fst; + v.elements[1U] = v0_7.snd; + v.elements[2U] = v0_7.thd; + v.elements[3U] = v0_7.f3; + v.elements[4U] = v0_7.f4; + v.elements[5U] = v0_7.f5; + v.elements[6U] = v0_7.f6; + v.elements[7U] = v0_7.f7; + v.elements[8U] = v8_15.fst; + v.elements[9U] = v8_15.snd; + v.elements[10U] = v8_15.thd; + v.elements[11U] = v8_15.f3; + v.elements[12U] = v8_15.f4; + v.elements[13U] = v8_15.f5; + v.elements[14U] = v8_15.f6; + v.elements[15U] = v8_15.f7; + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_10_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_10(a); +} + +typedef struct uint8_t_x3_s { + uint8_t fst; + uint8_t snd; + uint8_t thd; +} uint8_t_x3; + +static KRML_MUSTINLINE uint8_t_x3 +libcrux_ml_kem_vector_portable_serialize_serialize_12_int(Eurydice_slice v) { + uint8_t r0 = + (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) & + (int16_t)255); + uint8_t r1 = + (uint8_t)(Eurydice_slice_index(v, (size_t)0U, int16_t, int16_t *) >> 8U | + (Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) & + (int16_t)15) + << 4U); + uint8_t r2 = + (uint8_t)(Eurydice_slice_index(v, (size_t)1U, int16_t, int16_t *) >> 4U & + (int16_t)255); + return (CLITERAL(uint8_t_x3){.fst = r0, .snd = r1, .thd = r2}); +} + +static KRML_MUSTINLINE void +libcrux_ml_kem_vector_portable_serialize_serialize_12( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, + uint8_t ret[24U]) { + uint8_t_x3 r0_2 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)0U, (size_t)2U, int16_t)); + uint8_t_x3 r3_5 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)2U, (size_t)4U, int16_t)); + uint8_t_x3 r6_8 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)4U, (size_t)6U, int16_t)); + uint8_t_x3 r9_11 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)6U, (size_t)8U, int16_t)); + uint8_t_x3 r12_14 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)8U, (size_t)10U, + int16_t)); + uint8_t_x3 r15_17 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)10U, (size_t)12U, + int16_t)); + uint8_t_x3 r18_20 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)12U, (size_t)14U, + int16_t)); + uint8_t_x3 r21_23 = libcrux_ml_kem_vector_portable_serialize_serialize_12_int( + Eurydice_array_to_subslice2(v.elements, (size_t)14U, (size_t)16U, + int16_t)); + uint8_t result[24U] = {0U}; + result[0U] = r0_2.fst; + result[1U] = r0_2.snd; + result[2U] = r0_2.thd; + result[3U] = r3_5.fst; + result[4U] = r3_5.snd; + result[5U] = r3_5.thd; + result[6U] = r6_8.fst; + result[7U] = r6_8.snd; + result[8U] = r6_8.thd; + result[9U] = r9_11.fst; + result[10U] = r9_11.snd; + result[11U] = r9_11.thd; + result[12U] = r12_14.fst; + result[13U] = r12_14.snd; + result[14U] = r12_14.thd; + result[15U] = r15_17.fst; + result[16U] = r15_17.snd; + result[17U] = r15_17.thd; + result[18U] = r18_20.fst; + result[19U] = r18_20.snd; + result[20U] = r18_20.thd; + result[21U] = r21_23.fst; + result[22U] = r21_23.snd; + result[23U] = r21_23.thd; + memcpy(ret, result, (size_t)24U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline void libcrux_ml_kem_vector_portable_serialize_12_0d( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + uint8_t ret[24U]) { + libcrux_ml_kem_vector_portable_serialize_serialize_12(a, ret); +} + +typedef struct int16_t_x2_s { + int16_t fst; + int16_t snd; +} int16_t_x2; + +static KRML_MUSTINLINE int16_t_x2 +libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice bytes) { + int16_t byte0 = + (int16_t)Eurydice_slice_index(bytes, (size_t)0U, uint8_t, uint8_t *); + int16_t byte1 = + (int16_t)Eurydice_slice_index(bytes, (size_t)1U, uint8_t, uint8_t *); + int16_t byte2 = + (int16_t)Eurydice_slice_index(bytes, (size_t)2U, uint8_t, uint8_t *); + int16_t r0 = (byte1 & (int16_t)15) << 8U | (byte0 & (int16_t)255); + int16_t r1 = byte2 << 4U | (byte1 >> 4U & (int16_t)15); + return (CLITERAL(int16_t_x2){.fst = r0, .snd = r1}); +} + +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_serialize_deserialize_12(Eurydice_slice bytes) { + int16_t_x2 v0_1 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)0U, (size_t)3U, uint8_t)); + int16_t_x2 v2_3 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)3U, (size_t)6U, uint8_t)); + int16_t_x2 v4_5 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)6U, (size_t)9U, uint8_t)); + int16_t_x2 v6_7 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)9U, (size_t)12U, uint8_t)); + int16_t_x2 v8_9 = libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)12U, (size_t)15U, uint8_t)); + int16_t_x2 v10_11 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)15U, (size_t)18U, uint8_t)); + int16_t_x2 v12_13 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)18U, (size_t)21U, uint8_t)); + int16_t_x2 v14_15 = + libcrux_ml_kem_vector_portable_serialize_deserialize_12_int( + Eurydice_slice_subslice2(bytes, (size_t)21U, (size_t)24U, uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector re = + libcrux_ml_kem_vector_portable_vector_type_zero(); + re.elements[0U] = v0_1.fst; + re.elements[1U] = v0_1.snd; + re.elements[2U] = v2_3.fst; + re.elements[3U] = v2_3.snd; + re.elements[4U] = v4_5.fst; + re.elements[5U] = v4_5.snd; + re.elements[6U] = v6_7.fst; + re.elements[7U] = v6_7.snd; + re.elements[8U] = v8_9.fst; + re.elements[9U] = v8_9.snd; + re.elements[10U] = v10_11.fst; + re.elements[11U] = v10_11.snd; + re.elements[12U] = v12_13.fst; + re.elements[13U] = v12_13.snd; + re.elements[14U] = v14_15.fst; + re.elements[15U] = v14_15.snd; + return re; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_deserialize_12_0d(Eurydice_slice a) { + return libcrux_ml_kem_vector_portable_serialize_deserialize_12(a); +} + +static KRML_MUSTINLINE size_t +libcrux_ml_kem_vector_portable_sampling_rej_sample(Eurydice_slice a, + Eurydice_slice result) { + size_t sampled = (size_t)0U; + for (size_t i = (size_t)0U; i < Eurydice_slice_len(a, uint8_t) / (size_t)3U; + i++) { + size_t i0 = i; + int16_t b1 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)0U, + uint8_t, uint8_t *); + int16_t b2 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)1U, + uint8_t, uint8_t *); + int16_t b3 = (int16_t)Eurydice_slice_index(a, i0 * (size_t)3U + (size_t)2U, + uint8_t, uint8_t *); + int16_t d1 = (b2 & (int16_t)15) << 8U | b1; + int16_t d2 = b3 << 4U | b2 >> 4U; + bool uu____0; + int16_t uu____1; + bool uu____2; + size_t uu____3; + int16_t uu____4; + size_t uu____5; + int16_t uu____6; + if (d1 < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS) { + if (sampled < (size_t)16U) { + Eurydice_slice_index(result, sampled, int16_t, int16_t *) = d1; + sampled++; + uu____1 = d2; + uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + uu____0 = uu____1 < uu____6; + if (uu____0) { + uu____3 = sampled; + uu____2 = uu____3 < (size_t)16U; + if (uu____2) { + uu____4 = d2; + uu____5 = sampled; + Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4; + sampled++; + continue; + } + } + continue; + } + } + uu____1 = d2; + uu____6 = LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + uu____0 = uu____1 < uu____6; + if (uu____0) { + uu____3 = sampled; + uu____2 = uu____3 < (size_t)16U; + if (uu____2) { + uu____4 = d2; + uu____5 = sampled; + Eurydice_slice_index(result, uu____5, int16_t, int16_t *) = uu____4; + sampled++; + continue; + } + } + } + return sampled; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline size_t libcrux_ml_kem_vector_portable_rej_sample_0d( + Eurydice_slice a, Eurydice_slice out) { + return libcrux_ml_kem_vector_portable_sampling_rej_sample(a, out); +} + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 ((size_t)10U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 \ + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ + LIBCRUX_ML_KEM_MLKEM768_VECTOR_U_COMPRESSION_FACTOR_768 / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_RANK_768 ((size_t)3U) + +#define LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_C1_BLOCK_SIZE_768 * LIBCRUX_ML_KEM_MLKEM768_RANK_768) + +#define LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 ((size_t)4U) + +#define LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768 \ + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ + LIBCRUX_ML_KEM_MLKEM768_VECTOR_V_COMPRESSION_FACTOR_768 / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_C1_SIZE_768 + LIBCRUX_ML_KEM_MLKEM768_C2_SIZE_768) + +#define LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \ + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ + LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_T_AS_NTT_ENCODED_SIZE_768 + (size_t)32U) + +#define LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \ + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * \ + LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_COEFFICIENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA1_RANDOMNESS_SIZE \ + (LIBCRUX_ML_KEM_MLKEM768_ETA1 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2 ((size_t)2U) + +#define LIBCRUX_ML_KEM_MLKEM768_ETA2_RANDOMNESS_SIZE \ + (LIBCRUX_ML_KEM_MLKEM768_ETA2 * (size_t)64U) + +#define LIBCRUX_ML_KEM_MLKEM768_IMPLICIT_REJECTION_HASH_INPUT_SIZE \ + (LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE + \ + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_CIPHERTEXT_SIZE_768) + +typedef libcrux_ml_kem_types_MlKemPrivateKey_55 + libcrux_ml_kem_mlkem768_MlKem768PrivateKey; + +typedef libcrux_ml_kem_types_MlKemPublicKey_15 + libcrux_ml_kem_mlkem768_MlKem768PublicKey; + +#define LIBCRUX_ML_KEM_MLKEM768_RANKED_BYTES_PER_RING_ELEMENT_768 \ + (LIBCRUX_ML_KEM_MLKEM768_RANK_768 * \ + LIBCRUX_ML_KEM_CONSTANTS_BITS_PER_RING_ELEMENT / (size_t)8U) + +#define LIBCRUX_ML_KEM_MLKEM768_SECRET_KEY_SIZE_768 \ + (LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_SECRET_KEY_SIZE_768 + \ + LIBCRUX_ML_KEM_MLKEM768_CPA_PKE_PUBLIC_KEY_SIZE_768 + \ + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE + \ + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE) + +/** +A monomorphic instance of libcrux_ml_kem.polynomial.PolynomialRingElement +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector + +*/ +typedef struct libcrux_ml_kem_polynomial_PolynomialRingElement_f0_s { + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients[16U]; +} libcrux_ml_kem_polynomial_PolynomialRingElement_f0; + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ZERO_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_polynomial_ZERO_89_ea(void) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 lit; + lit.coefficients[0U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[1U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[2U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[3U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[4U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[5U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[6U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[7U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[8U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[9U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[10U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[11U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[12U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[13U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[14U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + lit.coefficients[15U] = libcrux_ml_kem_vector_portable_ZERO_0d(); + return lit; +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_ind_cpa_deserialize_secret_key_closure_6b(size_t _) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_to_uncompressed_ring_element with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** + Call [`deserialize_to_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_secret_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_deserialize_secret_key_24( + Eurydice_slice secret_key, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + secret_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(secret_key, uint8_t) / + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; + i++) { + size_t i0 = i; + Eurydice_slice secret_bytes = Eurydice_slice_subslice2( + secret_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + uint8_t); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 = + libcrux_ml_kem_serialize_deserialize_to_uncompressed_ring_element_af( + secret_bytes); + secret_as_ntt[i0] = uu____0; + } + memcpy( + ret, secret_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.ind_cpa.unpacked.IndCpaPrivateKeyUnpacked with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8_s { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U]; +} libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8; + +/** +A monomorphic instance of +libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u.closure with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_closure_7c(size_t _) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with +const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int32_t decompressed = (int32_t)v.elements[i0] * + (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)10); + decompressed = decompressed >> (uint32_t)((int32_t)10 + (int32_t)1); + v.elements[i0] = (int16_t)decompressed; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const +generics +- COEFFICIENT_BITS= 10 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b( + v); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_then_decompress_10 with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)20U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)20U, i0 * (size_t)20U + (size_t)20U, uint8_t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_deserialize_10_0d(bytes); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a( + coefficient); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with +const generics +- COEFFICIENT_BITS= 11 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int32_t decompressed = (int32_t)v.elements[i0] * + (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)11); + decompressed = decompressed >> (uint32_t)((int32_t)11 + (int32_t)1); + v.elements[i0] = (int16_t)decompressed; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const +generics +- COEFFICIENT_BITS= 11 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b0( + v); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_then_decompress_11 with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_11_8d( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)22U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)22U, i0 * (size_t)22U + (size_t)22U, uint8_t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_deserialize_11_0d(bytes); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a0( + coefficient); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_u with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34( + Eurydice_slice serialized) { + return libcrux_ml_kem_serialize_deserialize_then_decompress_10_2c(serialized); +} + +typedef struct libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2_s { + libcrux_ml_kem_vector_portable_vector_type_PortableVector fst; + libcrux_ml_kem_vector_portable_vector_type_PortableVector snd; +} libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2; + +/** +A monomorphic instance of libcrux_ml_kem.vector.traits.montgomery_multiply_fe +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v, int16_t fer) { + return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d(v, + fer); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_layer_int_vec_step +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + libcrux_ml_kem_vector_portable_vector_type_PortableVector b, + int16_t zeta_r) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector t = + libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(b, zeta_r); + b = libcrux_ml_kem_vector_portable_sub_0d(a, &t); + a = libcrux_ml_kem_vector_portable_add_0d(a, &t); + return ( + CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, .snd = b}); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t layer, size_t _initial_coefficient_bound) { + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { + size_t round = i0; + zeta_i[0U] = zeta_i[0U] + (size_t)1U; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = offset / (size_t)16U; + size_t step_vec = step / (size_t)16U; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = + libcrux_ml_kem_ntt_ntt_layer_int_vec_step_0c( + re->coefficients[j], re->coefficients[j + step_vec], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]); + libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; + libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; + re->coefficients[j] = x; + re->coefficients[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_3_fd( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer, size_t _initial_coefficient_bound) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] + (size_t)1U; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_ntt_layer_3_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]); + re->coefficients[round] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_2_ad( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer, size_t _initial_coefficient_bound) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] + (size_t)1U; + re->coefficients[round] = + libcrux_ml_kem_vector_portable_ntt_layer_2_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] + + (size_t)1U]); + zeta_i[0U] = zeta_i[0U] + (size_t)1U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_1_a2( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer, size_t _initial_coefficient_bound) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] + (size_t)1U; + re->coefficients[round] = + libcrux_ml_kem_vector_portable_ntt_layer_1_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] + + (size_t)1U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] + + (size_t)2U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] + + (size_t)3U]); + zeta_i[0U] = zeta_i[0U] + (size_t)3U; + } +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.poly_barrett_reduce_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_barrett_reduce_0d( + self->coefficients[i0]); + self->coefficients[i0] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- VECTOR_U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_vector_u_9f( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) { + size_t zeta_i = (size_t)0U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)7U, + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U, + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U, + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U, + (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3328U); + libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3328U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re); +} + +/** + Call [`deserialize_then_decompress_ring_element_u`] on each ring element + in the `ciphertext`. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.deserialize_then_decompress_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- U_COMPRESSION_FACTOR= 10 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4( + uint8_t *ciphertext, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + u_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice((size_t)1088U, ciphertext, uint8_t), + uint8_t) / + (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * + (size_t)10U / (size_t)8U); + i++) { + size_t i0 = i; + Eurydice_slice u_bytes = Eurydice_array_to_subslice2( + ciphertext, + i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * + (size_t)10U / (size_t)8U), + i0 * (LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * + (size_t)10U / (size_t)8U) + + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT * + (size_t)10U / (size_t)8U, + uint8_t); + u_as_ntt[i0] = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_u_34( + u_bytes); + libcrux_ml_kem_ntt_ntt_vector_u_9f(&u_as_ntt[i0]); + } + memcpy( + ret, u_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with +const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int32_t decompressed = (int32_t)v.elements[i0] * + (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)4); + decompressed = decompressed >> (uint32_t)((int32_t)4 + (int32_t)1); + v.elements[i0] = (int16_t)decompressed; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const +generics +- COEFFICIENT_BITS= 4 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b1( + v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_4_41( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)8U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)8U, i0 * (size_t)8U + (size_t)8U, uint8_t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_deserialize_4_0d(bytes); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a1( + coefficient); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.compress.decompress_ciphertext_coefficient with +const generics +- COEFFICIENT_BITS= 5 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int32_t decompressed = (int32_t)v.elements[i0] * + (int32_t)LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS; + decompressed = (decompressed << 1U) + ((int32_t)1 << (uint32_t)(int32_t)5); + decompressed = decompressed >> (uint32_t)((int32_t)5 + (int32_t)1); + v.elements[i0] = (int16_t)decompressed; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.vector.portable.decompress_ciphertext_coefficient_0d with const +generics +- COEFFICIENT_BITS= 5 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_decompress_ciphertext_coefficient_6b2( + v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.deserialize_then_decompress_5 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_5_4e( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)10U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)10U, i0 * (size_t)10U + (size_t)10U, uint8_t); + re.coefficients[i0] = + libcrux_ml_kem_vector_portable_deserialize_5_0d(bytes); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 = + libcrux_ml_kem_vector_portable_decompress_ciphertext_coefficient_0d_5a2( + re.coefficients[i0]); + re.coefficients[i0] = uu____1; + } + return re; +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_then_decompress_ring_element_v with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- COMPRESSION_FACTOR= 4 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56( + Eurydice_slice serialized) { + return libcrux_ml_kem_serialize_deserialize_then_decompress_4_41(serialized); +} + +/** + Given two `KyberPolynomialRingElement`s in their NTT representations, + compute their product. Given two polynomials in the NTT domain `f^` and `ĵ`, + the `iᵗʰ` coefficient of the product `k̂` is determined by the calculation: + + ```plaintext + ĥ[2·i] + ĥ[2·i + 1]X = (f^[2·i] + f^[2·i + 1]X)·(ĝ[2·i] + ĝ[2·i + 1]X) mod (X² + - ζ^(2·BitRev₇(i) + 1)) + ``` + + This function almost implements <strong>Algorithm 10</strong> of the + NIST FIPS 203 standard, which is reproduced below: + + ```plaintext + Input: Two arrays fˆ ∈ ℤ₂₅₆ and ĝ ∈ ℤ₂₅₆. + Output: An array ĥ ∈ ℤq. + + for(i ← 0; i < 128; i++) + (ĥ[2i], ĥ[2i+1]) ← BaseCaseMultiply(fˆ[2i], fˆ[2i+1], ĝ[2i], ĝ[2i+1], + ζ^(2·BitRev₇(i) + 1)) end for return ĥ + ``` + We say "almost" because the coefficients of the ring element output by + this function are in the Montgomery domain. + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.ntt_multiply_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_polynomial_ntt_multiply_89_2a( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 out = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_ntt_multiply_0d( + &self->coefficients[i0], &rhs->coefficients[i0], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U + + (size_t)4U * i0], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U + + (size_t)4U * i0 + + (size_t)1U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U + + (size_t)4U * i0 + + (size_t)2U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[(size_t)64U + + (size_t)4U * i0 + + (size_t)3U]); + out.coefficients[i0] = uu____0; + } + return out; +} + +/** + Given two polynomial ring elements `lhs` and `rhs`, compute the pointwise + sum of their constituent coefficients. +*/ +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_to_ring_element_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_to_ring_element_89_84( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *rhs) { + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)16U, self->coefficients, + libcrux_ml_kem_vector_portable_vector_type_PortableVector), + libcrux_ml_kem_vector_portable_vector_type_PortableVector); + i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0], + &rhs->coefficients[i0]); + self->coefficients[i0] = uu____0; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] - (size_t)1U; + re->coefficients[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_1_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] - + (size_t)1U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] - + (size_t)2U], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] - + (size_t)3U]); + zeta_i[0U] = zeta_i[0U] - (size_t)3U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_2 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] - (size_t)1U; + re->coefficients[round] = + libcrux_ml_kem_vector_portable_inv_ntt_layer_2_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U] - + (size_t)1U]); + zeta_i[0U] = zeta_i[0U] - (size_t)1U; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_3 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t _layer) { + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t round = i; + zeta_i[0U] = zeta_i[0U] - (size_t)1U; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_inv_ntt_layer_3_step_0d( + re->coefficients[round], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]); + re->coefficients[round] = uu____0; + } +} + +/** +A monomorphic instance of +libcrux_ml_kem.invert_ntt.inv_ntt_layer_int_vec_step_reduce with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 + libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a, + libcrux_ml_kem_vector_portable_vector_type_PortableVector b, + int16_t zeta_r) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector a_minus_b = + libcrux_ml_kem_vector_portable_sub_0d(b, &a); + a = libcrux_ml_kem_vector_portable_barrett_reduce_0d( + libcrux_ml_kem_vector_portable_add_0d(a, &b)); + b = libcrux_ml_kem_vector_traits_montgomery_multiply_fe_67(a_minus_b, zeta_r); + return ( + CLITERAL(libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2){ + .fst = a, .snd = b}); +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_at_layer_4_plus +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e( + size_t *zeta_i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, + size_t layer) { + size_t step = (size_t)1U << (uint32_t)layer; + for (size_t i0 = (size_t)0U; i0 < (size_t)128U >> (uint32_t)layer; i0++) { + size_t round = i0; + zeta_i[0U] = zeta_i[0U] - (size_t)1U; + size_t offset = round * step * (size_t)2U; + size_t offset_vec = + offset / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + size_t step_vec = + step / LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; + for (size_t i = offset_vec; i < offset_vec + step_vec; i++) { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector_x2 uu____0 = + libcrux_ml_kem_invert_ntt_inv_ntt_layer_int_vec_step_reduce_65( + re->coefficients[j], re->coefficients[j + step_vec], + libcrux_ml_kem_polynomial_ZETAS_TIMES_MONTGOMERY_R[zeta_i[0U]]); + libcrux_ml_kem_vector_portable_vector_type_PortableVector x = uu____0.fst; + libcrux_ml_kem_vector_portable_vector_type_PortableVector y = uu____0.snd; + re->coefficients[j] = x; + re->coefficients[j + step_vec] = y; + } + } +} + +/** +A monomorphic instance of libcrux_ml_kem.invert_ntt.invert_ntt_montgomery +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) { + size_t zeta_i = + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT / (size_t)2U; + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_1_83(&zeta_i, re, (size_t)1U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_2_c3(&zeta_i, re, (size_t)2U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_3_68(&zeta_i, re, (size_t)3U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re, + (size_t)4U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re, + (size_t)5U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re, + (size_t)6U); + libcrux_ml_kem_invert_ntt_invert_ntt_at_layer_4_plus_6e(&zeta_i, re, + (size_t)7U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re); +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.subtract_reduce_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_polynomial_subtract_reduce_89_d4( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 b) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d( + b.coefficients[i0], (int16_t)1441); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_barrett_reduce_0d( + libcrux_ml_kem_vector_portable_sub_0d(self->coefficients[i0], + &coefficient_normal_form)); + b.coefficients[i0] = uu____0; + } + return b; +} + +/** + The following functions compute various expressions involving + vectors and matrices. The computation of these expressions has been + abstracted away into these functions in order to save on loop iterations. + Compute v − InverseNTT(sᵀ ◦ NTT(u)) +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_message +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_matrix_compute_message_b3( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *v, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *secret_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *u_as_ntt) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product = + libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&secret_as_ntt[i0], + &u_as_ntt[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result); + result = libcrux_ml_kem_polynomial_subtract_reduce_89_d4(v, result); + return result; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.arithmetic.shift_right +with const generics +- SHIFT_BY= 15 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_arithmetic_shift_right_94( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + v.elements[i0] = v.elements[i0] >> (uint32_t)(int32_t)15; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.shift_right_0d +with const generics +- SHIFT_BY= 15 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_shift_right_0d_19( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_arithmetic_shift_right_94(v); +} + +/** +A monomorphic instance of +libcrux_ml_kem.vector.traits.to_unsigned_representative with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + libcrux_ml_kem_vector_portable_vector_type_PortableVector a) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector t = + libcrux_ml_kem_vector_portable_shift_right_0d_19(a); + libcrux_ml_kem_vector_portable_vector_type_PortableVector fm = + libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d( + t, LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_MODULUS); + return libcrux_ml_kem_vector_portable_add_0d(a, &fm); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.compress_then_serialize_message with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_message_aa( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, uint8_t ret[32U]) { + uint8_t serialized[32U] = {0U}; + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re.coefficients[i0]); + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_compressed = + libcrux_ml_kem_vector_portable_compress_1_0d(coefficient); + uint8_t bytes[2U]; + libcrux_ml_kem_vector_portable_serialize_1_0d(coefficient_compressed, + bytes); + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + serialized, (size_t)2U * i0, (size_t)2U * i0 + (size_t)2U, uint8_t); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)2U, bytes, uint8_t), uint8_t); + } + memcpy(ret, serialized, (size_t)32U * sizeof(uint8_t)); +} + +/** + This function implements <strong>Algorithm 14</strong> of the + NIST FIPS 203 specification; this is the Kyber CPA-PKE decryption algorithm. + + Algorithm 14 is reproduced below: + + ```plaintext + Input: decryption key dkₚₖₑ ∈ 𝔹^{384k}. + Input: ciphertext c ∈ 𝔹^{32(dᵤk + dᵥ)}. + Output: message m ∈ 𝔹^{32}. + + c₁ ← c[0 : 32dᵤk] + c₂ ← c[32dᵤk : 32(dᵤk + dᵥ)] + u ← Decompress_{dᵤ}(ByteDecode_{dᵤ}(c₁)) + v ← Decompress_{dᵥ}(ByteDecode_{dᵥ}(c₂)) + ŝ ← ByteDecode₁₂(dkₚₖₑ) + w ← v - NTT-¹(ŝᵀ ◦ NTT(u)) + m ← ByteEncode₁(Compress₁(w)) + return m + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt_unpacked +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static inline void libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d( + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 *secret_key, + uint8_t *ciphertext, uint8_t ret[32U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u_as_ntt[3U]; + libcrux_ml_kem_ind_cpa_deserialize_then_decompress_u_f4(ciphertext, u_as_ntt); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v = + libcrux_ml_kem_serialize_deserialize_then_decompress_ring_element_v_56( + Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, + (size_t)960U, uint8_t, size_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message = + libcrux_ml_kem_matrix_compute_message_b3(&v, secret_key->secret_as_ntt, + u_as_ntt); + uint8_t ret0[32U]; + libcrux_ml_kem_serialize_compress_then_serialize_message_aa(message, ret0); + memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.decrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- VECTOR_U_ENCODED_SIZE= 960 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +*/ +static inline void libcrux_ml_kem_ind_cpa_decrypt_43(Eurydice_slice secret_key, + uint8_t *ciphertext, + uint8_t ret[32U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U]; + libcrux_ml_kem_ind_cpa_deserialize_secret_key_24(secret_key, secret_as_ntt); + /* Passing arrays by value in Rust generates a copy in C */ + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_secret_as_ntt[3U]; + memcpy( + copy_of_secret_as_ntt, secret_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + libcrux_ml_kem_ind_cpa_unpacked_IndCpaPrivateKeyUnpacked_f8 + secret_key_unpacked; + memcpy( + secret_key_unpacked.secret_as_ntt, copy_of_secret_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + uint8_t ret0[32U]; + libcrux_ml_kem_ind_cpa_decrypt_unpacked_6d(&secret_key_unpacked, ciphertext, + ret0); + memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.G_f1 +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_slice input, uint8_t ret[64U]) { + libcrux_ml_kem_hash_functions_portable_G(input, ret); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 32 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b( + Eurydice_slice input, uint8_t ret[32U]) { + uint8_t digest[32U] = {0U}; + libcrux_sha3_portable_shake256( + Eurydice_array_to_slice((size_t)32U, digest, uint8_t), input); + memcpy(ret, digest, (size_t)32U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1 +with const generics +- K= 3 +- LEN= 32 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee( + Eurydice_slice input, uint8_t ret[32U]) { + libcrux_ml_kem_hash_functions_portable_PRF_2b(input, ret); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- PUBLIC_KEY_SIZE= 1152 +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd( + size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** + Only use with public values. + + This MUST NOT be used with secret inputs, like its caller + `deserialize_ring_elements_reduced`. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_to_reduced_ring_element with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c( + Eurydice_slice serialized) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(serialized, uint8_t) / (size_t)24U; i++) { + size_t i0 = i; + Eurydice_slice bytes = Eurydice_slice_subslice2( + serialized, i0 * (size_t)24U, i0 * (size_t)24U + (size_t)24U, uint8_t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_deserialize_12_0d(bytes); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_cond_subtract_3329_0d(coefficient); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** + This function deserializes ring elements and reduces the result by the field + modulus. + + This function MUST NOT be used on secret inputs. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- PUBLIC_KEY_SIZE= 1152 +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33( + Eurydice_slice public_key, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(public_key, uint8_t) / + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; + i++) { + size_t i0 = i; + Eurydice_slice ring_element = Eurydice_slice_subslice2( + public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + uint8_t); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 = + libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c( + ring_element); + deserialized_pk[i0] = uu____0; + } + memcpy( + ret, deserialized_pk, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_matrix_sample_matrix_A_closure_closure_78(size_t _j) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +*/ +static inline void libcrux_ml_kem_matrix_sample_matrix_A_closure_4b( + size_t _i, libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + ret[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PortableHash +with const generics +- $3size_t +*/ +typedef struct libcrux_ml_kem_hash_functions_portable_PortableHash_58_s { + libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U]; +} libcrux_ml_kem_hash_functions_portable_PortableHash_58; + +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_init_absorb with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7( + uint8_t input[3U][34U]) { + libcrux_sha3_generic_keccak_KeccakState_48 shake128_state[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + shake128_state[i] = libcrux_sha3_portable_incremental_shake128_init(); + } + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_absorb_final( + &shake128_state[i0], + Eurydice_array_to_slice((size_t)34U, input[i0], uint8_t)); + } + /* Passing arrays by value in Rust generates a copy in C */ + libcrux_sha3_generic_keccak_KeccakState_48 copy_of_shake128_state[3U]; + memcpy(copy_of_shake128_state, shake128_state, + (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48)); + libcrux_ml_kem_hash_functions_portable_PortableHash_58 lit; + memcpy(lit.shake128_state, copy_of_shake128_state, + (size_t)3U * sizeof(libcrux_sha3_generic_keccak_KeccakState_48)); + return lit; +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_init_absorb_f1 with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_hash_functions_portable_PortableHash_58 +libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c( + uint8_t input[3U][34U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_input[3U][34U]; + memcpy(copy_of_input, input, (size_t)3U * sizeof(uint8_t[34U])); + return libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_b7( + copy_of_input); +} + +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca( + libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st, + uint8_t ret[3U][504U]) { + uint8_t out[3U][504U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_first_three_blocks( + &st->shake128_state[i0], + Eurydice_array_to_slice((size_t)504U, out[i0], uint8_t)); + } + memcpy(ret, out, (size_t)3U * sizeof(uint8_t[504U])); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_squeeze_three_blocks_f1 with +const generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69( + libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self, + uint8_t ret[3U][504U]) { + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_ca(self, + ret); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT + representation of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function <strong>partially</strong> implements <strong>Algorithm + 6</strong> of the NIST FIPS 203 standard, We say "partially" because this + implementation only accepts a finite set of bytes as input and returns an error + if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other + hand samples from an infinite stream of bytes until the ring element is filled. + Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- K= 3 +- N= 504 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db( + uint8_t randomness[3U][504U], size_t *sampled_coefficients, + int16_t (*out)[272U]) { + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)504U / (size_t)24U; i++) { + size_t r = i; + if (sampled_coefficients[i1] < + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { + Eurydice_slice uu____0 = + Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U, + r * (size_t)24U + (size_t)24U, uint8_t); + size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d( + uu____0, Eurydice_array_to_subslice2( + out[i1], sampled_coefficients[i1], + sampled_coefficients[i1] + (size_t)16U, int16_t)); + size_t uu____1 = i1; + sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + if (sampled_coefficients[i0] >= + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { + sampled_coefficients[i0] = + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } else { + done = false; + } + } + return done; +} + +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd( + libcrux_ml_kem_hash_functions_portable_PortableHash_58 *st, + uint8_t ret[3U][168U]) { + uint8_t out[3U][168U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_sha3_portable_incremental_shake128_squeeze_next_block( + &st->shake128_state[i0], + Eurydice_array_to_slice((size_t)168U, out[i0], uint8_t)); + } + memcpy(ret, out, (size_t)3U * sizeof(uint8_t[168U])); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of +libcrux_ml_kem.hash_functions.portable.shake128_squeeze_block_f1 with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60( + libcrux_ml_kem_hash_functions_portable_PortableHash_58 *self, + uint8_t ret[3U][168U]) { + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_dd(self, ret); +} + +/** + If `bytes` contains a set of uniformly random bytes, this function + uniformly samples a ring element `â` that is treated as being the NTT + representation of the corresponding polynomial `a`. + + Since rejection sampling is used, it is possible the supplied bytes are + not enough to sample the element, in which case an `Err` is returned and the + caller must try again with a fresh set of bytes. + + This function <strong>partially</strong> implements <strong>Algorithm + 6</strong> of the NIST FIPS 203 standard, We say "partially" because this + implementation only accepts a finite set of bytes as input and returns an error + if the set is not enough; Algorithm 6 of the FIPS 203 standard on the other + hand samples from an infinite stream of bytes until the ring element is filled. + Algorithm 6 is reproduced below: + + ```plaintext + Input: byte stream B ∈ 𝔹*. + Output: array â ∈ ℤ₂₅₆. + + i ← 0 + j ← 0 + while j < 256 do + d₁ ← B[i] + 256·(B[i+1] mod 16) + d₂ ← ⌊B[i+1]/16⌋ + 16·B[i+2] + if d₁ < q then + â[j] ← d₁ + j ← j + 1 + end if + if d₂ < q and j < 256 then + â[j] ← d₂ + j ← j + 1 + end if + i ← i + 3 + end while + return â + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.sampling.sample_from_uniform_distribution_next with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- K= 3 +- N= 168 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0( + uint8_t randomness[3U][168U], size_t *sampled_coefficients, + int16_t (*out)[272U]) { + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { + size_t i1 = i0; + for (size_t i = (size_t)0U; i < (size_t)168U / (size_t)24U; i++) { + size_t r = i; + if (sampled_coefficients[i1] < + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { + Eurydice_slice uu____0 = + Eurydice_array_to_subslice2(randomness[i1], r * (size_t)24U, + r * (size_t)24U + (size_t)24U, uint8_t); + size_t sampled = libcrux_ml_kem_vector_portable_rej_sample_0d( + uu____0, Eurydice_array_to_subslice2( + out[i1], sampled_coefficients[i1], + sampled_coefficients[i1] + (size_t)16U, int16_t)); + size_t uu____1 = i1; + sampled_coefficients[uu____1] = sampled_coefficients[uu____1] + sampled; + } + } + } + bool done = true; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + if (sampled_coefficients[i0] >= + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT) { + sampled_coefficients[i0] = + LIBCRUX_ML_KEM_CONSTANTS_COEFFICIENTS_IN_RING_ELEMENT; + } else { + done = false; + } + } + return done; +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.from_i16_array_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_polynomial_from_i16_array_89_c1(Eurydice_slice a) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_from_i16_array_0d( + Eurydice_slice_subslice2(a, i0 * (size_t)16U, + (i0 + (size_t)1U) * (size_t)16U, int16_t)); + result.coefficients[i0] = uu____0; + } + return result; +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_sampling_sample_from_xof_closure_04(int16_t s[272U]) { + return libcrux_ml_kem_polynomial_from_i16_array_89_c1( + Eurydice_array_to_subslice2(s, (size_t)0U, (size_t)256U, int16_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.sampling.sample_from_xof +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_sampling_sample_from_xof_3f( + uint8_t seeds[3U][34U], + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + size_t sampled_coefficients[3U] = {0U}; + int16_t out[3U][272U] = {{0U}}; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_seeds[3U][34U]; + memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U])); + libcrux_ml_kem_hash_functions_portable_PortableHash_58 xof_state = + libcrux_ml_kem_hash_functions_portable_shake128_init_absorb_f1_8c( + copy_of_seeds); + uint8_t randomness0[3U][504U]; + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_three_blocks_f1_69( + &xof_state, randomness0); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness0[3U][504U]; + memcpy(copy_of_randomness0, randomness0, (size_t)3U * sizeof(uint8_t[504U])); + bool done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db( + copy_of_randomness0, sampled_coefficients, out); + while (true) { + if (done) { + break; + } else { + uint8_t randomness[3U][168U]; + libcrux_ml_kem_hash_functions_portable_shake128_squeeze_block_f1_60( + &xof_state, randomness); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[3U][168U]; + memcpy(copy_of_randomness, randomness, + (size_t)3U * sizeof(uint8_t[168U])); + done = libcrux_ml_kem_sampling_sample_from_uniform_distribution_next_db0( + copy_of_randomness, sampled_coefficients, out); + } + } + /* Passing arrays by value in Rust generates a copy in C */ + int16_t copy_of_out[3U][272U]; + memcpy(copy_of_out, out, (size_t)3U * sizeof(int16_t[272U])); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret0[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + ret0[i] = + libcrux_ml_kem_sampling_sample_from_xof_closure_04(copy_of_out[i]); + } + memcpy( + ret, ret0, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.sample_matrix_A +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_matrix_sample_matrix_A_38( + uint8_t seed[34U], bool transpose, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U][3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + libcrux_ml_kem_matrix_sample_matrix_A_closure_4b(i, A_transpose[i]); + } + for (size_t i0 = (size_t)0U; i0 < (size_t)3U; i0++) { + size_t i1 = i0; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_seed[34U]; + memcpy(copy_of_seed, seed, (size_t)34U * sizeof(uint8_t)); + uint8_t seeds[3U][34U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + memcpy(seeds[i], copy_of_seed, (size_t)34U * sizeof(uint8_t)); + } + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t j = i; + seeds[j][32U] = (uint8_t)i1; + seeds[j][33U] = (uint8_t)j; + } + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_seeds[3U][34U]; + memcpy(copy_of_seeds, seeds, (size_t)3U * sizeof(uint8_t[34U])); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sampled[3U]; + libcrux_ml_kem_sampling_sample_from_xof_3f(copy_of_seeds, sampled); + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, sampled, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0); + i++) { + size_t j = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 sample = sampled[j]; + if (transpose) { + A_transpose[j][i1] = sample; + } else { + A_transpose[i1][j] = sample; + } + } + } + memcpy(ret, A_transpose, + (size_t)3U * + sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U])); +} + +/** +A monomorphic instance of K. +with types libcrux_ml_kem_polynomial_PolynomialRingElement +libcrux_ml_kem_vector_portable_vector_type_PortableVector[3size_t], uint8_t + +*/ +typedef struct tuple_b0_s { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 fst[3U]; + uint8_t snd; +} tuple_b0; + +/** +A monomorphic instance of +libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt.closure with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +- ETA= 2 +- ETA_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_closure_f7(size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN +with const generics +- K= 3 +- LEN= 128 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_c5( + uint8_t (*input)[33U], uint8_t ret[3U][128U]) { + uint8_t out[3U][128U] = {{0U}}; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_sha3_portable_shake256( + Eurydice_array_to_slice((size_t)128U, out[i0], uint8_t), + Eurydice_array_to_slice((size_t)33U, input[i0], uint8_t)); + } + memcpy(ret, out, (size_t)3U * sizeof(uint8_t[128U])); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRFxN_f1 +with const generics +- K= 3 +- LEN= 128 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93( + uint8_t (*input)[33U], uint8_t ret[3U][128U]) { + libcrux_ml_kem_hash_functions_portable_PRFxN_c5(input, ret); +} + +/** + Given a series of uniformly random bytes in `randomness`, for some number + `eta`, the `sample_from_binomial_distribution_{eta}` functions sample a ring + element from a binomial distribution centered at 0 that uses two sets of `eta` + coin flips. If, for example, `eta = ETA`, each ring coefficient is a value `v` + such such that `v ∈ {-ETA, -ETA + 1, ..., 0, ..., ETA + 1, ETA}` and: + + ```plaintext + - If v < 0, Pr[v] = Pr[-v] + - If v >= 0, Pr[v] = BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / 2 ^ (2 * ETA) + ``` + + The values `v < 0` are mapped to the appropriate `KyberFieldElement`. + + The expected value is: + + ```plaintext + E[X] = (-ETA)Pr[-ETA] + (-(ETA - 1))Pr[-(ETA - 1)] + ... + (ETA - 1)Pr[ETA - 1] + + (ETA)Pr[ETA] = 0 since Pr[-v] = Pr[v] when v < 0. + ``` + + And the variance is: + + ```plaintext + Var(X) = E[(X - E[X])^2] + = E[X^2] + = sum_(v=-ETA to ETA)v^2 * (BINOMIAL_COEFFICIENT(2 * ETA; ETA - v) / + 2^(2 * ETA)) = ETA / 2 + ``` + + This function implements <strong>Algorithm 7</strong> of the NIST FIPS 203 + standard, which is reproduced below: + + ```plaintext + Input: byte array B ∈ 𝔹^{64η}. + Output: array f ∈ ℤ₂₅₆. + + b ← BytesToBits(B) + for (i ← 0; i < 256; i++) + x ← ∑(j=0 to η - 1) b[2iη + j] + y ← ∑(j=0 to η - 1) b[2iη + η + j] + f[i] ← x−y mod q + end for + return f + ``` + + The NIST FIPS 203 standard can be found at + <https://csrc.nist.gov/pubs/fips/203/ipd>. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.sampling.sample_from_binomial_distribution_2 with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85( + Eurydice_slice randomness) { + int16_t sampled_i16s[256U] = {0U}; + for (size_t i0 = (size_t)0U; + i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)4U; i0++) { + size_t chunk_number = i0; + Eurydice_slice byte_chunk = Eurydice_slice_subslice2( + randomness, chunk_number * (size_t)4U, + chunk_number * (size_t)4U + (size_t)4U, uint8_t); + uint32_t random_bits_as_u32 = + (((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t, + uint8_t *) | + (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t, + uint8_t *) + << 8U) | + (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t, + uint8_t *) + << 16U) | + (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)3U, uint8_t, + uint8_t *) + << 24U; + uint32_t even_bits = random_bits_as_u32 & 1431655765U; + uint32_t odd_bits = random_bits_as_u32 >> 1U & 1431655765U; + uint32_t coin_toss_outcomes = even_bits + odd_bits; + for (uint32_t i = 0U; i < CORE_NUM__U32_8__BITS / 4U; i++) { + uint32_t outcome_set = i; + uint32_t outcome_set0 = outcome_set * 4U; + int16_t outcome_1 = + (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 3U); + int16_t outcome_2 = + (int16_t)(coin_toss_outcomes >> (uint32_t)(outcome_set0 + 2U) & 3U); + size_t offset = (size_t)(outcome_set0 >> 2U); + sampled_i16s[(size_t)8U * chunk_number + offset] = outcome_1 - outcome_2; + } + } + return libcrux_ml_kem_polynomial_from_i16_array_89_c1( + Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.sampling.sample_from_binomial_distribution_3 with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_sampling_sample_from_binomial_distribution_3_eb( + Eurydice_slice randomness) { + int16_t sampled_i16s[256U] = {0U}; + for (size_t i0 = (size_t)0U; + i0 < Eurydice_slice_len(randomness, uint8_t) / (size_t)3U; i0++) { + size_t chunk_number = i0; + Eurydice_slice byte_chunk = Eurydice_slice_subslice2( + randomness, chunk_number * (size_t)3U, + chunk_number * (size_t)3U + (size_t)3U, uint8_t); + uint32_t random_bits_as_u24 = + ((uint32_t)Eurydice_slice_index(byte_chunk, (size_t)0U, uint8_t, + uint8_t *) | + (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)1U, uint8_t, + uint8_t *) + << 8U) | + (uint32_t)Eurydice_slice_index(byte_chunk, (size_t)2U, uint8_t, + uint8_t *) + << 16U; + uint32_t first_bits = random_bits_as_u24 & 2396745U; + uint32_t second_bits = random_bits_as_u24 >> 1U & 2396745U; + uint32_t third_bits = random_bits_as_u24 >> 2U & 2396745U; + uint32_t coin_toss_outcomes = first_bits + second_bits + third_bits; + for (int32_t i = (int32_t)0; i < (int32_t)24 / (int32_t)6; i++) { + int32_t outcome_set = i; + int32_t outcome_set0 = outcome_set * (int32_t)6; + int16_t outcome_1 = + (int16_t)(coin_toss_outcomes >> (uint32_t)outcome_set0 & 7U); + int16_t outcome_2 = (int16_t)(coin_toss_outcomes >> + (uint32_t)(outcome_set0 + (int32_t)3) & + 7U); + size_t offset = (size_t)(outcome_set0 / (int32_t)6); + sampled_i16s[(size_t)4U * chunk_number + offset] = outcome_1 - outcome_2; + } + } + return libcrux_ml_kem_polynomial_from_i16_array_89_c1( + Eurydice_array_to_slice((size_t)256U, sampled_i16s, int16_t)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.sampling.sample_from_binomial_distribution with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- ETA= 2 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6( + Eurydice_slice randomness) { + return libcrux_ml_kem_sampling_sample_from_binomial_distribution_2_85( + randomness); +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_at_layer_7 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ntt_ntt_at_layer_7_f4( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) { + size_t step = LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT / (size_t)2U; + for (size_t i = (size_t)0U; i < step; i++) { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector t = + libcrux_ml_kem_vector_portable_multiply_by_constant_0d( + re->coefficients[j + step], (int16_t)-1600); + re->coefficients[j + step] = + libcrux_ml_kem_vector_portable_sub_0d(re->coefficients[j], &t); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____1 = + libcrux_ml_kem_vector_portable_add_0d(re->coefficients[j], &t); + re->coefficients[j] = uu____1; + } +} + +/** +A monomorphic instance of libcrux_ml_kem.ntt.ntt_binomially_sampled_ring_element +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re) { + libcrux_ml_kem_ntt_ntt_at_layer_7_f4(re); + size_t zeta_i = (size_t)1U; + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)6U, + (size_t)3U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)5U, + (size_t)3U); + libcrux_ml_kem_ntt_ntt_at_layer_4_plus_51(&zeta_i, re, (size_t)4U, + (size_t)3U); + libcrux_ml_kem_ntt_ntt_at_layer_3_fd(&zeta_i, re, (size_t)3U, (size_t)3U); + libcrux_ml_kem_ntt_ntt_at_layer_2_ad(&zeta_i, re, (size_t)2U, (size_t)3U); + libcrux_ml_kem_ntt_ntt_at_layer_1_a2(&zeta_i, re, (size_t)1U, (size_t)3U); + libcrux_ml_kem_polynomial_poly_barrett_reduce_89_8b(re); +} + +/** + Sample a vector of ring elements from a centered binomial distribution and + convert them into their NTT representations. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_vector_cbd_then_ntt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +- ETA= 2 +- ETA_RANDOMNESS_SIZE= 128 +*/ +static KRML_MUSTINLINE tuple_b0 +libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(uint8_t prf_input[33U], + uint8_t domain_separator) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re_as_ntt[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + re_as_ntt[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input[33U]; + memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t)); + uint8_t prf_inputs[3U][33U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t)); + } + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + prf_inputs[i0][32U] = domain_separator; + domain_separator = (uint32_t)domain_separator + 1U; + } + uint8_t prf_outputs[3U][128U]; + libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + re_as_ntt[i0] = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6( + Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); + libcrux_ml_kem_ntt_ntt_binomially_sampled_ring_element_0f(&re_as_ntt[i0]); + } + /* Passing arrays by value in Rust generates a copy in C */ + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_re_as_ntt[3U]; + memcpy( + copy_of_re_as_ntt, re_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + tuple_b0 lit; + memcpy( + lit.fst, copy_of_re_as_ntt, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + lit.snd = domain_separator; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +- ETA2_RANDOMNESS_SIZE= 128 +- ETA2= 2 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_closure_77(size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** + Sample a vector of ring elements from a centered binomial distribution. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.sample_ring_element_cbd +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +- ETA2_RANDOMNESS_SIZE= 128 +- ETA2= 2 +*/ +static KRML_MUSTINLINE tuple_b0 +libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac(uint8_t prf_input[33U], + uint8_t domain_separator) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + error_1[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input[33U]; + memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t)); + uint8_t prf_inputs[3U][33U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + memcpy(prf_inputs[i], copy_of_prf_input, (size_t)33U * sizeof(uint8_t)); + } + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + prf_inputs[i0][32U] = domain_separator; + domain_separator = (uint32_t)domain_separator + 1U; + } + uint8_t prf_outputs[3U][128U]; + libcrux_ml_kem_hash_functions_portable_PRFxN_f1_93(prf_inputs, prf_outputs); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____1 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6( + Eurydice_array_to_slice((size_t)128U, prf_outputs[i0], uint8_t)); + error_1[i0] = uu____1; + } + /* Passing arrays by value in Rust generates a copy in C */ + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 copy_of_error_1[3U]; + memcpy( + copy_of_error_1, error_1, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + tuple_b0 lit; + memcpy( + lit.fst, copy_of_error_1, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + lit.snd = domain_separator; + return lit; +} + +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF +with const generics +- LEN= 128 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_2b0( + Eurydice_slice input, uint8_t ret[128U]) { + uint8_t digest[128U] = {0U}; + libcrux_sha3_portable_shake256( + Eurydice_array_to_slice((size_t)128U, digest, uint8_t), input); + memcpy(ret, digest, (size_t)128U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.PRF_f1 +with const generics +- K= 3 +- LEN= 128 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0( + Eurydice_slice input, uint8_t ret[128U]) { + libcrux_ml_kem_hash_functions_portable_PRF_2b0(input, ret); +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_matrix_compute_vector_u_closure_d6(size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_error_reduce_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_polynomial_add_error_reduce_89_38( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d( + self->coefficients[j], (int16_t)1441); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_barrett_reduce_0d( + libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, + &error->coefficients[j])); + self->coefficients[j] = uu____0; + } +} + +/** + Compute u := InvertNTT(Aᵀ ◦ r̂) + e₁ +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_vector_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_vector_u_59( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*a_as_ntt)[3U], + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_1, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i0 = (size_t)0U; + i0 < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, a_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]); + i0++) { + size_t i1 = i0; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = a_as_ntt[i1]; + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, row, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0); + i++) { + size_t j = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *a_element = &row[j]; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product = + libcrux_ml_kem_polynomial_ntt_multiply_89_2a(a_element, &r_as_ntt[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1], + &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result[i1]); + libcrux_ml_kem_polynomial_add_error_reduce_89_38(&result[i1], &error_1[i1]); + } + memcpy( + ret, result, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.traits.decompress_1 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_traits_decompress_1_63( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_ZERO_0d(); + return libcrux_ml_kem_vector_portable_bitwise_and_with_constant_0d( + libcrux_ml_kem_vector_portable_sub_0d(uu____0, &v), (int16_t)1665); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_then_decompress_message with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d( + uint8_t serialized[32U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; i < (size_t)16U; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_compressed = + libcrux_ml_kem_vector_portable_deserialize_1_0d( + Eurydice_array_to_subslice2(serialized, (size_t)2U * i0, + (size_t)2U * i0 + (size_t)2U, + uint8_t)); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_traits_decompress_1_63(coefficient_compressed); + re.coefficients[i0] = uu____0; + } + return re; +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_message_error_reduce_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_normal_form = + libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d( + result.coefficients[i0], (int16_t)1441); + libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp = + libcrux_ml_kem_vector_portable_add_0d(self->coefficients[i0], + &message->coefficients[i0]); + libcrux_ml_kem_vector_portable_vector_type_PortableVector tmp0 = + libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, &tmp); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_barrett_reduce_0d(tmp0); + result.coefficients[i0] = uu____0; + } + return result; +} + +/** + Compute InverseNTT(tᵀ ◦ r̂) + e₂ + message +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_ring_element_v +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_matrix_compute_ring_element_v_54( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *r_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_2, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *message) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result = + libcrux_ml_kem_polynomial_ZERO_89_ea(); + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + size_t i0 = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product = + libcrux_ml_kem_polynomial_ntt_multiply_89_2a(&t_as_ntt[i0], + &r_as_ntt[i0]); + libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result, &product); + } + libcrux_ml_kem_invert_ntt_invert_ntt_montgomery_f6(&result); + result = libcrux_ml_kem_polynomial_add_message_error_reduce_89_ea( + error_2, message, result); + return result; +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 10 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_compress_02( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int16_t uu____0 = + libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + (uint8_t)(int32_t)10, (uint16_t)v.elements[i0]); + v.elements[i0] = uu____0; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d +with const generics +- COEFFICIENT_BITS= 10 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_0d_28( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_compress_02(v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_10 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_10_fc( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) { + uint8_t serialized[320U] = {0U}; + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_compress_0d_28( + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re->coefficients[i0])); + uint8_t bytes[20U]; + libcrux_ml_kem_vector_portable_serialize_10_0d(coefficient, bytes); + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + serialized, (size_t)20U * i0, (size_t)20U * i0 + (size_t)20U, uint8_t); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)20U, bytes, uint8_t), uint8_t); + } + memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 11 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_compress_020( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int16_t uu____0 = + libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + (uint8_t)(int32_t)11, (uint16_t)v.elements[i0]); + v.elements[i0] = uu____0; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d +with const generics +- COEFFICIENT_BITS= 11 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_0d_280( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_compress_020(v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_11 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_11_e1( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) { + uint8_t serialized[320U] = {0U}; + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_compress_0d_280( + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re->coefficients[i0])); + uint8_t bytes[22U]; + libcrux_ml_kem_vector_portable_serialize_11_0d(coefficient, bytes); + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + serialized, (size_t)22U * i0, (size_t)22U * i0 + (size_t)22U, uint8_t); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)22U, bytes, uint8_t), uint8_t); + } + memcpy(ret, serialized, (size_t)320U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.compress_then_serialize_ring_element_u with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- COMPRESSION_FACTOR= 10 +- OUT_LEN= 320 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[320U]) { + uint8_t uu____0[320U]; + libcrux_ml_kem_serialize_compress_then_serialize_10_fc(re, uu____0); + memcpy(ret, uu____0, (size_t)320U * sizeof(uint8_t)); +} + +/** + Call [`compress_then_serialize_ring_element_u`] on each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.compress_then_serialize_u +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- OUT_LEN= 960 +- COMPRESSION_FACTOR= 10 +- BLOCK_LEN= 320 +*/ +static inline void libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 input[3U], + Eurydice_slice out) { + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, input, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0); + i++) { + size_t i0 = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = input[i0]; + Eurydice_slice uu____0 = Eurydice_slice_subslice2( + out, i0 * ((size_t)960U / (size_t)3U), + (i0 + (size_t)1U) * ((size_t)960U / (size_t)3U), uint8_t); + uint8_t ret[320U]; + libcrux_ml_kem_serialize_compress_then_serialize_ring_element_u_5f(&re, + ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)320U, ret, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 4 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_compress_021( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int16_t uu____0 = + libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + (uint8_t)(int32_t)4, (uint16_t)v.elements[i0]); + v.elements[i0] = uu____0; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d +with const generics +- COEFFICIENT_BITS= 4 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_0d_281( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_compress_021(v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_4 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_4_9a( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, + Eurydice_slice serialized) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_portable_compress_0d_281( + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re.coefficients[i0])); + uint8_t bytes[8U]; + libcrux_ml_kem_vector_portable_serialize_4_0d(coefficient, bytes); + Eurydice_slice_copy( + Eurydice_slice_subslice2(serialized, (size_t)8U * i0, + (size_t)8U * i0 + (size_t)8U, uint8_t), + Eurydice_array_to_slice((size_t)8U, bytes, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress.compress +with const generics +- COEFFICIENT_BITS= 5 +*/ +static KRML_MUSTINLINE libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_compress_022( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_VECTOR_TRAITS_FIELD_ELEMENTS_IN_VECTOR; i++) { + size_t i0 = i; + int16_t uu____0 = + libcrux_ml_kem_vector_portable_compress_compress_ciphertext_coefficient( + (uint8_t)(int32_t)5, (uint16_t)v.elements[i0]); + v.elements[i0] = uu____0; + } + return v; +} + +/** +This function found in impl {(libcrux_ml_kem::vector::traits::Operations for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.vector.portable.compress_0d +with const generics +- COEFFICIENT_BITS= 5 +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_compress_0d_282( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_compress_compress_022(v); +} + +/** +A monomorphic instance of libcrux_ml_kem.serialize.compress_then_serialize_5 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_5_1f( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, + Eurydice_slice serialized) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficients = + libcrux_ml_kem_vector_portable_compress_0d_282( + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re.coefficients[i0])); + uint8_t bytes[10U]; + libcrux_ml_kem_vector_portable_serialize_5_0d(coefficients, bytes); + Eurydice_slice_copy( + Eurydice_slice_subslice2(serialized, (size_t)10U * i0, + (size_t)10U * i0 + (size_t)10U, uint8_t), + Eurydice_array_to_slice((size_t)10U, bytes, uint8_t), uint8_t); + } +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.compress_then_serialize_ring_element_v with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- COMPRESSION_FACTOR= 4 +- OUT_LEN= 128 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re, Eurydice_slice out) { + libcrux_ml_kem_serialize_compress_then_serialize_4_9a(re, out); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.encrypt +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] with const +generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_LEN= 960 +- C2_LEN= 128 +- U_COMPRESSION_FACTOR= 10 +- V_COMPRESSION_FACTOR= 4 +- BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline void libcrux_ml_kem_ind_cpa_encrypt_60(Eurydice_slice public_key, + uint8_t message[32U], + Eurydice_slice randomness, + uint8_t ret[1088U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U]; + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_33( + Eurydice_slice_subslice_to(public_key, (size_t)1152U, uint8_t, size_t), + t_as_ntt); + Eurydice_slice seed = + Eurydice_slice_subslice_from(public_key, (size_t)1152U, uint8_t, size_t); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A[3U][3U]; + uint8_t ret0[34U]; + libcrux_ml_kem_utils_into_padded_array_ea1(seed, ret0); + libcrux_ml_kem_matrix_sample_matrix_A_38(ret0, false, A); + uint8_t prf_input[33U]; + libcrux_ml_kem_utils_into_padded_array_ea2(randomness, prf_input); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input0[33U]; + memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t)); + tuple_b0 uu____1 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc( + copy_of_prf_input0, 0U); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 r_as_ntt[3U]; + memcpy( + r_as_ntt, uu____1.fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + uint8_t domain_separator0 = uu____1.snd; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input[33U]; + memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t)); + tuple_b0 uu____3 = libcrux_ml_kem_ind_cpa_sample_ring_element_cbd_ac( + copy_of_prf_input, domain_separator0); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_1[3U]; + memcpy( + error_1, uu____3.fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + uint8_t domain_separator = uu____3.snd; + prf_input[32U] = domain_separator; + uint8_t prf_output[128U]; + libcrux_ml_kem_hash_functions_portable_PRF_f1_ee0( + Eurydice_array_to_slice((size_t)33U, prf_input, uint8_t), prf_output); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_2 = + libcrux_ml_kem_sampling_sample_from_binomial_distribution_c6( + Eurydice_array_to_slice((size_t)128U, prf_output, uint8_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 u[3U]; + libcrux_ml_kem_matrix_compute_vector_u_59(A, r_as_ntt, error_1, u); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_message[32U]; + memcpy(copy_of_message, message, (size_t)32U * sizeof(uint8_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 message_as_ring_element = + libcrux_ml_kem_serialize_deserialize_then_decompress_message_0d( + copy_of_message); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 v = + libcrux_ml_kem_matrix_compute_ring_element_v_54( + t_as_ntt, r_as_ntt, &error_2, &message_as_ring_element); + uint8_t ciphertext[1088U] = {0U}; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____5[3U]; + memcpy( + uu____5, u, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + libcrux_ml_kem_ind_cpa_compress_then_serialize_u_a7( + uu____5, Eurydice_array_to_subslice2(ciphertext, (size_t)0U, (size_t)960U, + uint8_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____6 = v; + libcrux_ml_kem_serialize_compress_then_serialize_ring_element_v_4e( + uu____6, Eurydice_array_to_subslice_from((size_t)1088U, ciphertext, + (size_t)960U, uint8_t, size_t)); + memcpy(ret, ciphertext, (size_t)1088U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::MlKem)#1} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.kdf_d8 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_d8_41( + Eurydice_slice shared_secret, libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_, + uint8_t ret[32U]) { + uint8_t out[32U] = {0U}; + Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), + shared_secret, uint8_t); + memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_MlKem with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline void libcrux_ml_kem_ind_cca_decapsulate_70( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t), + (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_secret_key = uu____0.fst; + Eurydice_slice secret_key0 = uu____0.snd; + Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( + secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_public_key = uu____1.fst; + Eurydice_slice secret_key = uu____1.snd; + Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at( + secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_public_key_hash = uu____2.fst; + Eurydice_slice implicit_rejection_value = uu____2.snd; + uint8_t decrypted[32U]; + libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value, + decrypted); + uint8_t to_hash0[64U]; + libcrux_ml_kem_utils_into_padded_array_ea( + Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); + Eurydice_slice_copy( + Eurydice_array_to_subslice_from( + (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, size_t), + ind_cpa_public_key_hash, uint8_t); + uint8_t hashed[64U]; + libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); + Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice shared_secret0 = uu____3.fst; + Eurydice_slice pseudorandomness = uu____3.snd; + uint8_t to_hash[1120U]; + libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash); + Eurydice_slice uu____4 = Eurydice_array_to_subslice_from( + (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, size_t); + Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext), + uint8_t); + uint8_t implicit_rejection_shared_secret0[32U]; + libcrux_ml_kem_hash_functions_portable_PRF_f1_ee( + Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), + implicit_rejection_shared_secret0); + Eurydice_slice uu____5 = ind_cpa_public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_decrypted[32U]; + memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t)); + uint8_t expected_ciphertext[1088U]; + libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted, + pseudorandomness, expected_ciphertext); + uint8_t implicit_rejection_shared_secret[32U]; + libcrux_ml_kem_variant_kdf_d8_41( + Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0, + uint8_t), + ciphertext, implicit_rejection_shared_secret); + uint8_t shared_secret[32U]; + libcrux_ml_kem_variant_kdf_d8_41(shared_secret0, ciphertext, shared_secret); + uint8_t ret0[32U]; + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( + libcrux_ml_kem_types_as_ref_00_24(ciphertext), + Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t), + Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t), + Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, + uint8_t), + ret0); + memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); +} + +/** + Portable decapsulate +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.decapsulate with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline void +libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + libcrux_ml_kem_ind_cca_decapsulate_70(private_key, ciphertext, ret); +} + +/** + Decapsulate ML-KEM 768 + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an [`MlKem768PrivateKey`] and an + [`MlKem768Ciphertext`]. +*/ +static inline void libcrux_ml_kem_mlkem768_portable_decapsulate( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + libcrux_ml_kem_ind_cca_instantiations_portable_decapsulate_2e( + private_key, ciphertext, ret); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::MlKem)#1} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_d8 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_d8_63( + Eurydice_slice randomness, uint8_t ret[32U]) { + uint8_t out[32U] = {0U}; + Eurydice_slice_copy(Eurydice_array_to_slice((size_t)32U, out, uint8_t), + randomness, uint8_t); + memcpy(ret, out, (size_t)32U * sizeof(uint8_t)); +} + +/** +This function found in impl {(libcrux_ml_kem::hash_functions::Hash<K> for +libcrux_ml_kem::hash_functions::portable::PortableHash<K>)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.hash_functions.portable.H_f1 +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_hash_functions_portable_H_f1_1a( + Eurydice_slice input, uint8_t ret[32U]) { + libcrux_ml_kem_hash_functions_portable_H(input, ret); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_MlKem with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + uint8_t randomness0[32U]; + libcrux_ml_kem_variant_entropy_preprocess_d8_63( + Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0); + uint8_t to_hash[64U]; + libcrux_ml_kem_utils_into_padded_array_ea( + Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash); + Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( + (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, + size_t); + uint8_t ret[32U]; + libcrux_ml_kem_hash_functions_portable_H_f1_1a( + Eurydice_array_to_slice((size_t)1184U, + libcrux_ml_kem_types_as_slice_cb_50(public_key), + uint8_t), + ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t); + uint8_t hashed[64U]; + libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed); + Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice shared_secret = uu____1.fst; + Eurydice_slice pseudorandomness = uu____1.snd; + Eurydice_slice uu____2 = Eurydice_array_to_slice( + (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t)); + uint8_t ciphertext[1088U]; + libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness, + pseudorandomness, ciphertext); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_ciphertext[1088U]; + memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); + libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 = + libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext); + uint8_t shared_secret_array[32U]; + libcrux_ml_kem_variant_kdf_d8_41(shared_secret, &ciphertext0, + shared_secret_array); + libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_shared_secret_array[32U]; + memcpy(copy_of_shared_secret_array, shared_secret_array, + (size_t)32U * sizeof(uint8_t)); + tuple_3c lit; + lit.fst = uu____5; + memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t)); + return lit; +} + +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.encapsulate with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_3c +libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_encapsulate_cd(uu____0, copy_of_randomness); +} + +/** + Encapsulate ML-KEM 768 + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] + bytes of `randomness`. +*/ +static inline tuple_3c libcrux_ml_kem_mlkem768_portable_encapsulate( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_instantiations_portable_encapsulate_c6( + uu____0, copy_of_randomness); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::MlKem)#1} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_d8 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e( + Eurydice_slice key_generation_seed, uint8_t ret[64U]) { + uint8_t seed[33U] = {0U}; + Eurydice_slice_copy( + Eurydice_array_to_subslice2( + seed, (size_t)0U, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t), + key_generation_seed, uint8_t); + seed[LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE] = + (uint8_t)(size_t)3U; + uint8_t ret0[64U]; + libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_array_to_slice((size_t)33U, seed, uint8_t), ret0); + memcpy(ret, ret0, (size_t)64U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e.closure +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_matrix_compute_As_plus_e_closure_87(size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** +A monomorphic instance of libcrux_ml_kem.vector.traits.to_standard_domain +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_traits_to_standard_domain_59( + libcrux_ml_kem_vector_portable_vector_type_PortableVector v) { + return libcrux_ml_kem_vector_portable_montgomery_multiply_by_constant_0d( + v, LIBCRUX_ML_KEM_VECTOR_TRAITS_MONTGOMERY_R_SQUARED_MOD_FIELD_MODULUS); +} + +/** +This function found in impl +{libcrux_ml_kem::polynomial::PolynomialRingElement<Vector>[TraitClause@0]} +*/ +/** +A monomorphic instance of libcrux_ml_kem.polynomial.add_standard_error_reduce_89 +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *self, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error) { + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t j = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector + coefficient_normal_form = + libcrux_ml_kem_vector_traits_to_standard_domain_59( + self->coefficients[j]); + libcrux_ml_kem_vector_portable_vector_type_PortableVector uu____0 = + libcrux_ml_kem_vector_portable_barrett_reduce_0d( + libcrux_ml_kem_vector_portable_add_0d(coefficient_normal_form, + &error->coefficients[j])); + self->coefficients[j] = uu____0; + } +} + +/** + Compute  ◦ ŝ + ê +*/ +/** +A monomorphic instance of libcrux_ml_kem.matrix.compute_As_plus_e +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_matrix_compute_As_plus_e_60( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 (*matrix_A)[3U], + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *s_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *error_as_ntt, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 result[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + result[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i0 = (size_t)0U; + i0 < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, matrix_A, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0[3U]); + i0++) { + size_t i1 = i0; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *row = matrix_A[i1]; + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, row, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0); + i++) { + size_t j = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *matrix_element = + &row[j]; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 product = + libcrux_ml_kem_polynomial_ntt_multiply_89_2a(matrix_element, + &s_as_ntt[j]); + libcrux_ml_kem_polynomial_add_to_ring_element_89_84(&result[i1], + &product); + } + libcrux_ml_kem_polynomial_add_standard_error_reduce_89_03( + &result[i1], &error_as_ntt[i1]); + } + memcpy( + ret, result, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.serialize_uncompressed_ring_element with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics + +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *re, uint8_t ret[384U]) { + uint8_t serialized[384U] = {0U}; + for (size_t i = (size_t)0U; + i < LIBCRUX_ML_KEM_POLYNOMIAL_VECTORS_IN_RING_ELEMENT; i++) { + size_t i0 = i; + libcrux_ml_kem_vector_portable_vector_type_PortableVector coefficient = + libcrux_ml_kem_vector_traits_to_unsigned_representative_db( + re->coefficients[i0]); + uint8_t bytes[24U]; + libcrux_ml_kem_vector_portable_serialize_12_0d(coefficient, bytes); + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + serialized, (size_t)24U * i0, (size_t)24U * i0 + (size_t)24U, uint8_t); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)24U, bytes, uint8_t), uint8_t); + } + memcpy(ret, serialized, (size_t)384U * sizeof(uint8_t)); +} + +/** + Call [`serialize_uncompressed_ring_element`] for each ring element. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_secret_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- OUT_LEN= 1152 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_secret_key_b5( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *key, + uint8_t ret[1152U]) { + uint8_t out[1152U] = {0U}; + for (size_t i = (size_t)0U; + i < Eurydice_slice_len( + Eurydice_array_to_slice( + (size_t)3U, key, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0), + libcrux_ml_kem_polynomial_PolynomialRingElement_f0); + i++) { + size_t i0 = i; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 re = key[i0]; + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + out, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + (i0 + (size_t)1U) * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + uint8_t); + uint8_t ret0[384U]; + libcrux_ml_kem_serialize_serialize_uncompressed_ring_element_5b(&re, ret0); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)384U, ret0, uint8_t), uint8_t); + } + memcpy(ret, out, (size_t)1152U * sizeof(uint8_t)); +} + +/** + Concatenate `t` and `ρ` into the public key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.serialize_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- RANKED_BYTES_PER_RING_ELEMENT= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ind_cpa_serialize_public_key_79( + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *t_as_ntt, + Eurydice_slice seed_for_a, uint8_t ret[1184U]) { + uint8_t public_key_serialized[1184U] = {0U}; + Eurydice_slice uu____0 = Eurydice_array_to_subslice2( + public_key_serialized, (size_t)0U, (size_t)1152U, uint8_t); + uint8_t ret0[1152U]; + libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(t_as_ntt, ret0); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)1152U, ret0, uint8_t), uint8_t); + Eurydice_slice_copy( + Eurydice_array_to_subslice_from((size_t)1184U, public_key_serialized, + (size_t)1152U, uint8_t, size_t), + seed_for_a, uint8_t); + memcpy(ret, public_key_serialized, (size_t)1184U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_MlKem with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- RANKED_BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_generate_keypair_fc(Eurydice_slice key_generation_seed) { + uint8_t hashed[64U]; + libcrux_ml_kem_variant_cpa_keygen_seed_d8_0e(key_generation_seed, hashed); + Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U, + uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice seed_for_A0 = uu____0.fst; + Eurydice_slice seed_for_secret_and_error = uu____0.snd; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U]; + uint8_t ret[34U]; + libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret); + libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose); + uint8_t prf_input[33U]; + libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error, + prf_input); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input0[33U]; + memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t)); + tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc( + copy_of_prf_input0, 0U); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U]; + memcpy( + secret_as_ntt, uu____2.fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + uint8_t domain_separator = uu____2.snd; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input[33U]; + memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U]; + memcpy( + error_as_ntt, + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input, + domain_separator) + .fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U]; + libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt, + error_as_ntt, t_as_ntt); + uint8_t seed_for_A[32U]; + Result_00 dst; + Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]); + unwrap_41_83(dst, seed_for_A); + uint8_t public_key_serialized[1184U]; + libcrux_ml_kem_ind_cpa_serialize_public_key_79( + t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t), + public_key_serialized); + uint8_t secret_key_serialized[1152U]; + libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt, + secret_key_serialized); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_secret_key_serialized[1152U]; + memcpy(copy_of_secret_key_serialized, secret_key_serialized, + (size_t)1152U * sizeof(uint8_t)); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_public_key_serialized[1184U]; + memcpy(copy_of_public_key_serialized, public_key_serialized, + (size_t)1184U * sizeof(uint8_t)); + libcrux_ml_kem_utils_extraction_helper_Keypair768 lit; + memcpy(lit.fst, copy_of_secret_key_serialized, + (size_t)1152U * sizeof(uint8_t)); + memcpy(lit.snd, copy_of_public_key_serialized, + (size_t)1184U * sizeof(uint8_t)); + return lit; +} + +/** + Serialize the secret key. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.serialize_kem_secret_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SERIALIZED_KEY_LEN= 2400 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48( + Eurydice_slice private_key, Eurydice_slice public_key, + Eurydice_slice implicit_rejection_value, uint8_t ret[2400U]) { + uint8_t out[2400U] = {0U}; + size_t pointer = (size_t)0U; + uint8_t *uu____0 = out; + size_t uu____1 = pointer; + size_t uu____2 = pointer; + Eurydice_slice_copy( + Eurydice_array_to_subslice2( + uu____0, uu____1, uu____2 + Eurydice_slice_len(private_key, uint8_t), + uint8_t), + private_key, uint8_t); + pointer = pointer + Eurydice_slice_len(private_key, uint8_t); + uint8_t *uu____3 = out; + size_t uu____4 = pointer; + size_t uu____5 = pointer; + Eurydice_slice_copy( + Eurydice_array_to_subslice2( + uu____3, uu____4, uu____5 + Eurydice_slice_len(public_key, uint8_t), + uint8_t), + public_key, uint8_t); + pointer = pointer + Eurydice_slice_len(public_key, uint8_t); + Eurydice_slice uu____6 = Eurydice_array_to_subslice2( + out, pointer, pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t); + uint8_t ret0[32U]; + libcrux_ml_kem_hash_functions_portable_H_f1_1a(public_key, ret0); + Eurydice_slice_copy( + uu____6, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t); + pointer = pointer + LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE; + uint8_t *uu____7 = out; + size_t uu____8 = pointer; + size_t uu____9 = pointer; + Eurydice_slice_copy( + Eurydice_array_to_subslice2( + uu____7, uu____8, + uu____9 + Eurydice_slice_len(implicit_rejection_value, uint8_t), + uint8_t), + implicit_rejection_value, uint8_t); + memcpy(ret, out, (size_t)2400U * sizeof(uint8_t)); +} + +/** + Packed API + + Generate a key pair. + + Depending on the `Vector` and `Hasher` used, this requires different hardware + features +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_MlKem with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_generate_keypair_8c(uint8_t randomness[64U]) { + Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2( + randomness, (size_t)0U, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t); + Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( + (size_t)64U, randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, + size_t); + libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = + libcrux_ml_kem_ind_cpa_generate_keypair_fc(ind_cpa_keypair_randomness); + uint8_t ind_cpa_private_key[1152U]; + memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); + uint8_t public_key[1184U]; + memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); + uint8_t secret_key_serialized[2400U]; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48( + Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), + Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t), + implicit_rejection_value, secret_key_serialized); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_secret_key_serialized[2400U]; + memcpy(copy_of_secret_key_serialized, secret_key_serialized, + (size_t)2400U * sizeof(uint8_t)); + libcrux_ml_kem_types_MlKemPrivateKey_55 private_key = + libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized); + libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_public_key[1184U]; + memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t)); + return libcrux_ml_kem_types_from_17_35( + uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key)); +} + +/** + Portable generate key pair. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.generate_keypair with const +generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5( + uint8_t randomness[64U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[64U]; + memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_generate_keypair_8c(copy_of_randomness); +} + +/** + Generate ML-KEM 768 Key Pair +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_mlkem768_portable_generate_key_pair(uint8_t randomness[64U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[64U]; + memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_instantiations_portable_generate_keypair_d5( + copy_of_randomness); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::Kyber)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.kdf_33 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_kdf_33_f0( + Eurydice_slice shared_secret, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + uint8_t kdf_input[64U]; + libcrux_ml_kem_utils_into_padded_array_ea(shared_secret, kdf_input); + Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( + (size_t)64U, kdf_input, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, + size_t); + uint8_t ret0[32U]; + libcrux_ml_kem_hash_functions_portable_H_f1_1a( + Eurydice_array_to_slice((size_t)1088U, + libcrux_ml_kem_types_as_slice_d4_1d(ciphertext), + uint8_t), + ret0); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)32U, ret0, uint8_t), uint8_t); + uint8_t ret1[32U]; + libcrux_ml_kem_hash_functions_portable_PRF_f1_ee( + Eurydice_array_to_slice((size_t)64U, kdf_input, uint8_t), ret1); + memcpy(ret, ret1, (size_t)32U * sizeof(uint8_t)); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.decapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_Kyber with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline void libcrux_ml_kem_ind_cca_decapsulate_700( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)2400U, private_key->value, uint8_t), + (size_t)1152U, uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_secret_key = uu____0.fst; + Eurydice_slice secret_key0 = uu____0.snd; + Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( + secret_key0, (size_t)1184U, uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_public_key = uu____1.fst; + Eurydice_slice secret_key = uu____1.snd; + Eurydice_slice_uint8_t_x2 uu____2 = Eurydice_slice_split_at( + secret_key, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice ind_cpa_public_key_hash = uu____2.fst; + Eurydice_slice implicit_rejection_value = uu____2.snd; + uint8_t decrypted[32U]; + libcrux_ml_kem_ind_cpa_decrypt_43(ind_cpa_secret_key, ciphertext->value, + decrypted); + uint8_t to_hash0[64U]; + libcrux_ml_kem_utils_into_padded_array_ea( + Eurydice_array_to_slice((size_t)32U, decrypted, uint8_t), to_hash0); + Eurydice_slice_copy( + Eurydice_array_to_subslice_from( + (size_t)64U, to_hash0, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, size_t), + ind_cpa_public_key_hash, uint8_t); + uint8_t hashed[64U]; + libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_array_to_slice((size_t)64U, to_hash0, uint8_t), hashed); + Eurydice_slice_uint8_t_x2 uu____3 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice shared_secret0 = uu____3.fst; + Eurydice_slice pseudorandomness = uu____3.snd; + uint8_t to_hash[1120U]; + libcrux_ml_kem_utils_into_padded_array_ea0(implicit_rejection_value, to_hash); + Eurydice_slice uu____4 = Eurydice_array_to_subslice_from( + (size_t)1120U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, + uint8_t, size_t); + Eurydice_slice_copy(uu____4, libcrux_ml_kem_types_as_ref_00_24(ciphertext), + uint8_t); + uint8_t implicit_rejection_shared_secret0[32U]; + libcrux_ml_kem_hash_functions_portable_PRF_f1_ee( + Eurydice_array_to_slice((size_t)1120U, to_hash, uint8_t), + implicit_rejection_shared_secret0); + Eurydice_slice uu____5 = ind_cpa_public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_decrypted[32U]; + memcpy(copy_of_decrypted, decrypted, (size_t)32U * sizeof(uint8_t)); + uint8_t expected_ciphertext[1088U]; + libcrux_ml_kem_ind_cpa_encrypt_60(uu____5, copy_of_decrypted, + pseudorandomness, expected_ciphertext); + uint8_t implicit_rejection_shared_secret[32U]; + libcrux_ml_kem_variant_kdf_33_f0( + Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret0, + uint8_t), + ciphertext, implicit_rejection_shared_secret); + uint8_t shared_secret[32U]; + libcrux_ml_kem_variant_kdf_33_f0(shared_secret0, ciphertext, shared_secret); + uint8_t ret0[32U]; + libcrux_ml_kem_constant_time_ops_compare_ciphertexts_select_shared_secret_in_constant_time( + libcrux_ml_kem_types_as_ref_00_24(ciphertext), + Eurydice_array_to_slice((size_t)1088U, expected_ciphertext, uint8_t), + Eurydice_array_to_slice((size_t)32U, shared_secret, uint8_t), + Eurydice_array_to_slice((size_t)32U, implicit_rejection_shared_secret, + uint8_t), + ret0); + memcpy(ret, ret0, (size_t)32U * sizeof(uint8_t)); +} + +/** + Portable decapsulate +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.kyber_decapsulate with const +generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CPA_SECRET_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- CIPHERTEXT_SIZE= 1088 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- C1_BLOCK_SIZE= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +- IMPLICIT_REJECTION_HASH_INPUT_SIZE= 1120 +*/ +static inline void +libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + libcrux_ml_kem_ind_cca_decapsulate_700(private_key, ciphertext, ret); +} + +/** + Decapsulate Kyber 768 + + Generates an [`MlKemSharedSecret`]. + The input is a reference to an [`MlKem768PrivateKey`] and an + [`MlKem768Ciphertext`]. +*/ +static inline void libcrux_ml_kem_mlkem768_portable_kyber_decapsulate( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext, uint8_t ret[32U]) { + libcrux_ml_kem_ind_cca_instantiations_portable_kyber_decapsulate_fc( + private_key, ciphertext, ret); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::Kyber)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.entropy_preprocess_33 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_entropy_preprocess_33_8a( + Eurydice_slice randomness, uint8_t ret[32U]) { + libcrux_ml_kem_hash_functions_portable_H_f1_1a(randomness, ret); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.encapsulate +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_Kyber with const generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_3c libcrux_ml_kem_ind_cca_encapsulate_cd0( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + uint8_t randomness0[32U]; + libcrux_ml_kem_variant_entropy_preprocess_33_8a( + Eurydice_array_to_slice((size_t)32U, randomness, uint8_t), randomness0); + uint8_t to_hash[64U]; + libcrux_ml_kem_utils_into_padded_array_ea( + Eurydice_array_to_slice((size_t)32U, randomness0, uint8_t), to_hash); + Eurydice_slice uu____0 = Eurydice_array_to_subslice_from( + (size_t)64U, to_hash, LIBCRUX_ML_KEM_CONSTANTS_H_DIGEST_SIZE, uint8_t, + size_t); + uint8_t ret[32U]; + libcrux_ml_kem_hash_functions_portable_H_f1_1a( + Eurydice_array_to_slice((size_t)1184U, + libcrux_ml_kem_types_as_slice_cb_50(public_key), + uint8_t), + ret); + Eurydice_slice_copy( + uu____0, Eurydice_array_to_slice((size_t)32U, ret, uint8_t), uint8_t); + uint8_t hashed[64U]; + libcrux_ml_kem_hash_functions_portable_G_f1_e4( + Eurydice_array_to_slice((size_t)64U, to_hash, uint8_t), hashed); + Eurydice_slice_uint8_t_x2 uu____1 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), + LIBCRUX_ML_KEM_CONSTANTS_SHARED_SECRET_SIZE, uint8_t, + Eurydice_slice_uint8_t_x2); + Eurydice_slice shared_secret = uu____1.fst; + Eurydice_slice pseudorandomness = uu____1.snd; + Eurydice_slice uu____2 = Eurydice_array_to_slice( + (size_t)1184U, libcrux_ml_kem_types_as_slice_cb_50(public_key), uint8_t); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness0, (size_t)32U * sizeof(uint8_t)); + uint8_t ciphertext[1088U]; + libcrux_ml_kem_ind_cpa_encrypt_60(uu____2, copy_of_randomness, + pseudorandomness, ciphertext); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_ciphertext[1088U]; + memcpy(copy_of_ciphertext, ciphertext, (size_t)1088U * sizeof(uint8_t)); + libcrux_ml_kem_mlkem768_MlKem768Ciphertext ciphertext0 = + libcrux_ml_kem_types_from_01_9f(copy_of_ciphertext); + uint8_t shared_secret_array[32U]; + libcrux_ml_kem_variant_kdf_33_f0(shared_secret, &ciphertext0, + shared_secret_array); + libcrux_ml_kem_mlkem768_MlKem768Ciphertext uu____5 = ciphertext0; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_shared_secret_array[32U]; + memcpy(copy_of_shared_secret_array, shared_secret_array, + (size_t)32U * sizeof(uint8_t)); + tuple_3c lit; + lit.fst = uu____5; + memcpy(lit.snd, copy_of_shared_secret_array, (size_t)32U * sizeof(uint8_t)); + return lit; +} + +/** + Portable encapsulate +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.kyber_encapsulate with const +generics +- K= 3 +- CIPHERTEXT_SIZE= 1088 +- PUBLIC_KEY_SIZE= 1184 +- T_AS_NTT_ENCODED_SIZE= 1152 +- C1_SIZE= 960 +- C2_SIZE= 128 +- VECTOR_U_COMPRESSION_FACTOR= 10 +- VECTOR_V_COMPRESSION_FACTOR= 4 +- VECTOR_U_BLOCK_LEN= 320 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +- ETA2= 2 +- ETA2_RANDOMNESS_SIZE= 128 +*/ +static inline tuple_3c +libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_encapsulate_cd0(uu____0, copy_of_randomness); +} + +/** + Encapsulate Kyber 768 + + Generates an ([`MlKem768Ciphertext`], [`MlKemSharedSecret`]) tuple. + The input is a reference to an [`MlKem768PublicKey`] and [`SHARED_SECRET_SIZE`] + bytes of `randomness`. +*/ +static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key, + uint8_t randomness[32U]) { + libcrux_ml_kem_types_MlKemPublicKey_15 *uu____0 = public_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[32U]; + memcpy(copy_of_randomness, randomness, (size_t)32U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_encapsulate_7a( + uu____0, copy_of_randomness); +} + +/** +This function found in impl {(libcrux_ml_kem::variant::Variant for +libcrux_ml_kem::variant::Kyber)} +*/ +/** +A monomorphic instance of libcrux_ml_kem.variant.cpa_keygen_seed_33 +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +*/ +static KRML_MUSTINLINE void libcrux_ml_kem_variant_cpa_keygen_seed_33_b6( + Eurydice_slice key_generation_seed, uint8_t ret[64U]) { + libcrux_ml_kem_hash_functions_portable_G_f1_e4(key_generation_seed, ret); +} + +/** +A monomorphic instance of libcrux_ml_kem.ind_cpa.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_Kyber with const generics +- K= 3 +- PRIVATE_KEY_SIZE= 1152 +- PUBLIC_KEY_SIZE= 1184 +- RANKED_BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_utils_extraction_helper_Keypair768 +libcrux_ml_kem_ind_cpa_generate_keypair_fc0( + Eurydice_slice key_generation_seed) { + uint8_t hashed[64U]; + libcrux_ml_kem_variant_cpa_keygen_seed_33_b6(key_generation_seed, hashed); + Eurydice_slice_uint8_t_x2 uu____0 = Eurydice_slice_split_at( + Eurydice_array_to_slice((size_t)64U, hashed, uint8_t), (size_t)32U, + uint8_t, Eurydice_slice_uint8_t_x2); + Eurydice_slice seed_for_A0 = uu____0.fst; + Eurydice_slice seed_for_secret_and_error = uu____0.snd; + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 A_transpose[3U][3U]; + uint8_t ret[34U]; + libcrux_ml_kem_utils_into_padded_array_ea1(seed_for_A0, ret); + libcrux_ml_kem_matrix_sample_matrix_A_38(ret, true, A_transpose); + uint8_t prf_input[33U]; + libcrux_ml_kem_utils_into_padded_array_ea2(seed_for_secret_and_error, + prf_input); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input0[33U]; + memcpy(copy_of_prf_input0, prf_input, (size_t)33U * sizeof(uint8_t)); + tuple_b0 uu____2 = libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc( + copy_of_prf_input0, 0U); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 secret_as_ntt[3U]; + memcpy( + secret_as_ntt, uu____2.fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + uint8_t domain_separator = uu____2.snd; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_prf_input[33U]; + memcpy(copy_of_prf_input, prf_input, (size_t)33U * sizeof(uint8_t)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 error_as_ntt[3U]; + memcpy( + error_as_ntt, + libcrux_ml_kem_ind_cpa_sample_vector_cbd_then_ntt_fc(copy_of_prf_input, + domain_separator) + .fst, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 t_as_ntt[3U]; + libcrux_ml_kem_matrix_compute_As_plus_e_60(A_transpose, secret_as_ntt, + error_as_ntt, t_as_ntt); + uint8_t seed_for_A[32U]; + Result_00 dst; + Eurydice_slice_to_array2(&dst, seed_for_A0, Eurydice_slice, uint8_t[32U]); + unwrap_41_83(dst, seed_for_A); + uint8_t public_key_serialized[1184U]; + libcrux_ml_kem_ind_cpa_serialize_public_key_79( + t_as_ntt, Eurydice_array_to_slice((size_t)32U, seed_for_A, uint8_t), + public_key_serialized); + uint8_t secret_key_serialized[1152U]; + libcrux_ml_kem_ind_cpa_serialize_secret_key_b5(secret_as_ntt, + secret_key_serialized); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_secret_key_serialized[1152U]; + memcpy(copy_of_secret_key_serialized, secret_key_serialized, + (size_t)1152U * sizeof(uint8_t)); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_public_key_serialized[1184U]; + memcpy(copy_of_public_key_serialized, public_key_serialized, + (size_t)1184U * sizeof(uint8_t)); + libcrux_ml_kem_utils_extraction_helper_Keypair768 lit; + memcpy(lit.fst, copy_of_secret_key_serialized, + (size_t)1152U * sizeof(uint8_t)); + memcpy(lit.snd, copy_of_public_key_serialized, + (size_t)1184U * sizeof(uint8_t)); + return lit; +} + +/** + Packed API + + Generate a key pair. + + Depending on the `Vector` and `Hasher` used, this requires different hardware + features +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.generate_keypair +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector, +libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]], +libcrux_ml_kem_variant_Kyber with const generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_generate_keypair_8c0(uint8_t randomness[64U]) { + Eurydice_slice ind_cpa_keypair_randomness = Eurydice_array_to_subslice2( + randomness, (size_t)0U, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t); + Eurydice_slice implicit_rejection_value = Eurydice_array_to_subslice_from( + (size_t)64U, randomness, + LIBCRUX_ML_KEM_CONSTANTS_CPA_PKE_KEY_GENERATION_SEED_SIZE, uint8_t, + size_t); + libcrux_ml_kem_utils_extraction_helper_Keypair768 uu____0 = + libcrux_ml_kem_ind_cpa_generate_keypair_fc0(ind_cpa_keypair_randomness); + uint8_t ind_cpa_private_key[1152U]; + memcpy(ind_cpa_private_key, uu____0.fst, (size_t)1152U * sizeof(uint8_t)); + uint8_t public_key[1184U]; + memcpy(public_key, uu____0.snd, (size_t)1184U * sizeof(uint8_t)); + uint8_t secret_key_serialized[2400U]; + libcrux_ml_kem_ind_cca_serialize_kem_secret_key_48( + Eurydice_array_to_slice((size_t)1152U, ind_cpa_private_key, uint8_t), + Eurydice_array_to_slice((size_t)1184U, public_key, uint8_t), + implicit_rejection_value, secret_key_serialized); + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_secret_key_serialized[2400U]; + memcpy(copy_of_secret_key_serialized, secret_key_serialized, + (size_t)2400U * sizeof(uint8_t)); + libcrux_ml_kem_types_MlKemPrivateKey_55 private_key = + libcrux_ml_kem_types_from_05_f2(copy_of_secret_key_serialized); + libcrux_ml_kem_types_MlKemPrivateKey_55 uu____2 = private_key; + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_public_key[1184U]; + memcpy(copy_of_public_key, public_key, (size_t)1184U * sizeof(uint8_t)); + return libcrux_ml_kem_types_from_17_35( + uu____2, libcrux_ml_kem_types_from_b6_da(copy_of_public_key)); +} + +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.kyber_generate_keypair with const +generics +- K= 3 +- CPA_PRIVATE_KEY_SIZE= 1152 +- PRIVATE_KEY_SIZE= 2400 +- PUBLIC_KEY_SIZE= 1184 +- BYTES_PER_RING_ELEMENT= 1152 +- ETA1= 2 +- ETA1_RANDOMNESS_SIZE= 128 +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b( + uint8_t randomness[64U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[64U]; + memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_generate_keypair_8c0(copy_of_randomness); +} + +/** + Generate Kyber 768 Key Pair +*/ +static inline libcrux_ml_kem_mlkem768_MlKem768KeyPair +libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair( + uint8_t randomness[64U]) { + /* Passing arrays by value in Rust generates a copy in C */ + uint8_t copy_of_randomness[64U]; + memcpy(copy_of_randomness, randomness, (size_t)64U * sizeof(uint8_t)); + return libcrux_ml_kem_ind_cca_instantiations_portable_kyber_generate_keypair_9b( + copy_of_randomness); +} + +/** + Validate an ML-KEM private key. + + This implements the Hash check in 7.3 3. + Note that the size checks in 7.2 1 and 2 are covered by the `SECRET_KEY_SIZE` + and `CIPHERTEXT_SIZE` in the `private_key` and `ciphertext` types. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_private_key +with types libcrux_ml_kem_hash_functions_portable_PortableHash[[$3size_t]] +with const generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_private_key_e7( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *_ciphertext) { + uint8_t t[32U]; + libcrux_ml_kem_hash_functions_portable_H_f1_1a( + Eurydice_array_to_subslice2(private_key->value, (size_t)384U * (size_t)3U, + (size_t)768U * (size_t)3U + (size_t)32U, + uint8_t), + t); + Eurydice_slice expected = Eurydice_array_to_subslice2( + private_key->value, (size_t)768U * (size_t)3U + (size_t)32U, + (size_t)768U * (size_t)3U + (size_t)64U, uint8_t); + return core_array_equality___core__cmp__PartialEq__0___Slice_U____for__Array_T__N___3__eq( + (size_t)32U, t, &expected, uint8_t, uint8_t, bool); +} + +/** + Portable private key validation +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.validate_private_key with const +generics +- K= 3 +- SECRET_KEY_SIZE= 2400 +- CIPHERTEXT_SIZE= 1088 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { + return libcrux_ml_kem_ind_cca_validate_private_key_e7(private_key, + ciphertext); +} + +/** + Validate a private key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool libcrux_ml_kem_mlkem768_portable_validate_private_key( + libcrux_ml_kem_types_MlKemPrivateKey_55 *private_key, + libcrux_ml_kem_mlkem768_MlKem768Ciphertext *ciphertext) { + return libcrux_ml_kem_ind_cca_instantiations_portable_validate_private_key_9c( + private_key, ciphertext); +} + +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_ring_elements_reduced.closure with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- PUBLIC_KEY_SIZE= 1184 +- K= 3 +*/ +static inline libcrux_ml_kem_polynomial_PolynomialRingElement_f0 +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_closure_cd0( + size_t _i) { + return libcrux_ml_kem_polynomial_ZERO_89_ea(); +} + +/** + This function deserializes ring elements and reduces the result by the field + modulus. + + This function MUST NOT be used on secret inputs. +*/ +/** +A monomorphic instance of +libcrux_ml_kem.serialize.deserialize_ring_elements_reduced with types +libcrux_ml_kem_vector_portable_vector_type_PortableVector with const generics +- PUBLIC_KEY_SIZE= 1184 +- K= 3 +*/ +static KRML_MUSTINLINE void +libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330( + Eurydice_slice public_key, + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 ret[3U]) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U]; + for (size_t i = (size_t)0U; i < (size_t)3U; i++) { + deserialized_pk[i] = libcrux_ml_kem_polynomial_ZERO_89_ea(); + } + for (size_t i = (size_t)0U; + i < Eurydice_slice_len(public_key, uint8_t) / + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT; + i++) { + size_t i0 = i; + Eurydice_slice ring_element = Eurydice_slice_subslice2( + public_key, i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + i0 * LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT + + LIBCRUX_ML_KEM_CONSTANTS_BYTES_PER_RING_ELEMENT, + uint8_t); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 uu____0 = + libcrux_ml_kem_serialize_deserialize_to_reduced_ring_element_4c( + ring_element); + deserialized_pk[i0] = uu____0; + } + memcpy( + ret, deserialized_pk, + (size_t)3U * sizeof(libcrux_ml_kem_polynomial_PolynomialRingElement_f0)); +} + +/** + Validate an ML-KEM public key. + + This implements the Modulus check in 7.2 2. + Note that the size check in 7.2 1 is covered by the `PUBLIC_KEY_SIZE` in the + `public_key` type. +*/ +/** +A monomorphic instance of libcrux_ml_kem.ind_cca.validate_public_key +with types libcrux_ml_kem_vector_portable_vector_type_PortableVector +with const generics +- K= 3 +- RANKED_BYTES_PER_RING_ELEMENT= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool libcrux_ml_kem_ind_cca_validate_public_key_19( + uint8_t *public_key) { + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 deserialized_pk[3U]; + libcrux_ml_kem_serialize_deserialize_ring_elements_reduced_330( + Eurydice_array_to_subslice_to((size_t)1184U, public_key, (size_t)1152U, + uint8_t, size_t), + deserialized_pk); + libcrux_ml_kem_polynomial_PolynomialRingElement_f0 *uu____0 = deserialized_pk; + uint8_t public_key_serialized[1184U]; + libcrux_ml_kem_ind_cpa_serialize_public_key_79( + uu____0, + Eurydice_array_to_subslice_from((size_t)1184U, public_key, (size_t)1152U, + uint8_t, size_t), + public_key_serialized); + return core_array_equality___core__cmp__PartialEq__Array_U__N___for__Array_T__N____eq( + (size_t)1184U, public_key, public_key_serialized, uint8_t, uint8_t, bool); +} + +/** + Portable public key validation +*/ +/** +A monomorphic instance of +libcrux_ml_kem.ind_cca.instantiations.portable.validate_public_key with const +generics +- K= 3 +- RANKED_BYTES_PER_RING_ELEMENT= 1152 +- PUBLIC_KEY_SIZE= 1184 +*/ +static KRML_MUSTINLINE bool +libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b( + uint8_t *public_key) { + return libcrux_ml_kem_ind_cca_validate_public_key_19(public_key); +} + +/** + Validate a public key. + + Returns `true` if valid, and `false` otherwise. +*/ +static inline bool libcrux_ml_kem_mlkem768_portable_validate_public_key( + libcrux_ml_kem_types_MlKemPublicKey_15 *public_key) { + return libcrux_ml_kem_ind_cca_instantiations_portable_validate_public_key_4b( + public_key->value); +} + +/** +This function found in impl {(core::clone::Clone for +libcrux_ml_kem::vector::portable::vector_type::PortableVector)} +*/ +static inline libcrux_ml_kem_vector_portable_vector_type_PortableVector +libcrux_ml_kem_vector_portable_vector_type_clone_3b( + libcrux_ml_kem_vector_portable_vector_type_PortableVector *self) { + return self[0U]; +} + +typedef int16_t libcrux_ml_kem_vector_portable_vector_type_FieldElement; + +typedef int16_t + libcrux_ml_kem_vector_portable_arithmetic_MontgomeryFieldElement; + +typedef int16_t + libcrux_ml_kem_vector_portable_arithmetic_FieldElementTimesMontgomeryR; + +#if defined(__cplusplus) +} +#endif + +#define __libcrux_mlkem768_portable_H_DEFINED +#endif + + +/* rename some types to be a bit more ergonomic */ +#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s +#define libcrux_mlkem768_pk_valid_result Option_92_s +#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s +#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s +#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s +#define libcrux_mlkem768_enc_result tuple_3c_s +/* defines for PRNG inputs */ +#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN 64 +#define LIBCRUX_ML_KEM_ENC_PRNG_LEN 32 @@ -25,27 +25,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -/* - * The btmp logging code is derived from login.c from util-linux and is under - * the the following license: - * - * Copyright (c) 1980, 1987, 1988 The Regents of the University of California. - * All rights reserved. - * - * Redistribution and use in source and binary forms are permitted - * provided that the above copyright notice and this paragraph are - * duplicated in all such forms and that any documentation, - * advertising materials, and other materials related to such - * distribution and use acknowledge that the software was developed - * by the University of California, Berkeley. The name of the - * University may not be used to endorse or promote products derived - * from this software without specific prior written permission. - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. - */ - - /** ** loginrec.c: platform-independent login recording and lastlog retrieval **/ @@ -603,6 +582,9 @@ line_abbrevname(char *dst, const char *src, int dstsize) memset(dst, '\0', dstsize); + if (strcmp(src, "ssh:notty") == 0) + return dst; + /* Always skip prefix if present */ if (strncmp(src, "/dev/", 5) == 0) src += 5; @@ -1651,23 +1633,20 @@ utmpx_get_entry(struct logininfo *li) #endif /* USE_UTMPX && HAVE_SETUTXDB && UTXDB_LASTLOGIN && HAVE_GETUTXUSER */ #ifdef USE_BTMP - /* - * Logs failed login attempts in _PATH_BTMP if that exists. - * The most common login failure is to give password instead of username. - * So the _PATH_BTMP file checked for the correct permission, so that - * only root can read it. - */ - +/* + * Logs failed login attempts in _PATH_BTMP if that exists. + * The most common login failure is to give password instead of username. + * So the _PATH_BTMP file checked for the correct permission, so that only + * root can read it. + */ void record_failed_login(struct ssh *ssh, const char *username, const char *hostname, const char *ttyn) { int fd; struct utmp ut; - struct sockaddr_storage from; - socklen_t fromlen = sizeof(from); - struct sockaddr_in *a4; - struct sockaddr_in6 *a6; + struct logininfo li; + socklen_t fromlen = sizeof(li.hostaddr); time_t t; struct stat fst; @@ -1683,47 +1662,31 @@ record_failed_login(struct ssh *ssh, const char *username, const char *hostname, strerror(errno)); goto out; } - if((fst.st_mode & (S_IXGRP | S_IRWXO)) || (fst.st_uid != 0)){ + if ((fst.st_mode & (S_IXGRP | S_IRWXO)) || fst.st_uid != 0) { logit("Excess permission or bad ownership on file %s", _PATH_BTMP); goto out; } - memset(&ut, 0, sizeof(ut)); - /* strncpy because we don't necessarily want nul termination */ - strncpy(ut.ut_user, username, sizeof(ut.ut_user)); - strlcpy(ut.ut_line, "ssh:notty", sizeof(ut.ut_line)); - + /* Construct a logininfo and turn it into a utmp */ + memset(&li, 0, sizeof(li)); + li.type = LTYPE_LOGIN; + li.pid = getpid(); + strlcpy(li.line, "ssh:notty", sizeof(li.line)); + strlcpy(li.username, username, sizeof(li.username)); + strlcpy(li.hostname, hostname, sizeof(li.hostname)); time(&t); - ut.ut_time = t; /* ut_time is not always a time_t */ - ut.ut_type = LOGIN_PROCESS; - ut.ut_pid = getpid(); - - /* strncpy because we don't necessarily want nul termination */ - strncpy(ut.ut_host, hostname, sizeof(ut.ut_host)); - - if (ssh_packet_connection_is_on_socket(ssh) && - getpeername(ssh_packet_get_connection_in(ssh), - (struct sockaddr *)&from, &fromlen) == 0) { - ipv64_normalise_mapped(&from, &fromlen); - if (from.ss_family == AF_INET) { - a4 = (struct sockaddr_in *)&from; - memcpy(&ut.ut_addr, &(a4->sin_addr), - MIN_SIZEOF(ut.ut_addr, a4->sin_addr)); - } -#ifdef HAVE_ADDR_V6_IN_UTMP - if (from.ss_family == AF_INET6) { - a6 = (struct sockaddr_in6 *)&from; - memcpy(&ut.ut_addr_v6, &(a6->sin6_addr), - MIN_SIZEOF(ut.ut_addr_v6, a6->sin6_addr)); - } -#endif + li.tv_sec = t > 0 ? (unsigned long)t : 0; + if (ssh_packet_connection_is_on_socket(ssh)) { + (void)getpeername(ssh_packet_get_connection_in(ssh), + &li.hostaddr.sa, &fromlen); } + construct_utmp(&li, &ut); - if (atomicio(vwrite, fd, &ut, sizeof(ut)) != sizeof(ut)) + if (atomicio(vwrite, fd, &ut, sizeof(ut)) != sizeof(ut)) { error("Failed to write to %s: %s", _PATH_BTMP, strerror(errno)); - + } out: close(fd); } @@ -1,4 +1,4 @@ -/* $OpenBSD: match.c,v 1.44 2023/04/06 03:19:32 djm Exp $ */ +/* $OpenBSD: match.c,v 1.45 2024/09/06 02:30:44 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -241,7 +241,7 @@ match_user(const char *user, const char *host, const char *ipaddr, /* test mode */ if (user == NULL && host == NULL && ipaddr == NULL) { - if ((p = strchr(pattern, '@')) != NULL && + if ((p = strrchr(pattern, '@')) != NULL && match_host_and_ip(NULL, NULL, p + 1) < 0) return -1; return 0; @@ -250,11 +250,11 @@ match_user(const char *user, const char *host, const char *ipaddr, if (user == NULL) return 0; /* shouldn't happen */ - if ((p = strchr(pattern, '@')) == NULL) + if (strrchr(pattern, '@') == NULL) return match_pattern(user, pattern); pat = xstrdup(pattern); - p = strchr(pat, '@'); + p = strrchr(pat, '@'); *p++ = '\0'; if ((ret = match_pattern(user, pat)) == 1) diff --git a/mlkem768.sh b/mlkem768.sh new file mode 100644 index 0000000..2fdc283 --- /dev/null +++ b/mlkem768.sh @@ -0,0 +1,148 @@ +#!/bin/sh +# $OpenBSD: mlkem768.sh,v 1.2 2024/09/04 05:11:33 djm Exp $ +# Placed in the Public Domain. +# + +WANT_LIBCRUX_REVISION="origin/main" + +FILES=" + libcrux/libcrux-ml-kem/cg/eurydice_glue.h + libcrux/libcrux-ml-kem/cg/libcrux_core.h + libcrux/libcrux-ml-kem/cg/libcrux_ct_ops.h + libcrux/libcrux-ml-kem/cg/libcrux_sha3_portable.h + libcrux/libcrux-ml-kem/cg/libcrux_mlkem768_portable.h +" + +START="$PWD" +die() { + echo "$@" 1>&2 + exit 1 +} + +set -xeuo pipefail +test -d libcrux || git clone https://github.com/cryspen/libcrux +cd libcrux +test `git diff | wc -l` -ne 0 && die "tree has unstaged changes" +git fetch +git checkout -B extract 1>&2 +git reset --hard $WANT_LIBCRUX_REVISION 1>&2 +LIBCRUX_REVISION=`git rev-parse HEAD` +set +x + +cd $START +( +printf '/* $Open'; printf 'BSD$ */\n' # Sigh +echo +echo "/* Extracted from libcrux revision $LIBCRUX_REVISION */" +echo +echo '/*' +cat libcrux/LICENSE-MIT | sed 's/^/ * /;s/ *$//' +echo ' */' +echo +echo '#if !defined(__GNUC__) || (__GNUC__ < 2)' +echo '# define __attribute__(x)' +echo '#endif' +echo '#define KRML_MUSTINLINE inline' +echo '#define KRML_NOINLINE __attribute__((noinline, unused))' +echo '#define KRML_HOST_EPRINTF(...)' +echo '#define KRML_HOST_EXIT(x) fatal_f("internal error")' +echo +for i in $FILES; do + echo "/* from $i */" + # Changes to all files: + # - remove all includes, we inline everything required. + # - cleanup whitespace + sed -e "/#include/d" \ + -e 's/[ ]*$//' \ + $i | \ + case "$i" in + # XXX per-file handling goes here. + # Default: pass through. + *) + cat + ;; + esac + echo +done + +echo +echo '/* rename some types to be a bit more ergonomic */' +echo '#define libcrux_mlkem768_keypair libcrux_ml_kem_mlkem768_MlKem768KeyPair_s' +echo '#define libcrux_mlkem768_pk_valid_result Option_92_s' +echo '#define libcrux_mlkem768_pk libcrux_ml_kem_types_MlKemPublicKey_15_s' +echo '#define libcrux_mlkem768_sk libcrux_ml_kem_types_MlKemPrivateKey_55_s' +echo '#define libcrux_mlkem768_ciphertext libcrux_ml_kem_mlkem768_MlKem768Ciphertext_s' +echo '#define libcrux_mlkem768_enc_result tuple_3c_s' +) > libcrux_mlkem768_sha3.h_new + +# Do some checks on the resultant file + +cat > libcrux_mlkem768_sha3_check.c << _EOF +#include <sys/types.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdbool.h> +#include <string.h> +#include <signal.h> +#include <err.h> +#include "crypto_api.h" +#define fatal_f(x) exit(1) +#include "libcrux_mlkem768_sha3.h_new" +int main(void) { + struct libcrux_mlkem768_keypair keypair = {0}; + struct libcrux_mlkem768_pk pk = {0}; + struct libcrux_mlkem768_sk sk = {0}; + struct libcrux_mlkem768_ciphertext ct = {0}; + struct libcrux_mlkem768_enc_result enc_result = {0}; + uint8_t kp_seed[64] = {0}, enc_seed[32] = {0}; + uint8_t shared_key[crypto_kem_mlkem768_BYTES]; + + if (sizeof(keypair.pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "keypair.pk bad"); + if (sizeof(keypair.sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "keypair.sk bad"); + if (sizeof(pk.value) != crypto_kem_mlkem768_PUBLICKEYBYTES) + errx(1, "pk bad"); + if (sizeof(sk.value) != crypto_kem_mlkem768_SECRETKEYBYTES) + errx(1, "sk bad"); + if (sizeof(ct.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "ct bad"); + if (sizeof(enc_result.fst.value) != crypto_kem_mlkem768_CIPHERTEXTBYTES) + errx(1, "enc_result ct bad"); + if (sizeof(enc_result.snd) != crypto_kem_mlkem768_BYTES) + errx(1, "enc_result shared key bad"); + + keypair = libcrux_ml_kem_mlkem768_portable_generate_key_pair(kp_seed); + if (!libcrux_ml_kem_mlkem768_portable_validate_public_key(&keypair.pk)) + errx(1, "valid smoke failed"); + enc_result = libcrux_ml_kem_mlkem768_portable_encapsulate(&keypair.pk, + enc_seed); + libcrux_ml_kem_mlkem768_portable_decapsulate(&keypair.sk, + &enc_result.fst, shared_key); + if (memcmp(shared_key, enc_result.snd, sizeof(shared_key)) != 0) + errx(1, "smoke failed"); + return 0; +} +_EOF +cc -Wall -Wextra -Wno-unused-parameter -o libcrux_mlkem768_sha3_check \ + libcrux_mlkem768_sha3_check.c +./libcrux_mlkem768_sha3_check + +# Extract PRNG inputs; there's no nice #defines for these +key_pair_rng_len=`sed -e '/^libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'` +enc_rng_len=`sed -e '/^static inline tuple_3c libcrux_ml_kem_mlkem768_portable_kyber_encapsulate[(]$/,/[)] {$/!d' < libcrux_mlkem768_sha3.h_new | grep 'uint8_t randomness\[[0-9]*U\][)]' | sed 's/.*randomness\[\([0-9]*\)U\].*/\1/'` +test -z "$key_pair_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_generate_key_pair randomness argument" +test -z "$enc_rng_len" && die "couldn't find size of libcrux_ml_kem_mlkem768_portable_kyber_encapsulate randomness argument" + +( +echo "/* defines for PRNG inputs */" +echo "#define LIBCRUX_ML_KEM_KEY_PAIR_PRNG_LEN $key_pair_rng_len" +echo "#define LIBCRUX_ML_KEM_ENC_PRNG_LEN $enc_rng_len" +) >> libcrux_mlkem768_sha3.h_new + +mv libcrux_mlkem768_sha3.h_new libcrux_mlkem768_sha3.h +rm libcrux_mlkem768_sha3_check libcrux_mlkem768_sha3_check.c +echo 1>&2 +echo "libcrux_mlkem768_sha3.h OK" 1>&2 + @@ -1,469 +1,412 @@ -# $OpenBSD: moduli,v 1.37 2024/03/26 01:23:11 dtucker Exp $ +# $OpenBSD: moduli,v 1.38 2024/08/21 07:06:27 dtucker Exp $ # Time Type Tests Tries Size Generator Modulus -20240104095616 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E18168688F265F -20240104095622 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E1816868B9D16B -20240104095623 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E1816868BE5B5B -20240104095635 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E18168691008CB -20240104095636 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E1816869118D93 -20240104095705 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E1816869F03EDB -20240104095716 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686A45B59F -20240104095724 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686A76925B -20240104095725 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686A7CBA63 -20240104095735 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686AC16E5B -20240104095748 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686B23EC2F -20240104095803 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686B8C2C0B -20240104095812 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686BC90DD7 -20240104095816 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686BE3B4F7 -20240104095818 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686BEB2A0B -20240104095834 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686C601253 -20240104095837 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686C747FFB -20240104095900 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D2720BF -20240104095904 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D3E5603 -20240104095908 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D5635F3 -20240104095917 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D92F173 -20240104095918 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D93EFD7 -20240104095920 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686D9E4673 -20240104095934 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686E020E77 -20240104095941 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686E319F3B -20240104095947 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686E5EC05F -20240104100001 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686EC17C4F -20240104100012 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686F12137F -20240104100026 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686F73FAC3 -20240104100029 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686F88A3FF -20240104100038 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686FC81D1F -20240104100039 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686FCD023B -20240104100042 2 6 100 2047 5 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181686FDA5E8F -20240104100056 2 6 100 2047 2 C383B937F2718D0CF93B36B8C4AA5B68E7B0E45E07100F8E40336B40B211BD1B4199CC92D5D03890022C8855239908B7348F8C76667368F8F73988568196B6308F9CCBB2571B9B88258C0DD717FB2ECB063B05BC2E36AE5EC2941E2D52133405B5DB9219C76B11764CAF1D73001036AB26ECE915DD4FE21251F01C19C415B0DA80231EE10410BEF198E0FE320E105844F537E2D6A45E77B0B16454931C30ED888D505641E5A4D07DD7937276ED988EB5DB7CC54C8CF5FF28FD39F4FBBC49AF7E023AE39396796A4736279495BC00EC89FE830A7C0BCDEFFDF910FD80F702078543CC2D1E53EB0F510EB9CBE78819B3E33BEA921612FCD755E4E181687044E3F3 -20240104100101 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8C5E15E3 -20240104100123 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8D074C03 -20240104100130 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8D33D613 -20240104100141 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8D811FD3 -20240104100145 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8D99912B -20240104100202 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8E169543 -20240104100223 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8EB0BA6B -20240104100226 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8EBF5F7B -20240104100227 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8EC40C1B -20240104100242 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8F2E1DF3 -20240104100245 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8F3C8C67 -20240104100254 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB8F795C9F -20240104100317 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB902632A3 -20240104100332 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB9096384B -20240104100334 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB90A286C3 -20240104100336 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB90AA1ABB -20240104100338 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB90B5380B -20240104100344 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB90DAA413 -20240104100351 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB910CE893 -20240104100351 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB910EBF0F -20240104100416 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB91C2935F -20240104100422 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB91EE5C43 -20240104100433 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB92428037 -20240104100436 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB924F7E5F -20240104100448 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB92A78E33 -20240104100452 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB92C39FFF -20240104100502 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB930AB887 -20240104100511 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB93484697 -20240104100513 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB934EE903 -20240104100521 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB93859FA3 -20240104100525 2 6 100 2047 5 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB93A15877 -20240104100532 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB93CEA42B -20240104100536 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB93F09E33 -20240104100547 2 6 100 2047 2 EDE2897770950A39DDAC39B88173C52469FCA04AAD0665C1C1FA7059B7859FD1F84ED9C9510F7ECAAD251C174DB09975EAE851EE71A9BD0F83F6E2022723E66ECDE73BFB6D940A1A1D6112197BC1DE040CDD9D3A80BDA683679CB0705FA548878C8720CB14BDAFFF61AE546A8450B000EAC1DB6756C04E7FF65D2131A1015F741396395858BA490C0A65920817F114BD74FCBF1019BFD5E3C31E49CE523818113DB2097DB3CBFF4F5D6F323F72A084C54CD042FC053D378F458CC55088D170BF36539FAD7A019AF20491C29A95FBF036C1D18B8035BB10ABB5321DDD1201DAF890AE31F3B77451C1A8A927AEBA77613E4EBBB490414B19451446A3BB943E537B -20240104101115 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A0D5ED5B -20240104101119 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A0DC38D3 -20240104101145 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A12CF7DB -20240104101213 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A17CE1A7 -20240104101309 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A21EA1DB -20240104101404 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A2CFD013 -20240104101448 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A356C09B -20240104101513 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A3A06C1B -20240104101532 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A3DC6ACB -20240104101754 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A59D6073 -20240104101824 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A5F889D3 -20240104101914 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A69226F3 -20240104102026 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A7778413 -20240104102104 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A7ED53AF -20240104102111 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A7FC79FB -20240104102143 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A85B8803 -20240104102252 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A938656F -20240104102259 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A9493BAF -20240104102310 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53A967D647 -20240104102422 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AA47EBC3 -20240104102451 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AAA0B5EB -20240104102523 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AB06D25F -20240104102545 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AB48A373 -20240104102701 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AC38C9B3 -20240104102738 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53ACA7A56B -20240104102808 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AD033D5F -20240104102825 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AD32BE27 -20240104102848 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AD75754B -20240104102913 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53ADBBC7BB -20240104102931 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53ADF2C9AF -20240104102936 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53ADFA97A3 -20240104103004 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AE4E97A3 -20240104103054 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AEE6F5A3 -20240104103136 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AF6C7D17 -20240104103155 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AFA24993 -20240104103204 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AFBD89BF -20240104103225 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53AFFADD37 -20240104103441 2 6 100 3071 2 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53B1BE6E0B -20240104103449 2 6 100 3071 5 E5200F78D0067C75B413BFE21DBBB301C8D14F8A46C0D16A957F5FD8708569CEFA51C549F9493C21ACE299A60AB6C8191EC47A356BBD2E41B9BDBC12486F1783F1FC3E559D29B4863898B5976E7108C391F1DD63B58F705109961D1577EDC807AFB96777476D1DD837AF21F81B6556EAB1BF0576552FF3304AABF72FFFC460E83982B3290C139E75D1628B2562B1A541D28551569C6336041CFCA45BAF9955EC7CE3364BBB9344C59BDFB346F1316F9D2538EDA32A6C4A018799ECB20FD383CC8191903B26FAE0F84FFF6FCB5E0D6CC50F25E7C2F4D05AC02BE22DF03781BDE9A5FC4951C4A20495E18B12111FCEB42F4B41CB9C6BE9E7FEBD2A224CFFB0028E2D22DA3A00CB48B2AFAB5287445B04ACFD65164EC97370FD89F2F04C2190D2AE9590CA2B88A4E946D1B62684D76AC39E291A201BF50BD9D521458AA9BA0F11416018F59D98DA058F5F4A67078AF968E51B193A74BE8486ABB1ACBD89A16D6F053B2FDB6D769195D2452E932719714E3474844AA606BD9D3186D4BB53B1D4228F -20240104103608 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F45F532253 -20240104103721 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46039F7FF -20240104103727 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46046CF03 -20240104103902 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4616F9AE3 -20240104103918 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4619C6F1B -20240104103932 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F461C2094F -20240104103959 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46210E24B -20240104104005 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4621D6F93 -20240104104014 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4623557F3 -20240104104041 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46283FC03 -20240104104104 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F462C76DF3 -20240104104124 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F463010D2F -20240104104145 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4633D54E7 -20240104104221 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F463A5D183 -20240104104232 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F463C2FF47 -20240104104250 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F463F7D33B -20240104104437 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4653512CF -20240104104548 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4661420E7 -20240104104605 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F466462DDB -20240104104608 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F466482167 -20240104104613 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46651DF9F -20240104104619 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4665D3CD3 -20240104104654 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F466C8206F -20240104104716 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46706CDFB -20240104104816 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F467C6AC6B -20240104104849 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F4682E9853 -20240104104939 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F468CD47B3 -20240104105103 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F469DC1C53 -20240104105116 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F469FD7CA7 -20240104105238 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46B04E72B -20240104105406 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46C1C8F1F -20240104105432 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46C69A60F -20240104105538 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46D3431C7 -20240104105600 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46D7551CF -20240104105623 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46DBA58FB -20240104105913 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46FDA4817 -20240104105921 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F46FEE672F -20240104105938 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F47022732B -20240104110025 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F470BAC72F -20240104110044 2 6 100 3071 5 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F470F2A087 -20240104110057 2 6 100 3071 2 EDCE3D686B1FF9B87585480575F96A54B973EBC8E9330E7CA890624CE60311FFB65EBFB08E9B6D6184895C6C78238241D12F50B9178DD3F77DEAABB0BDF084F9B7713B72CE5ABD25BAEECBFEC06957BC92D74EBC234D87B255ACD94372785BAAE5362EDD5E75D025FB7E4B36A9636A8F65141BDA5E5789F4C09E6FEEF47B2F56CBB05002856A2A85F3E25A83808E1AE44578ACA4A3139792B971D452CD2DFEE48A28C1CA7616E4E06218D0062EEDD5622D6F1B84DE03DBEA72F97A907F8CEFBB102C54657127F646A4B2422CE2503341B18E2E1424755628F11EB7B9D8938C939586E3CE84CD5620BD2AE105E7D821D97FC85B92F00A72DC47450C258143E1A5C99E4E89AC94E0BB028C650D10BB9EAB68C9EA5D7C3BB2D139590572A8421C3AE1B440DB320A99A439E542FB79754BAEE30361B8E8519FD118E60D33FDB1FC20FCE9A275CAEC3F4605DC8E1CBDBA207951BEFDE24227F34A9788EDBF91E9088A5255165F27AC8DF63FB4FDCEDB43FAD4D3E0606A0F27DD50C41BD5F47113FA93 -20240104111235 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92ED6D5283 -20240104111516 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92EE6BFE0B -20240104111802 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92EF69F083 -20240104111812 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92EF7314EF -20240104112330 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F168359B -20240104112346 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F17A8473 -20240104112646 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F293A44B -20240104113126 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F454A78B -20240104113140 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F463745B -20240104113405 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F5472E0B -20240104113513 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F5AB6593 -20240104113631 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F61DC737 -20240104113915 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F71C183B -20240104114114 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F7D25F1F -20240104114127 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F7E2A817 -20240104114209 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F81D6DE3 -20240104114242 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F847E7F3 -20240104114540 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92F95BB83B -20240104114912 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FAA7AC87 -20240104115220 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FBDD46BF -20240104115358 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FC763BD3 -20240104115645 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FD89AC93 -20240104115825 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FE24086F -20240104120004 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D92FEB1B48F -20240104121351 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9303DEC3DB -20240104121632 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9304D97987 -20240104121655 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9304F7758B -20240104121904 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9305BB0867 -20240104122020 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D93062D0873 -20240104122033 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D93063AE3CF -20240104122233 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9306EE09FB -20240104122350 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D930763399B -20240104122643 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D93086CF9BB -20240104122651 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D9308730BA3 -20240104122926 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D930966BF1F -20240104123326 2 6 100 4095 5 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D930ADB4A27 -20240104123447 2 6 100 4095 2 EEB25F20046DA7CBAC47745F4C0F4B81D854E699C4761A4175478874F20DBA865A392640F8B584C4B9B4B1731A946DF7A57CD37B61BE3964194F06CA3A67C34B26DD2BBF3028F0239D0D947FD9A2AA9B38374FDE72528B7FA745F09DB9C1BCE23028F9EC17D19F25F088E0242B5F3554541185A9A16858D1553CCB603778B07887190A898727269B4228247FB3CE1AEA89ADFB3D11710243C05FA76BC3556B980B039126B0DA69D1FE928F77A4F7920A1AD89BCBF2B78B7D602BB7AF9C16F0E208C0C7500F6DCA222680C786E43DBFC1003AA1977EE65498C5245F14D66BB690B6786EF3AC4E3422C10C8D016EBFA509F8E68E378E1C4910400FF13C318C1072C0AEA5864E211D088A7F13B6FCBABFCB2D006C7E5F22D149078964A87C31FA80A570DB73D00B178CC34D4A5BEFAA270EA30F80184F4FF98E1E0A6CB45474DEA9381A8871519EF3C1BF1F68378D8DE6D11966D14EEC08EC96A656E677A35B415D56711D16FF912CD2A30DCCE1CBB648437D82A73BFCBD4CA25DA1CCAF9F49646FA5F420C3F6CEE4A5A19DF750E9842B460025EEDFDF208622435D0205916B75EDB72050CDE2B51F9C37DD99987C8957FE46DBDD97CE5BACF1A0CD04FD82309BE29809714DE6F0BCCD73B9EF1BCEBE57A7DED76A1BD19F2237704CE93EF30725CEA5E4EFE122A782E53E6474D5A7AFFC75F1D4E4CF2035E3DA53BF7D930B505B73 -20240104123558 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE029B533 -20240104123620 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE047224B -20240104123807 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE0EBCB87 -20240104124250 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE2B0F0D7 -20240104124501 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE36ED43B -20240104124512 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE378775B -20240104125156 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE5F9437B -20240104125510 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE723ADDF -20240104125525 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE7329FCF -20240104125540 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE7439817 -20240104125851 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE86AB4DB -20240104125907 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE87B66BB -20240104125924 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE88F2753 -20240104130222 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CE9A5226B -20240104130442 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEA7DB5B3 -20240104130643 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEB398DAF -20240104130657 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEB479503 -20240104131100 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CECD07E8F -20240104131128 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CECF457BF -20240104131223 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CED437003 -20240104131543 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEE787A6B -20240104131552 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEE7EE587 -20240104131707 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEEF11B57 -20240104131858 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CEFA09947 -20240104132135 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF0963173 -20240104132305 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF11E122B -20240104132442 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF1B47BA3 -20240104132621 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF244368B -20240104132834 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF3139187 -20240104133205 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF455DA5B -20240104133257 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF49FB7F7 -20240104133331 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF4CF5FFB -20240104133444 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF5392DAB -20240104133611 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF5BB213B -20240104133702 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF609579B -20240104133750 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF64F4693 -20240104133858 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF6B0B2B3 -20240104134528 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF9174353 -20240104134709 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF9A9D48F -20240104134725 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CF9B8ECEF -20240104135017 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFAC6EE33 -20240104135028 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFACF7567 -20240104135526 2 6 100 4095 5 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFC9FDEEF -20240104135617 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFCE8DB8B -20240104135643 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFD0D1E7B -20240104135715 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFD3993D3 -20240104135931 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFE0D249B -20240104135940 2 6 100 4095 2 E8BBED0B2C20CE2D6D7C175858DF5007987AB4AC62559BFE502866F4BA984F41EC586A62B79DE81B818784CE66B4EF6EE06BE7C4242BE2A6DFA5D218E9D073A4162F0B05A1381AFCA6A27565DDD36D1EEF0812AA0CC37C3FEBA6CD728F8DD8FBBF5FF2C25C2D5F456EBF9EA83D6593AC7121E157F17101AE85DAC1B747A915C52159948A190454DBED5F7016F43D3F3BC2C496D6DE2A5DF17872B59789A4E5F503C4F1F096A3A9DCD1CA53D5CE88F6C00959DF042577D064467F375AAB350DCF6427078FAC4DB76E56A80A8AC4E3F276A2DC2E51DDB75F921B2F7A3C51D957B8A89F806FBD5879741438194AF82FC33DE8B5AF6D6D63A750DC1BC18A063CF6A824276A8F2447707DD110425B3644C19E3BAC8FC4686629D90101340691D026B8184EC4872FAC2A658FB8A4BBE5DF9B2A8A17D675FC9EEA09D12A8C8D7914712D21032FA35B056A95C60DB9F464EB15EC04C5CE8958A8CCE7600A207432BD6DBBDAC099DB42A6FAB7297FF7CDD77A80A245A16A9B01FF00442F0259EDB26BFD04BBF58E8CCD98C762BD1BFCF840398A5DF817F7632AEF5C1C9E9FFF766474308918E5D309DD318D0BACD2A75612BFE40FFCD6C14B55A96072C3FFC5F10DE4A3FF9D0DFCEE2EF21517D3095552873C9C875FF91E4518545D595B02B69D3E0CCC370270A0356F4CB3F7E0177557AD5AD730955DA0203EDDC3C19DE9D73CFE126753 -20240104142106 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1710332DCB -20240104143451 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1711E1C253 -20240104150313 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17156243B7 -20240104150556 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1715B0C103 -20240104150825 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1715F7F803 -20240104152907 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171886D57F -20240104154312 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171A440F23 -20240104154730 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171AC37183 -20240104155021 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171B12B0DF -20240104155636 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171BCE9CAF -20240104160727 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171D1EA6C3 -20240104162058 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A171ECBF4F3 -20240104163450 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1720828973 -20240104170537 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17246219FF -20240104173739 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17286C63FB -20240104180227 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A172B8A314F -20240104181102 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A172C9D0567 -20240104181529 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A172D236A93 -20240104184018 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1730435B07 -20240104184554 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1730F0EAAB -20240104185310 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1731CD5F77 -20240104185350 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1731DAA9B3 -20240104190334 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173307F9A7 -20240104191938 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17350588AF -20240104192635 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1735DAA9A3 -20240104193532 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1736F11283 -20240104193805 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17373C750B -20240104195916 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1739EBDD33 -20240104200312 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173A6430BB -20240104200754 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173AF2A68F -20240104202320 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173CDDF643 -20240104203508 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173E54E6E3 -20240104204338 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A173F5E5ABF -20240104205043 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174019A1B3 -20240104210231 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174197571B -20240104215505 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1748451A43 -20240104222200 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174BA0BE73 -20240104223343 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174D1343FB -20240104223558 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174D50F24B -20240104223657 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A174D65D7C3 -20240104230313 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1750A0115B -20240104232200 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1752FC1F4F -20240104232649 2 6 100 6143 5 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A17538FC137 -20240104233816 2 6 100 6143 2 E26B3DF44B6BDB283DD87C8FCFB841E7116C771B87651254D58C3ED54FCF6E041E04B189F53C0AAA9838EADA85D258A70516CAFE7752EB065542E89F25CFD74BEAC3A0B1EDC79D677137E229915D5E7F9AEC2386582B4E069651943CAFE738A6A435BF75D91B4ED92D571B74DB636A155162D8E43D2B3889E09241842FCEF7FF9841E69942817C72C20A23B015F781AC740D1FC7CC9CCBF98D8C92CAB153F8CE24E540A2325E9769AD8F4B6DE329919F797259B691DFF2FA06BAB66E11E5BB5556D8BADFE3F6B41EA905FBB17A7D602ACDFB98BD2F7F80204329121D3607C64547FE04E34A9F6C14F6BA70ECC6929880A305B6C647F4D1E3B4257FD60666C9FDA9E44F5A3C76818054A2BE034C80F7756854B8AC3694412A8632F10F794AD16EFC696C2B792A906F7E8B9B99086DB52C3BC1436B1D8B91489C1D7B910204DE03F8D837989BB65C1C69E35E5F3EFB61F79EE8877880ECA82F1A1CC886E4FC72EB5AB28A77584C11B8D26BA67F1E07AFCB19F478AE21E71A1A48E9ECC05388B7AE6D053EAB219F659D6353412261BE121E30F35CFB527FCFFB9EDA780CE6B3AABC281018EF7ED7612AF8E877496C8008229786D2656FC13028BA3AE818BEBCF5089ECC8C7E91CC8866838BCB4F605EC8C3CB236523C1F3FE67C63AD9E3C03AA7A8ECC2C78749FE2CBB046812E823750EB78124A61932972AEB7573BB7D3DC47597883C0B4DADD75E1D4752C08DECF2345B9A2DB5655CBF056843DC655FE0EE540E0A80BD113BCA208DC60C30A98ED742B262126D304A51D763A83F6FC09113F6DDF3583AAB10A6D16856900D1F0E0B61214DBAB00C353ED0A7D9B3E02A5D4E0EBAA6974408F4277F7C191CE9A7941FEBB456A38C6841CA5124D6B23373F97C6428D7BA96F4722B8110DE4078C3570E663039BE9B7B20C90474FE759C9391CFA635EC3D89CE491318DA89877CE31782F10F053F46DED6864FE28970C605E0B1C5D4BFAFD961DFBAC5EC123626D9B55592713918CC21A1A522FDD0C407E42532022DBE030A844C8008E184DDE76EA3F8B6333BCC27F23BA58170CE691A1754FE4CC3 -20240104235816 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E526A4027 -20240105000102 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E52B9D47F -20240105000341 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5307C49B -20240105002604 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E55C8951F -20240105005413 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E594FDC6B -20240105011251 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5BA98A8B -20240105013007 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5DCD786B -20240105013213 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5E08D3E3 -20240105013953 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5EF3AD33 -20240105014506 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5F8EAA8B -20240105014846 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E5FFDD18B -20240105014953 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E601A78EB -20240105015628 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E60E96A33 -20240105020424 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E61E408CF -20240105020757 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E6251DED3 -20240105022925 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E64FD3CDF -20240105024930 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E677F3A93 -20240105040144 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7077E4E7 -20240105040715 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7125CD47 -20240105041838 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7292290B -20240105043220 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7445EA7F -20240105045717 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E775FC3E3 -20240105050855 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E78C836D3 -20240105051736 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E79DB2663 -20240105053034 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7B7AF41B -20240105053602 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7C2244FB -20240105055132 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7E0B5887 -20240105060142 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E7F4B55DF -20240105062354 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E820CC287 -20240105062720 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E827312A3 -20240105070333 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E87007257 -20240105070659 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8765266B -20240105070824 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8788941F -20240105071340 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E882B5647 -20240105073012 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8A3A1757 -20240105073438 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8ABFBF6B -20240105074101 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8B83EBE3 -20240105075449 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8D2D8B0B -20240105075939 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E8DC91A67 -20240105083505 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E9233F247 -20240105091527 2 6 100 6143 2 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E97244C43 -20240105092237 2 6 100 6143 5 FF5C5D46851A712217A7872DC20FF08EDD8DAF1F5041D8E35C2889494C9D8EE9313A8425B2DF8ACE596A9B3044564D2DF404370C9F2B819E5E3F75FCD6A119BC357B24671D1F6221E94DADF4BBA056785FA323E6BCD416DD8A11799D997E73C6A32602F35592F31456FDF05CE5BECC9D233D607E6A6E1341CDE092E04376B35A81668315141B9F3EB5DB7D28A92A85F8175087FF4582636A29EBC0C14C1F8664BDFC4B1C3A5B405D240E0A67B81D3E8D366DCCF8649FFFACC530FEB87866AF3E765E9C8B7B19EAE109BD9BDB184137C7218AF8FF1E36BDE8FD9AFF4E4E29E9497A5104502CBE8A3A01A0D4C65C605A81EE3C3AF59DAD4AE4062201FD1F0AE0CC8FDE86625B1209EDE36FD81D573BA35A1153F6273C3F5DDEEC3E14BB20F6392E937FB2C11005B762FB8E5A61348AAF6374EC3F3A27498B5CCECD5447F7837C21D9EA418E689AD518778A3B4D70CB8CCE215CF5407CA93A882B8463F3311DC1757EF00554FD187F7A286D03AC715FC2CBABC7A00037D91EDF450DC6A515D2866D71555AD4073A87A5488F804A391890A48B2C8E8BD5AF53C97AA9505166788A216634B62DE3376E88621A47E5DA1A783B56C3D738473E9D751CC570F7EC94B8D76A9350CAA57D25F8621A6CB03B68A2E01D9FBD508E8C91CB8859544490936D5FCF198F3E5ADDD2C0DB756B3A94D9C357779C1867265F7CBE9EC00F726E683537DE973E59C7ACD928FA91AB996906D8FB6DBE6F1708913008D08180A3DE71AF098A481400BB5284B02B360080118163B2E19BEF45E51AD3A02D34E92B369C227355EE5BD6316E07991B211A87ED8F36FE5337C6969F4B0BC9FF626C5468F88D49B5A0BE005DC89E0AF7285710E14FC683FD9A99AC86749D8E1FF0BAC1CCB6D734BEFCBBA90F7F0D195860915578661F213012FB2C7F68C0E49D154B9D153D62C8C95084172A395F8E228688CE70226CA41435EB903E3EAAC6695BCE4E6AF36C63D387070D12009BE2B9ECAC9540896DCE83A4AAA6FF6F4ED14A169BC17A20B8AD165997536F55B7590483878B806458FAADC4AC60AE4326251A153B3E97FEE79F -20240105095913 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29046217ABB -20240105101403 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290471B744B -20240105104919 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2904974A54F -20240105113526 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2904C8FD633 -20240105121046 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2904ED8847F -20240105122212 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2904F9A37C7 -20240105154705 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2905D2EA893 -20240105162329 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2905F97BD13 -20240105164947 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290615186EB -20240105183728 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290687AC4D7 -20240105184151 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29068C000E3 -20240105202016 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2906F571D5F -20240105214209 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29074DB94EB -20240105224349 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29078F088AB -20240105224824 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2907938DD5F -20240106020909 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290869AA027 -20240106021855 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290874189E7 -20240106035257 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2908D8EE727 -20240106044018 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29090CAEA63 -20240106044946 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2909163261F -20240106045528 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E29091B93073 -20240106050848 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E2909297B81B -20240106092208 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290A3BCF3C7 -20240106101059 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290A7091163 -20240106101802 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290A77D0A0B -20240106104846 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290A989844F -20240106110203 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290AA67622F -20240106113157 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290AC6FC52B -20240106115438 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290ADE815A3 -20240106133228 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290B48CC803 -20240106133609 2 6 100 7679 5 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290B4C4DBCF -20240106134717 2 6 100 7679 2 D1501303160348FD3A7B93C0412E414592732D1C3780B7CEEAD4867A47FC4E561D607B47D1B05E93FAD668BBBB5F21CD009E5D3C9D7870A3FC811AA616A4F50A5F8A73DA799E4E2959006D1FD23D3DA241E8F5F7674904B56058A95AE30B7EB8ED4977C93E6C3460E0A4421B1BC044A93F71B8FB60C7EFE4B4C41454FF7BD38D5447AF6AE20D826D8244F9396EF549DFF6138BAE6BDFD3B1F2E1125365761CE905827D63F39605B703FF39EDA7A239D553012FAF6C33A327A4447868A9321D30ACE8F0DA43427BF73595D41C089F2F817245FCC4B38AE3DCDBD73C2F82386E53EE9BD4850754E21060B0688EC27CDC2045216E1FA70770F420230D8923361C30F10340A1715B1F642DCD397A5A3BA28C59B3F29818B896D45DD6B12F34BF69303048DB6A8DAF68F3DE4E9CB902C56D511578873A30869642961B242625FA41B5059ED0C9098DA1FC8EE928B6E5429EAFBEE721D5BAD923B35046CC09E85E1894FD0DEA671DBD5DC2FD42CD8FD2E52379544212ADE9F755712515AF31F47372F6DF80C9DAFF562542B7E26F32E373C5C83222FA83356071175C44F639B2711C7B3F74063CD8FDE5ED9E25BA806F4BE2504C339F03A1B9ABE0979D181A7F71624E2AB1DF6945C5FB419727BABFD9755A8019DAF7607273B57C7B9A802928D6C3B377E621988F6DBAA6FE322F14210244C1C3EDDF104F73D57A661F8CBF117D405A18E1B176A705049BD696244109AB272F4C5352C456D4C04D2A6001E1626E6E038F48093B3EF619B7BA9002A7E64BEFCCA297D71D08EF1C0E99962B55EF85CCD2F111F51AEEAD99C3085BC9AA936D1A55F5204281860E33EA6ACCC22CBFD6A1AD086E44B43E0E445B22F0A7222EC3417619461BB69E27B1A931EEECECA667DDF6A7AB24B3F369337F261A99DA78B55FB24FFFF315FA48882D70446E617F7804E8A743AAC7CA0A1F4FB3C31E37E0D51A6EC1E923C110763047E9AD04B1A321A3E3993D7A4C688DED76FB6B907D80DB3DB89589B98ECE42059630FE74FE945B0A92888B9D3566CC0384DDCD92C4B0455D7B5DD39E0A0DFED6C96A7C4B5095A231E67E8AF3D70742F37A4DEC85B0E060D7F304778062F0F4C3CE4019DEF66484000A0A79243EFFA5927813B30B915F454CD87A13B0B0403E65970194C98F042F26C25462D0F749B5255A5AC0D294DE30DDAFC1AEA00C7D280555003FD4C32C5C9987405CA4728104E469487794B3616BABA85B09A7369B8530FA565D2B04736386AD8938B8CEDAC0B1B9FE073B21B4D402BDFCE7AF4F8F69FD6695A013424FC8484AABAA19BDDFB74E1935EB972C6D6C0CA9E9A3C07333788552B446E290B5751C53 -20240106141837 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DEE2E4EE3 -20240106142436 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DEE8A7CD7 -20240106144829 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF015742F -20240106152038 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF234DAA7 -20240106160105 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF4EFC613 -20240106163121 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF6F6E203 -20240106163448 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF72A0C27 -20240106170007 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DF8E1C203 -20240106175041 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DFC3E7E5F -20240106184134 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7DFFA55BB7 -20240106194104 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E03A6612B -20240106201237 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E05C48B9B -20240106203135 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E070747CB -20240106215140 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E0C7B892B -20240106225612 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E10CEF363 -20240107002641 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E16E9D69B -20240107012956 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E1B324EEB -20240107014336 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E1C0FDB2F -20240107015412 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E1CC29D5F -20240107023117 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E1F39A223 -20240107024430 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E20145813 -20240107030408 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E2165D633 -20240107032720 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E22F0D6AF -20240107045444 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E28D2CA07 -20240107052034 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E2A83AF4B -20240107055000 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E2C7678F3 -20240107064332 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E3017D303 -20240107070345 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E316A269B -20240107071248 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E31F72497 -20240107073413 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E3368806B -20240107075627 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E34E626DF -20240107092923 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E3B1B9373 -20240107105443 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E40D41C83 -20240107120213 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E4560E6C7 -20240107121141 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E45F89EEF -20240107121703 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E464C599B -20240107132926 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E4B161313 -20240107142507 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E4ECFD6B3 -20240107151843 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E5258293B -20240107153743 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E539E84FB -20240107160830 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E55AB3C8F -20240107163047 2 6 100 7679 2 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E571F6DD3 -20240107170058 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E591D8A17 -20240107174158 2 6 100 7679 5 ECDBC2E7C98E3D4FEABA99C3FA3EEAAC6305023D95B895C4019BFC22601AB5F9D51E3CFC909E5B963B2C52654C150DECAEDA6D0397EB54F1DA714D70920CF4054E02B5CD515C51FCA359DC1733120FAA30541BC2707C9FA7B973464558F6A7119E9ACC9F0A62729B41A2CF697EBA9E646627E8DB08E967447517B31844C347B02576F9E8E9B80FBE14E5C1D42D5CA233644FA7652130878CCF740A59F20835B21FFBDB2B1EDE638AF89D50A3EE7E31E37DD712FD021DB31EDAE2981299034B6C0E4F99E40D4D8E179F384931DAC81A266507E586A01C60BBE107F6896ED9DF8F8CC7E4E50EEC3EAE34B00817FF531413A27B3F8DFFCBC297043E769DDF8CE267AE314F9CBEBEFBC43D46DCAA1948E1626094CF1D7109AABBF971D76CC4C8F8FEEB211BC7DA3748B0341C39126FF72497F6D0B4800CD8D47A1C64565C752ABD83B4B013CEE0547BE9EFC0C806F9B9318F5B2E34573E912A9A18A3778F82978BF2AB2ABCE38BF82F77A1FB15D6675BB0F881E2963686E2AF1842085AEFAF65DF160260D788DE8F1D955D89B70693E70F58EFE6E3B1C8C3852031BB44A17905DD9F083BFD8A8A4F08E1CDE8434B0CC84E9F119C0D56012FFB5854E3C427EC034E085733B77E072FE074714AEF51D8378774BCB2E7A38BD8FDED53AF1D086A508D90A2FE7AE66247BC4A476C9462FECD4EDF39147267EBAEFD44FA45E2E55B320E912CA67ECA0A768BC573B2639F3DC4D36CA747008A0B4EF891422F66123072F66753B5594981EBEC23CE739971AF90DB0822B1C312DD916395CAE325ABB2AD544C84C79C645095DF9BDD20FE6499B6999E471E85AA2012F38927A5B3AB17AA10956C240D9BB1151E6E83700C3759D74C463B56D5D215B812A5A5BA859B4237EF0E23D6C086A9A25A6ACCD2B830F64F677F83531CA0FDCEAAF65B96EF4C9772C73D4627BEAE8645ED34404F8A2F4FAB1FF4F56E28C5CA1D9AA227FD95DF5113FD07200E3D10065FA337160E544D0027C0A82B049204BA0A544B5E32B3F08B76404A85E2927630EC0324A50632657543A72E481F5418B1CB45B1DB93AA66539FF4A0120599F87705284BC1AB03EDD8FCFC9C0C2C4BD58276C1D4AC3680B05CED61B91AE9791140655A229D776900DB47379B99EF8ABF851E2F61099BF43F6870E1EF5D03CAC45D00F6927601241AC087C235098CEC4AFDC9DA8586108517F7D4D761D1FEA18110825E5EE903ED3562BF5E12A2C2A3B295553D3948A1B1F28B6B0F7D9C94D9AD634105D2A8BCE8E7C93FBF9CE2DD73047F6E1B616188375F94B3CDDC878B69C4FD9D918ED35FE45659093974E46247F09B8D3C23DAB5DA7E5BDEE42F -20240107195132 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C0BF412DB -20240107211121 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C106F1A93 -20240107220224 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C1347F0E7 -20240107223011 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C14CC844F -20240107233406 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C185DAE33 -20240108000524 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C1A253E97 -20240108013639 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C1D6DA233 -20240108015050 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C1E2A0393 -20240108022016 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C1FCAB623 -20240108033300 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C23A9F963 -20240108082339 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C33AB6633 -20240108085755 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C3584E623 -20240108101256 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C399FD6BF -20240108142359 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C47985243 -20240108150338 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C49B5DE8B -20240108163222 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C4E9B7AD7 -20240108194900 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C599C1087 -20240108204036 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C5C81D16B -20240108211124 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C5E307A1B -20240109020016 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C6E22534F -20240109031529 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C7259083B -20240109032856 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C73148B47 -20240109034303 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C73DA772B -20240109040437 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C7507EF03 -20240109045950 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C7828D92B -20240109064936 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C7E67E273 -20240109084815 2 6 100 8191 5 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C850D9B77 -20240109091115 2 6 100 8191 2 F601EC0972F67ADD6AA2031ABBAE6FAF062C5AD1619D32B18D43DB10D9B5E0A5E2F69321C963175289C7B809575F1CA9B1C51D14BDDFB5B9F825EB4F2890D9C5C0D6D03B42ED03B16816DA4213187289FC4F2C51710DF07506C50B2D0BD47A1D5EEF8832D8D62CE93BE30646F7EAAB30AD4C172C1F0162FDF61299C3EB1EB91AC76D9219DD0608C0640E080887E6BC4F076CFA6CAD2C64B5E2BA2803B13A34F28923897E861DF14CA58848A773F0B348788F6034F3AFAE3798DCDB196172229F7D9ED45857917411A1F4A79119F544B45CDC2F0D7CC8381BC31DF229A72CF03D150E016B3CA95D803B42463FAB8382B389A1B3FF4E76F2B4025E0872D28F9F4E356B9C967EE4230BB3AA8629626C12DD66282B0E2979F428F89131BECD4FEF45E028BEBBD3CA638F71F8832B7552212BBE1C1A2F213DC579E227285D6B1511303F6905A492CC08BE2361EA5E46A66E0633D35819FAF6B7DA7C9BBA485E2813D0122ADCFAEB5C2991AFFF76A7A746CCC4F9A40DAA3870FD943E92F3BD8F65CFA997A3635EE9F3BBB3D4E229AAA64F6F53C56F02E65DB06ACD2182FB013FB2E33EF6D8D2A40C9EE3885D7322B4F87F2EBEA0A799EF949BD7CE9657CBD7FD75485F7B68839167FE40F20C796B4CFA42FAC5593BFDA46FA6E416BC688D33426B0644BABC0E52CBA377CD0A3CC0D159A7B003F3BEEB9405B160D55264F7A31A52A9A4C7A1576494BC994925D574DF813CFB2C0DFA6B92B8EA6036B2D4CD5E54109F722C3F75690F3295EEE4CE512612711B1E59A0600701A8AA90D4FB6604B765E0AECB664F2318B556A2C1645865E1CD30CF50FFD2F6A8BA3D1642DEDD67F3E1B0516205F5EDC25FB21217666A1690DED31BD0020B6F7706C9E499EE23B2BF9265E43C23CEE5CA5F9B70ABBC437E8FBBD0295E639FB4858A99A85DDA4B3058145F7D2081A869C3D8A775DBB3FA66DE5FD1DD8278E7627891B845CC8B2918DD8FC21112F3D1AE4EA375AEC71F95A0C02251489CFDFC40272F8BF3C04469E5FB196C18081E94EB56731AC5EB40E5476B3D8743E69BDD7316C9ECEF9FE30FBABA7B4483CABFE9BF91F3BC536F022DAC1FE2A3E5090924CC23EC793A45DC9BF88384CA6152A82903C107517D3252E3067A2AF52E24A3B0A9B7A1CB9F8FAC05C8CAD0729A270432A437A5417CED21A7BC11086437A104C05D542E5BC3E106DCF2772FAE6A90E3FDC1F3397C3E0A16630EAC1F02302407B453C4B2956FB8BDACBD8DB142ACFBFC8345F339E89B8103D2C5AB252BAB6B78BDD869F2A0FC7A9ABD2F4E5DF78E4A13EEC2DCF0B90FCA6CE7E255E95CD5B2CC59855FD7509B6C8080ABBB205F01186E25EA88DEB918EBCD5D62D3008DC8E93A4C31C379A388FD58E92E0E1308D30D66DEFF4C02C46FAB280FC61FA205B7A7D074582D40BF4B5EE4B87C86562483 -20240109102754 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3113DE49B -20240109103838 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB311CE7D53 -20240109122733 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB31802BDDB -20240109144019 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB31F830A13 -20240109151803 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3218C2C43 -20240109172004 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB32877BA83 -20240109173200 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3291AFE77 -20240109175727 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB32A87A0F7 -20240109190851 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB32E84D477 -20240109232421 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB33CD99FDF -20240110000155 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB33EF7933B -20240110004723 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3417961D3 -20240110033004 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB34A9B46AB -20240110044250 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB34EAF64AB -20240110053016 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3514D538B -20240110060245 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3532513EB -20240110065303 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB355F0E0D7 -20240110065533 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3560D1433 -20240110075227 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB359366F87 -20240110100015 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3604C809B -20240110104106 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB36298E677 -20240110104740 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB362EE1733 -20240110111504 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3646C34FF -20240110112023 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB364B02F03 -20240110115553 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB366AD1CA7 -20240110120601 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB367384E6B -20240110130930 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB36ACD8457 -20240110133324 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB36C204A5B -20240110144137 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB36FE62043 -20240110150954 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB37171A81F -20240110152353 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3722EE947 -20240110152557 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB37242E447 -20240110152925 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3726B351F -20240110161518 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3750124BB -20240110163930 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB37655D503 -20240110171223 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3782C4503 -20240110173427 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3795E162F -20240110184239 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB37D2F5503 -20240110194145 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB3807A121F -20240110194314 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB38088267B -20240110200018 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB381776C63 -20240110211339 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB385922C6F -20240110230519 2 6 100 8191 2 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB38BF1EC13 -20240110230904 2 6 100 8191 5 F7D2DED9D5BF8F08F6729427B4FA345B673D55A16502D2B438B068D893B7FD078638BFC485EE380DA4F972F1E2D28F9DE0C9D32CFECE54C8FFACDFB01EF0CFEAF7E644667DAE998AC4E387CBB3D7A5E4CC822EAC7D515E6FFC76DF221FCF9C75B443A10C349D01D7B0EDE446DB84A638E4BB390362E25201D2B3766FAB1C154B24827C9DD3F26018960AD84D599FB5F0090E321AD891DBB94B9E755CE54B3A99BE00CE2CBA594205B28F277FB3205A531709AC7753EC2C38CEF555715CC56FD88780779CDFED96E1300F705E6426C9420275C5CFF3A5CEA59FCC57EF776B98DB7B23C1CE34F6097E778B6DA4AE5593C3827DF62AE582738497F51A089E30DCC44FADD4200A72DD9C11E645C56085678687ED0BD12E6C862EC0BA0FBEC9B5677534D83335C5550B6A04C6D52189E396CDFAD25D56344300D17DEEF76FA106741EA0A164EF404EBD6EE03ED514D3E0443B8C30535114CE68B8507B9C3F7F942E1E4A86AABDB9DF0D688842E9AB8508146E08F974FDB3D7E07DC7610FC4BB3259FB2F1FB9142B77640715690A53E6B9E1CB43F270CE35A585BD6BD5F8E7415C27273F0B6C040D4F293C71FFAED61319DAF9FAAD3BE65671657B7A3C1F115CE315A3C329DF25DA1C3CC8EEA18AC8BCDCF1E965B573FC5B194AF79F04FE7B3E28347EB73F12F19B87548D9A34DE6820D78D5490F93B126A0ECB6696E32E917EC922BB27BC3DED89EF206AE1917F74B4C642043C54F77AC8B9273CC68BE4A1131E634263057E10C97C866934AE984D8D4D2FDDF833AB58AAB209A193D0E6AEDDB70A8E6AD7DB2090412118687DF9817B1D81D00C64925A4995F19368813CCFC1D13BAD28B8C449A71FA42CEFFB1251D7CBC01875C80ED21FF370638E4EBE5CC4EA7674B24599826390C84DA1F292E7B989E838F047ABE7A075E357D90068037E886ADB9A869E0C62513A7E0B90231AA40AA8F96A5A795482410EB3FEA4D1CC5549CD50FF2B2AA5A42DB4366B3CABF54EE92B830D8EE77293A03E436A637CFCA3FE7CF60B662FFDD8C72516C2F2370978BC2DEF32D88FB55801D1E22878C8C86B7DD63077A700639A95A30C7DD522943D99C9CA17059715B6884FB786FE50994915D41B0D9DDC8AA2517094CFF9C1769E05F548C5222486B798EFE13788351E986CAAFFE3D95A0082C822CECB7D55FBAF4DD026849765690E283433B0B6B0060533863CA03736FB7973BF83EE5C12C1A3FA3F4E64A23746A9DB919257C06ED0918FB1BC8D28EB4A72DDC37954680C91FF58811883342B3FE2D8FA68623C139BFB6843E858156317C8C803D5971871F2A55C0A36CC5FED30733FB09F6F5D87825300E543B02DDCCD6C4CE68E977C7EA824B5E9EC28B671DC4B28224C6CE43F2BC3B729E3C833403C2FF9F082B2445368A132F97C088E90367832BB69F5C54CB38C21AB87 +20240326013051 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DDC5DFB +20240326013055 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85DF8EE9F +20240326013100 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E15B2AF +20240326013115 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85E8800BB +20240326013121 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EA93D9F +20240326013127 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85ED33B77 +20240326013129 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EDE96FB +20240326013133 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85EFDC7AB +20240326013135 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F004B07 +20240326013147 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F5A20FB +20240326013151 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F780007 +20240326013154 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F873847 +20240326013155 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F8792BF +20240326013158 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85F99602B +20240326013212 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A85FFDCCE7 +20240326013219 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86033F8F7 +20240326013239 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860C92607 +20240326013244 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A860EACC9F +20240326013252 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8612623A3 +20240326013254 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86131122B +20240326013256 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86137AE5B +20240326013316 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861CE9FAB +20240326013319 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861DDF033 +20240326013322 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A861F71477 +20240326013330 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8622DF73F +20240326013333 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8623FA97B +20240326013347 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862A6F8D3 +20240326013357 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A862EDADB3 +20240326013401 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86306A44F +20240326013402 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8630A4F4F +20240326013406 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86329C6AF +20240326013412 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8634D56D7 +20240326013433 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A863ECB6D7 +20240326013438 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8640E99FF +20240326013448 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86456D45B +20240326013455 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8648DB9CF +20240326013456 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86490C78B +20240326013506 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864D48787 +20240326013511 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A864F4C14B +20240326013522 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A86546E877 +20240326013524 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8654FB6D3 +20240326013529 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865742D0B +20240326013534 2 6 100 2047 2 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A8659900A3 +20240326013537 2 6 100 2047 5 D221068E02C30ED0DB86E4A0861A1E810B7BB629273F85D3706B90056B2CF34C342FF875ACADDDF5E49A87B1B038567EB05D77EADB0905CD24ECC8240F5EF15DCF197BBF61895F00DDD75D949C9BFF7066625602DBD460D9EA7D9E06F70AA721011BE246139444E9AB4ABFCCCB1A5943E67BF7D3AA5ADCF214945B1E7D8E40E44BD60D9ECD3C5E151944467F1B3DD3CFEDEA7C15CAD12F4F9AC78C7E0DEE2E15713C13FAFDC297DF06F3FB0BEBD1F481C642527085FAF48A29CB1BE20D5FE235E29345BF213C475F5A20CFA960E716987614825120EA968864837EEB68DB47A1F3336927BB9ADCC54A4341228289F92F9E23F1FFFB1E59DFCA8017A865A3FE37 +20240326013538 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F049F51F +20240326013547 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0859D0B +20240326013554 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F0BBD077 +20240326013607 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F11279FB +20240326013628 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F1B2B0DB +20240326013645 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F22EA4A7 +20240326013653 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F266CCCB +20240326013656 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F27B8CC3 +20240326013704 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F2B6898B +20240326013728 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F3661F27 +20240326013732 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F382F33F +20240326013755 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F42B19A3 +20240326013815 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4BFFC7F +20240326013816 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4C4D313 +20240326013818 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F4CB895F +20240326013838 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F55F34E3 +20240326013843 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F581582B +20240326013845 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F58BB9BF +20240326013904 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F61FCE5B +20240326013920 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F69490CF +20240326013923 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F6A8041B +20240326013953 2 6 100 2047 2 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7815AF3 +20240326014006 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F7E1576F +20240326014014 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F818E747 +20240326014019 2 6 100 2047 5 F7B6DB1359F90C032532089BF3BAE4A2ED1209EE181E517D24238A7EDF32489C1E6F3DBA19C01489FF3B6A2764E932B108218462111D8C834EB642726F08FDBEEBC08DC25A2ABD10D72DE4053EF4B48AD385A0EB97F1EF96F01BAA45AA914BAD8096B97919F724C1075FCFBA43119006C61A5F4E991B791E1056730CF19E9215B482F6047104269C1122AA14A76B5537621C0A620CE4BD63A70B898E002D19BD2897A1D036B6283EF9CB8ADF92806CAEA8AEFCDE63F945C5F098E11824BE3493225F9848E08F4AAB4E4C3621D8AF209C02058683332CE1163D158C484ECF99095C889B900127DE4367D2A8433E5D23DAB5F5AEBDA97C425F8B169759F83E49A7 +20240326014532 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3425DB7F +20240326014544 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34464EAF +20240326014614 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A349D1663 +20240326014629 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A34C39EC3 +20240326014710 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3544B6B7 +20240326014727 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3574A89B +20240326014741 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A359DA947 +20240326014823 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A361FBA5F +20240326014832 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A36377BB3 +20240326015023 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A19A47 +20240326015025 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37A30F2B +20240326015030 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37AD1B0F +20240326015038 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A37C0B3FF +20240326015116 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38348BB3 +20240326015159 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A38BA81C7 +20240326015331 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A39D93F9B +20240326015416 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3A61FCDF +20240326015505 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3AFA877F +20240326015516 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3B1796B3 +20240326015601 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3BA5A777 +20240326015813 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3D516827 +20240326020106 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7A7897 +20240326020108 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A3F7B337B +20240326020156 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A4012DDF3 +20240326020241 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A409D1FB7 +20240326020357 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418A36C7 +20240326020359 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A418AC37F +20240326020434 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A41F5DCD3 +20240326020621 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A434E3E3F +20240326020642 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A438BE4BB +20240326020655 2 6 100 3071 5 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43ADA137 +20240326020708 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A43D0D1CB +20240326020800 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44709DB3 +20240326020836 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A44DBD6DB +20240326020854 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A450CF663 +20240326020934 2 6 100 3071 2 E5EBD573C64E8C90F57D2EA3086FE8A0553F6E71A29D8C629C3AA54B6648F45B3CE898928396A4E07340D3B08C83DDF2DFD73A938E8716E633EFF84055EF653423B67B0C98C1BB45E6D24662B5EC5F04E90EEB4FE7EFC4F2EE41AACB0FE5712DEF846A2454C0FAB58061046FB8EEEB7FB351ABF70069E22A9901246EF9A8640AF80DA998506C749DED56E421DCC0FFC09F2E011C237573CDE365CE2E7D41C2614602CACDA3706EF919ACD82FF79FC1DC48C2F724EF8781281F67CA0E0835455A8D2142F2A820C2A57B7E9EA2936E76044F09655E2B5EC40BCD6198DEB10DBCF87C2CBA659431D54921A880F79DCB5C9D4B7CFC688A2BFB84D40199A41461A8FD2A0EFD68F72358311886D7FA3EB29F627133C892E1E27626D476A271BC1C3970C7B52C996089A16798D2E4B7D43E6233450A89F356D9A4AB9C00E4D7683480F7618DFF43DBE5D8324B95A49F4E71874BBD0245D30B2E57DEC68E85D176122EAC0D398A0DAE7A1880BE551B47E28898FED4C40A38365830967BA1423A458A51DB +20240326021106 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585539C8487 +20240326021134 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258553F5040F +20240326021206 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855453B76F +20240326021324 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855546DBDB +20240326021407 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555BDDCF3 +20240326021424 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258555F11B9F +20240326021450 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855644DDE3 +20240326021458 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855656D6E7 +20240326021614 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557488DE3 +20240326021659 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258557D16D53 +20240326021718 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585580918BB +20240326021822 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558D0013B +20240326021836 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258558F7A96B +20240326021921 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855982467F +20240326021932 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258559A0BC87 +20240326022009 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A12A95B +20240326022029 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A4C1027 +20240326022038 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855A608723 +20240326022102 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855AA76F27 +20240326022132 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855B050E7B +20240326022301 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855C2121F3 +20240326022441 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D60DD03 +20240326022451 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855D7D2637 +20240326022516 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DC6F6EF +20240326022530 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855DEDE3DB +20240326022711 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125855F35973F +20240326022824 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856017684F +20240326022834 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856032C153 +20240326022854 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585606C9E9F +20240326022919 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258560B97F3B +20240326023041 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258561B88E3B +20240326023119 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585622F17B3 +20240326023135 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585625E20DB +20240326023142 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585626E1567 +20240326023229 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585630054CB +20240326023255 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585634C7DFB +20240326023307 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A3512585636F2A3B +20240326023310 2 6 100 3071 5 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A35125856371CA8F +20240326023417 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564487EA3 +20240326023451 2 6 100 3071 2 FF64FA2B9B9C1232EEECB2CB61C177D9714DAEAB27DB484855D95D7851B1CCD86068CCADB2EE0DF3C4FD76B2D7B8963DC5FBB49B5A003C23F423141B9E8FFFD771F5A40D47B74B8DC9704D7F3023637905DCE2000F5F85CE9699626BA067C7693A5CBC03598D402679D874A38904AB699D08F4E6BD73830B57BE87F9A10858EC3C342033B25D1DD6AD29D3CCB4AF01BC721AC75082CCFD5B098B15F5F154F222C33F580980904EAFE0BE926F740A3165BCC89C47E74C9B713CA0332947D1F9A5D05A52117EDABF7316C54605FEA3AE7EB7587E05EBC98A2A3ABA708E85DABC10BF48B64A6381730FA722A3FBFCA80817E1F0EDE608EAA6CF1FADDD8FABDF59825DC0DEF002BE804A59E70AD94C576E049D445656644CF2AF384220DDBEC013C0F532BC9AB8283902F8E8D6CEEBFA8E1CB4CA576A2B0500E26CF967603A69084F9D877953034E38AE87ABA7D08926790B1A37A613401CE8D42CF4384118F6CAAEA1C6B28A10DD710F681F328D73EB3E43B3EABC74C5EA8133A351258564AFE53B +20240326024347 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181186E03B3 +20240326024508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818118EEB0A3 +20240326024849 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811A4ECE4B +20240326025526 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811CD141E3 +20240326025628 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811D32676B +20240326030110 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81811EF7F1E3 +20240326030518 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818120788D47 +20240326031719 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125002673 +20240326031926 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125C6B433 +20240326031951 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818125E6335B +20240326032742 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818128EAC3E7 +20240326032936 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129980033 +20240326032952 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818129AAC3DB +20240326033059 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812A0B8603 +20240326033458 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812B8E0D07 +20240326033533 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BBB8B97 +20240326033606 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812BE87FF7 +20240326033629 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C03788F +20240326033712 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812C3FAF07 +20240326034008 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812D534F8B +20240326034204 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812E080CA3 +20240326034508 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81812F2F5493 +20240326034751 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181302AABC7 +20240326034806 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181303CD8D3 +20240326034823 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181304F3DCB +20240326035043 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181312A3FE7 +20240326035348 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181324BFA5B +20240326035602 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF8181331F2E53 +20240326035702 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133769453 +20240326035737 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133AA336B +20240326035756 2 6 100 4095 2 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818133C16B8B +20240326040216 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813553AD37 +20240326040447 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF81813644788F +20240326040552 2 6 100 4095 5 D0D3C82A946A66A83A8CC225EE93B60D6260A5167B1476B41D8FE172E9EE15CE394E23C7F35D6BB24C0D3A5266A4F21DF8FF23134101FDA61F9D92F70AF32EFBABC5408226C6F931149BF40FD4B166B21B87F0E76B95A9095E0ECED05C7F81900F7216E7DDFE22FA3E4EAD74992DB6FE68F539AAAF285CE869BDD819AF650DAE192DC217EB6988E92601FAF7FEF564AB4A01C7E24E38F7B6EF0CC17CA220E6269AB1E837FBF694B3961E5AEC0C85D4800B3334CE6E8716F94557B081927267D33F1E7A3DD7FC965718956E2364E956076C23CAF13A5145F1BD62DC073C8170BFA98D8A405717190A95C98E598613AEA578B5FC4A9A08B80782D9A3EF49A6A464DA9D5A3B14F1CDAADAC4143FA77C9FB73FD5DD650CF078010A8FC6C6946A4D991E75A0AC709DF3D028DB86995A2007913522632092292537BEB34196EBF1E2ACBD4A697056CEBA4DEEA8F7AEBC11963601C12C33B0FEA90102D87ECB40277B32067CBA52DD74CBDCE68597DAF04C4635AD5918E7AE99008008DDCC49713B68CA567D1F46C3C0A0A1403E722408647E072F6A3C543F9CCE36A025427211721D377ABFE15806AD07EBD60B5BCB23C50EC37B06F47D2AA941E3DF5AFB749C0E325ED8A4157E7695696B08015BAEDA784B3503F42019AA96CCBA41CB72E0CF3491F440116B5BA679355835BAC1164676279FA026655D285CA0F094CF818136A4C7F7 +20240326040951 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D80EA89E4B +20240326042517 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8147E15B3 +20240326042616 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D814D61A3B +20240326043713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D818FD20D3 +20240326043724 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D819078123 +20240326043742 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8191EAEFF +20240326044025 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81A204197 +20240326044258 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81B145927 +20240326044447 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BB935AB +20240326044534 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81BFCFA6F +20240326045348 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F0CEB6B +20240326045438 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D81F582F4B +20240326045630 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82007A843 +20240326045745 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D820792B27 +20240326045949 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82142CB8F +20240326045957 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82148EA73 +20240326050355 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D822CAC6BF +20240326050713 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D8240BBCC3 +20240326050731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824214D3B +20240326050903 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D824ACACFB +20240326051214 2 6 100 4095 5 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D825DF67F7 +20240326051332 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D826515C63 +20240326051747 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D827E42F0B +20240326051831 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D828243B8B +20240326051843 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82831A223 +20240326052417 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82A48CE23 +20240326052731 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82B78A8F3 +20240326052959 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82C5D399B +20240326053126 2 6 100 4095 2 F52D556E0D75D910A1C4DF0D571DBCEBCAB3513CA78923277BA6240C1BB579A73E56739548C0F6882B5C8BF03A15C36CA58355E6EE2170ACDFBB13CF60BA34BD92FFDC091D9AC86141CAC874E1615508A2B1A1B4A31E81B2E1982AA3ED676B3DFBD0962400B188F56C6DFCDE7CDDBCEA57654D61272C585EDBBE0449D1AF74C537F8A022BADDCFC2E6F3050B586A6761CFD444DF39CC585715A0CC863B9B225499B3097CE62B7645485754A1A8B3010FCEF13EA07D29161D1F3E701B5BC3D99B1EF2F8916F862B4815BC0D0A3385B33FEDF1B7FBC85F615E051B8A31F32A6B4213754A5F8E4BBFCE77A292BCF482B7FC30E817A591170E72696359B3635CB393BEF4075DDD7D0734E358DB2A803EE621CBB04010EAC75F810D72C41A3D7013EE2799A59D7A8ADAB73E0FD5EE4A6498CA8DF000AC152C0F6CA1C57660D0DD750A6A5F788F89CC424FD19FBD42E9C7E2A949FBF43FC67528AFD879A37A0D1D38E05328C5216BA938C058A341AAEA8D8EACBA42610B0E7823E74CAB6CA791F17AECB532DA5BF80C056B67BDFDED51A97C95AFCD32509C87600A2D734F23944552727CF726068C04F339D206BAF472A0C2E2F22D7CF939B7A6FB3D5C67B0564537A33E6802DBD07AEE817BAD37B5287BA678E962EB3B8B5BEFAC937241725A1B8789C1609706B24C7266FAE9195B9536151FE3D65684AACF304BC664F4D82CE5BB4B +20240326060038 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3C767FD7 +20240326060444 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A3CF77C3B +20240326070240 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4448EF33 +20240326073131 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A47DAE05B +20240326073415 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A482BBA27 +20240326080953 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CB6AE7F +20240326081127 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A4CDF5A0B +20240326093032 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A56B6523B +20240326093454 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A573897EB +20240326093728 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A57820693 +20240326094259 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5829EAF7 +20240326094948 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A58FD0FEF +20240326101231 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5BDEBEE3 +20240326101412 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5C09FFB3 +20240326102704 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5DAD12BF +20240326103806 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A5F05465F +20240326105506 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A611EE2E3 +20240326112146 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A647870E3 +20240326114154 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6707EC03 +20240326114315 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6729353B +20240326122735 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6CC0FBB3 +20240326123728 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A6DF24D2F +20240326130541 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71768773 +20240326130743 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A71AF6A1B +20240326132826 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A743654E3 +20240326134513 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76478D13 +20240326134939 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A76C9E817 +20240326135416 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7755E8B7 +20240326143409 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7C397F2F +20240326144117 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7D13AF93 +20240326150017 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F704F7F +20240326150157 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A7F9F468F +20240326150526 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8005826B +20240326150739 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A8045FDAF +20240326151012 2 6 100 6143 5 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A808FF207 +20240326151536 2 6 100 6143 2 E0848AB4E94DE11B8BFF81622A26C6D2145529210F586E2C145E8E26243AD47D8FB09EC8A70E1DBC3C1360EB1E511BB8657803B33D9CBAEA50236234CFD5354B08A7F9ADAEE929E263FFDB2572D56BE935DB62E8BC56ABB4594F5C0E9944B002E3A1E4DB42DEFBFEFCFB6DC014B5E20B319AC14C08FF4881E1648B39853C2D02C12EC355531BD61DCB6DE2EF99EBE4960810D43EA00A4F4CDD1E6A4F6B8037A737A306443E0E7F5B121101114FB3859ADC3C1A162DC937E6789B130DCCE01BF013CB3E79FAE8A4F6D1BA8EC5D2014D5E807DC5B1837AA025AE5A1A104C3FBC676C595DB6D27EF9F417F29C7CE3C48D2CAF46B9B79B2DD203E51E15A455B44D7EE85467BA02F922CB10CEA99C61589041CDA67D8F48A80FEC7B68CBBEEBD9DB6A82B377FFDADD912FCFD17AF6A08563F6CE7EF94153C9666CEC4D4210801E9BE697B3EDAC935E13A7D490DA08EC4F86CB2DC4497B0B4F031366918CD0ADD7B28E3E29C258CC3550EDFF59D8BCE4699296A0625AF61BA1DD74107CAD7D7EED70F3CCA27FE27E1A56C7AFEC8F92FB33BA5B322978D941FC4B39D22B1D952D975C4B1478E09F4ED4E98C054B80AD8AA5E02B5F0F84711E1464587FCF94D06CF716BA68141C3EADD9B501FA73B9DC49C19E95CCFF50613417CF6C95824E9C108B094C9AADC3E2CD6D2FEACEE698800ECF9411EAB20CD2A308B6983B25F3741D5EB12E7C9D46505CB2B0AA00FBFCFDEEF158FB28B4A93BEAB3EB4079EA6C6F9AA618A5E80560EF8966FC202ADB571DC143082E3E444149DFB3B3DD7B325440563A67147F351BF8B4C480D2635B2C78EA102E42B894489A366FFC764B502F3D48EFA342E7F0D13B15EEE257BE326265740BA62CA2DC2E6E49CEF1B11EF903CC0E756E92BCF404997D56631C817F44FCD826C6C0140EF990DF1FAA8A0A288DF2DDE4D67214C9B27F6D97A89D2067D59D1FCE0B65A27EAE0E6F065F01F0B06CF951E5D62460947DADAFF0B339CBDE45D8E6BACF1FA59676D9F65FC202FB640F3CCE10C2A5F4923F73AB1F9BEBF68906F4F36F469C7996739440380E4D5F63FF3A81343BEB +20240326162321 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5AD9F98F93F +20240326163529 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA11D7CC3 +20240326163654 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA142310B +20240326165530 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA394A593 +20240326171340 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADA5C7FE3B +20240326175630 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB35A653 +20240326175808 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADAB62C48F +20240326184011 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB0B50FD7 +20240326184335 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB1203D2F +20240326185246 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB2435AB7 +20240326190020 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB333EDAB +20240326190122 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB34BD947 +20240326191114 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB482E3D7 +20240326192702 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADB67FBDFB +20240326195941 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAA83D13 +20240326200115 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBAD40AEF +20240326201633 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBCB670E7 +20240326203821 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADBF6DC6B3 +20240326204751 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC094E45B +20240326205334 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC1441637 +20240326211827 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC45F0E3F +20240326212459 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC52DBD1B +20240326214659 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC800E58F +20240326215635 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADC9314DBF +20240326221037 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCAE8162F +20240326225055 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADCFEC8FA3 +20240326225519 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD072DFCF +20240326231305 2 6 100 6143 5 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD2AFDE1F +20240326233946 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADD60F026B +20240327001519 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDA879EA3 +20240327002618 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDBDFC89B +20240327003415 2 6 100 6143 2 F133729818EAD55DC3D8CA6C2754D6A78304D3CE96232D084B090E615BEAB6C63EC4B94BB1E33816ABCAFA3A08568FAD186C8873FDB17D7F9A28555871790CDA450A6EE13E97123F9A0589A77927047CE8B41B24F5505D19A3C4C18E132AFE9671423749DE1E110FB172AA66A15E405BD5CF56BE3CC6A22B13C3E03E42CA5BC3D8DA5B228C9569D7C15A2AE749A0F884A558687C2B656D94C167B47D9E3DD0691744E0D48858D0A1991FFEAAFE7E00C6284DC1E31CE3CED715F6686408BAEED6597453030DC62D033EF5A10B72D5367F7F1558F632CA86797FEBC16BF862D5CA0966122A584259FA0277B166F64F91959CC1F21E66BF0F6FD4489A00E0FC2E5C443A7AF646F32A772414D29F7A8116264C089E7D8A436870F0BB98EB134383464E2583DC569C9FC7D779D8C51A6D8BFA498FF8CF0F3CCDB631D794F1330E4E27A922BF0B0CADD66C11C885977B0AD344910D930E9D22F800FBB5A3712A5581C13D0378F82B2481969FC22C6A82E522A271C5FCA7079EEB7718D67BAC06F6A83B094B4FCD95BA2BCDC50EB547C79AAD9392DB976298511E0C270411CB37E3C1228ED8B018B15D3E2B334756DBF219624F2A2C6226FBF2EA33B9AAEC961E6BD3D7B6C9625ECF7E649D5EC21792E0A3E75E998FF6464961E74DAFB9CF95CF1CD654E4906FB725B381A325BE2D967B756072194EBAF8A2A524660EFA430957F30BE266C1105474A41964A5F7D5C9782FA193221BA23D9150CB5A08A3E231C62088D42FAA95777ADCE5D63ACB49299FBB1B29448A63B683B5799EE8DEE56B56748B7F269B43C35200716D74B5010388CF17B082AB285AC0DC827AAFF482EEC13268514B4F45AF6E0F948D3F466CE07C38A1308ED781B89837EB7332748A1BDD7E75CC904C763D44B0BA7A404046F1422B29DEC63EE2A524A123B8F971A181E8169601EBF10AABB5B71649E00E3D4600E23D2C20096CE2DB122C82F15A85238AA2337B559E7E8D0A824929956AA2394746B03E36A401565C2048D3DBF0411A8D4BB1044A9904290D264256B9085DA6001E5C208A2FB2760E94B958B4B2D5ADDCD9388B +20240327012525 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123BF06ED93 +20240327022256 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C2EB1D03 +20240327025321 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C4EE6D8F +20240327031901 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C6A6ECFB +20240327034252 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C84AA3F3 +20240327034558 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C876E36F +20240327035607 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123C91E770F +20240327043824 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123CBF90753 +20240327061734 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D2A46DE3 +20240327071503 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D6765ED7 +20240327080706 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123D9FC24D3 +20240327091530 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DE8C18AB +20240327092725 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123DF4D10AF +20240327100400 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E1BE884B +20240327102109 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E2D9E9AF +20240327111646 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123E69B7CAB +20240327140134 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F1C97CDB +20240327144258 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F48C6AEB +20240327150511 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F6023BEB +20240327153839 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123F8480A9B +20240327160724 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FA2AE0EF +20240327170619 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54123FE1F90CB +20240327201733 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240B20240F +20240327202608 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240BACBC77 +20240327204230 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541240CCB39CB +20240327220340 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412412509EF3 +20240327230112 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A54124164279BF +20240327231350 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412417159137 +20240328011850 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541241F8FAF0F +20240328020121 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242268881B +20240328020416 2 6 100 7679 5 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A5412422921477 +20240328035516 2 6 100 7679 2 EC85B1B812727C95C9C6D18B4F5700D62DBF698E4F4663A8C3298C2E301DF351147BB27E17982D2AF86FC969FB517AF57B10D864F23E8604341D97ECE9D33D31CA686CEEF872647B720A3010AFD4B85B0DBA65D3C9200D2C87BE4D4CAC50CAEBE0C92600F73FE5B5FD60D09762105BAA466DEB7809061EE3E4D0621D53DD39F5D7730324DF21FD9871E0BBCEBBB5450DBA4F30CA294BE8AE76D4318F8C543D9E6A032586BC29BE362311B3087657F3A068ED3221BA4EF3FF233C721D261FB9EE8245E171B32FFB8E7BA85ADFE304C784FF306AF7B2C8D9CDE0209AF5592BC33CAE85EAFB662808FA8B45405C4C0ED10DDC3B44C9A69AE6EFC86088D91C137046B2C2133EEAAA55EF5A55D4501B6357FEAC66EF33E521CCBCAA4BA4969EFAF7B41A2059C391AA92A387E75E02E8A018911D13899851C88B81F0592219032EB0538E6CB37E69A8FE2D7E759C7548556FF28B61F3DB0D1D945CF68BEC64497C803A4F8EB9B88F9872963A792480007310840F83966B386681071FAD8E5CF1502B6B2985C39E4D6CE509F086B53594B93A9AE3CA763C5CAD850FD1B1138B88E6741E7198ADC5768CC1737DEB702270FC8DE01042774E36AED88262D1C8B2166F84A3CEB5623B764CD85C808DB607837701D3F5BBEF83D19E927AEEF464079A9ABA5053CB0F2FD0942ABB568ACD050BF682809EAACD695F248D851CA0D7542BE8517BAEE4D0C8E22AA1C76E7650602723DD93A4834F4D87E74EEE8288F17175F481932E5FF012F903DDA99F74B547AF32937C7FD673ED79588C220D8EB60600747A32CFECC4E4E87001E6EEBB855EE56D47AFCD6B820D4130F6DB7E78948253A03E76CED6C399C058BB06253B799FD075DF738B7CEE5EF7AF153EFBA54A5A1EB9080A975B30262708B5E9CD283DCC8839CF10C28611B8D69A24A46DD926F755B84FF6C3D004313436C4E3E78A52D8FD8533DC2B1B7AFD1C3134B0AEBB0194844398262D56B442EEA1DD8731FE31FB785C2DFC32728AC502EF85A4A25EA2FA869172BDAE8872DA8EDA79020BF86E291EE8F383CCA7CFD3DAD66C92A734474A2AD7309BDB87C63F4FCD19E0C65912F9F054EB2E7A387CA81AB509E095C7331EE7DAA33E636663E0FF6DB66C3F3812C3CEC115B899FA6621B209E392DCB747F1800718A9ADAD04D48B5617D36AF518EF9A5A76FCCE8CE6BEFE567F1E91DA0FAEF318762B2E3D949C2D08A8544C80A841BF3DF01ACCF58700B804E7568F59F370DB76EEE625A7B380B38E4A1CC24F0DF6FD26C439B34B765DC4E04D6C0325DAF60A1C79057C0D94281E652E2C1CDCDCC304159440571F1B565F0A511647A541242A164FCB +20240328051250 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCB60A9A5B +20240328061956 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCBA8EE4D3 +20240328083541 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCC39DE953 +20240328104001 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCCBE8F2FF +20240328123936 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD40450AB +20240328131851 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD6B3842F +20240328133514 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCD7C761BB +20240328163521 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCE3D44693 +20240328184556 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCECA94E8F +20240328185443 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCED3C2EEB +20240328190404 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEDD4DEAB +20240328193132 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCEFA3B567 +20240328194029 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF039E777 +20240328205320 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF523DF3F +20240328210032 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCF59C775B +20240328221220 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA7B3FEB +20240328221329 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFA863653 +20240328222505 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFB420393 +20240328224858 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FCFCDA54CF +20240329004423 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD04B953EF +20240329024223 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD0BE0B937 +20240329035503 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10BA6927 +20240329035634 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10CC8C1F +20240329035914 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD10F42063 +20240329045640 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD14CA5323 +20240329050935 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD159E9383 +20240329053141 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD170D04C3 +20240329054343 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD17D323FB +20240329062142 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1A5DB2DF +20240329073301 2 6 100 7679 5 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD1F20E86F +20240329074920 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD20377F03 +20240329085033 2 6 100 7679 2 D4279A076EDA914DE80D14AF2DCB0B98294B99F706FBC061EF9007F2FA5897AEAF52D11A38EABEBA1EE590E35650894BA7669CE22689E6B50F11858063244F6BFBD664B19BA7ABD81CF1B65852069F215E8A1E1E72B3DFE09CAAFEC80797FF9F7AC81B6FB4A8813551385CD0D679E3F56BBFDC9069C7EB860A985C0170EA7899D76AD2D05AFD42205537E7BEB5782C27D2E6EF1532CEB5158BA23AC9E115AB472A1571A37E03439EFA47A04F61839D0DC47A8C7E2D13C9A018E87B5EB6B804AF7147814742D908212DBFB893171BC1713680CB1A036CBD0A6B6280F4D7B798913A9B59299E98F7553F202B0F33A2F67D6BB0071803DAD35595103E073F992321C4FFFCEB4F6AF4D3ADC9B53C41D8EFE7FE7AFE531E6485F8C087F18DD6B5A73101AE84737CAB85244E3FE085806104A9323907A94B06C437EE31D89AF7A584DE2F18DAD1A8E57FE1BAF5E2CC773EE57781F69A5D1EC4D8EB468BA9432394B5A9AD2F53B58A264B9C8E015F209DF60F865209482EDF309A575724A16E211CFC448799E4F05A9C2B1F09BDDECFB33FCC71211A646D8482F9A6EC20F10B38218A62182EB0E55BFF9BBA85585242B8BEFF20F1C88DFF9B20EA0C006D705B495750E2E78C4D1739347BF4628DF3F6A301DEDFCA7FA60D139B942338E8375471A1B33DF30316AF5584142D8B1E1F2C6966A08E2D70AED5DEC84968CAE5881587A734DEAD037A97EB384E4E07960EB4A64774579094763B71999D0783E95117BAB533C42516FE26A5F1C35F4FA2AF2B4F7A72E84B805DC31E8709BC36505F09954BDE0C86C918BC34FFD230491BECF307F1522AF4835C444D3CDBD0B00907B9CC3F483A51591659652378FF7C799373C2C40D238F8A2EBF6CDBC7FB26CE2748CCA89B85638CA12E7F5C477BB4FA0ED536BCCC7B3CFFC9E9D9126A8B1F56540A919A21439B66F3DF4C81A057B630176733B89AF3A29C297E2C0460265246AD68BF34E02391AD8C4601537B2B6BBD22C921D35574EFF85B1FE6C8A7BD6662CBF96D990929203D471F7648A7EDFC1E3AD551DFB688C6AC06E0F47844085C7485B00B5CDB3A3A449B26E104562531A12268ADC308F5095B066C0F82BD722D48A572EFC0F28865AE6EE37E39CAF2548C2B44780945AE573F8469ECC546FCEABCE9F518477ECC21B23B3E0532530795F1613B59C86EC0ACE047938CEC19C46CDCA59633F4712F989EFBDF065A5F64883C1E3960D7BCFE9FAB9B04A6DC4FB4BDA363E7A3967DF393799619DA22C6D2ECA276A6E9801CC1DCFBDBDD9985C09463B2F2CD57C922BF8FF65964A7B5EA4108F547F5D2FD328DD6A34C2B581AEDB7949AB8FD242F4BCB +20240329121808 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C124806CA43 +20240329122442 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12485AF08F +20240329153134 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1252D3F0CF +20240329155254 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1254053513 +20240329161124 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12550A7BDB +20240329161738 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12555C651B +20240329174531 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125A40EEC3 +20240329191732 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C125F71710B +20240329195323 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126178458B +20240329204827 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12648DD15F +20240329234203 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E5A5097 +20240329234306 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C126E615ACB +20240330005652 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12726F6443 +20240330033619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127B69FC23 +20240330044619 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C127F446BC3 +20240330054010 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1282492493 +20240330055823 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128344D603 +20240330062335 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C1284A06C1F +20240330082107 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128B2D4E73 +20240330083555 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128BF7E127 +20240330084121 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C128C3C894F +20240330104737 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129350C1FB +20240330112334 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12954A50B3 +20240330133619 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129CB0C66F +20240330135122 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129D7F94B3 +20240330141203 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C129E9C046B +20240330155328 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A438CDC3 +20240330164337 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A6FF833B +20240330172236 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12A9222D1B +20240330193325 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B07FB5BB +20240330201458 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B2CA43B3 +20240330212712 2 6 100 8191 2 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12B6C88EF3 +20240330225844 2 6 100 8191 5 C4FF326CB002CB4F25BB4309818DE616BCD6A04CB1C8D569FC4D34148B1D5D6B439D6DB946A264765BB6EAAE20B1B737C3CE28B7047D18B47C37ABECEC047E51A0541FE6434045192CE79898A70E6D93E12C35237219A6E3E00F88F5B1EE69982F0ECDA40DE90F5181A6F6F9BF5F9C497A1589ED3E2C16C68A41EA50D544BC57DB544F81F3DD6E6E09E0261A8FB2845A73A13156EBEC90719DE167262FAA68FA08DB412A918DE0D0C5585262DAB724FE31489205D7EA7C669DF4A4423E537153DB359EF31A71FE15C0707D46EE8EFF55305742BE773C6BAD327B2DB2829BF88216A275DFEBB04B3CFA2CF45507788E1DC5EDAFA03A03AD61CFCFE40D7CF7BF3712874CAA2C711691DD189B7024520B0B07D51095E91162FCA7203ECB4DDC9FFEA8355090AB20EEBA13F7901F5B71AB397CD097E0443DFAC8FED92DBBF2B38100E3CCB0118B2C8F27876D6067AF3EE9E44C7F44472C0DC419DE40E23D9DE359138028A9423328261E625A7381012787C370BC3C933C192EFE8CBF23F80271CBCA40F39D1BE4B4173997E646FEDB7AC81006E10D96559EDF6490A56FD47945E35A102C8B00EA740A7F1B53B4CC03D2DC302A8EA16971403CA8B826F6D56E307E04C75EDC1A8565A9EFBBE0F6ECA61D976649A23C82D9A8D7AC3E5124334916A75A6C8AA3B5DFB00FFEB893E6A7E7CEF0622C41C3FFB0B83C38A329E7144F6C06E789D897E3704817C6A79548B8D394EC53A460517DFD1513896B8360156561A5668AEF0F9F2D2B1CDBD4DAA8ED0C28E774EFE72D9FF758B97DAD89B305E5EC82BBC17733DB5F550EFFF1C45CBCA807BD7461C2D3C80FFDE3C1D4410DD678A94ADA54192EABFEC129C5F33DEADEF0C15B1D13782336637544FF1433E97022E45CFD560870ECD85CFF72944596B73DC7D9F978A07A47806E97EDB253019551791D6C62DEB669F5FA5EAA31FCDA0431C07AD97004F527C72548E9D22936D47D8963ABA0D82231473AF8CA45EBC59D93FCE197B7930AD7A82E3D780391A317097CFFA545DC42341FB1B265B851BBF55D95EF63A9AAFA4B2A78036751FBAABCBE9A8215B050AD478C3BF350462A4812A4FDE66FAC8B91718AAD80B68D21E5788F7CB3711F23F25EDBBDF7AC6DD9FBC110EBA2272750936C2F2A74CE5E69DE59A0B6359076EE3FB1D4F2779A6AC5753C860C2CA448E036EA15055D4A19148FE7BCD0AFA3B140A0203548A7A456ECDA8B9B9E740620291F14E21D08EEF21CE5676BB2434233E6C7CC62E48B9B752C87DC87E6DAE0A870E81D17E44AAF6982000A95B7EA676255A17D73FF4A45FAE0C5C9513B5EC0C6414D73EA9488373B6E2FFC9BD2E2C77394BB392F0AD23D91C99D9AA5066EBEE7123D00E223CA3CE572F667DBBD243473453DEC1A44CB979EF3898056D1E3B3A66DB1CB711B232291FA7C12BBE67097 +20240331000148 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B73EA509F +20240331002043 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B74F19237 +20240331015303 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7A08A157 +20240331021926 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7B77B293 +20240331031147 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7E5DF07B +20240331032001 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B7ECA5C3F +20240331054028 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B86B76577 +20240331062300 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B891AC21B +20240331063150 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B898D590B +20240331064453 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8A3FB29B +20240331070343 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8B4728B3 +20240331082004 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B8F78FC67 +20240331083046 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B90063753 +20240331085336 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B913BDDA3 +20240331104948 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B97AD8FBB +20240331121935 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9CBCB66B +20240331125021 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9E75E9EF +20240331131006 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51B9F876B2B +20240331135555 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA21BA983 +20240331154257 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BA8151143 +20240331171643 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BAD603A0F +20240331180835 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB042B533 +20240331184114 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB20E55D7 +20240331190024 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB31FB5FB +20240331193130 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB4D5DEF3 +20240331203633 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BB878F90B +20240331215848 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD220A13 +20240331220718 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BBD9694FB +20240331234057 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BC2D1D8B3 +20240401015736 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BCA81EB2B +20240401044749 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD41C3C93 +20240401051819 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD5D2C057 +20240401061504 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD8EDA743 +20240401062619 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BD98C438F +20240401095349 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BE51ECC83 +20240401133450 2 6 100 8191 2 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF189CF03 +20240401134927 2 6 100 8191 5 C236B21D4EECEC7DC25307B012452FBBBA72E7AB9CAD0D72A327FD19280856FD9993CDA7989072BD8C6E597FF7E009888DDDF8383E4F27BDB40D384CE8E9E7D739F296FD74C5415A164B0746783ACF1ABF031D4E8D1F2585BB9DBF6195215D9663196D4C5D3162E95A7163CA49255C77E412FFD7230B29C42C8703726D41006EBCFDB4EE478111ED6A8B3EDFE73496070250ECEBBB15E9376DCA438A3905EE308F8E4E064C31D1399ED7BB8AC8F6E458E8B43B1AC35DC4600B3780EA5D30F0704E7EEFDA1F2BACC94196B27E4A08B622D0AD441F3FEBA78A30D49732673040D7DD905604C7A7972BF62EFA6F3E477EADF778A7B9EA91ED338B72A42E4C30C40EF3CFADFAAF1690E469AD2B160FB1C2E836090D69F42C035B81B0E3301C0A18F9CA77C54447DB2AE57EC1765D79E188073D26328E285A3B889983409DA8B28EE75E5882524878D25083126A8007E5833272A7C330221D51CB023EC3BB452518BD57AEA2EE4560E57DF5FB7017646C6A426041551E6C55FE4ED7506FDFA1A04E1F9C36B47B031FFE4AE7480780BDC916A2B5A96C7B6D20EAFC4DF2FE721B415C365FEC16D0FEC74D034727A32D8E16D5E6CD64CAF6BC6F394E8BFBD3E9895A00924C016EEB8B6932B11CEB9A15668FE87E931CE9B1F30C3B23508760DF07A7B0AEDEDA196CC2D2974A15B51087503AF06B7351854CA928C966634E4638DC49A714B9F163AFAFD29B192E5AD2F4DED6A6945D77E7F26A72B5D6D1FB5C2F3A48970E9A0D2A212FBB8C15D5EA5435DA282E4C75DC3366BED430F71FFB6A43759542D572F828533C2437F65AB6A86EB6A994D2AA49B81D28106CFBDA10BBD7CA117A6E3CBED73D53185FEDE998C0D2EBADD81AEE2CFFAF17276E110BDDDDA163CDB5F12C12F67F432143588D4FDA6EF0763BAEC70B7D43BCD0213E650FEE7CAE47A3F327605A56116F2DB500F6481AAAD8AC312CD62F6E344705C5DA741C5E30140FB702BEE43DE37D905E8688E03F2E4D84DCBFD1BAED99BC18FAE53D701B6D78A6CDC84CDD09BA52F495785135F9006C34D7FB1059200FE16D1C707302FFB775387B3BDF1833953C0090D44076F1C27F815B638A846BEFCFC4F14B5EB38136737657E4781B8EDE5D97C175AF87F1EBE97DE9EBC410CA0C14DF17E320E986181D05D7573DF744D28846A6D78B193C7E094EE4530A15385AE6865469ADA3BCA7D6582E05C046B04306DD460940D9F76A72C13E9EFAA9184F5DC17FAB86879B29A6049BF201C5F21F6442BC1225217C288066E4FA5C16C62F8923B5C4A6B218365B3806349CEC8F79EEA94170A94BB10D6127DC78D1493CBBF7E12A7C1C2C4C14F353110E01DB0FA6459344DDD60EADE8F49924280CDEBE3D563F7069746DA3A0717438169F67534B769A9DE2B9938F148854652D7DDC7E513BAB18D356C51BF2540457 @@ -1,4 +1,4 @@ -/* $OpenBSD: monitor.c,v 1.240 2024/06/06 17:15:25 djm Exp $ */ +/* $OpenBSD: monitor.c,v 1.244 2024/09/15 01:09:40 djm Exp $ */ /* * Copyright 2002 Niels Provos <provos@citi.umich.edu> * Copyright 2002 Markus Friedl <markus@openbsd.org> @@ -96,6 +96,7 @@ #include "match.h" #include "ssherr.h" #include "sk-api.h" +#include "srclimit.h" #ifdef GSSAPI static Gssctxt *gsscontext = NULL; @@ -797,6 +798,15 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m) ssh_packet_set_log_preamble(ssh, "%suser %s", authctxt->valid ? "authenticating" : "invalid ", authctxt->user); + if (options.refuse_connection) { + logit("administratively prohibited connection for " + "%s%s from %.128s port %d", + authctxt->valid ? "" : "invalid user ", + authctxt->user, ssh_remote_ipaddr(ssh), + ssh_remote_port(ssh)); + cleanup_exit(EXIT_CONFIG_REFUSED); + } + /* Send active options to unpriv */ mm_encode_server_options(m); @@ -1496,7 +1506,7 @@ mm_answer_keyverify(struct ssh *ssh, int sock, struct sshbuf *m) } auth2_record_key(authctxt, ret == 0, key); - if (key_blobtype == MM_USERKEY) + if (key_blobtype == MM_USERKEY && ret == 0) auth_activate_options(ssh, key_opts); monitor_reset_key_state(); @@ -1763,6 +1773,7 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor) #endif /* WITH_OPENSSL */ kex->kex[KEX_C25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; kex->load_host_public_key=&get_hostkey_public_by_type; kex->load_host_private_key=&get_hostkey_private_by_type; kex->host_key_index=&get_hostkey_index; @@ -1,4 +1,4 @@ -/* $OpenBSD: mux.c,v 1.101 2023/11/23 03:37:05 dtucker Exp $ */ +/* $OpenBSD: mux.c,v 1.102 2024/07/25 22:40:08 djm Exp $ */ /* * Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org> * @@ -201,8 +201,8 @@ mux_master_session_cleanup_cb(struct ssh *ssh, int cid, int force, void *unused) fatal_f("channel %d missing control channel %d", c->self, c->ctl_chan); c->ctl_chan = -1; - cc->remote_id = 0; - cc->have_remote_id = 0; + cc->ctl_child_id = 0; + cc->have_ctl_child_id = 0; chan_rcvd_oclose(ssh, cc); } channel_cancel_cleanup(ssh, c->self); @@ -217,12 +217,12 @@ mux_master_control_cleanup_cb(struct ssh *ssh, int cid, int force, void *unused) debug3_f("entering for channel %d", cid); if (c == NULL) fatal_f("channel_by_id(%i) == NULL", cid); - if (c->have_remote_id) { - if ((sc = channel_by_id(ssh, c->remote_id)) == NULL) + if (c->have_ctl_child_id) { + if ((sc = channel_by_id(ssh, c->ctl_child_id)) == NULL) fatal_f("channel %d missing session channel %u", - c->self, c->remote_id); - c->remote_id = 0; - c->have_remote_id = 0; + c->self, c->ctl_child_id); + c->ctl_child_id = 0; + c->have_ctl_child_id = 0; sc->ctl_chan = -1; if (sc->type != SSH_CHANNEL_OPEN && sc->type != SSH_CHANNEL_OPENING) { @@ -418,7 +418,7 @@ mux_master_process_new_session(struct ssh *ssh, u_int rid, new_fd[0], new_fd[1], new_fd[2]); /* XXX support multiple child sessions in future */ - if (c->have_remote_id) { + if (c->have_ctl_child_id) { debug2_f("session already open"); reply_error(reply, MUX_S_FAILURE, rid, "Multiple sessions not supported"); @@ -463,8 +463,8 @@ mux_master_process_new_session(struct ssh *ssh, u_int rid, CHAN_EXTENDED_WRITE, "client-session", CHANNEL_NONBLOCK_STDIO); nc->ctl_chan = c->self; /* link session -> control channel */ - c->remote_id = nc->self; /* link control -> session channel */ - c->have_remote_id = 1; + c->ctl_child_id = nc->self; /* link control -> session channel */ + c->have_ctl_child_id = 1; if (cctx->want_tty && escape_char != 0xffffffff) { channel_register_filter(ssh, nc->self, @@ -1003,7 +1003,7 @@ mux_master_process_stdio_fwd(struct ssh *ssh, u_int rid, debug3_f("got fds stdin %d, stdout %d", new_fd[0], new_fd[1]); /* XXX support multiple child sessions in future */ - if (c->have_remote_id) { + if (c->have_ctl_child_id) { debug2_f("session already open"); reply_error(reply, MUX_S_FAILURE, rid, "Multiple sessions not supported"); @@ -1035,8 +1035,8 @@ mux_master_process_stdio_fwd(struct ssh *ssh, u_int rid, free(chost); nc->ctl_chan = c->self; /* link session -> control channel */ - c->remote_id = nc->self; /* link control -> session channel */ - c->have_remote_id = 1; + c->ctl_child_id = nc->self; /* link control -> session channel */ + c->have_ctl_child_id = 1; debug2_f("channel_new: %d control %d", nc->self, nc->ctl_chan); diff --git a/myproposal.h b/myproposal.h index ee6e9f7..3bdc2e9 100644 --- a/myproposal.h +++ b/myproposal.h @@ -1,4 +1,4 @@ -/* $OpenBSD: myproposal.h,v 1.71 2022/03/30 21:13:23 djm Exp $ */ +/* $OpenBSD: myproposal.h,v 1.73 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. @@ -25,7 +25,9 @@ */ #define KEX_SERVER_KEX \ + "sntrup761x25519-sha512," \ "sntrup761x25519-sha512@openssh.com," \ + "mlkem768x25519-sha256," \ "curve25519-sha256," \ "curve25519-sha256@libssh.org," \ "ecdh-sha2-nistp256," \ @@ -1,4 +1,4 @@ -/* $OpenBSD: nchan.c,v 1.75 2024/02/01 02:37:33 djm Exp $ */ +/* $OpenBSD: nchan.c,v 1.76 2024/07/25 22:40:08 djm Exp $ */ /* * Copyright (c) 1999, 2000, 2001, 2002 Markus Friedl. All rights reserved. * @@ -208,7 +208,7 @@ chan_send_close2(struct ssh *ssh, Channel *c) { int r; - debug2("channel %d: send close", c->self); + debug2("channel %d: send_close2", c->self); if (c->ostate != CHAN_OUTPUT_CLOSED || c->istate != CHAN_INPUT_CLOSED) { error("channel %d: cannot send close for istate/ostate %d/%d", @@ -218,6 +218,8 @@ chan_send_close2(struct ssh *ssh, Channel *c) } else { if (!c->have_remote_id) fatal_f("channel %d: no remote_id", c->self); + debug2("channel %d: send close for remote id %u", c->self, + c->remote_id); if ((r = sshpkt_start(ssh, SSH2_MSG_CHANNEL_CLOSE)) != 0 || (r = sshpkt_put_u32(ssh, c->remote_id)) != 0 || (r = sshpkt_send(ssh)) != 0) diff --git a/openbsd-compat/arc4random.h b/openbsd-compat/arc4random.h index 5af3a44..af2d5c1 100644 --- a/openbsd-compat/arc4random.h +++ b/openbsd-compat/arc4random.h @@ -23,7 +23,9 @@ * Stub functions for portability. From LibreSSL with some adaptations. */ +#ifdef HAVE_SYS_MMAN_H #include <sys/mman.h> +#endif #include <signal.h> diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c index 6c65003..1486507 100644 --- a/openbsd-compat/openssl-compat.c +++ b/openbsd-compat/openssl-compat.c @@ -95,4 +95,30 @@ ssh_libcrypto_init(void) #endif /* USE_OPENSSL_ENGINE */ } +#ifndef HAVE_EVP_DIGESTSIGN +int +EVP_DigestSign(EVP_MD_CTX *ctx, unsigned char *sigret, size_t *siglen, + const unsigned char *tbs, size_t tbslen) +{ + if (sigret != NULL) { + if (EVP_DigestSignUpdate(ctx, tbs, tbslen) <= 0) + return 0; + } + + return EVP_DigestSignFinal(ctx, sigret, siglen); +} +#endif + +#ifndef HAVE_EVP_DIGESTVERIFY +int +EVP_DigestVerify(EVP_MD_CTX *ctx, const unsigned char *sigret, size_t siglen, + const unsigned char *tbs, size_t tbslen) +{ + if (EVP_DigestVerifyUpdate(ctx, tbs, tbslen) <= 0) + return -1; + + return EVP_DigestVerifyFinal(ctx, sigret, siglen); +} +#endif + #endif /* WITH_OPENSSL */ diff --git a/openbsd-compat/openssl-compat.h b/openbsd-compat/openssl-compat.h index f6796b3..2b9780f 100644 --- a/openbsd-compat/openssl-compat.h +++ b/openbsd-compat/openssl-compat.h @@ -78,5 +78,15 @@ int EVP_CIPHER_CTX_set_iv(EVP_CIPHER_CTX *ctx, const unsigned char *iv, size_t len); #endif /* HAVE_EVP_CIPHER_CTX_SET_IV */ +#ifndef HAVE_EVP_DIGESTSIGN +int EVP_DigestSign(EVP_MD_CTX *, unsigned char *, size_t *, + const unsigned char *, size_t); +#endif + +#ifndef HAVE_EVP_DIGESTVERIFY +int EVP_DigestVerify(EVP_MD_CTX *, const unsigned char *, size_t, + const unsigned char *, size_t); +#endif + #endif /* WITH_OPENSSL */ #endif /* _OPENSSL_COMPAT_H */ diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c index 4c024c6..8adfec5 100644 --- a/openbsd-compat/port-linux.c +++ b/openbsd-compat/port-linux.c @@ -366,7 +366,7 @@ ssh_systemd_notify(const char *fmt, ...) error_f("socket \"%s\": %s", path, strerror(errno)); goto out; } - if (connect(fd, &addr, sizeof(addr)) != 0) { + if (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) != 0) { error_f("socket \"%s\" connect: %s", path, strerror(errno)); goto out; } @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.c,v 1.315 2024/05/31 08:49:35 djm Exp $ */ +/* $OpenBSD: packet.c,v 1.317 2024/08/23 04:51:00 deraadt Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -1015,9 +1015,8 @@ ssh_set_newkeys(struct ssh *ssh, int mode) /* explicit_bzero(enc->iv, enc->block_size); explicit_bzero(enc->key, enc->key_len); explicit_bzero(mac->key, mac->key_len); */ - if ((comp->type == COMP_ZLIB || - (comp->type == COMP_DELAYED && - state->after_authentication)) && comp->enabled == 0) { + if (((comp->type == COMP_DELAYED && state->after_authentication)) && + comp->enabled == 0) { if ((r = ssh_packet_init_compression(ssh)) < 0) return r; if (mode == MODE_OUT) { @@ -2637,12 +2636,6 @@ sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v) return sshbuf_put_stringb(ssh->state->outgoing_packet, v); } -int -sshpkt_getb_froms(struct ssh *ssh, struct sshbuf **valp) -{ - return sshbuf_froms(ssh->state->incoming_packet, valp); -} - #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC int @@ -2650,8 +2643,13 @@ sshpkt_put_ec(struct ssh *ssh, const EC_POINT *v, const EC_GROUP *g) { return sshbuf_put_ec(ssh->state->outgoing_packet, v, g); } -#endif /* OPENSSL_HAS_ECC */ +int +sshpkt_put_ec_pkey(struct ssh *ssh, EVP_PKEY *pkey) +{ + return sshbuf_put_ec_pkey(ssh->state->outgoing_packet, pkey); +} +#endif /* OPENSSL_HAS_ECC */ int sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v) @@ -2710,6 +2708,12 @@ sshpkt_get_cstring(struct ssh *ssh, char **valp, size_t *lenp) return sshbuf_get_cstring(ssh->state->incoming_packet, valp, lenp); } +int +sshpkt_getb_froms(struct ssh *ssh, struct sshbuf **valp) +{ + return sshbuf_froms(ssh->state->incoming_packet, valp); +} + #ifdef WITH_OPENSSL #ifdef OPENSSL_HAS_ECC int @@ -1,4 +1,4 @@ -/* $OpenBSD: packet.h,v 1.98 2024/05/17 06:42:04 jsg Exp $ */ +/* $OpenBSD: packet.h,v 1.99 2024/08/15 00:51:51 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -20,6 +20,7 @@ #ifdef WITH_OPENSSL # include <openssl/bn.h> +# include <openssl/evp.h> # ifdef OPENSSL_HAS_ECC # include <openssl/ec.h> # else /* OPENSSL_HAS_ECC */ @@ -32,6 +33,7 @@ # define EC_KEY void # define EC_GROUP void # define EC_POINT void +# define EVP_PKEY void #endif /* WITH_OPENSSL */ #include <signal.h> @@ -191,6 +193,7 @@ int sshpkt_put_string(struct ssh *ssh, const void *v, size_t len); int sshpkt_put_cstring(struct ssh *ssh, const void *v); int sshpkt_put_stringb(struct ssh *ssh, const struct sshbuf *v); int sshpkt_put_ec(struct ssh *ssh, const EC_POINT *v, const EC_GROUP *g); +int sshpkt_put_ec_pkey(struct ssh *ssh, EVP_PKEY *pkey); int sshpkt_put_bignum2(struct ssh *ssh, const BIGNUM *v); int sshpkt_get(struct ssh *ssh, void *valp, size_t len); @@ -213,6 +216,7 @@ const u_char *sshpkt_ptr(struct ssh *, size_t *lenp); # undef EC_KEY # undef EC_GROUP # undef EC_POINT +# undef EVP_PKEY #elif !defined(OPENSSL_HAS_ECC) # undef EC_KEY # undef EC_GROUP @@ -1,4 +1,4 @@ -/* $OpenBSD: readconf.c,v 1.387 2024/05/17 02:39:11 jsg Exp $ */ +/* $OpenBSD: readconf.c,v 1.390 2024/09/15 00:57:36 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -646,24 +646,78 @@ check_match_ifaddrs(const char *addrlist) } /* + * Expand a "match exec" command or an Include path, caller must free returned + * value. + */ +static char * +expand_match_exec_or_include_path(const char *path, Options *options, + struct passwd *pw, const char *host_arg, const char *original_host, + int final_pass, int is_include_path) +{ + char thishost[NI_MAXHOST], shorthost[NI_MAXHOST], portstr[NI_MAXSERV]; + char uidstr[32], *conn_hash_hex, *keyalias, *jmphost, *ruser; + char *host, *ret; + int port; + + port = options->port <= 0 ? default_ssh_port() : options->port; + ruser = options->user == NULL ? pw->pw_name : options->user; + if (final_pass) { + host = xstrdup(options->hostname); + } else if (options->hostname != NULL) { + /* NB. Please keep in sync with ssh.c:main() */ + host = percent_expand(options->hostname, + "h", host_arg, (char *)NULL); + } else { + host = xstrdup(host_arg); + } + if (gethostname(thishost, sizeof(thishost)) == -1) + fatal("gethostname: %s", strerror(errno)); + jmphost = option_clear_or_none(options->jump_host) ? + "" : options->jump_host; + strlcpy(shorthost, thishost, sizeof(shorthost)); + shorthost[strcspn(thishost, ".")] = '\0'; + snprintf(portstr, sizeof(portstr), "%d", port); + snprintf(uidstr, sizeof(uidstr), "%llu", + (unsigned long long)pw->pw_uid); + conn_hash_hex = ssh_connection_hash(thishost, host, + portstr, ruser, jmphost); + keyalias = options->host_key_alias ? options->host_key_alias : host; + + ret = (is_include_path ? percent_dollar_expand : percent_expand)(path, + "C", conn_hash_hex, + "L", shorthost, + "d", pw->pw_dir, + "h", host, + "k", keyalias, + "l", thishost, + "n", original_host, + "p", portstr, + "r", ruser, + "u", pw->pw_name, + "i", uidstr, + "j", jmphost, + (char *)NULL); + free(host); + free(conn_hash_hex); + return ret; +} + +/* * Parse and execute a Match directive. */ static int -match_cfg_line(Options *options, char **condition, struct passwd *pw, - const char *host_arg, const char *original_host, int final_pass, - int *want_final_pass, const char *filename, int linenum) +match_cfg_line(Options *options, const char *full_line, int *acp, char ***avp, + struct passwd *pw, const char *host_arg, const char *original_host, + int final_pass, int *want_final_pass, const char *filename, int linenum) { - char *arg, *oattrib, *attrib, *cmd, *cp = *condition, *host, *criteria; + char *arg, *oattrib, *attrib, *cmd, *host, *criteria; const char *ruser; - int r, port, this_result, result = 1, attributes = 0, negate; - char thishost[NI_MAXHOST], shorthost[NI_MAXHOST], portstr[NI_MAXSERV]; - char uidstr[32]; + int r, this_result, result = 1, attributes = 0, negate; /* * Configuration is likely to be incomplete at this point so we * must be prepared to use default values. */ - port = options->port <= 0 ? default_ssh_port() : options->port; ruser = options->user == NULL ? pw->pw_name : options->user; if (final_pass) { host = xstrdup(options->hostname); @@ -676,11 +730,11 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, } debug2("checking match for '%s' host %s originally %s", - cp, host, original_host); - while ((oattrib = attrib = strdelim(&cp)) && *attrib != '\0') { + full_line, host, original_host); + while ((oattrib = attrib = argv_next(acp, avp)) != NULL) { /* Terminate on comment */ if (*attrib == '#') { - cp = NULL; /* mark all arguments consumed */ + argv_consume(acp); break; } arg = criteria = NULL; @@ -689,7 +743,8 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, attrib++; /* Criterion "all" has no argument and must appear alone */ if (strcasecmp(attrib, "all") == 0) { - if (attributes > 1 || ((arg = strdelim(&cp)) != NULL && + if (attributes > 1 || + ((arg = argv_next(acp, avp)) != NULL && *arg != '\0' && *arg != '#')) { error("%.200s line %d: '%s' cannot be combined " "with other Match attributes", @@ -698,7 +753,7 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, goto out; } if (arg != NULL && *arg == '#') - cp = NULL; /* mark all arguments consumed */ + argv_consume(acp); /* consume remaining args */ if (result) result = negate ? 0 : 1; goto out; @@ -723,7 +778,7 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, continue; } /* All other criteria require an argument */ - if ((arg = strdelim(&cp)) == NULL || + if ((arg = argv_next(acp, avp)) == NULL || *arg == '\0' || *arg == '#') { error("Missing Match criteria for %s", attrib); result = -1; @@ -765,37 +820,12 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, if (r == (negate ? 1 : 0)) this_result = result = 0; } else if (strcasecmp(attrib, "exec") == 0) { - char *conn_hash_hex, *keyalias, *jmphost; - - if (gethostname(thishost, sizeof(thishost)) == -1) - fatal("gethostname: %s", strerror(errno)); - jmphost = option_clear_or_none(options->jump_host) ? - "" : options->jump_host; - strlcpy(shorthost, thishost, sizeof(shorthost)); - shorthost[strcspn(thishost, ".")] = '\0'; - snprintf(portstr, sizeof(portstr), "%d", port); - snprintf(uidstr, sizeof(uidstr), "%llu", - (unsigned long long)pw->pw_uid); - conn_hash_hex = ssh_connection_hash(thishost, host, - portstr, ruser, jmphost); - keyalias = options->host_key_alias ? - options->host_key_alias : host; - - cmd = percent_expand(arg, - "C", conn_hash_hex, - "L", shorthost, - "d", pw->pw_dir, - "h", host, - "k", keyalias, - "l", thishost, - "n", original_host, - "p", portstr, - "r", ruser, - "u", pw->pw_name, - "i", uidstr, - "j", jmphost, - (char *)NULL); - free(conn_hash_hex); + if ((cmd = expand_match_exec_or_include_path(arg, + options, pw, host_arg, original_host, + final_pass, 0)) == NULL) { + fatal("%.200s line %d: failed to expand match " + "exec '%.100s'", filename, linenum, arg); + } if (result != 1) { /* skip execution if prior predicate failed */ debug3("%.200s line %d: skipped exec " @@ -835,7 +865,6 @@ match_cfg_line(Options *options, char **condition, struct passwd *pw, out: if (result != -1) debug2("match %sfound", result ? "" : "not "); - *condition = cp; free(host); return result; } @@ -1002,7 +1031,7 @@ static const struct multistate multistate_pubkey_auth[] = { }; static const struct multistate multistate_compression[] = { #ifdef WITH_ZLIB - { "yes", COMP_ZLIB }, + { "yes", COMP_DELAYED }, #endif { "no", COMP_NONE }, { NULL, -1 } @@ -1778,8 +1807,8 @@ parse_pubkey_algos: "option"); goto out; } - value = match_cfg_line(options, &str, pw, host, original_host, - flags & SSHCONF_FINAL, want_final_pass, + value = match_cfg_line(options, str, &ac, &av, pw, host, + original_host, flags & SSHCONF_FINAL, want_final_pass, filename, linenum); if (value < 0) { error("%.200s line %d: Bad Match condition", filename, @@ -1787,13 +1816,6 @@ parse_pubkey_algos: goto out; } *activep = (flags & SSHCONF_NEVERMATCH) ? 0 : value; - /* - * If match_cfg_line() didn't consume all its arguments then - * arrange for the extra arguments check below to fail. - */ - - if (str == NULL || *str == '\0') - argv_consume(&ac); break; case oEscapeChar: @@ -1990,6 +2012,15 @@ parse_pubkey_algos: filename, linenum, keyword); goto out; } + /* Expand %tokens and environment variables */ + if ((p = expand_match_exec_or_include_path(arg, + options, pw, host, original_host, + flags & SSHCONF_FINAL, 1)) == NULL) { + error("%.200s line %d: Unable to expand user " + "config file '%.100s'", + filename, linenum, arg); + continue; + } /* * Ensure all paths are anchored. User configuration * files may begin with '~/' but system configurations @@ -1997,17 +2028,19 @@ parse_pubkey_algos: * as living in ~/.ssh for user configurations or * /etc/ssh for system ones. */ - if (*arg == '~' && (flags & SSHCONF_USERCONF) == 0) { + if (*p == '~' && (flags & SSHCONF_USERCONF) == 0) { error("%.200s line %d: bad include path %s.", - filename, linenum, arg); + filename, linenum, p); goto out; } - if (!path_absolute(arg) && *arg != '~') { + if (!path_absolute(p) && *p != '~') { xasprintf(&arg2, "%s/%s", (flags & SSHCONF_USERCONF) ? - "~/" _PATH_SSH_USER_DIR : SSHDIR, arg); - } else - arg2 = xstrdup(arg); + "~/" _PATH_SSH_USER_DIR : SSHDIR, p); + } else { + arg2 = xstrdup(p); + } + free(p); memset(&gl, 0, sizeof(gl)); r = glob(arg2, GLOB_TILDE, NULL, &gl); if (r == GLOB_NOMATCH) { @@ -2033,8 +2066,9 @@ parse_pubkey_algos: (oactive ? 0 : SSHCONF_NEVERMATCH), activep, want_final_pass, depth + 1); if (r != 1 && errno != ENOENT) { - error("Can't open user config file " - "%.100s: %.100s", gl.gl_pathv[i], + error("%.200s line %d: Can't open user " + "config file %.100s: %.100s", + filename, linenum, gl.gl_pathv[i], strerror(errno)); globfree(&gl); goto out; diff --git a/regress/cfginclude.sh b/regress/cfginclude.sh index f5b492f..d442cdd 100644 --- a/regress/cfginclude.sh +++ b/regress/cfginclude.sh @@ -1,4 +1,4 @@ -# $OpenBSD: cfginclude.sh,v 1.3 2021/06/08 06:52:43 djm Exp $ +# $OpenBSD: cfginclude.sh,v 1.4 2024/09/03 05:58:56 djm Exp $ # Placed in the Public Domain. tid="config include" @@ -142,7 +142,7 @@ trial a aa # cleanup rm -f $OBJ/ssh_config.i $OBJ/ssh_config.i.* $OBJ/ssh_config.out -# $OpenBSD: cfginclude.sh,v 1.3 2021/06/08 06:52:43 djm Exp $ +# $OpenBSD: cfginclude.sh,v 1.4 2024/09/03 05:58:56 djm Exp $ # Placed in the Public Domain. tid="config include" @@ -289,5 +289,27 @@ _EOF ${REAL_SSH} -F $OBJ/ssh_config.i -G a 2>/dev/null && \ fail "ssh include allowed infinite recursion?" # or hang... +# Environment variable expansion +cat > $OBJ/ssh_config.i << _EOF +Include $OBJ/ssh_config.\${REAL_FILE} +_EOF +cat > $OBJ/ssh_config.i.x << _EOF +Hostname xyzzy +_EOF +REAL_FILE=i.x +export REAL_FILE +trial a xyzzy + +# Environment variable expansion +cat > $OBJ/ssh_config.i << _EOF +Include $OBJ/ssh_config.i.%h%h +_EOF +cat > $OBJ/ssh_config.i.blahblah << _EOF +Hostname mekmitastdigoat +_EOF +REAL_FILE=i.x +export REAL_FILE +trial blah mekmitastdigoat + # cleanup rm -f $OBJ/ssh_config.i $OBJ/ssh_config.i.* $OBJ/ssh_config.out diff --git a/regress/misc/fuzz-harness/Makefile b/regress/misc/fuzz-harness/Makefile index 1072130..55dcc17 100644 --- a/regress/misc/fuzz-harness/Makefile +++ b/regress/misc/fuzz-harness/Makefile @@ -4,52 +4,68 @@ CXX=clang++-16 FUZZ_FLAGS=-fsanitize=address,fuzzer -fno-omit-frame-pointer FUZZ_LIBS=-L/usr/lib/llvm-16/lib -lFuzzer -CXXFLAGS=-O2 -g -Wall -Wextra -Wno-unused-parameter -Wno-exceptions -I ../../.. $(FUZZ_FLAGS) -CFLAGS=$(CXXFLAGS) -LDFLAGS=-L ../../.. -L ../../../openbsd-compat -g $(FUZZ_FLAGS) +CFLAGS=-D_GNU_SOURCE=1 -O2 -g -Wall -Wextra -Wno-unused-parameter -Wno-exceptions -Wno-deprecated -I ../../.. +CXXFLAGS=$(CFLAGS) $(FUZZ_FLAGS) +LDFLAGS=-L ../../.. -L ../../../openbsd-compat -g LIBS=-lssh -lopenbsd-compat -lmd -lcrypto -lfido2 -lcbor $(FUZZ_LIBS) SK_NULL_OBJS=ssh-sk-null.o COMMON_DEPS=../../../libssh.a TARGETS=pubkey_fuzz sig_fuzz authopt_fuzz authkeys_fuzz sshsig_fuzz \ - sshsigopt_fuzz privkey_fuzz kex_fuzz agent_fuzz + sshsigopt_fuzz privkey_fuzz kex_fuzz agent_fuzz \ + mkcorpus_sntrup761 sntrup761_enc_fuzz sntrup761_dec_fuzz all: $(TARGETS) .cc.o: $(CXX) $(CXXFLAGS) -c $< -o $@ +.c.o: + $(CC) $(CFLAGS) -c $< -o $@ + pubkey_fuzz: pubkey_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ pubkey_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(LIBS) + $(CXX) -o $@ pubkey_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) sig_fuzz: sig_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ sig_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(LIBS) + $(CXX) -o $@ sig_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) authopt_fuzz: authopt_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ authopt_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o $(LDFLAGS) $(LIBS) + $(CXX) -o $@ authopt_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) authkeys_fuzz: authkeys_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ authkeys_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o ../../../auth2-pubkeyfile.o $(LDFLAGS) $(LIBS) + $(CXX) -o $@ authkeys_fuzz.o $(SK_NULL_OBJS) ../../../auth-options.o ../../../auth2-pubkeyfile.o $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) sshsig_fuzz: sshsig_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ sshsig_fuzz.o $(SK_NULL_OBJS) ../../../sshsig.o $(LDFLAGS) $(LIBS) + $(CXX) -o $@ sshsig_fuzz.o $(SK_NULL_OBJS) ../../../sshsig.o $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) sshsigopt_fuzz: sshsigopt_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ sshsigopt_fuzz.o $(SK_NULL_OBJS) ../../../sshsig.o $(LDFLAGS) $(LIBS) + $(CXX) -o $@ sshsigopt_fuzz.o $(SK_NULL_OBJS) ../../../sshsig.o $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) privkey_fuzz: privkey_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ privkey_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(LIBS) + $(CXX) -o $@ privkey_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) kex_fuzz: kex_fuzz.o $(SK_NULL_OBJS) $(COMMON_DEPS) - $(CXX) -o $@ kex_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(LIBS) -lz + $(CXX) -o $@ kex_fuzz.o $(SK_NULL_OBJS) $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) -lz agent_fuzz: agent_fuzz.o agent_fuzz_helper.o sk-dummy.o ../../../ssh-sk.o $(COMMON_DEPS) - $(CXX) -o $@ agent_fuzz.o agent_fuzz_helper.o sk-dummy.o ../../../ssh-sk.o $(LDFLAGS) $(LIBS) -lz + $(CXX) -o $@ agent_fuzz.o agent_fuzz_helper.o sk-dummy.o ../../../ssh-sk.o $(LDFLAGS) $(FUZZ_FLAGS) $(LIBS) -lz agent_fuzz_helper.o: agent_fuzz_helper.c ../../../ssh-agent.c sk-dummy.o: ../sk-dummy/sk-dummy.c - $(CC) $(CFLAGS) -c -o $@ ../sk-dummy/sk-dummy.c -DSK_DUMMY_INTEGRATE=1 $(LDFLAGS) + $(CC) $(CFLAGS) -c -o $@ ../sk-dummy/sk-dummy.c -DSK_DUMMY_INTEGRATE=1 $(LDFLAGS) $(FUZZ_FLAGS) + +mkcorpus_sntrup761: mkcorpus_sntrup761.o + $(CC) -o $@ mkcorpus_sntrup761.o $(LDFLAGS) -lcrypto + +sntrup761_dec_fuzz: sntrup761_dec_fuzz.o + $(CXX) -o $@ sntrup761_dec_fuzz.o $(LDFLAGS) $(FUZZ_FLAGS) $(FUZZ_LIBS) -lcrypto + +sntrup761_enc_fuzz: sntrup761_enc_fuzz.o + $(CXX) -o $@ sntrup761_enc_fuzz.o $(LDFLAGS) $(FUZZ_FLAGS) $(FUZZ_LIBS) -lcrypto clean: -rm -f *.o $(TARGETS) + +cleandir: clean + diff --git a/regress/misc/fuzz-harness/mkcorpus_sntrup761.c b/regress/misc/fuzz-harness/mkcorpus_sntrup761.c new file mode 100644 index 0000000..86a8e02 --- /dev/null +++ b/regress/misc/fuzz-harness/mkcorpus_sntrup761.c @@ -0,0 +1,82 @@ +// Makes basic seed corpora for other fuzzers +// +// Will write to ./sntrup761_pubkey_corpus (for sntrup761_enc_fuzz) and +// to ./sntrup761_ciphertext_corpus (for sntrup761_dec_fuzz) + +#include <sys/stat.h> +#include <stddef.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <err.h> +#include <errno.h> + +#include "crypto_api.h" +#include "hash.c" + +#undef randombytes +#define USE_SNTRUP761X25519 1 +void randombytes(unsigned char *ptr, size_t l); +volatile crypto_int16 crypto_int16_optblocker = 0; +volatile crypto_int32 crypto_int32_optblocker = 0; +volatile crypto_int64 crypto_int64_optblocker = 0; +#include "sntrup761.c" + +#define NSEEDS 1000 + +static int real_random; + +void +randombytes(unsigned char *ptr, size_t l) +{ + if (real_random) + arc4random_buf(ptr, l); + else + memset(ptr, 0, l); +} + +void write_blob(const char *path, int n, const char *suffix, + const void *ptr, size_t l) +{ + char name[256]; + FILE *f; + + snprintf(name, sizeof(name), "%s/%06d.%s", path, n, suffix); + if ((f = fopen(name, "wb+")) == NULL) + err(1, "fopen %s", name); + if (fwrite(ptr, l, 1, f) != 1) + err(1, "write %s", name); + fclose(f); +} + +int main(void) +{ + int i; + unsigned char pk[crypto_kem_sntrup761_PUBLICKEYBYTES]; + unsigned char sk[crypto_kem_sntrup761_SECRETKEYBYTES]; + unsigned char ciphertext[crypto_kem_sntrup761_CIPHERTEXTBYTES]; + unsigned char secret[crypto_kem_sntrup761_BYTES]; + + if (mkdir("sntrup761_pubkey_corpus", 0777) != 0 && errno != EEXIST) + err(1, "mkdir sntrup761_pubkey_corpus"); + if (mkdir("sntrup761_ciphertext_corpus", 0777) != 0 && errno != EEXIST) + err(1, "mkdir sntrup761_ciphertext_corpus"); + + fprintf(stderr, "making: "); + for (i = 0; i < NSEEDS; i++) { + real_random = i != 0; + if (crypto_kem_sntrup761_keypair(pk, sk) != 0) + errx(1, "crypto_kem_sntrup761_keypair failed"); + write_blob("sntrup761_pubkey_corpus", i, "pk", pk, sizeof(pk)); + if (crypto_kem_sntrup761_enc(ciphertext, secret, pk) != 0) + errx(1, "crypto_kem_sntrup761_enc failed"); + write_blob("sntrup761_ciphertext_corpus", i, "ct", + ciphertext, sizeof(ciphertext)); + if (i % 20 == 0) + fprintf(stderr, "."); + } + fprintf(stderr, "\n"); + return 0; +} diff --git a/regress/misc/fuzz-harness/sntrup761_dec_fuzz.cc b/regress/misc/fuzz-harness/sntrup761_dec_fuzz.cc new file mode 100644 index 0000000..9aecae0 --- /dev/null +++ b/regress/misc/fuzz-harness/sntrup761_dec_fuzz.cc @@ -0,0 +1,74 @@ +// Basic fuzz test for depcapsulate operation, + +#include <stddef.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <err.h> + +extern "C" { + +#include "crypto_api.h" +#include "hash.c" + +#undef randombytes +#define USE_SNTRUP761X25519 1 +#ifdef SNTRUP761_NO_ASM +# undef __GNUC__ +#endif +void randombytes(unsigned char *ptr, size_t l); +volatile crypto_int16 crypto_int16_optblocker = 0; +volatile crypto_int32 crypto_int32_optblocker = 0; +volatile crypto_int64 crypto_int64_optblocker = 0; +#include "sntrup761.c" + +static int real_random; + +void +randombytes(unsigned char *ptr, size_t l) +{ + if (real_random) + arc4random_buf(ptr, l); + else + memset(ptr, 0, l); +} + +void privkeys(unsigned char *zero_sk, unsigned char *rnd_sk) +{ + unsigned char pk[crypto_kem_sntrup761_PUBLICKEYBYTES]; + + real_random = 0; + if (crypto_kem_sntrup761_keypair(pk, zero_sk) != 0) + errx(1, "crypto_kem_sntrup761_keypair failed"); + real_random = 1; + if (crypto_kem_sntrup761_keypair(pk, rnd_sk) != 0) + errx(1, "crypto_kem_sntrup761_keypair failed"); +} + +int LLVMFuzzerTestOneInput(const uint8_t* input, size_t len) +{ + static bool once; + static unsigned char zero_sk[crypto_kem_sntrup761_SECRETKEYBYTES]; + static unsigned char rnd_sk[crypto_kem_sntrup761_SECRETKEYBYTES]; + unsigned char ciphertext[crypto_kem_sntrup761_CIPHERTEXTBYTES]; + unsigned char secret[crypto_kem_sntrup761_BYTES]; + + if (!once) { + privkeys(zero_sk, rnd_sk); + once = true; + } + + memset(&ciphertext, 0, sizeof(ciphertext)); + if (len > sizeof(ciphertext)) { + len = sizeof(ciphertext); + } + memcpy(ciphertext, input, len); + + (void)crypto_kem_sntrup761_dec(secret, ciphertext, zero_sk); + (void)crypto_kem_sntrup761_dec(secret, ciphertext, rnd_sk); + return 0; +} + +} // extern diff --git a/regress/misc/fuzz-harness/sntrup761_enc_fuzz.cc b/regress/misc/fuzz-harness/sntrup761_enc_fuzz.cc new file mode 100644 index 0000000..c4ebac4 --- /dev/null +++ b/regress/misc/fuzz-harness/sntrup761_enc_fuzz.cc @@ -0,0 +1,57 @@ +// Basic fuzz test for encapsulate operation. + +#include <stddef.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <err.h> + +extern "C" { + +#include "crypto_api.h" +#include "hash.c" + +#undef randombytes +#define USE_SNTRUP761X25519 1 +#ifdef SNTRUP761_NO_ASM +# undef __GNUC__ +#endif +void randombytes(unsigned char *ptr, size_t l); +volatile crypto_int16 crypto_int16_optblocker = 0; +volatile crypto_int32 crypto_int32_optblocker = 0; +volatile crypto_int64 crypto_int64_optblocker = 0; +#include "sntrup761.c" + +static int real_random; + +void +randombytes(unsigned char *ptr, size_t l) +{ + if (real_random) + arc4random_buf(ptr, l); + else + memset(ptr, 0, l); +} + +int LLVMFuzzerTestOneInput(const uint8_t* input, size_t len) +{ + unsigned char pk[crypto_kem_sntrup761_PUBLICKEYBYTES]; + unsigned char ciphertext[crypto_kem_sntrup761_CIPHERTEXTBYTES]; + unsigned char secret[crypto_kem_sntrup761_BYTES]; + + memset(&pk, 0, sizeof(pk)); + if (len > sizeof(pk)) { + len = sizeof(pk); + } + memcpy(pk, input, len); + + real_random = 0; + (void)crypto_kem_sntrup761_enc(ciphertext, secret, pk); + real_random = 1; + (void)crypto_kem_sntrup761_enc(ciphertext, secret, pk); + return 0; +} + +} // extern diff --git a/regress/misc/fuzz-harness/watch-sntrup761.sh b/regress/misc/fuzz-harness/watch-sntrup761.sh new file mode 100755 index 0000000..482f831 --- /dev/null +++ b/regress/misc/fuzz-harness/watch-sntrup761.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +set -e +mkdir -p sntrup761_dec_fuzzing sntrup761_enc_fuzzing +(cd sntrup761_enc_fuzzing ; + ../sntrup761_enc_fuzz -jobs=48 ../sntrup761_pubkey_corpus &) +(cd sntrup761_dec_fuzzing ; + ../sntrup761_dec_fuzz -jobs=48 ../sntrup761_ciphertext_corpus &) + +while true ; do + clear + uptime + echo + echo "Findings" + ls -1 sntrup761_dec_fuzzing sntrup761_enc_fuzzing | grep -v '^fuzz-.*log$' + printf "\n\n" + printf "ciphertext_corpus: " ; ls -1 sntrup761_ciphertext_corpus | wc -l + printf " pubkey_corpus: "; ls -1 sntrup761_pubkey_corpus | wc -l + sleep 10; +done diff --git a/regress/multiplex.sh b/regress/multiplex.sh index b992cd4..8274b9d 100644 --- a/regress/multiplex.sh +++ b/regress/multiplex.sh @@ -1,4 +1,4 @@ -# $OpenBSD: multiplex.sh,v 1.36 2023/03/01 09:29:32 dtucker Exp $ +# $OpenBSD: multiplex.sh,v 1.37 2024/07/19 04:33:36 djm Exp $ # Placed in the Public Domain. make_tmpdir @@ -56,19 +56,20 @@ if [ $? -ne 0 ]; then fail "environment not found" fi - -verbose "test $tid: transfer" -rm -f ${COPY} -trace "ssh transfer over multiplexed connection and check result" -${SSH} -F $OBJ/ssh_config -S$CTL otherhost cat ${DATA} > ${COPY} -test -f ${COPY} || fail "ssh -Sctl: failed copy ${DATA}" -cmp ${DATA} ${COPY} || fail "ssh -Sctl: corrupted copy of ${DATA}" - -rm -f ${COPY} -trace "ssh transfer over multiplexed connection and check result" -${SSH} -F $OBJ/ssh_config -S $CTL otherhost cat ${DATA} > ${COPY} -test -f ${COPY} || fail "ssh -S ctl: failed copy ${DATA}" -cmp ${DATA} ${COPY} || fail "ssh -S ctl: corrupted copy of ${DATA}" +for mode in "" "-Oproxy"; do + verbose "test $tid: transfer $mode" + rm -f ${COPY} + trace "ssh transfer over $mode multiplexed connection and check result" + ${SSH} $mode -F $OBJ/ssh_config -S$CTL otherhost cat ${DATA} > ${COPY} + test -f ${COPY} || fail "ssh -Sctl: failed copy ${DATA}" + cmp ${DATA} ${COPY} || fail "ssh -Sctl: corrupted copy of ${DATA}" + + rm -f ${COPY} + trace "ssh transfer over $mode multiplexed connection and check result" + ${SSH} $mode -F $OBJ/ssh_config -S $CTL otherhost cat ${DATA} > ${COPY} + test -f ${COPY} || fail "ssh -S ctl: failed copy ${DATA}" + cmp ${DATA} ${COPY} || fail "ssh -S ctl: corrupted copy of ${DATA}" +done rm -f ${COPY} trace "sftp transfer over multiplexed connection and check result" diff --git a/regress/rekey.sh b/regress/rekey.sh index 8005a86..3f5e1d5 100644 --- a/regress/rekey.sh +++ b/regress/rekey.sh @@ -1,76 +1,114 @@ -# $OpenBSD: rekey.sh,v 1.20 2024/05/22 04:20:00 djm Exp $ +# $OpenBSD: rekey.sh,v 1.30 2024/08/28 12:08:26 djm Exp $ # Placed in the Public Domain. tid="rekey" LOG=${TEST_SSH_LOGFILE} +COPY2=$OBJ/copy2 rm -f ${LOG} cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak +echo "Compression no" >> $OBJ/ssh_proxy +echo "RekeyLimit 256k" >> $OBJ/ssh_proxy +echo "KexAlgorithms curve25519-sha256" >> ssh_proxy + # Test rekeying based on data volume only. -# Arguments will be passed to ssh. +# Arguments: rekeylimit, kex method, optional remaining opts are passed to ssh. ssh_data_rekeying() { + _bytes=$1 ; shift _kexopt=$1 ; shift _opts="$@" + if test -z "$_bytes"; then + _bytes=32k + fi if ! test -z "$_kexopt" ; then cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy echo "$_kexopt" >> $OBJ/sshd_proxy _opts="$_opts -o$_kexopt" fi - rm -f ${COPY} ${LOG} - _opts="$_opts -oCompression=no" - ${SSH} <${DATA} $_opts -v -F $OBJ/ssh_proxy somehost "cat > ${COPY}" + case "$_kexopt" in + MACs=*) + # default chacha20-poly1305 cipher has implicit MAC + _opts="$_opts -oCiphers=aes128-ctr" ;; + esac + trace bytes $_bytes kex $_kexopt opts $_opts + rm -f ${COPY} ${COPY2} ${LOG} + # Create data file just big enough to reach rekey threshold. + dd if=${DATA} of=${COPY} bs=$_bytes count=1 2>/dev/null + ${SSH} <${COPY} $_opts -vv \ + -oRekeyLimit=$_bytes -F $OBJ/ssh_proxy somehost "cat >${COPY2}" if [ $? -ne 0 ]; then fail "ssh failed ($@)" fi - cmp ${DATA} ${COPY} || fail "corrupted copy ($@)" + cmp ${COPY} ${COPY2} || fail "corrupted copy ($@)" n=`grep 'NEWKEYS sent' ${LOG} | wc -l` n=`expr $n - 1` + _want=`echo $_kexopt | cut -f2 -d=` + _got="" + case "$_kexopt" in + KexAlgorithms=*) + _got=`awk '/kex: algorithm: /{print $4}' ${LOG} | \ + tr -d '\r' | sort -u` ;; + Ciphers=*) + _got=`awk '/kex: client->server cipher:/{print $5}' ${LOG} | \ + tr -d '\r' | sort -u` ;; + MACs=*) + _got=`awk '/kex: client->server cipher:/{print $7}' ${LOG} | \ + tr -d '\r' | sort -u` ;; + esac + if [ "$_want" != "$_got" ]; then + fail "unexpected algorithm, want $_want, got $_got" + fi trace "$n rekeying(s)" if [ $n -lt 1 ]; then fail "no rekeying occurred ($@)" fi + cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy } increase_datafile_size 300 opts="" -for i in `${SSH} -Q kex`; do + +# Filter out duplicate curve algo +kexs=`${SSH} -Q kex | grep -v curve25519-sha256@libssh.org` +ciphers=`${SSH} -Q cipher` +macs=`${SSH} -Q mac` + +for i in $kexs; do opts="$opts KexAlgorithms=$i" done -for i in `${SSH} -Q cipher`; do +for i in $ciphers; do opts="$opts Ciphers=$i" done -for i in `${SSH} -Q mac`; do +for i in $macs; do opts="$opts MACs=$i" done for opt in $opts; do verbose "client rekey $opt" - ssh_data_rekeying "$opt" -oRekeyLimit=256k + if ${SSH} -Q cipher-auth | sed 's/^/Ciphers=/' | \ + grep $opt >/dev/null; then + trace AEAD cipher, testing all KexAlgorithms + for kex in $kexs; do + ssh_data_rekeying "" "KexAlgorithms=$kex" "-o$opt" + done + else + ssh_data_rekeying "" "$opt" + fi done -# AEAD ciphers are magical so test with all KexAlgorithms -if ${SSH} -Q cipher-auth | grep '^.*$' >/dev/null 2>&1 ; then - for c in `${SSH} -Q cipher-auth`; do - for kex in `${SSH} -Q kex`; do - verbose "client rekey $c $kex" - ssh_data_rekeying "KexAlgorithms=$kex" -oRekeyLimit=256k -oCiphers=$c - done - done -fi - for s in 16 1k 128k 256k; do verbose "client rekeylimit ${s}" - ssh_data_rekeying "" -oCompression=no -oRekeyLimit=$s + ssh_data_rekeying "$s" "" done for s in 5 10; do verbose "client rekeylimit default ${s}" rm -f ${COPY} ${LOG} - ${SSH} < ${DATA} -oCompression=no -oRekeyLimit="default $s" -F \ + ${SSH} < ${DATA} -oRekeyLimit="default $s" -F \ $OBJ/ssh_proxy somehost "cat >${COPY};sleep $s;sleep 10" if [ $? -ne 0 ]; then fail "ssh failed" @@ -87,7 +125,7 @@ done for s in 5 10; do verbose "client rekeylimit default ${s} no data" rm -f ${COPY} ${LOG} - ${SSH} -oCompression=no -oRekeyLimit="default $s" -F \ + ${SSH} -oRekeyLimit="default $s" -F \ $OBJ/ssh_proxy somehost "sleep $s;sleep 10" if [ $? -ne 0 ]; then fail "ssh failed" @@ -104,13 +142,13 @@ for s in 16 1k 128k 256k; do verbose "server rekeylimit ${s}" cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy echo "rekeylimit ${s}" >>$OBJ/sshd_proxy - rm -f ${COPY} ${LOG} - ${SSH} -oCompression=no -F $OBJ/ssh_proxy somehost "cat ${DATA}" \ - > ${COPY} + rm -f ${COPY} ${COPY2} ${LOG} + dd if=${DATA} of=${COPY} bs=$s count=1 2>/dev/null + ${SSH} -F $OBJ/ssh_proxy somehost "cat ${COPY}" >${COPY2} if [ $? -ne 0 ]; then fail "ssh failed" fi - cmp ${DATA} ${COPY} || fail "corrupted copy" + cmp ${COPY} ${COPY2} || fail "corrupted copy" n=`grep 'NEWKEYS sent' ${LOG} | wc -l` n=`expr $n - 1` trace "$n rekeying(s)" @@ -124,7 +162,7 @@ for s in 5 10; do cp $OBJ/sshd_proxy_bak $OBJ/sshd_proxy echo "rekeylimit default ${s}" >>$OBJ/sshd_proxy rm -f ${COPY} ${LOG} - ${SSH} -oCompression=no -F $OBJ/ssh_proxy somehost "sleep $s;sleep 10" + ${SSH} -F $OBJ/ssh_proxy somehost "sleep $s;sleep 10" if [ $? -ne 0 ]; then fail "ssh failed" fi @@ -136,9 +174,8 @@ for s in 5 10; do fi done -verbose "rekeylimit parsing" +verbose "rekeylimit parsing: bytes" for size in 16 1k 1K 1m 1M 1g 1G 4G 8G; do - for time in 1 1m 1M 1h 1H 1d 1D 1w 1W; do case $size in 16) bytes=16 ;; 1k|1K) bytes=1024 ;; @@ -147,6 +184,15 @@ for size in 16 1k 1K 1m 1M 1g 1G 4G 8G; do 4g|4G) bytes=4294967296 ;; 8g|8G) bytes=8589934592 ;; esac + b=`${SSH} -G -o "rekeylimit $size" -F $OBJ/ssh_proxy host | \ + awk '/rekeylimit/{print $2}'` + if [ "$bytes" != "$b" ]; then + fatal "rekeylimit size: expected $bytes bytes got $b" + fi +done + +verbose "rekeylimit parsing: time" +for time in 1 1m 1M 1h 1H 1d 1D 1w 1W; do case $time in 1) seconds=1 ;; 1m|1M) seconds=60 ;; @@ -154,19 +200,11 @@ for size in 16 1k 1K 1m 1M 1g 1G 4G 8G; do 1d|1D) seconds=86400 ;; 1w|1W) seconds=604800 ;; esac - - b=`$SUDO ${SSHD} -T -o "rekeylimit $size $time" -f $OBJ/sshd_proxy | \ - awk '/rekeylimit/{print $2}'` - s=`$SUDO ${SSHD} -T -o "rekeylimit $size $time" -f $OBJ/sshd_proxy | \ + s=`${SSH} -G -o "rekeylimit default $time" -F $OBJ/ssh_proxy host | \ awk '/rekeylimit/{print $3}'` - - if [ "$bytes" != "$b" ]; then - fatal "rekeylimit size: expected $bytes bytes got $b" - fi if [ "$seconds" != "$s" ]; then fatal "rekeylimit time: expected $time seconds got $s" fi - done done -rm -f ${COPY} ${DATA} +rm -f ${COPY} ${COPY2} ${DATA} diff --git a/regress/unittests/kex/Makefile b/regress/unittests/kex/Makefile index 3c89840..ca4f0ee 100644 --- a/regress/unittests/kex/Makefile +++ b/regress/unittests/kex/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.15 2024/05/19 19:10:01 anton Exp $ +# $OpenBSD: Makefile,v 1.16 2024/09/09 03:13:39 djm Exp $ PROG=test_kex SRCS=tests.c test_kex.c test_proposal.c @@ -25,6 +25,7 @@ SRCS+= kexc25519.c SRCS+= smult_curve25519_ref.c SRCS+= kexgen.c SRCS+= kexsntrup761x25519.c +SRCS+= kexmlkem768x25519.c SRCS+= sntrup761.c SRCS+= utf8.c diff --git a/regress/unittests/kex/test_kex.c b/regress/unittests/kex/test_kex.c index b1161ea..caf8f57 100644 --- a/regress/unittests/kex/test_kex.c +++ b/regress/unittests/kex/test_kex.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_kex.c,v 1.8 2024/03/25 19:28:09 djm Exp $ */ +/* $OpenBSD: test_kex.c,v 1.9 2024/09/09 03:13:39 djm Exp $ */ /* * Regress test KEX * @@ -153,6 +153,7 @@ do_kex_with_key(char *kex, int keytype, int bits) #endif /* WITH_OPENSSL */ server2->kex->kex[KEX_C25519_SHA256] = kex_gen_server; server2->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + server2->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; server2->kex->load_host_public_key = server->kex->load_host_public_key; server2->kex->load_host_private_key = server->kex->load_host_private_key; server2->kex->sign = server->kex->sign; @@ -207,6 +208,9 @@ kex_tests(void) do_kex("diffie-hellman-group-exchange-sha1"); do_kex("diffie-hellman-group14-sha1"); do_kex("diffie-hellman-group1-sha1"); +# ifdef USE_MLKEM768X25519 + do_kex("mlkem768x25519-sha256"); +# endif /* USE_MLKEM768X25519 */ # ifdef USE_SNTRUP761X25519 do_kex("sntrup761x25519-sha512@openssh.com"); # endif /* USE_SNTRUP761X25519 */ diff --git a/regress/unittests/sshkey/common.c b/regress/unittests/sshkey/common.c index 51b0d92..f325c2a 100644 --- a/regress/unittests/sshkey/common.c +++ b/regress/unittests/sshkey/common.c @@ -1,4 +1,4 @@ -/* $OpenBSD: common.c,v 1.5 2021/12/14 21:25:27 deraadt Exp $ */ +/* $OpenBSD: common.c,v 1.6 2024/08/15 00:52:23 djm Exp $ */ /* * Helpers for key API tests * @@ -89,8 +89,8 @@ rsa_n(struct sshkey *k) const BIGNUM *n = NULL; ASSERT_PTR_NE(k, NULL); - ASSERT_PTR_NE(k->rsa, NULL); - RSA_get0_key(k->rsa, &n, NULL, NULL); + ASSERT_PTR_NE(k->pkey, NULL); + RSA_get0_key(EVP_PKEY_get0_RSA(k->pkey), &n, NULL, NULL); return n; } @@ -100,8 +100,8 @@ rsa_e(struct sshkey *k) const BIGNUM *e = NULL; ASSERT_PTR_NE(k, NULL); - ASSERT_PTR_NE(k->rsa, NULL); - RSA_get0_key(k->rsa, NULL, &e, NULL); + ASSERT_PTR_NE(k->pkey, NULL); + RSA_get0_key(EVP_PKEY_get0_RSA(k->pkey), NULL, &e, NULL); return e; } @@ -111,8 +111,8 @@ rsa_p(struct sshkey *k) const BIGNUM *p = NULL; ASSERT_PTR_NE(k, NULL); - ASSERT_PTR_NE(k->rsa, NULL); - RSA_get0_factors(k->rsa, &p, NULL); + ASSERT_PTR_NE(EVP_PKEY_get0_RSA(k->pkey), NULL); + RSA_get0_factors(EVP_PKEY_get0_RSA(k->pkey), &p, NULL); return p; } @@ -122,8 +122,8 @@ rsa_q(struct sshkey *k) const BIGNUM *q = NULL; ASSERT_PTR_NE(k, NULL); - ASSERT_PTR_NE(k->rsa, NULL); - RSA_get0_factors(k->rsa, NULL, &q); + ASSERT_PTR_NE(EVP_PKEY_get0_RSA(k->pkey), NULL); + RSA_get0_factors(EVP_PKEY_get0_RSA(k->pkey), NULL, &q); return q; } diff --git a/regress/unittests/sshkey/test_file.c b/regress/unittests/sshkey/test_file.c index 4528405..3babe60 100644 --- a/regress/unittests/sshkey/test_file.c +++ b/regress/unittests/sshkey/test_file.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_file.c,v 1.11 2024/01/11 01:45:58 djm Exp $ */ +/* $OpenBSD: test_file.c,v 1.12 2024/08/15 00:52:23 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -271,11 +271,12 @@ sshkey_file_tests(void) #ifndef OPENSSL_IS_BORINGSSL /* lacks EC_POINT_point2bn() */ a = load_bignum("ecdsa_1.param.priv"); b = load_bignum("ecdsa_1.param.pub"); - c = EC_POINT_point2bn(EC_KEY_get0_group(k1->ecdsa), - EC_KEY_get0_public_key(k1->ecdsa), POINT_CONVERSION_UNCOMPRESSED, - NULL, NULL); + c = EC_POINT_point2bn(EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(k1->pkey)), + EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(k1->pkey)), + POINT_CONVERSION_UNCOMPRESSED, NULL, NULL); ASSERT_PTR_NE(c, NULL); - ASSERT_BIGNUM_EQ(EC_KEY_get0_private_key(k1->ecdsa), a); + ASSERT_BIGNUM_EQ( + EC_KEY_get0_private_key(EVP_PKEY_get0_EC_KEY(k1->pkey)), a); ASSERT_BIGNUM_EQ(b, c); BN_free(a); BN_free(b); diff --git a/regress/unittests/sshkey/test_sshkey.c b/regress/unittests/sshkey/test_sshkey.c index c1cbb11..5bf4b65 100644 --- a/regress/unittests/sshkey/test_sshkey.c +++ b/regress/unittests/sshkey/test_sshkey.c @@ -1,4 +1,4 @@ -/* $OpenBSD: test_sshkey.c,v 1.24 2024/01/11 01:45:58 djm Exp $ */ +/* $OpenBSD: test_sshkey.c,v 1.25 2024/08/15 00:52:23 djm Exp $ */ /* * Regress test for sshkey.h key management API * @@ -204,7 +204,7 @@ sshkey_tests(void) TEST_START("new/free KEY_RSA"); k1 = sshkey_new(KEY_RSA); ASSERT_PTR_NE(k1, NULL); - ASSERT_PTR_NE(k1->rsa, NULL); + ASSERT_PTR_NE(k1->pkey, NULL); sshkey_free(k1); TEST_DONE(); @@ -221,7 +221,7 @@ sshkey_tests(void) TEST_START("new/free KEY_ECDSA"); k1 = sshkey_new(KEY_ECDSA); ASSERT_PTR_NE(k1, NULL); - ASSERT_PTR_EQ(k1->ecdsa, NULL); /* Can't allocate without NID */ + ASSERT_PTR_EQ(k1->pkey, NULL); /* Can't allocate without NID */ sshkey_free(k1); TEST_DONE(); #endif @@ -270,7 +270,7 @@ sshkey_tests(void) SSH_ERR_KEY_LENGTH); ASSERT_INT_EQ(sshkey_generate(KEY_RSA, 1024, &kr), 0); ASSERT_PTR_NE(kr, NULL); - ASSERT_PTR_NE(kr->rsa, NULL); + ASSERT_PTR_NE(EVP_PKEY_get0_RSA(kr->pkey), NULL); ASSERT_PTR_NE(rsa_n(kr), NULL); ASSERT_PTR_NE(rsa_e(kr), NULL); ASSERT_PTR_NE(rsa_p(kr), NULL); @@ -291,9 +291,11 @@ sshkey_tests(void) TEST_START("generate KEY_ECDSA"); ASSERT_INT_EQ(sshkey_generate(KEY_ECDSA, 256, &ke), 0); ASSERT_PTR_NE(ke, NULL); - ASSERT_PTR_NE(ke->ecdsa, NULL); - ASSERT_PTR_NE(EC_KEY_get0_public_key(ke->ecdsa), NULL); - ASSERT_PTR_NE(EC_KEY_get0_private_key(ke->ecdsa), NULL); + ASSERT_PTR_NE(EVP_PKEY_get0_EC_KEY(ke->pkey), NULL); + ASSERT_PTR_NE(EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(ke->pkey)), + NULL); + ASSERT_PTR_NE(EC_KEY_get0_private_key(EVP_PKEY_get0_EC_KEY(ke->pkey)), + NULL); TEST_DONE(); #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ @@ -312,7 +314,7 @@ sshkey_tests(void) ASSERT_PTR_NE(k1, NULL); ASSERT_PTR_NE(kr, k1); ASSERT_INT_EQ(k1->type, KEY_RSA); - ASSERT_PTR_NE(k1->rsa, NULL); + ASSERT_PTR_NE(EVP_PKEY_get0_RSA(k1->pkey), NULL); ASSERT_PTR_NE(rsa_n(k1), NULL); ASSERT_PTR_NE(rsa_e(k1), NULL); ASSERT_PTR_EQ(rsa_p(k1), NULL); @@ -346,10 +348,12 @@ sshkey_tests(void) ASSERT_PTR_NE(k1, NULL); ASSERT_PTR_NE(ke, k1); ASSERT_INT_EQ(k1->type, KEY_ECDSA); - ASSERT_PTR_NE(k1->ecdsa, NULL); + ASSERT_PTR_NE(EVP_PKEY_get0_EC_KEY(k1->pkey), NULL); ASSERT_INT_EQ(k1->ecdsa_nid, ke->ecdsa_nid); - ASSERT_PTR_NE(EC_KEY_get0_public_key(ke->ecdsa), NULL); - ASSERT_PTR_EQ(EC_KEY_get0_private_key(k1->ecdsa), NULL); + ASSERT_PTR_NE(EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(ke->pkey)), + NULL); + ASSERT_PTR_EQ(EC_KEY_get0_private_key(EVP_PKEY_get0_EC_KEY(k1->pkey)), + NULL); TEST_DONE(); TEST_START("equal KEY_ECDSA/demoted KEY_ECDSA"); diff --git a/regress/unittests/test_helper/fuzz.c b/regress/unittests/test_helper/fuzz.c index 78b3665..9995b26 100644 --- a/regress/unittests/test_helper/fuzz.c +++ b/regress/unittests/test_helper/fuzz.c @@ -214,7 +214,7 @@ siginfo(int unused __attribute__((__unused__))) struct fuzz * fuzz_begin(u_int strategies, const void *p, size_t l) { - struct fuzz *ret = calloc(sizeof(*ret), 1); + struct fuzz *ret = calloc(1, sizeof(*ret)); assert(p != NULL); assert(ret != NULL); @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.c,v 1.411 2024/06/12 22:36:00 djm Exp $ */ +/* $OpenBSD: servconf.c,v 1.418 2024/09/15 03:09:44 djm Exp $ */ /* * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland * All rights reserved @@ -178,6 +178,7 @@ initialize_server_options(ServerOptions *options) options->per_source_penalty.penalty_authfail = -1; options->per_source_penalty.penalty_noauth = -1; options->per_source_penalty.penalty_grace = -1; + options->per_source_penalty.penalty_refuseconnection = -1; options->per_source_penalty.penalty_max = -1; options->per_source_penalty.penalty_min = -1; options->max_authtries = -1; @@ -213,6 +214,7 @@ initialize_server_options(ServerOptions *options) options->num_channel_timeouts = 0; options->unused_connection_timeout = -1; options->sshd_session_path = NULL; + options->refuse_connection = -1; } /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */ @@ -434,11 +436,13 @@ fill_default_server_options(ServerOptions *options) if (options->per_source_penalty.penalty_crash == -1) options->per_source_penalty.penalty_crash = 90; if (options->per_source_penalty.penalty_grace == -1) - options->per_source_penalty.penalty_grace = 20; + options->per_source_penalty.penalty_grace = 10; if (options->per_source_penalty.penalty_authfail == -1) options->per_source_penalty.penalty_authfail = 5; if (options->per_source_penalty.penalty_noauth == -1) options->per_source_penalty.penalty_noauth = 1; + if (options->per_source_penalty.penalty_refuseconnection == -1) + options->per_source_penalty.penalty_refuseconnection = 10; if (options->per_source_penalty.penalty_min == -1) options->per_source_penalty.penalty_min = 15; if (options->per_source_penalty.penalty_max == -1) @@ -489,6 +493,8 @@ fill_default_server_options(ServerOptions *options) options->unused_connection_timeout = 0; if (options->sshd_session_path == NULL) options->sshd_session_path = xstrdup(_PATH_SSHD_SESSION); + if (options->refuse_connection == -1) + options->refuse_connection = 0; assemble_algorithms(options); @@ -571,7 +577,7 @@ typedef enum { sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding, sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider, sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout, - sSshdSessionPath, + sSshdSessionPath, sRefuseConnection, sDeprecated, sIgnore, sUnsupported } ServerOpCodes; @@ -739,6 +745,7 @@ static struct { { "channeltimeout", sChannelTimeout, SSHCFG_ALL }, { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL }, { "sshdsessionpath", sSshdSessionPath, SSHCFG_GLOBAL }, + { "refuseconnection", sRefuseConnection, SSHCFG_ALL }, { NULL, sBadOption, 0 } }; @@ -1022,43 +1029,57 @@ match_test_missing_fatal(const char *criteria, const char *attrib) * not match. */ static int -match_cfg_line(char **condition, int line, struct connection_info *ci) +match_cfg_line(const char *full_line, int *acp, char ***avp, + int line, struct connection_info *ci) { int result = 1, attributes = 0, port; - char *arg, *attrib, *cp = *condition; + char *arg, *attrib; if (ci == NULL) - debug3("checking syntax for 'Match %s'", cp); - else - debug3("checking match for '%s' user %s host %s addr %s " - "laddr %s lport %d", cp, ci->user ? ci->user : "(null)", + debug3("checking syntax for 'Match %s'", full_line); + else { + debug3("checking match for '%s' user %s%s host %s addr %s " + "laddr %s lport %d", full_line, + ci->user ? ci->user : "(null)", + ci->user_invalid ? " (invalid)" : "", ci->host ? ci->host : "(null)", ci->address ? ci->address : "(null)", ci->laddress ? ci->laddress : "(null)", ci->lport); + } - while ((attrib = strdelim(&cp)) && *attrib != '\0') { + while ((attrib = argv_next(acp, avp)) != NULL) { /* Terminate on comment */ if (*attrib == '#') { - cp = NULL; /* mark all arguments consumed */ + argv_consume(acp); /* mark all arguments consumed */ break; } arg = NULL; attributes++; /* Criterion "all" has no argument and must appear alone */ if (strcasecmp(attrib, "all") == 0) { - if (attributes > 1 || ((arg = strdelim(&cp)) != NULL && + if (attributes > 1 || + ((arg = argv_next(acp, avp)) != NULL && *arg != '\0' && *arg != '#')) { error("'all' cannot be combined with other " "Match attributes"); return -1; } if (arg != NULL && *arg == '#') - cp = NULL; /* mark all arguments consumed */ - *condition = cp; + argv_consume(acp); /* consume remaining args */ return 1; } + /* Criterion "invalid-user" also has no argument */ + if (strcasecmp(attrib, "invalid-user") == 0) { + if (ci == NULL) + continue; + if (ci->user_invalid == 0) + result = 0; + else + debug("matched invalid-user at line %d", line); + continue; + } /* All other criteria require an argument */ - if ((arg = strdelim(&cp)) == NULL || + if ((arg = argv_next(acp, avp)) == NULL || *arg == '\0' || *arg == '#') { error("Missing Match criteria for %s", attrib); return -1; @@ -1189,7 +1210,6 @@ match_cfg_line(char **condition, int line, struct connection_info *ci) } if (ci != NULL) debug3("match %sfound", result ? "" : "not "); - *condition = cp; return result; } @@ -1933,6 +1953,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, xasprintf(&options->subsystem_args[options->num_subsystems], "%s%s%s", arg, *arg2 == '\0' ? "" : " ", arg2); free(arg2); + free(arg); argv_consume(&ac); options->num_subsystems++; break; @@ -2047,6 +2068,9 @@ process_server_config_line_depth(ServerOptions *options, char *line, } else if (strncmp(arg, "grace-exceeded:", 15) == 0) { p = arg + 15; intptr = &options->per_source_penalty.penalty_grace; + } else if (strncmp(arg, "refuseconnection:", 17) == 0) { + p = arg + 17; + intptr = &options->per_source_penalty.penalty_refuseconnection; } else if (strncmp(arg, "max:", 4) == 0) { p = arg + 4; intptr = &options->per_source_penalty.penalty_max; @@ -2325,7 +2349,7 @@ process_server_config_line_depth(ServerOptions *options, char *line, if (cmdline) fatal("Match directive not supported as a command-line " "option"); - value = match_cfg_line(&str, linenum, + value = match_cfg_line(str, &ac, &av, linenum, (*inc_flags & SSHCFG_NEVERMATCH ? NULL : connectinfo)); if (value < 0) fatal("%s line %d: Bad Match condition", filename, @@ -2336,12 +2360,6 @@ process_server_config_line_depth(ServerOptions *options, char *line, * match block. */ *inc_flags &= ~SSHCFG_MATCH_ONLY; - /* - * If match_cfg_line() didn't consume all its arguments then - * arrange for the extra arguments check below to fail. - */ - if (str == NULL || *str == '\0') - argv_consume(&ac); break; case sPermitListen: @@ -2658,6 +2676,11 @@ process_server_config_line_depth(ServerOptions *options, char *line, charptr = &options->sshd_session_path; goto parse_filename; + case sRefuseConnection: + intptr = &options->refuse_connection; + multistate_ptr = multistate_flag; + goto parse_multistate; + case sDeprecated: case sIgnore: case sUnsupported: @@ -2772,6 +2795,8 @@ int parse_server_match_testspec(struct connection_info *ci, char *spec) " specification %s\n", p+6, p); return -1; } + } else if (strcmp(p, "invalid-user") == 0) { + ci->user_invalid = 1; } else { fprintf(stderr, "Invalid test mode specification %s\n", p); @@ -2873,6 +2898,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth) M_CP_INTOPT(log_level); M_CP_INTOPT(required_rsa_size); M_CP_INTOPT(unused_connection_timeout); + M_CP_INTOPT(refuse_connection); /* * The bind_mask is a mode_t that may be unsigned, so we can't use @@ -3203,6 +3229,7 @@ dump_config(ServerOptions *o) dump_cfg_fmtint(sStreamLocalBindUnlink, o->fwd_opts.streamlocal_bind_unlink); dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash); dump_cfg_fmtint(sExposeAuthInfo, o->expose_userauth_info); + dump_cfg_fmtint(sRefuseConnection, o->refuse_connection); /* string arguments */ dump_cfg_string(sPidFile, o->pid_file); @@ -3325,12 +3352,14 @@ dump_config(ServerOptions *o) if (o->per_source_penalty.enabled) { printf("persourcepenalties crash:%d authfail:%d noauth:%d " - "grace-exceeded:%d max:%d min:%d max-sources4:%d " - "max-sources6:%d overflow:%s overflow6:%s\n", + "grace-exceeded:%d refuseconnection:%d max:%d min:%d " + "max-sources4:%d max-sources6:%d " + "overflow:%s overflow6:%s\n", o->per_source_penalty.penalty_crash, o->per_source_penalty.penalty_authfail, o->per_source_penalty.penalty_noauth, o->per_source_penalty.penalty_grace, + o->per_source_penalty.penalty_refuseconnection, o->per_source_penalty.penalty_max, o->per_source_penalty.penalty_min, o->per_source_penalty.max_sources4, @@ -1,4 +1,4 @@ -/* $OpenBSD: servconf.h,v 1.165 2024/06/12 22:36:00 djm Exp $ */ +/* $OpenBSD: servconf.h,v 1.168 2024/09/15 01:18:26 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> @@ -77,6 +77,7 @@ struct per_source_penalty { int penalty_grace; int penalty_authfail; int penalty_noauth; + int penalty_refuseconnection; int penalty_max; int penalty_min; }; @@ -248,11 +249,14 @@ typedef struct { int unused_connection_timeout; char *sshd_session_path; + + int refuse_connection; } ServerOptions; /* Information about the incoming connection as used by Match */ struct connection_info { const char *user; + int user_invalid; const char *host; /* possibly resolved hostname */ const char *address; /* remote address */ const char *laddress; /* local address */ diff --git a/sntrup761.c b/sntrup761.c index 57368bd..123d013 100644 --- a/sntrup761.c +++ b/sntrup761.c @@ -1,4 +1,5 @@ -/* $OpenBSD: sntrup761.c,v 1.6 2023/01/11 02:13:52 djm Exp $ */ + +/* $OpenBSD: sntrup761.c,v 1.8 2024/09/16 05:37:05 djm Exp $ */ /* * Public Domain, Authors: @@ -15,6 +16,8 @@ #include <string.h> #include "crypto_api.h" +#define crypto_declassify(x, y) do {} while (0) + #define int8 crypto_int8 #define uint8 crypto_uint8 #define int16 crypto_int16 @@ -23,1251 +26,2134 @@ #define uint32 crypto_uint32 #define int64 crypto_int64 #define uint64 crypto_uint64 +extern volatile crypto_int16 crypto_int16_optblocker; +extern volatile crypto_int32 crypto_int32_optblocker; +extern volatile crypto_int64 crypto_int64_optblocker; -/* from supercop-20201130/crypto_sort/int32/portable4/int32_minmax.inc */ -#define int32_MINMAX(a,b) \ -do { \ - int64_t ab = (int64_t)b ^ (int64_t)a; \ - int64_t c = (int64_t)b - (int64_t)a; \ - c ^= ab & (c ^ b); \ - c >>= 31; \ - c &= ab; \ - a ^= c; \ - b ^= c; \ -} while(0) +/* from supercop-20240808/cryptoint/crypto_int16.h */ +/* auto-generated: cd cryptoint; ./autogen */ +/* cryptoint 20240806 */ -/* from supercop-20201130/crypto_sort/int32/portable4/sort.c */ +#ifndef crypto_int16_h +#define crypto_int16_h +#define crypto_int16 int16_t +#define crypto_int16_unsigned uint16_t -static void crypto_sort_int32(void *array,long long n) -{ - long long top,p,q,r,i,j; - int32 *x = array; - if (n < 2) return; - top = 1; - while (top < n - top) top += top; - - for (p = top;p >= 1;p >>= 1) { - i = 0; - while (i + 2 * p <= n) { - for (j = i;j < i + p;++j) - int32_MINMAX(x[j],x[j+p]); - i += 2 * p; - } - for (j = i;j < n - p;++j) - int32_MINMAX(x[j],x[j+p]); - i = 0; - j = 0; - for (q = top;q > p;q >>= 1) { - if (j != i) for (;;) { - if (j == n - q) goto done; - int32 a = x[j + p]; - for (r = q;r > p;r >>= 1) - int32_MINMAX(a,x[j + r]); - x[j + p] = a; - ++j; - if (j == i + p) { - i += 2 * p; - break; - } - } - while (i + p <= n - q) { - for (j = i;j < i + p;++j) { - int32 a = x[j + p]; - for (r = q;r > p;r >>= 1) - int32_MINMAX(a,x[j+r]); - x[j + p] = a; - } - i += 2 * p; - } - /* now i + p > n - q */ - j = i; - while (j < n - q) { - int32 a = x[j + p]; - for (r = q;r > p;r >>= 1) - int32_MINMAX(a,x[j+r]); - x[j + p] = a; - ++j; - } - - done: ; - } - } +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_load(const unsigned char *crypto_int16_s) { + crypto_int16 crypto_int16_z = 0; + crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 0; + crypto_int16_z |= ((crypto_int16) (*crypto_int16_s++)) << 8; + return crypto_int16_z; } -/* from supercop-20201130/crypto_sort/uint32/useint32/sort.c */ - -/* can save time by vectorizing xor loops */ -/* can save time by integrating xor loops with int32_sort */ - -static void crypto_sort_uint32(void *array,long long n) -{ - crypto_uint32 *x = array; - long long j; - for (j = 0;j < n;++j) x[j] ^= 0x80000000; - crypto_sort_int32(array,n); - for (j = 0;j < n;++j) x[j] ^= 0x80000000; +__attribute__((unused)) +static inline +void crypto_int16_store(unsigned char *crypto_int16_s,crypto_int16 crypto_int16_x) { + *crypto_int16_s++ = crypto_int16_x >> 0; + *crypto_int16_s++ = crypto_int16_x >> 8; } -/* from supercop-20201130/crypto_kem/sntrup761/ref/uint32.c */ - -/* -CPU division instruction typically takes time depending on x. -This software is designed to take time independent of x. -Time still varies depending on m; user must ensure that m is constant. -Time also varies on CPUs where multiplication is variable-time. -There could be more CPU issues. -There could also be compiler issues. -*/ - -static void uint32_divmod_uint14(uint32 *q,uint16 *r,uint32 x,uint16 m) -{ - uint32 v = 0x80000000; - uint32 qpart; - uint32 mask; - - v /= m; - - /* caller guarantees m > 0 */ - /* caller guarantees m < 16384 */ - /* vm <= 2^31 <= vm+m-1 */ - /* xvm <= 2^31 x <= xvm+x(m-1) */ - - *q = 0; - - qpart = (x*(uint64)v)>>31; - /* 2^31 qpart <= xv <= 2^31 qpart + 2^31-1 */ - /* 2^31 qpart m <= xvm <= 2^31 qpart m + (2^31-1)m */ - /* 2^31 qpart m <= 2^31 x <= 2^31 qpart m + (2^31-1)m + x(m-1) */ - /* 0 <= 2^31 newx <= (2^31-1)m + x(m-1) */ - /* 0 <= newx <= (1-1/2^31)m + x(m-1)/2^31 */ - /* 0 <= newx <= (1-1/2^31)(2^14-1) + (2^32-1)((2^14-1)-1)/2^31 */ - - x -= qpart*m; *q += qpart; - /* x <= 49146 */ - - qpart = (x*(uint64)v)>>31; - /* 0 <= newx <= (1-1/2^31)m + x(m-1)/2^31 */ - /* 0 <= newx <= m + 49146(2^14-1)/2^31 */ - /* 0 <= newx <= m + 0.4 */ - /* 0 <= newx <= m */ - - x -= qpart*m; *q += qpart; - /* x <= m */ - - x -= m; *q += 1; - mask = -(x>>31); - x += mask&(uint32)m; *q += mask; - /* x < m */ - - *r = x; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_negative_mask(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarw $15,%0" : "+r"(crypto_int16_x) : : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_y; + __asm__ ("sbfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); + return crypto_int16_y; +#else + crypto_int16_x >>= 16-6; + crypto_int16_x ^= crypto_int16_optblocker; + crypto_int16_x >>= 5; + return crypto_int16_x; +#endif } - -static uint16 uint32_mod_uint14(uint32 x,uint16 m) -{ - uint32 q; - uint16 r; - uint32_divmod_uint14(&q,&r,x,m); - return r; +__attribute__((unused)) +static inline +crypto_int16_unsigned crypto_int16_unsigned_topbit_01(crypto_int16_unsigned crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("shrw $15,%0" : "+r"(crypto_int16_x) : : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_y; + __asm__ ("ubfx %w0,%w1,15,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); + return crypto_int16_y; +#else + crypto_int16_x >>= 16-6; + crypto_int16_x ^= crypto_int16_optblocker; + crypto_int16_x >>= 5; + return crypto_int16_x; +#endif } -/* from supercop-20201130/crypto_kem/sntrup761/ref/int32.c */ - -static void int32_divmod_uint14(int32 *q,uint16 *r,int32 x,uint16 m) -{ - uint32 uq,uq2; - uint16 ur,ur2; - uint32 mask; - - uint32_divmod_uint14(&uq,&ur,0x80000000+(uint32)x,m); - uint32_divmod_uint14(&uq2,&ur2,0x80000000,m); - ur -= ur2; uq -= uq2; - mask = -(uint32)(ur>>15); - ur += mask&m; uq += mask; - *r = ur; *q = uq; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_negative_01(crypto_int16 crypto_int16_x) { + return crypto_int16_unsigned_topbit_01(crypto_int16_x); } - -static uint16 int32_mod_uint14(int32 x,uint16 m) -{ - int32 q; - uint16 r; - int32_divmod_uint14(&q,&r,x,m); - return r; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_topbit_mask(crypto_int16 crypto_int16_x) { + return crypto_int16_negative_mask(crypto_int16_x); } -/* from supercop-20201130/crypto_kem/sntrup761/ref/paramsmenu.h */ -/* pick one of these three: */ -#define SIZE761 -#undef SIZE653 -#undef SIZE857 - -/* pick one of these two: */ -#define SNTRUP /* Streamlined NTRU Prime */ -#undef LPR /* NTRU LPRime */ - -/* from supercop-20201130/crypto_kem/sntrup761/ref/params.h */ -#ifndef params_H -#define params_H - -/* menu of parameter choices: */ - - -/* what the menu means: */ +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_topbit_01(crypto_int16 crypto_int16_x) { + return crypto_int16_unsigned_topbit_01(crypto_int16_x); +} -#if defined(SIZE761) -#define p 761 -#define q 4591 -#define Rounded_bytes 1007 -#ifndef LPR -#define Rq_bytes 1158 -#define w 286 +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bottombit_mask(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc"); + return -crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_y; + __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); + return crypto_int16_y; #else -#define w 250 -#define tau0 2156 -#define tau1 114 -#define tau2 2007 -#define tau3 287 + crypto_int16_x &= 1 ^ crypto_int16_optblocker; + return -crypto_int16_x; #endif +} -#elif defined(SIZE653) -#define p 653 -#define q 4621 -#define Rounded_bytes 865 -#ifndef LPR -#define Rq_bytes 994 -#define w 288 +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bottombit_01(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andw $1,%0" : "+r"(crypto_int16_x) : : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_y; + __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); + return crypto_int16_y; #else -#define w 252 -#define tau0 2175 -#define tau1 113 -#define tau2 2031 -#define tau3 290 + crypto_int16_x &= 1 ^ crypto_int16_optblocker; + return crypto_int16_x; #endif +} -#elif defined(SIZE857) -#define p 857 -#define q 5167 -#define Rounded_bytes 1152 -#ifndef LPR -#define Rq_bytes 1322 -#define w 322 +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bitinrangepublicpos_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #else -#define w 281 -#define tau0 2433 -#define tau1 101 -#define tau2 2265 -#define tau3 324 + crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker; #endif + return crypto_int16_bottombit_mask(crypto_int16_x); +} +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bitinrangepublicpos_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("sxth %w0,%w0\n asr %w0,%w0,%w1" : "+&r"(crypto_int16_x) : "r"(crypto_int16_s) : ); #else -#error "no parameter set defined" + crypto_int16_x >>= crypto_int16_s ^ crypto_int16_optblocker; #endif + return crypto_int16_bottombit_01(crypto_int16_x); +} -#ifdef LPR -#define I 256 +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_shlmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16_s &= 15; + __asm__ ("shlw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("and %w0,%w0,15\n and %w1,%w1,65535\n lsl %w1,%w1,%w0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); +#else + int crypto_int16_k, crypto_int16_l; + for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2) + crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x << crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l); #endif + return crypto_int16_x; +} +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_shrmod(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16_s &= 15; + __asm__ ("sarw %%cl,%0" : "+r"(crypto_int16_x) : "c"(crypto_int16_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("and %w0,%w0,15\n sxth %w1,%w1\n asr %w1,%w1,%w0" : "+&r"(crypto_int16_s), "+r"(crypto_int16_x) : : ); +#else + int crypto_int16_k, crypto_int16_l; + for (crypto_int16_l = 0,crypto_int16_k = 1;crypto_int16_k < 16;++crypto_int16_l,crypto_int16_k *= 2) + crypto_int16_x ^= (crypto_int16_x ^ (crypto_int16_x >> crypto_int16_k)) & crypto_int16_bitinrangepublicpos_mask(crypto_int16_s,crypto_int16_l); #endif - -/* from supercop-20201130/crypto_kem/sntrup761/ref/Decode.h */ -#ifndef Decode_H -#define Decode_H - - -/* Decode(R,s,M,len) */ -/* assumes 0 < M[i] < 16384 */ -/* produces 0 <= R[i] < M[i] */ - + return crypto_int16_x; +} + +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bitmod_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { + crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s); + return crypto_int16_bottombit_mask(crypto_int16_x); +} + +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_bitmod_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_s) { + crypto_int16_x = crypto_int16_shrmod(crypto_int16_x,crypto_int16_s); + return crypto_int16_bottombit_01(crypto_int16_x); +} + +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_nonzero_mask(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("tst %w1,65535\n csetm %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + crypto_int16_x |= -crypto_int16_x; + return crypto_int16_negative_mask(crypto_int16_x); #endif - -/* from supercop-20201130/crypto_kem/sntrup761/ref/Decode.c */ - -static void Decode(uint16 *out,const unsigned char *S,const uint16 *M,long long len) -{ - if (len == 1) { - if (M[0] == 1) - *out = 0; - else if (M[0] <= 256) - *out = uint32_mod_uint14(S[0],M[0]); - else - *out = uint32_mod_uint14(S[0]+(((uint16)S[1])<<8),M[0]); - } - if (len > 1) { - uint16 R2[(len+1)/2]; - uint16 M2[(len+1)/2]; - uint16 bottomr[len/2]; - uint32 bottomt[len/2]; - long long i; - for (i = 0;i < len-1;i += 2) { - uint32 m = M[i]*(uint32) M[i+1]; - if (m > 256*16383) { - bottomt[i/2] = 256*256; - bottomr[i/2] = S[0]+256*S[1]; - S += 2; - M2[i/2] = (((m+255)>>8)+255)>>8; - } else if (m >= 16384) { - bottomt[i/2] = 256; - bottomr[i/2] = S[0]; - S += 1; - M2[i/2] = (m+255)>>8; - } else { - bottomt[i/2] = 1; - bottomr[i/2] = 0; - M2[i/2] = m; - } - } - if (i < len) - M2[i/2] = M[i]; - Decode(R2,S,M2,(len+1)/2); - for (i = 0;i < len-1;i += 2) { - uint32 r = bottomr[i/2]; - uint32 r1; - uint16 r0; - r += bottomt[i/2]*R2[i/2]; - uint32_divmod_uint14(&r1,&r0,r,M[i]); - r1 = uint32_mod_uint14(r1,M[i+1]); /* only needed for invalid inputs */ - *out++ = r0; - *out++ = r1; - } - if (i < len) - *out++ = R2[i/2]; - } } -/* from supercop-20201130/crypto_kem/sntrup761/ref/Encode.h */ -#ifndef Encode_H -#define Encode_H - - -/* Encode(s,R,M,len) */ -/* assumes 0 <= R[i] < M[i] < 16384 */ - +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_nonzero_01(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("tst %w1,65535\n cset %w0,ne" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + crypto_int16_x |= -crypto_int16_x; + return crypto_int16_unsigned_topbit_01(crypto_int16_x); #endif - -/* from supercop-20201130/crypto_kem/sntrup761/ref/Encode.c */ - -/* 0 <= R[i] < M[i] < 16384 */ -static void Encode(unsigned char *out,const uint16 *R,const uint16 *M,long long len) -{ - if (len == 1) { - uint16 r = R[0]; - uint16 m = M[0]; - while (m > 1) { - *out++ = r; - r >>= 8; - m = (m+255)>>8; - } - } - if (len > 1) { - uint16 R2[(len+1)/2]; - uint16 M2[(len+1)/2]; - long long i; - for (i = 0;i < len-1;i += 2) { - uint32 m0 = M[i]; - uint32 r = R[i]+R[i+1]*m0; - uint32 m = M[i+1]*m0; - while (m >= 16384) { - *out++ = r; - r >>= 8; - m = (m+255)>>8; - } - R2[i/2] = r; - M2[i/2] = m; - } - if (i < len) { - R2[i/2] = R[i]; - M2[i/2] = M[i]; - } - Encode(out,R2,M2,(len+1)/2); - } } -/* from supercop-20201130/crypto_kem/sntrup761/ref/kem.c */ - -#ifdef LPR +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_positive_mask(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,0\n csetm %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + crypto_int16 crypto_int16_z = -crypto_int16_x; + crypto_int16_z ^= crypto_int16_x & crypto_int16_z; + return crypto_int16_negative_mask(crypto_int16_z); #endif - - -/* ----- masks */ - -#ifndef LPR - -/* return -1 if x!=0; else return 0 */ -static int int16_nonzero_mask(int16 x) -{ - uint16 u = x; /* 0, else 1...65535 */ - uint32 v = u; /* 0, else 1...65535 */ - v = -v; /* 0, else 2^32-65535...2^32-1 */ - v >>= 31; /* 0, else 1 */ - return -v; /* 0, else -1 */ } +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_positive_01(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovgw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,0\n cset %w0,gt" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + crypto_int16 crypto_int16_z = -crypto_int16_x; + crypto_int16_z ^= crypto_int16_x & crypto_int16_z; + return crypto_int16_unsigned_topbit_01(crypto_int16_z); #endif - -/* return -1 if x<0; otherwise return 0 */ -static int int16_negative_mask(int16 x) -{ - uint16 u = x; - u >>= 15; - return -(int) u; - /* alternative with gcc -fwrapv: */ - /* x>>15 compiles to CPU's arithmetic right shift */ } -/* ----- arithmetic mod 3 */ - -typedef int8 small; - -/* F3 is always represented as -1,0,1 */ -/* so ZZ_fromF3 is a no-op */ - -/* x must not be close to top int16 */ -static small F3_freeze(int16 x) -{ - return int32_mod_uint14(x+1,3)-1; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_zero_mask(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("tst %w1,65535\n csetm %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + return ~crypto_int16_nonzero_mask(crypto_int16_x); +#endif } -/* ----- arithmetic mod q */ - -#define q12 ((q-1)/2) -typedef int16 Fq; -/* always represented as -q12...q12 */ -/* so ZZ_fromFq is a no-op */ - -/* x must not be close to top int32 */ -static Fq Fq_freeze(int32 x) -{ - return int32_mod_uint14(x+q12,q)-q12; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_zero_01(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n testw %2,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("tst %w1,65535\n cset %w0,eq" : "=r"(crypto_int16_z) : "r"(crypto_int16_x) : "cc"); + return crypto_int16_z; +#else + return 1-crypto_int16_nonzero_01(crypto_int16_x); +#endif } -#ifndef LPR - -static Fq Fq_recip(Fq a1) -{ - int i = 1; - Fq ai = a1; - - while (i < q-2) { - ai = Fq_freeze(a1*(int32)ai); - i += 1; - } - return ai; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_unequal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return crypto_int16_nonzero_mask(crypto_int16_x ^ crypto_int16_y); +#endif } +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_unequal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovnew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,ne" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return crypto_int16_nonzero_01(crypto_int16_x ^ crypto_int16_y); #endif - -/* ----- Top and Right */ - -#ifdef LPR -#define tau 16 - -static int8 Top(Fq C) -{ - return (tau1*(int32)(C+tau0)+16384)>>15; } -static Fq Right(int8 T) -{ - return Fq_freeze(tau3*(int32)T-tau2); -} +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_equal_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n csetm %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return ~crypto_int16_unequal_mask(crypto_int16_x,crypto_int16_y); #endif +} -/* ----- small polynomials */ +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_equal_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("and %w0,%w1,65535\n cmp %w0,%w2,uxth\n cset %w0,eq" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return 1-crypto_int16_unequal_01(crypto_int16_x,crypto_int16_y); +#endif +} -#ifndef LPR +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_min(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpw %1,%0\n cmovgw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w0,%w1,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); + return crypto_int16_x; +#else + crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; + crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; + crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); + crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); + crypto_int16_z &= crypto_int16_r; + return crypto_int16_x ^ crypto_int16_z; +#endif +} -/* 0 if Weightw_is(r), else -1 */ -static int Weightw_mask(small *r) -{ - int weight = 0; - int i; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_max(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpw %1,%0\n cmovlw %1,%0" : "+r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("sxth %w0,%w0\n cmp %w0,%w1,sxth\n csel %w0,%w1,%w0,lt" : "+&r"(crypto_int16_x) : "r"(crypto_int16_y) : "cc"); + return crypto_int16_x; +#else + crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; + crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; + crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); + crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); + crypto_int16_z &= crypto_int16_r; + return crypto_int16_y ^ crypto_int16_z; +#endif +} - for (i = 0;i < p;++i) weight += r[i]&1; - return int16_nonzero_mask(weight-w); +__attribute__((unused)) +static inline +void crypto_int16_minmax(crypto_int16 *crypto_int16_p,crypto_int16 *crypto_int16_q) { + crypto_int16 crypto_int16_x = *crypto_int16_p; + crypto_int16 crypto_int16_y = *crypto_int16_q; +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_z; + __asm__ ("cmpw %2,%1\n movw %1,%0\n cmovgw %2,%1\n cmovgw %0,%2" : "=&r"(crypto_int16_z), "+&r"(crypto_int16_x), "+r"(crypto_int16_y) : : "cc"); + *crypto_int16_p = crypto_int16_x; + *crypto_int16_q = crypto_int16_y; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_r, crypto_int16_s; + __asm__ ("sxth %w0,%w0\n cmp %w0,%w3,sxth\n csel %w1,%w0,%w3,lt\n csel %w2,%w3,%w0,lt" : "+&r"(crypto_int16_x), "=&r"(crypto_int16_r), "=r"(crypto_int16_s) : "r"(crypto_int16_y) : "cc"); + *crypto_int16_p = crypto_int16_r; + *crypto_int16_q = crypto_int16_s; +#else + crypto_int16 crypto_int16_r = crypto_int16_y ^ crypto_int16_x; + crypto_int16 crypto_int16_z = crypto_int16_y - crypto_int16_x; + crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_y); + crypto_int16_z = crypto_int16_negative_mask(crypto_int16_z); + crypto_int16_z &= crypto_int16_r; + crypto_int16_x ^= crypto_int16_z; + crypto_int16_y ^= crypto_int16_z; + *crypto_int16_p = crypto_int16_x; + *crypto_int16_q = crypto_int16_y; +#endif } -/* R3_fromR(R_fromRq(r)) */ -static void R3_fromRq(small *out,const Fq *r) -{ - int i; - for (i = 0;i < p;++i) out[i] = F3_freeze(r[i]); +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_smaller_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y; + crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y; + crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x); + return crypto_int16_negative_mask(crypto_int16_z); +#endif } -/* h = f*g in the ring R3 */ -static void R3_mult(small *h,const small *f,const small *g) -{ - small fg[p+p-1]; - small result; - int i,j; - - for (i = 0;i < p;++i) { - result = 0; - for (j = 0;j <= i;++j) result = F3_freeze(result+f[j]*g[i-j]); - fg[i] = result; - } - for (i = p;i < p+p-1;++i) { - result = 0; - for (j = i-p+1;j < p;++j) result = F3_freeze(result+f[j]*g[i-j]); - fg[i] = result; - } +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_smaller_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlw %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,lt" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + crypto_int16 crypto_int16_r = crypto_int16_x ^ crypto_int16_y; + crypto_int16 crypto_int16_z = crypto_int16_x - crypto_int16_y; + crypto_int16_z ^= crypto_int16_r & (crypto_int16_z ^ crypto_int16_x); + return crypto_int16_unsigned_topbit_01(crypto_int16_z); +#endif +} - for (i = p+p-2;i >= p;--i) { - fg[i-p] = F3_freeze(fg[i-p]+fg[i]); - fg[i-p+1] = F3_freeze(fg[i-p+1]+fg[i]); - } +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_leq_mask(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $-1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n csetm %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return ~crypto_int16_smaller_mask(crypto_int16_y,crypto_int16_x); +#endif +} - for (i = 0;i < p;++i) h[i] = fg[i]; +__attribute__((unused)) +static inline +crypto_int16 crypto_int16_leq_01(crypto_int16 crypto_int16_x,crypto_int16 crypto_int16_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 crypto_int16_q,crypto_int16_z; + __asm__ ("xorw %0,%0\n movw $1,%1\n cmpw %3,%2\n cmovlew %1,%0" : "=&r"(crypto_int16_z), "=&r"(crypto_int16_q) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int16 crypto_int16_z; + __asm__ ("sxth %w0,%w1\n cmp %w0,%w2,sxth\n cset %w0,le" : "=&r"(crypto_int16_z) : "r"(crypto_int16_x), "r"(crypto_int16_y) : "cc"); + return crypto_int16_z; +#else + return 1-crypto_int16_smaller_01(crypto_int16_y,crypto_int16_x); +#endif } -/* returns 0 if recip succeeded; else -1 */ -static int R3_recip(small *out,const small *in) -{ - small f[p+1],g[p+1],v[p+1],r[p+1]; - int i,loop,delta; - int sign,swap,t; +__attribute__((unused)) +static inline +int crypto_int16_ones_num(crypto_int16 crypto_int16_x) { + crypto_int16_unsigned crypto_int16_y = crypto_int16_x; + const crypto_int16 C0 = 0x5555; + const crypto_int16 C1 = 0x3333; + const crypto_int16 C2 = 0x0f0f; + crypto_int16_y -= ((crypto_int16_y >> 1) & C0); + crypto_int16_y = (crypto_int16_y & C1) + ((crypto_int16_y >> 2) & C1); + crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 4)) & C2; + crypto_int16_y = (crypto_int16_y + (crypto_int16_y >> 8)) & 0xff; + return crypto_int16_y; +} + +__attribute__((unused)) +static inline +int crypto_int16_bottomzeros_num(crypto_int16 crypto_int16_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int16 fallback = 16; + __asm__ ("bsfw %0,%0\n cmovew %1,%0" : "+&r"(crypto_int16_x) : "r"(fallback) : "cc"); + return crypto_int16_x; +#elif defined(__GNUC__) && defined(__aarch64__) + int64_t crypto_int16_y; + __asm__ ("orr %w0,%w1,-65536\n rbit %w0,%w0\n clz %w0,%w0" : "=r"(crypto_int16_y) : "r"(crypto_int16_x) : ); + return crypto_int16_y; +#else + crypto_int16 crypto_int16_y = crypto_int16_x ^ (crypto_int16_x-1); + crypto_int16_y = ((crypto_int16) crypto_int16_y) >> 1; + crypto_int16_y &= ~(crypto_int16_x & (((crypto_int16) 1) << (16-1))); + return crypto_int16_ones_num(crypto_int16_y); +#endif +} - for (i = 0;i < p+1;++i) v[i] = 0; - for (i = 0;i < p+1;++i) r[i] = 0; - r[0] = 1; - for (i = 0;i < p;++i) f[i] = 0; - f[0] = 1; f[p-1] = f[p] = -1; - for (i = 0;i < p;++i) g[p-1-i] = in[i]; - g[p] = 0; +#endif - delta = 1; +/* from supercop-20240808/cryptoint/crypto_int32.h */ +/* auto-generated: cd cryptoint; ./autogen */ +/* cryptoint 20240806 */ - for (loop = 0;loop < 2*p-1;++loop) { - for (i = p;i > 0;--i) v[i] = v[i-1]; - v[0] = 0; +#ifndef crypto_int32_h +#define crypto_int32_h - sign = -g[0]*f[0]; - swap = int16_negative_mask(-delta) & int16_nonzero_mask(g[0]); - delta ^= swap&(delta^-delta); - delta += 1; +#define crypto_int32 int32_t +#define crypto_int32_unsigned uint32_t - for (i = 0;i < p+1;++i) { - t = swap&(f[i]^g[i]); f[i] ^= t; g[i] ^= t; - t = swap&(v[i]^r[i]); v[i] ^= t; r[i] ^= t; - } - for (i = 0;i < p+1;++i) g[i] = F3_freeze(g[i]+sign*f[i]); - for (i = 0;i < p+1;++i) r[i] = F3_freeze(r[i]+sign*v[i]); - for (i = 0;i < p;++i) g[i] = g[i+1]; - g[p] = 0; - } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_load(const unsigned char *crypto_int32_s) { + crypto_int32 crypto_int32_z = 0; + crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 0; + crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 8; + crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 16; + crypto_int32_z |= ((crypto_int32) (*crypto_int32_s++)) << 24; + return crypto_int32_z; +} - sign = f[0]; - for (i = 0;i < p;++i) out[i] = sign*v[p-1-i]; +__attribute__((unused)) +static inline +void crypto_int32_store(unsigned char *crypto_int32_s,crypto_int32 crypto_int32_x) { + *crypto_int32_s++ = crypto_int32_x >> 0; + *crypto_int32_s++ = crypto_int32_x >> 8; + *crypto_int32_s++ = crypto_int32_x >> 16; + *crypto_int32_s++ = crypto_int32_x >> 24; +} - return int16_nonzero_mask(delta); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_negative_mask(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarl $31,%0" : "+r"(crypto_int32_x) : : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_y; + __asm__ ("asr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); + return crypto_int32_y; +#else + crypto_int32_x >>= 32-6; + crypto_int32_x ^= crypto_int32_optblocker; + crypto_int32_x >>= 5; + return crypto_int32_x; +#endif } +__attribute__((unused)) +static inline +crypto_int32_unsigned crypto_int32_unsigned_topbit_01(crypto_int32_unsigned crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("shrl $31,%0" : "+r"(crypto_int32_x) : : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_y; + __asm__ ("lsr %w0,%w1,31" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); + return crypto_int32_y; +#else + crypto_int32_x >>= 32-6; + crypto_int32_x ^= crypto_int32_optblocker; + crypto_int32_x >>= 5; + return crypto_int32_x; #endif +} -/* ----- polynomials mod q */ +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_negative_01(crypto_int32 crypto_int32_x) { + return crypto_int32_unsigned_topbit_01(crypto_int32_x); +} -/* h = f*g in the ring Rq */ -static void Rq_mult_small(Fq *h,const Fq *f,const small *g) -{ - Fq fg[p+p-1]; - Fq result; - int i,j; - - for (i = 0;i < p;++i) { - result = 0; - for (j = 0;j <= i;++j) result = Fq_freeze(result+f[j]*(int32)g[i-j]); - fg[i] = result; - } - for (i = p;i < p+p-1;++i) { - result = 0; - for (j = i-p+1;j < p;++j) result = Fq_freeze(result+f[j]*(int32)g[i-j]); - fg[i] = result; - } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_topbit_mask(crypto_int32 crypto_int32_x) { + return crypto_int32_negative_mask(crypto_int32_x); +} - for (i = p+p-2;i >= p;--i) { - fg[i-p] = Fq_freeze(fg[i-p]+fg[i]); - fg[i-p+1] = Fq_freeze(fg[i-p+1]+fg[i]); - } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_topbit_01(crypto_int32 crypto_int32_x) { + return crypto_int32_unsigned_topbit_01(crypto_int32_x); +} - for (i = 0;i < p;++i) h[i] = fg[i]; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bottombit_mask(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc"); + return -crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_y; + __asm__ ("sbfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); + return crypto_int32_y; +#else + crypto_int32_x &= 1 ^ crypto_int32_optblocker; + return -crypto_int32_x; +#endif } -#ifndef LPR +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bottombit_01(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andl $1,%0" : "+r"(crypto_int32_x) : : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_y; + __asm__ ("ubfx %w0,%w1,0,1" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); + return crypto_int32_y; +#else + crypto_int32_x &= 1 ^ crypto_int32_optblocker; + return crypto_int32_x; +#endif +} -/* h = 3f in Rq */ -static void Rq_mult3(Fq *h,const Fq *f) -{ - int i; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bitinrangepublicpos_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); +#else + crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker; +#endif + return crypto_int32_bottombit_mask(crypto_int32_x); +} - for (i = 0;i < p;++i) h[i] = Fq_freeze(3*f[i]); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bitinrangepublicpos_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); +#else + crypto_int32_x >>= crypto_int32_s ^ crypto_int32_optblocker; +#endif + return crypto_int32_bottombit_01(crypto_int32_x); } -/* out = 1/(3*in) in Rq */ -/* returns 0 if recip succeeded; else -1 */ -static int Rq_recip3(Fq *out,const small *in) -{ - Fq f[p+1],g[p+1],v[p+1],r[p+1]; - int i,loop,delta; - int swap,t; - int32 f0,g0; - Fq scale; - - for (i = 0;i < p+1;++i) v[i] = 0; - for (i = 0;i < p+1;++i) r[i] = 0; - r[0] = Fq_recip(3); - for (i = 0;i < p;++i) f[i] = 0; - f[0] = 1; f[p-1] = f[p] = -1; - for (i = 0;i < p;++i) g[p-1-i] = in[i]; - g[p] = 0; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_shlmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("shll %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("lsl %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); +#else + int crypto_int32_k, crypto_int32_l; + for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2) + crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x << crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l); +#endif + return crypto_int32_x; +} - delta = 1; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_shrmod(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarl %%cl,%0" : "+r"(crypto_int32_x) : "c"(crypto_int32_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %w0,%w0,%w1" : "+r"(crypto_int32_x) : "r"(crypto_int32_s) : ); +#else + int crypto_int32_k, crypto_int32_l; + for (crypto_int32_l = 0,crypto_int32_k = 1;crypto_int32_k < 32;++crypto_int32_l,crypto_int32_k *= 2) + crypto_int32_x ^= (crypto_int32_x ^ (crypto_int32_x >> crypto_int32_k)) & crypto_int32_bitinrangepublicpos_mask(crypto_int32_s,crypto_int32_l); +#endif + return crypto_int32_x; +} + +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bitmod_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { + crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s); + return crypto_int32_bottombit_mask(crypto_int32_x); +} + +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_bitmod_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_s) { + crypto_int32_x = crypto_int32_shrmod(crypto_int32_x,crypto_int32_s); + return crypto_int32_bottombit_01(crypto_int32_x); +} + +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_nonzero_mask(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + crypto_int32_x |= -crypto_int32_x; + return crypto_int32_negative_mask(crypto_int32_x); +#endif +} - for (loop = 0;loop < 2*p-1;++loop) { - for (i = p;i > 0;--i) v[i] = v[i-1]; - v[0] = 0; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_nonzero_01(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + crypto_int32_x |= -crypto_int32_x; + return crypto_int32_unsigned_topbit_01(crypto_int32_x); +#endif +} - swap = int16_negative_mask(-delta) & int16_nonzero_mask(g[0]); - delta ^= swap&(delta^-delta); - delta += 1; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_positive_mask(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n csetm %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + crypto_int32 crypto_int32_z = -crypto_int32_x; + crypto_int32_z ^= crypto_int32_x & crypto_int32_z; + return crypto_int32_negative_mask(crypto_int32_z); +#endif +} - for (i = 0;i < p+1;++i) { - t = swap&(f[i]^g[i]); f[i] ^= t; g[i] ^= t; - t = swap&(v[i]^r[i]); v[i] ^= t; r[i] ^= t; - } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_positive_01(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovgl %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n cset %w0,gt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + crypto_int32 crypto_int32_z = -crypto_int32_x; + crypto_int32_z ^= crypto_int32_x & crypto_int32_z; + return crypto_int32_unsigned_topbit_01(crypto_int32_z); +#endif +} - f0 = f[0]; - g0 = g[0]; - for (i = 0;i < p+1;++i) g[i] = Fq_freeze(f0*g[i]-g0*f[i]); - for (i = 0;i < p+1;++i) r[i] = Fq_freeze(f0*r[i]-g0*v[i]); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_zero_mask(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + return ~crypto_int32_nonzero_mask(crypto_int32_x); +#endif +} - for (i = 0;i < p;++i) g[i] = g[i+1]; - g[p] = 0; - } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_zero_01(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n testl %2,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,0\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x) : "cc"); + return crypto_int32_z; +#else + return 1-crypto_int32_nonzero_01(crypto_int32_x); +#endif +} - scale = Fq_recip(f[0]); - for (i = 0;i < p;++i) out[i] = Fq_freeze(scale*(int32)v[p-1-i]); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_unequal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n csetm %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return crypto_int32_nonzero_mask(crypto_int32_x ^ crypto_int32_y); +#endif +} - return int16_nonzero_mask(delta); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_unequal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovnel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n cset %w0,ne" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return crypto_int32_nonzero_01(crypto_int32_x ^ crypto_int32_y); +#endif } +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_equal_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n csetm %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return ~crypto_int32_unequal_mask(crypto_int32_x,crypto_int32_y); #endif +} -/* ----- rounded polynomials mod q */ +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_equal_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n cset %w0,eq" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return 1-crypto_int32_unequal_01(crypto_int32_x,crypto_int32_y); +#endif +} -static void Round(Fq *out,const Fq *a) -{ - int i; - for (i = 0;i < p;++i) out[i] = a[i]-F3_freeze(a[i]); +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_min(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpl %1,%0\n cmovgl %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("cmp %w0,%w1\n csel %w0,%w0,%w1,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); + return crypto_int32_x; +#else + crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x; + crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x; + crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); + crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); + crypto_int32_z &= crypto_int32_r; + return crypto_int32_x ^ crypto_int32_z; +#endif } -/* ----- sorting to generate short polynomial */ +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_max(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpl %1,%0\n cmovll %1,%0" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("cmp %w0,%w1\n csel %w0,%w1,%w0,lt" : "+r"(crypto_int32_x) : "r"(crypto_int32_y) : "cc"); + return crypto_int32_x; +#else + crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x; + crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x; + crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); + crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); + crypto_int32_z &= crypto_int32_r; + return crypto_int32_y ^ crypto_int32_z; +#endif +} -static void Short_fromlist(small *out,const uint32 *in) -{ - uint32 L[p]; - int i; +__attribute__((unused)) +static inline +void crypto_int32_minmax(crypto_int32 *crypto_int32_p,crypto_int32 *crypto_int32_q) { + crypto_int32 crypto_int32_x = *crypto_int32_p; + crypto_int32 crypto_int32_y = *crypto_int32_q; +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmpl %2,%1\n movl %1,%0\n cmovgl %2,%1\n cmovgl %0,%2" : "=&r"(crypto_int32_z), "+&r"(crypto_int32_x), "+r"(crypto_int32_y) : : "cc"); + *crypto_int32_p = crypto_int32_x; + *crypto_int32_q = crypto_int32_y; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_r, crypto_int32_s; + __asm__ ("cmp %w2,%w3\n csel %w0,%w2,%w3,lt\n csel %w1,%w3,%w2,lt" : "=&r"(crypto_int32_r), "=r"(crypto_int32_s) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + *crypto_int32_p = crypto_int32_r; + *crypto_int32_q = crypto_int32_s; +#else + crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x; + crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x; + crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_y); + crypto_int32_z = crypto_int32_negative_mask(crypto_int32_z); + crypto_int32_z &= crypto_int32_r; + crypto_int32_x ^= crypto_int32_z; + crypto_int32_y ^= crypto_int32_z; + *crypto_int32_p = crypto_int32_x; + *crypto_int32_q = crypto_int32_y; +#endif +} - for (i = 0;i < w;++i) L[i] = in[i]&(uint32)-2; - for (i = w;i < p;++i) L[i] = (in[i]&(uint32)-3)|1; - crypto_sort_uint32(L,p); - for (i = 0;i < p;++i) out[i] = (L[i]&3)-1; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_smaller_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n csetm %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y; + crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y; + crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x); + return crypto_int32_negative_mask(crypto_int32_z); +#endif } -/* ----- underlying hash function */ +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_smaller_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovll %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n cset %w0,lt" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + crypto_int32 crypto_int32_r = crypto_int32_x ^ crypto_int32_y; + crypto_int32 crypto_int32_z = crypto_int32_x - crypto_int32_y; + crypto_int32_z ^= crypto_int32_r & (crypto_int32_z ^ crypto_int32_x); + return crypto_int32_unsigned_topbit_01(crypto_int32_z); +#endif +} -#define Hash_bytes 32 +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_leq_mask(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $-1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n csetm %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return ~crypto_int32_smaller_mask(crypto_int32_y,crypto_int32_x); +#endif +} -/* e.g., b = 0 means out = Hash0(in) */ -static void Hash_prefix(unsigned char *out,int b,const unsigned char *in,int inlen) -{ - unsigned char x[inlen+1]; - unsigned char h[64]; - int i; +__attribute__((unused)) +static inline +crypto_int32 crypto_int32_leq_01(crypto_int32 crypto_int32_x,crypto_int32 crypto_int32_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 crypto_int32_q,crypto_int32_z; + __asm__ ("xorl %0,%0\n movl $1,%1\n cmpl %3,%2\n cmovlel %1,%0" : "=&r"(crypto_int32_z), "=&r"(crypto_int32_q) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int32 crypto_int32_z; + __asm__ ("cmp %w1,%w2\n cset %w0,le" : "=r"(crypto_int32_z) : "r"(crypto_int32_x), "r"(crypto_int32_y) : "cc"); + return crypto_int32_z; +#else + return 1-crypto_int32_smaller_01(crypto_int32_y,crypto_int32_x); +#endif +} - x[0] = b; - for (i = 0;i < inlen;++i) x[i+1] = in[i]; - crypto_hash_sha512(h,x,inlen+1); - for (i = 0;i < 32;++i) out[i] = h[i]; +__attribute__((unused)) +static inline +int crypto_int32_ones_num(crypto_int32 crypto_int32_x) { + crypto_int32_unsigned crypto_int32_y = crypto_int32_x; + const crypto_int32 C0 = 0x55555555; + const crypto_int32 C1 = 0x33333333; + const crypto_int32 C2 = 0x0f0f0f0f; + crypto_int32_y -= ((crypto_int32_y >> 1) & C0); + crypto_int32_y = (crypto_int32_y & C1) + ((crypto_int32_y >> 2) & C1); + crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 4)) & C2; + crypto_int32_y += crypto_int32_y >> 8; + crypto_int32_y = (crypto_int32_y + (crypto_int32_y >> 16)) & 0xff; + return crypto_int32_y; +} + +__attribute__((unused)) +static inline +int crypto_int32_bottomzeros_num(crypto_int32 crypto_int32_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int32 fallback = 32; + __asm__ ("bsfl %0,%0\n cmovel %1,%0" : "+&r"(crypto_int32_x) : "r"(fallback) : "cc"); + return crypto_int32_x; +#elif defined(__GNUC__) && defined(__aarch64__) + int64_t crypto_int32_y; + __asm__ ("rbit %w0,%w1\n clz %w0,%w0" : "=r"(crypto_int32_y) : "r"(crypto_int32_x) : ); + return crypto_int32_y; +#else + crypto_int32 crypto_int32_y = crypto_int32_x ^ (crypto_int32_x-1); + crypto_int32_y = ((crypto_int32) crypto_int32_y) >> 1; + crypto_int32_y &= ~(crypto_int32_x & (((crypto_int32) 1) << (32-1))); + return crypto_int32_ones_num(crypto_int32_y); +#endif } -/* ----- higher-level randomness */ +#endif -static uint32 urandom32(void) -{ - unsigned char c[4]; - uint32 out[4]; +/* from supercop-20240808/cryptoint/crypto_int64.h */ +/* auto-generated: cd cryptoint; ./autogen */ +/* cryptoint 20240806 */ + +#ifndef crypto_int64_h +#define crypto_int64_h + +#define crypto_int64 int64_t +#define crypto_int64_unsigned uint64_t + + + +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_load(const unsigned char *crypto_int64_s) { + crypto_int64 crypto_int64_z = 0; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 0; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 8; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 16; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 24; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 32; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 40; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 48; + crypto_int64_z |= ((crypto_int64) (*crypto_int64_s++)) << 56; + return crypto_int64_z; +} + +__attribute__((unused)) +static inline +void crypto_int64_store(unsigned char *crypto_int64_s,crypto_int64 crypto_int64_x) { + *crypto_int64_s++ = crypto_int64_x >> 0; + *crypto_int64_s++ = crypto_int64_x >> 8; + *crypto_int64_s++ = crypto_int64_x >> 16; + *crypto_int64_s++ = crypto_int64_x >> 24; + *crypto_int64_s++ = crypto_int64_x >> 32; + *crypto_int64_s++ = crypto_int64_x >> 40; + *crypto_int64_s++ = crypto_int64_x >> 48; + *crypto_int64_s++ = crypto_int64_x >> 56; +} + +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_negative_mask(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarq $63,%0" : "+r"(crypto_int64_x) : : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_y; + __asm__ ("asr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); + return crypto_int64_y; +#else + crypto_int64_x >>= 64-6; + crypto_int64_x ^= crypto_int64_optblocker; + crypto_int64_x >>= 5; + return crypto_int64_x; +#endif +} - randombytes(c,4); - out[0] = (uint32)c[0]; - out[1] = ((uint32)c[1])<<8; - out[2] = ((uint32)c[2])<<16; - out[3] = ((uint32)c[3])<<24; - return out[0]+out[1]+out[2]+out[3]; +__attribute__((unused)) +static inline +crypto_int64_unsigned crypto_int64_unsigned_topbit_01(crypto_int64_unsigned crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("shrq $63,%0" : "+r"(crypto_int64_x) : : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_y; + __asm__ ("lsr %0,%1,63" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); + return crypto_int64_y; +#else + crypto_int64_x >>= 64-6; + crypto_int64_x ^= crypto_int64_optblocker; + crypto_int64_x >>= 5; + return crypto_int64_x; +#endif } -static void Short_random(small *out) -{ - uint32 L[p]; - int i; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_negative_01(crypto_int64 crypto_int64_x) { + return crypto_int64_unsigned_topbit_01(crypto_int64_x); +} - for (i = 0;i < p;++i) L[i] = urandom32(); - Short_fromlist(out,L); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_topbit_mask(crypto_int64 crypto_int64_x) { + return crypto_int64_negative_mask(crypto_int64_x); } -#ifndef LPR +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_topbit_01(crypto_int64 crypto_int64_x) { + return crypto_int64_unsigned_topbit_01(crypto_int64_x); +} -static void Small_random(small *out) -{ - int i; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bottombit_mask(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc"); + return -crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_y; + __asm__ ("sbfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); + return crypto_int64_y; +#else + crypto_int64_x &= 1 ^ crypto_int64_optblocker; + return -crypto_int64_x; +#endif +} - for (i = 0;i < p;++i) out[i] = (((urandom32()&0x3fffffff)*3)>>30)-1; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bottombit_01(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("andq $1,%0" : "+r"(crypto_int64_x) : : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_y; + __asm__ ("ubfx %0,%1,0,1" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); + return crypto_int64_y; +#else + crypto_int64_x &= 1 ^ crypto_int64_optblocker; + return crypto_int64_x; +#endif } +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bitinrangepublicpos_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); +#else + crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker; #endif + return crypto_int64_bottombit_mask(crypto_int64_x); +} -/* ----- Streamlined NTRU Prime Core */ +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bitinrangepublicpos_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); +#else + crypto_int64_x >>= crypto_int64_s ^ crypto_int64_optblocker; +#endif + return crypto_int64_bottombit_01(crypto_int64_x); +} -#ifndef LPR +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_shlmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("shlq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("lsl %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); +#else + int crypto_int64_k, crypto_int64_l; + for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2) + crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x << crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l); +#endif + return crypto_int64_x; +} -/* h,(f,ginv) = KeyGen() */ -static void KeyGen(Fq *h,small *f,small *ginv) -{ - small g[p]; - Fq finv[p]; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_shrmod(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("sarq %%cl,%0" : "+r"(crypto_int64_x) : "c"(crypto_int64_s) : "cc"); +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("asr %0,%0,%1" : "+r"(crypto_int64_x) : "r"(crypto_int64_s) : ); +#else + int crypto_int64_k, crypto_int64_l; + for (crypto_int64_l = 0,crypto_int64_k = 1;crypto_int64_k < 64;++crypto_int64_l,crypto_int64_k *= 2) + crypto_int64_x ^= (crypto_int64_x ^ (crypto_int64_x >> crypto_int64_k)) & crypto_int64_bitinrangepublicpos_mask(crypto_int64_s,crypto_int64_l); +#endif + return crypto_int64_x; +} + +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bitmod_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { + crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s); + return crypto_int64_bottombit_mask(crypto_int64_x); +} + +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_bitmod_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_s) { + crypto_int64_x = crypto_int64_shrmod(crypto_int64_x,crypto_int64_s); + return crypto_int64_bottombit_01(crypto_int64_x); +} + +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_nonzero_mask(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + crypto_int64_x |= -crypto_int64_x; + return crypto_int64_negative_mask(crypto_int64_x); +#endif +} - for (;;) { - Small_random(g); - if (R3_recip(ginv,g) == 0) break; - } - Short_random(f); - Rq_recip3(finv,f); /* always works */ - Rq_mult_small(h,finv,g); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_nonzero_01(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + crypto_int64_x |= -crypto_int64_x; + return crypto_int64_unsigned_topbit_01(crypto_int64_x); +#endif } -/* c = Encrypt(r,h) */ -static void Encrypt(Fq *c,const small *r,const Fq *h) -{ - Fq hr[p]; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_positive_mask(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n csetm %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + crypto_int64 crypto_int64_z = -crypto_int64_x; + crypto_int64_z ^= crypto_int64_x & crypto_int64_z; + return crypto_int64_negative_mask(crypto_int64_z); +#endif +} - Rq_mult_small(hr,h,r); - Round(c,hr); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_positive_01(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmovgq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n cset %0,gt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + crypto_int64 crypto_int64_z = -crypto_int64_x; + crypto_int64_z ^= crypto_int64_x & crypto_int64_z; + return crypto_int64_unsigned_topbit_01(crypto_int64_z); +#endif } -/* r = Decrypt(c,(f,ginv)) */ -static void Decrypt(small *r,const Fq *c,const small *f,const small *ginv) -{ - Fq cf[p]; - Fq cf3[p]; - small e[p]; - small ev[p]; - int mask; - int i; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_zero_mask(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + return ~crypto_int64_nonzero_mask(crypto_int64_x); +#endif +} - Rq_mult_small(cf,c,f); - Rq_mult3(cf3,cf); - R3_fromRq(e,cf3); - R3_mult(ev,e,ginv); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_zero_01(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n testq %2,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,0\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x) : "cc"); + return crypto_int64_z; +#else + return 1-crypto_int64_nonzero_01(crypto_int64_x); +#endif +} - mask = Weightw_mask(ev); /* 0 if weight w, else -1 */ - for (i = 0;i < w;++i) r[i] = ((ev[i]^1)&~mask)^1; - for (i = w;i < p;++i) r[i] = ev[i]&~mask; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_unequal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n csetm %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return crypto_int64_nonzero_mask(crypto_int64_x ^ crypto_int64_y); +#endif } +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_unequal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovneq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n cset %0,ne" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return crypto_int64_nonzero_01(crypto_int64_x ^ crypto_int64_y); #endif +} -/* ----- NTRU LPRime Core */ +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_equal_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n csetm %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return ~crypto_int64_unequal_mask(crypto_int64_x,crypto_int64_y); +#endif +} -#ifdef LPR +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_equal_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmoveq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n cset %0,eq" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return 1-crypto_int64_unequal_01(crypto_int64_x,crypto_int64_y); +#endif +} -/* (G,A),a = KeyGen(G); leaves G unchanged */ -static void KeyGen(Fq *A,small *a,const Fq *G) -{ - Fq aG[p]; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_min(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpq %1,%0\n cmovgq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("cmp %0,%1\n csel %0,%0,%1,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); + return crypto_int64_x; +#else + crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; + crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; + crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); + crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); + crypto_int64_z &= crypto_int64_r; + return crypto_int64_x ^ crypto_int64_z; +#endif +} - Short_random(a); - Rq_mult_small(aG,G,a); - Round(A,aG); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_max(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + __asm__ ("cmpq %1,%0\n cmovlq %1,%0" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + __asm__ ("cmp %0,%1\n csel %0,%1,%0,lt" : "+r"(crypto_int64_x) : "r"(crypto_int64_y) : "cc"); + return crypto_int64_x; +#else + crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; + crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; + crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); + crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); + crypto_int64_z &= crypto_int64_r; + return crypto_int64_y ^ crypto_int64_z; +#endif } -/* B,T = Encrypt(r,(G,A),b) */ -static void Encrypt(Fq *B,int8 *T,const int8 *r,const Fq *G,const Fq *A,const small *b) -{ - Fq bG[p]; - Fq bA[p]; - int i; +__attribute__((unused)) +static inline +void crypto_int64_minmax(crypto_int64 *crypto_int64_p,crypto_int64 *crypto_int64_q) { + crypto_int64 crypto_int64_x = *crypto_int64_p; + crypto_int64 crypto_int64_y = *crypto_int64_q; +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmpq %2,%1\n movq %1,%0\n cmovgq %2,%1\n cmovgq %0,%2" : "=&r"(crypto_int64_z), "+&r"(crypto_int64_x), "+r"(crypto_int64_y) : : "cc"); + *crypto_int64_p = crypto_int64_x; + *crypto_int64_q = crypto_int64_y; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_r, crypto_int64_s; + __asm__ ("cmp %2,%3\n csel %0,%2,%3,lt\n csel %1,%3,%2,lt" : "=&r"(crypto_int64_r), "=r"(crypto_int64_s) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + *crypto_int64_p = crypto_int64_r; + *crypto_int64_q = crypto_int64_s; +#else + crypto_int64 crypto_int64_r = crypto_int64_y ^ crypto_int64_x; + crypto_int64 crypto_int64_z = crypto_int64_y - crypto_int64_x; + crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_y); + crypto_int64_z = crypto_int64_negative_mask(crypto_int64_z); + crypto_int64_z &= crypto_int64_r; + crypto_int64_x ^= crypto_int64_z; + crypto_int64_y ^= crypto_int64_z; + *crypto_int64_p = crypto_int64_x; + *crypto_int64_q = crypto_int64_y; +#endif +} - Rq_mult_small(bG,G,b); - Round(B,bG); - Rq_mult_small(bA,A,b); - for (i = 0;i < I;++i) T[i] = Top(Fq_freeze(bA[i]+r[i]*q12)); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_smaller_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n csetm %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y; + crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y; + crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x); + return crypto_int64_negative_mask(crypto_int64_z); +#endif } -/* r = Decrypt((B,T),a) */ -static void Decrypt(int8 *r,const Fq *B,const int8 *T,const small *a) -{ - Fq aB[p]; - int i; +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_smaller_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovlq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n cset %0,lt" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + crypto_int64 crypto_int64_r = crypto_int64_x ^ crypto_int64_y; + crypto_int64 crypto_int64_z = crypto_int64_x - crypto_int64_y; + crypto_int64_z ^= crypto_int64_r & (crypto_int64_z ^ crypto_int64_x); + return crypto_int64_unsigned_topbit_01(crypto_int64_z); +#endif +} - Rq_mult_small(aB,B,a); - for (i = 0;i < I;++i) - r[i] = -int16_negative_mask(Fq_freeze(Right(T[i])-aB[i]+4*w+1)); +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_leq_mask(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $-1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n csetm %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return ~crypto_int64_smaller_mask(crypto_int64_y,crypto_int64_x); +#endif } +__attribute__((unused)) +static inline +crypto_int64 crypto_int64_leq_01(crypto_int64 crypto_int64_x,crypto_int64 crypto_int64_y) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 crypto_int64_q,crypto_int64_z; + __asm__ ("xorq %0,%0\n movq $1,%1\n cmpq %3,%2\n cmovleq %1,%0" : "=&r"(crypto_int64_z), "=&r"(crypto_int64_q) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#elif defined(__GNUC__) && defined(__aarch64__) + crypto_int64 crypto_int64_z; + __asm__ ("cmp %1,%2\n cset %0,le" : "=r"(crypto_int64_z) : "r"(crypto_int64_x), "r"(crypto_int64_y) : "cc"); + return crypto_int64_z; +#else + return 1-crypto_int64_smaller_01(crypto_int64_y,crypto_int64_x); #endif +} -/* ----- encoding I-bit inputs */ +__attribute__((unused)) +static inline +int crypto_int64_ones_num(crypto_int64 crypto_int64_x) { + crypto_int64_unsigned crypto_int64_y = crypto_int64_x; + const crypto_int64 C0 = 0x5555555555555555; + const crypto_int64 C1 = 0x3333333333333333; + const crypto_int64 C2 = 0x0f0f0f0f0f0f0f0f; + crypto_int64_y -= ((crypto_int64_y >> 1) & C0); + crypto_int64_y = (crypto_int64_y & C1) + ((crypto_int64_y >> 2) & C1); + crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 4)) & C2; + crypto_int64_y += crypto_int64_y >> 8; + crypto_int64_y += crypto_int64_y >> 16; + crypto_int64_y = (crypto_int64_y + (crypto_int64_y >> 32)) & 0xff; + return crypto_int64_y; +} + +__attribute__((unused)) +static inline +int crypto_int64_bottomzeros_num(crypto_int64 crypto_int64_x) { +#if defined(__GNUC__) && defined(__x86_64__) + crypto_int64 fallback = 64; + __asm__ ("bsfq %0,%0\n cmoveq %1,%0" : "+&r"(crypto_int64_x) : "r"(fallback) : "cc"); + return crypto_int64_x; +#elif defined(__GNUC__) && defined(__aarch64__) + int64_t crypto_int64_y; + __asm__ ("rbit %0,%1\n clz %0,%0" : "=r"(crypto_int64_y) : "r"(crypto_int64_x) : ); + return crypto_int64_y; +#else + crypto_int64 crypto_int64_y = crypto_int64_x ^ (crypto_int64_x-1); + crypto_int64_y = ((crypto_int64) crypto_int64_y) >> 1; + crypto_int64_y &= ~(crypto_int64_x & (((crypto_int64) 1) << (64-1))); + return crypto_int64_ones_num(crypto_int64_y); +#endif +} -#ifdef LPR +#endif -#define Inputs_bytes (I/8) -typedef int8 Inputs[I]; /* passed by reference */ +/* from supercop-20240808/crypto_sort/int32/portable4/sort.c */ +#define int32_MINMAX(a,b) crypto_int32_minmax(&a,&b) -static void Inputs_encode(unsigned char *s,const Inputs r) +static void crypto_sort_int32(void *array,long long n) { - int i; - for (i = 0;i < Inputs_bytes;++i) s[i] = 0; - for (i = 0;i < I;++i) s[i>>3] |= r[i]<<(i&7); -} - -#endif + long long top,p,q,r,i,j; + int32 *x = array; -/* ----- Expand */ + if (n < 2) return; + top = 1; + while (top < n - top) top += top; -#ifdef LPR + for (p = top;p >= 1;p >>= 1) { + i = 0; + while (i + 2 * p <= n) { + for (j = i;j < i + p;++j) + int32_MINMAX(x[j],x[j+p]); + i += 2 * p; + } + for (j = i;j < n - p;++j) + int32_MINMAX(x[j],x[j+p]); -static const unsigned char aes_nonce[16] = {0}; + i = 0; + j = 0; + for (q = top;q > p;q >>= 1) { + if (j != i) for (;;) { + if (j == n - q) goto done; + int32 a = x[j + p]; + for (r = q;r > p;r >>= 1) + int32_MINMAX(a,x[j + r]); + x[j + p] = a; + ++j; + if (j == i + p) { + i += 2 * p; + break; + } + } + while (i + p <= n - q) { + for (j = i;j < i + p;++j) { + int32 a = x[j + p]; + for (r = q;r > p;r >>= 1) + int32_MINMAX(a,x[j+r]); + x[j + p] = a; + } + i += 2 * p; + } + /* now i + p > n - q */ + j = i; + while (j < n - q) { + int32 a = x[j + p]; + for (r = q;r > p;r >>= 1) + int32_MINMAX(a,x[j+r]); + x[j + p] = a; + ++j; + } -static void Expand(uint32 *L,const unsigned char *k) -{ - int i; - crypto_stream_aes256ctr((unsigned char *) L,4*p,aes_nonce,k); - for (i = 0;i < p;++i) { - uint32 L0 = ((unsigned char *) L)[4*i]; - uint32 L1 = ((unsigned char *) L)[4*i+1]; - uint32 L2 = ((unsigned char *) L)[4*i+2]; - uint32 L3 = ((unsigned char *) L)[4*i+3]; - L[i] = L0+(L1<<8)+(L2<<16)+(L3<<24); + done: ; + } } } -#endif - -/* ----- Seeds */ - -#ifdef LPR +/* from supercop-20240808/crypto_sort/uint32/useint32/sort.c */ -#define Seeds_bytes 32 +/* can save time by vectorizing xor loops */ +/* can save time by integrating xor loops with int32_sort */ -static void Seeds_random(unsigned char *s) +static void crypto_sort_uint32(void *array,long long n) { - randombytes(s,Seeds_bytes); + crypto_uint32 *x = array; + long long j; + for (j = 0;j < n;++j) x[j] ^= 0x80000000; + crypto_sort_int32(array,n); + for (j = 0;j < n;++j) x[j] ^= 0x80000000; } -#endif - -/* ----- Generator, HashShort */ - -#ifdef LPR +/* from supercop-20240808/crypto_kem/sntrup761/compact/kem.c */ +// 20240806 djb: some automated conversion to cryptoint -/* G = Generator(k) */ -static void Generator(Fq *G,const unsigned char *k) -{ - uint32 L[p]; - int i; +#define p 761 +#define q 4591 +#define w 286 +#define q12 ((q - 1) / 2) +typedef int8_t small; +typedef int16_t Fq; +#define Hash_bytes 32 +#define Small_bytes ((p + 3) / 4) +typedef small Inputs[p]; +#define SecretKeys_bytes (2 * Small_bytes) +#define Confirm_bytes 32 - Expand(L,k); - for (i = 0;i < p;++i) G[i] = uint32_mod_uint14(L[i],q)-q12; +static small F3_freeze(int16_t x) { return x - 3 * ((10923 * x + 16384) >> 15); } + +static Fq Fq_freeze(int32_t x) { + const int32_t q16 = (0x10000 + q / 2) / q; + const int32_t q20 = (0x100000 + q / 2) / q; + const int32_t q28 = (0x10000000 + q / 2) / q; + x -= q * ((q16 * x) >> 16); + x -= q * ((q20 * x) >> 20); + return x - q * ((q28 * x + 0x8000000) >> 28); +} + +static int Weightw_mask(small *r) { + int i, weight = 0; + for (i = 0; i < p; ++i) weight += crypto_int64_bottombit_01(r[i]); + return crypto_int16_nonzero_mask(weight - w); +} + +static void uint32_divmod_uint14(uint32_t *Q, uint16_t *r, uint32_t x, uint16_t m) { + uint32_t qpart, mask, v = 0x80000000 / m; + qpart = (x * (uint64_t)v) >> 31; + x -= qpart * m; + *Q = qpart; + qpart = (x * (uint64_t)v) >> 31; + x -= qpart * m; + *Q += qpart; + x -= m; + *Q += 1; + mask = crypto_int32_negative_mask(x); + x += mask & (uint32_t)m; + *Q += mask; + *r = x; } -/* out = HashShort(r) */ -static void HashShort(small *out,const Inputs r) -{ - unsigned char s[Inputs_bytes]; - unsigned char h[Hash_bytes]; - uint32 L[p]; - - Inputs_encode(s,r); - Hash_prefix(h,5,s,sizeof s); - Expand(L,h); - Short_fromlist(out,L); +static uint16_t uint32_mod_uint14(uint32_t x, uint16_t m) { + uint32_t Q; + uint16_t r; + uint32_divmod_uint14(&Q, &r, x, m); + return r; } -#endif - -/* ----- NTRU LPRime Expand */ - -#ifdef LPR - -/* (S,A),a = XKeyGen() */ -static void XKeyGen(unsigned char *S,Fq *A,small *a) -{ - Fq G[p]; - - Seeds_random(S); - Generator(G,S); - KeyGen(A,a,G); +static void Encode(unsigned char *out, const uint16_t *R, const uint16_t *M, long long len) { + if (len == 1) { + uint16_t r = R[0], m = M[0]; + while (m > 1) { + *out++ = r; + r >>= 8; + m = (m + 255) >> 8; + } + } + if (len > 1) { + uint16_t R2[(len + 1) / 2], M2[(len + 1) / 2]; + long long i; + for (i = 0; i < len - 1; i += 2) { + uint32_t m0 = M[i]; + uint32_t r = R[i] + R[i + 1] * m0; + uint32_t m = M[i + 1] * m0; + while (m >= 16384) { + *out++ = r; + r >>= 8; + m = (m + 255) >> 8; + } + R2[i / 2] = r; + M2[i / 2] = m; + } + if (i < len) { + R2[i / 2] = R[i]; + M2[i / 2] = M[i]; + } + Encode(out, R2, M2, (len + 1) / 2); + } } -/* B,T = XEncrypt(r,(S,A)) */ -static void XEncrypt(Fq *B,int8 *T,const int8 *r,const unsigned char *S,const Fq *A) -{ - Fq G[p]; - small b[p]; - - Generator(G,S); - HashShort(b,r); - Encrypt(B,T,r,G,A,b); +static void Decode(uint16_t *out, const unsigned char *S, const uint16_t *M, long long len) { + if (len == 1) { + if (M[0] == 1) + *out = 0; + else if (M[0] <= 256) + *out = uint32_mod_uint14(S[0], M[0]); + else + *out = uint32_mod_uint14(S[0] + (((uint16_t)S[1]) << 8), M[0]); + } + if (len > 1) { + uint16_t R2[(len + 1) / 2], M2[(len + 1) / 2], bottomr[len / 2]; + uint32_t bottomt[len / 2]; + long long i; + for (i = 0; i < len - 1; i += 2) { + uint32_t m = M[i] * (uint32_t)M[i + 1]; + if (m > 256 * 16383) { + bottomt[i / 2] = 256 * 256; + bottomr[i / 2] = S[0] + 256 * S[1]; + S += 2; + M2[i / 2] = (((m + 255) >> 8) + 255) >> 8; + } else if (m >= 16384) { + bottomt[i / 2] = 256; + bottomr[i / 2] = S[0]; + S += 1; + M2[i / 2] = (m + 255) >> 8; + } else { + bottomt[i / 2] = 1; + bottomr[i / 2] = 0; + M2[i / 2] = m; + } + } + if (i < len) M2[i / 2] = M[i]; + Decode(R2, S, M2, (len + 1) / 2); + for (i = 0; i < len - 1; i += 2) { + uint32_t r1, r = bottomr[i / 2]; + uint16_t r0; + r += bottomt[i / 2] * R2[i / 2]; + uint32_divmod_uint14(&r1, &r0, r, M[i]); + r1 = uint32_mod_uint14(r1, M[i + 1]); + *out++ = r0; + *out++ = r1; + } + if (i < len) *out++ = R2[i / 2]; + } } -#define XDecrypt Decrypt - -#endif +static void R3_fromRq(small *out, const Fq *r) { + int i; + for (i = 0; i < p; ++i) out[i] = F3_freeze(r[i]); +} -/* ----- encoding small polynomials (including short polynomials) */ +static void R3_mult(small *h, const small *f, const small *g) { + int16_t fg[p + p - 1]; + int i, j; + for (i = 0; i < p + p - 1; ++i) fg[i] = 0; + for (i = 0; i < p; ++i) + for (j = 0; j < p; ++j) fg[i + j] += f[i] * (int16_t)g[j]; + for (i = p; i < p + p - 1; ++i) fg[i - p] += fg[i]; + for (i = p; i < p + p - 1; ++i) fg[i - p + 1] += fg[i]; + for (i = 0; i < p; ++i) h[i] = F3_freeze(fg[i]); +} -#define Small_bytes ((p+3)/4) +static int R3_recip(small *out, const small *in) { + small f[p + 1], g[p + 1], v[p + 1], r[p + 1]; + int sign, swap, t, i, loop, delta = 1; + for (i = 0; i < p + 1; ++i) v[i] = 0; + for (i = 0; i < p + 1; ++i) r[i] = 0; + r[0] = 1; + for (i = 0; i < p; ++i) f[i] = 0; + f[0] = 1; + f[p - 1] = f[p] = -1; + for (i = 0; i < p; ++i) g[p - 1 - i] = in[i]; + g[p] = 0; + for (loop = 0; loop < 2 * p - 1; ++loop) { + for (i = p; i > 0; --i) v[i] = v[i - 1]; + v[0] = 0; + sign = -g[0] * f[0]; + swap = crypto_int16_negative_mask(-delta) & crypto_int16_nonzero_mask(g[0]); + delta ^= swap & (delta ^ -delta); + delta += 1; + for (i = 0; i < p + 1; ++i) { + t = swap & (f[i] ^ g[i]); + f[i] ^= t; + g[i] ^= t; + t = swap & (v[i] ^ r[i]); + v[i] ^= t; + r[i] ^= t; + } + for (i = 0; i < p + 1; ++i) g[i] = F3_freeze(g[i] + sign * f[i]); + for (i = 0; i < p + 1; ++i) r[i] = F3_freeze(r[i] + sign * v[i]); + for (i = 0; i < p; ++i) g[i] = g[i + 1]; + g[p] = 0; + } + sign = f[0]; + for (i = 0; i < p; ++i) out[i] = sign * v[p - 1 - i]; + return crypto_int16_nonzero_mask(delta); +} -/* these are the only functions that rely on p mod 4 = 1 */ +static void Rq_mult_small(Fq *h, const Fq *f, const small *g) { + int32_t fg[p + p - 1]; + int i, j; + for (i = 0; i < p + p - 1; ++i) fg[i] = 0; + for (i = 0; i < p; ++i) + for (j = 0; j < p; ++j) fg[i + j] += f[i] * (int32_t)g[j]; + for (i = p; i < p + p - 1; ++i) fg[i - p] += fg[i]; + for (i = p; i < p + p - 1; ++i) fg[i - p + 1] += fg[i]; + for (i = 0; i < p; ++i) h[i] = Fq_freeze(fg[i]); +} -static void Small_encode(unsigned char *s,const small *f) -{ - small x; +static void Rq_mult3(Fq *h, const Fq *f) { int i; + for (i = 0; i < p; ++i) h[i] = Fq_freeze(3 * f[i]); +} - for (i = 0;i < p/4;++i) { - x = *f++ + 1; - x += (*f++ + 1)<<2; - x += (*f++ + 1)<<4; - x += (*f++ + 1)<<6; - *s++ = x; +static Fq Fq_recip(Fq a1) { + int i = 1; + Fq ai = a1; + while (i < q - 2) { + ai = Fq_freeze(a1 * (int32_t)ai); + i += 1; } - x = *f++ + 1; - *s++ = x; + return ai; } -static void Small_decode(small *f,const unsigned char *s) -{ - unsigned char x; - int i; - - for (i = 0;i < p/4;++i) { - x = *s++; - *f++ = ((small)(x&3))-1; x >>= 2; - *f++ = ((small)(x&3))-1; x >>= 2; - *f++ = ((small)(x&3))-1; x >>= 2; - *f++ = ((small)(x&3))-1; +static int Rq_recip3(Fq *out, const small *in) { + Fq f[p + 1], g[p + 1], v[p + 1], r[p + 1], scale; + int swap, t, i, loop, delta = 1; + int32_t f0, g0; + for (i = 0; i < p + 1; ++i) v[i] = 0; + for (i = 0; i < p + 1; ++i) r[i] = 0; + r[0] = Fq_recip(3); + for (i = 0; i < p; ++i) f[i] = 0; + f[0] = 1; + f[p - 1] = f[p] = -1; + for (i = 0; i < p; ++i) g[p - 1 - i] = in[i]; + g[p] = 0; + for (loop = 0; loop < 2 * p - 1; ++loop) { + for (i = p; i > 0; --i) v[i] = v[i - 1]; + v[0] = 0; + swap = crypto_int16_negative_mask(-delta) & crypto_int16_nonzero_mask(g[0]); + delta ^= swap & (delta ^ -delta); + delta += 1; + for (i = 0; i < p + 1; ++i) { + t = swap & (f[i] ^ g[i]); + f[i] ^= t; + g[i] ^= t; + t = swap & (v[i] ^ r[i]); + v[i] ^= t; + r[i] ^= t; + } + f0 = f[0]; + g0 = g[0]; + for (i = 0; i < p + 1; ++i) g[i] = Fq_freeze(f0 * g[i] - g0 * f[i]); + for (i = 0; i < p + 1; ++i) r[i] = Fq_freeze(f0 * r[i] - g0 * v[i]); + for (i = 0; i < p; ++i) g[i] = g[i + 1]; + g[p] = 0; } - x = *s++; - *f++ = ((small)(x&3))-1; + scale = Fq_recip(f[0]); + for (i = 0; i < p; ++i) out[i] = Fq_freeze(scale * (int32_t)v[p - 1 - i]); + return crypto_int16_nonzero_mask(delta); } -/* ----- encoding general polynomials */ - -#ifndef LPR - -static void Rq_encode(unsigned char *s,const Fq *r) -{ - uint16 R[p],M[p]; +static void Round(Fq *out, const Fq *a) { int i; - - for (i = 0;i < p;++i) R[i] = r[i]+q12; - for (i = 0;i < p;++i) M[i] = q; - Encode(s,R,M,p); + for (i = 0; i < p; ++i) out[i] = a[i] - F3_freeze(a[i]); } -static void Rq_decode(Fq *r,const unsigned char *s) -{ - uint16 R[p],M[p]; +static void Short_fromlist(small *out, const uint32_t *in) { + uint32_t L[p]; int i; - - for (i = 0;i < p;++i) M[i] = q; - Decode(R,s,M,p); - for (i = 0;i < p;++i) r[i] = ((Fq)R[i])-q12; + for (i = 0; i < w; ++i) L[i] = in[i] & (uint32_t)-2; + for (i = w; i < p; ++i) L[i] = (in[i] & (uint32_t)-3) | 1; + crypto_sort_uint32(L, p); + for (i = 0; i < p; ++i) out[i] = (L[i] & 3) - 1; } -#endif - -/* ----- encoding rounded polynomials */ - -static void Rounded_encode(unsigned char *s,const Fq *r) -{ - uint16 R[p],M[p]; +static void Hash_prefix(unsigned char *out, int b, const unsigned char *in, int inlen) { + unsigned char x[inlen + 1], h[64]; int i; - - for (i = 0;i < p;++i) R[i] = ((r[i]+q12)*10923)>>15; - for (i = 0;i < p;++i) M[i] = (q+2)/3; - Encode(s,R,M,p); + x[0] = b; + for (i = 0; i < inlen; ++i) x[i + 1] = in[i]; + crypto_hash_sha512(h, x, inlen + 1); + for (i = 0; i < 32; ++i) out[i] = h[i]; } -static void Rounded_decode(Fq *r,const unsigned char *s) -{ - uint16 R[p],M[p]; +static uint32_t urandom32(void) { + unsigned char c[4]; + uint32_t result = 0; int i; - - for (i = 0;i < p;++i) M[i] = (q+2)/3; - Decode(R,s,M,p); - for (i = 0;i < p;++i) r[i] = R[i]*3-q12; + randombytes(c, 4); + for (i = 0; i < 4; ++i) result += ((uint32_t)c[i]) << (8 * i); + return result; } -/* ----- encoding top polynomials */ - -#ifdef LPR - -#define Top_bytes (I/2) - -static void Top_encode(unsigned char *s,const int8 *T) -{ +static void Short_random(small *out) { + uint32_t L[p]; int i; - for (i = 0;i < Top_bytes;++i) - s[i] = T[2*i]+(T[2*i+1]<<4); + for (i = 0; i < p; ++i) L[i] = urandom32(); + Short_fromlist(out, L); } -static void Top_decode(int8 *T,const unsigned char *s) -{ +static void Small_random(small *out) { int i; - for (i = 0;i < Top_bytes;++i) { - T[2*i] = s[i]&15; - T[2*i+1] = s[i]>>4; - } + for (i = 0; i < p; ++i) out[i] = (((urandom32() & 0x3fffffff) * 3) >> 30) - 1; } -#endif - -/* ----- Streamlined NTRU Prime Core plus encoding */ - -#ifndef LPR - -typedef small Inputs[p]; /* passed by reference */ -#define Inputs_random Short_random -#define Inputs_encode Small_encode -#define Inputs_bytes Small_bytes - -#define Ciphertexts_bytes Rounded_bytes -#define SecretKeys_bytes (2*Small_bytes) -#define PublicKeys_bytes Rq_bytes - -/* pk,sk = ZKeyGen() */ -static void ZKeyGen(unsigned char *pk,unsigned char *sk) -{ - Fq h[p]; - small f[p],v[p]; - - KeyGen(h,f,v); - Rq_encode(pk,h); - Small_encode(sk,f); sk += Small_bytes; - Small_encode(sk,v); +static void KeyGen(Fq *h, small *f, small *ginv) { + small g[p]; + Fq finv[p]; + for (;;) { + int result; + Small_random(g); + result = R3_recip(ginv, g); + crypto_declassify(&result, sizeof result); + if (result == 0) break; + } + Short_random(f); + Rq_recip3(finv, f); + Rq_mult_small(h, finv, g); } -/* C = ZEncrypt(r,pk) */ -static void ZEncrypt(unsigned char *C,const Inputs r,const unsigned char *pk) -{ - Fq h[p]; - Fq c[p]; - Rq_decode(h,pk); - Encrypt(c,r,h); - Rounded_encode(C,c); +static void Encrypt(Fq *c, const small *r, const Fq *h) { + Fq hr[p]; + Rq_mult_small(hr, h, r); + Round(c, hr); +} + +static void Decrypt(small *r, const Fq *c, const small *f, const small *ginv) { + Fq cf[p], cf3[p]; + small e[p], ev[p]; + int mask, i; + Rq_mult_small(cf, c, f); + Rq_mult3(cf3, cf); + R3_fromRq(e, cf3); + R3_mult(ev, e, ginv); + mask = Weightw_mask(ev); + for (i = 0; i < w; ++i) r[i] = ((ev[i] ^ 1) & ~mask) ^ 1; + for (i = w; i < p; ++i) r[i] = ev[i] & ~mask; +} + +static void Small_encode(unsigned char *s, const small *f) { + int i, j; + for (i = 0; i < p / 4; ++i) { + small x = 0; + for (j = 0;j < 4;++j) x += (*f++ + 1) << (2 * j); + *s++ = x; + } + *s = *f++ + 1; } -/* r = ZDecrypt(C,sk) */ -static void ZDecrypt(Inputs r,const unsigned char *C,const unsigned char *sk) -{ - small f[p],v[p]; - Fq c[p]; - - Small_decode(f,sk); sk += Small_bytes; - Small_decode(v,sk); - Rounded_decode(c,C); - Decrypt(r,c,f,v); +static void Small_decode(small *f, const unsigned char *s) { + int i, j; + for (i = 0; i < p / 4; ++i) { + unsigned char x = *s++; + for (j = 0;j < 4;++j) *f++ = ((small)((x >> (2 * j)) & 3)) - 1; + } + *f++ = ((small)(*s & 3)) - 1; } -#endif - -/* ----- NTRU LPRime Expand plus encoding */ - -#ifdef LPR - -#define Ciphertexts_bytes (Rounded_bytes+Top_bytes) -#define SecretKeys_bytes Small_bytes -#define PublicKeys_bytes (Seeds_bytes+Rounded_bytes) - -static void Inputs_random(Inputs r) -{ - unsigned char s[Inputs_bytes]; +static void Rq_encode(unsigned char *s, const Fq *r) { + uint16_t R[p], M[p]; int i; - - randombytes(s,sizeof s); - for (i = 0;i < I;++i) r[i] = 1&(s[i>>3]>>(i&7)); + for (i = 0; i < p; ++i) R[i] = r[i] + q12; + for (i = 0; i < p; ++i) M[i] = q; + Encode(s, R, M, p); } -/* pk,sk = ZKeyGen() */ -static void ZKeyGen(unsigned char *pk,unsigned char *sk) -{ - Fq A[p]; - small a[p]; - - XKeyGen(pk,A,a); pk += Seeds_bytes; - Rounded_encode(pk,A); - Small_encode(sk,a); -} - -/* c = ZEncrypt(r,pk) */ -static void ZEncrypt(unsigned char *c,const Inputs r,const unsigned char *pk) -{ - Fq A[p]; - Fq B[p]; - int8 T[I]; - - Rounded_decode(A,pk+Seeds_bytes); - XEncrypt(B,T,r,pk,A); - Rounded_encode(c,B); c += Rounded_bytes; - Top_encode(c,T); +static void Rq_decode(Fq *r, const unsigned char *s) { + uint16_t R[p], M[p]; + int i; + for (i = 0; i < p; ++i) M[i] = q; + Decode(R, s, M, p); + for (i = 0; i < p; ++i) r[i] = ((Fq)R[i]) - q12; } -/* r = ZDecrypt(C,sk) */ -static void ZDecrypt(Inputs r,const unsigned char *c,const unsigned char *sk) -{ - small a[p]; - Fq B[p]; - int8 T[I]; - - Small_decode(a,sk); - Rounded_decode(B,c); - Top_decode(T,c+Rounded_bytes); - XDecrypt(r,B,T,a); +static void Rounded_encode(unsigned char *s, const Fq *r) { + uint16_t R[p], M[p]; + int i; + for (i = 0; i < p; ++i) R[i] = ((r[i] + q12) * 10923) >> 15; + for (i = 0; i < p; ++i) M[i] = (q + 2) / 3; + Encode(s, R, M, p); } -#endif - -/* ----- confirmation hash */ - -#define Confirm_bytes 32 - -/* h = HashConfirm(r,pk,cache); cache is Hash4(pk) */ -static void HashConfirm(unsigned char *h,const unsigned char *r,const unsigned char *pk,const unsigned char *cache) -{ -#ifndef LPR - unsigned char x[Hash_bytes*2]; +static void Rounded_decode(Fq *r, const unsigned char *s) { + uint16_t R[p], M[p]; int i; + for (i = 0; i < p; ++i) M[i] = (q + 2) / 3; + Decode(R, s, M, p); + for (i = 0; i < p; ++i) r[i] = R[i] * 3 - q12; +} - Hash_prefix(x,3,r,Inputs_bytes); - for (i = 0;i < Hash_bytes;++i) x[Hash_bytes+i] = cache[i]; -#else - unsigned char x[Inputs_bytes+Hash_bytes]; - int i; +static void ZKeyGen(unsigned char *pk, unsigned char *sk) { + Fq h[p]; + small f[p], v[p]; + KeyGen(h, f, v); + Rq_encode(pk, h); + Small_encode(sk, f); + Small_encode(sk + Small_bytes, v); +} - for (i = 0;i < Inputs_bytes;++i) x[i] = r[i]; - for (i = 0;i < Hash_bytes;++i) x[Inputs_bytes+i] = cache[i]; -#endif - Hash_prefix(h,2,x,sizeof x); +static void ZEncrypt(unsigned char *C, const Inputs r, const unsigned char *pk) { + Fq h[p], c[p]; + Rq_decode(h, pk); + Encrypt(c, r, h); + Rounded_encode(C, c); } -/* ----- session-key hash */ +static void ZDecrypt(Inputs r, const unsigned char *C, const unsigned char *sk) { + small f[p], v[p]; + Fq c[p]; + Small_decode(f, sk); + Small_decode(v, sk + Small_bytes); + Rounded_decode(c, C); + Decrypt(r, c, f, v); +} -/* k = HashSession(b,y,z) */ -static void HashSession(unsigned char *k,int b,const unsigned char *y,const unsigned char *z) -{ -#ifndef LPR - unsigned char x[Hash_bytes+Ciphertexts_bytes+Confirm_bytes]; +static void HashConfirm(unsigned char *h, const unsigned char *r, const unsigned char *cache) { + unsigned char x[Hash_bytes * 2]; int i; + Hash_prefix(x, 3, r, Small_bytes); + for (i = 0; i < Hash_bytes; ++i) x[Hash_bytes + i] = cache[i]; + Hash_prefix(h, 2, x, sizeof x); +} - Hash_prefix(x,3,y,Inputs_bytes); - for (i = 0;i < Ciphertexts_bytes+Confirm_bytes;++i) x[Hash_bytes+i] = z[i]; -#else - unsigned char x[Inputs_bytes+Ciphertexts_bytes+Confirm_bytes]; +static void HashSession(unsigned char *k, int b, const unsigned char *y, const unsigned char *z) { + unsigned char x[Hash_bytes + crypto_kem_sntrup761_CIPHERTEXTBYTES]; int i; - - for (i = 0;i < Inputs_bytes;++i) x[i] = y[i]; - for (i = 0;i < Ciphertexts_bytes+Confirm_bytes;++i) x[Inputs_bytes+i] = z[i]; -#endif - Hash_prefix(k,b,x,sizeof x); + Hash_prefix(x, 3, y, Small_bytes); + for (i = 0; i < crypto_kem_sntrup761_CIPHERTEXTBYTES; ++i) x[Hash_bytes + i] = z[i]; + Hash_prefix(k, b, x, sizeof x); } -/* ----- Streamlined NTRU Prime and NTRU LPRime */ - -/* pk,sk = KEM_KeyGen() */ -static void KEM_KeyGen(unsigned char *pk,unsigned char *sk) -{ +int crypto_kem_sntrup761_keypair(unsigned char *pk, unsigned char *sk) { int i; - - ZKeyGen(pk,sk); sk += SecretKeys_bytes; - for (i = 0;i < PublicKeys_bytes;++i) *sk++ = pk[i]; - randombytes(sk,Inputs_bytes); sk += Inputs_bytes; - Hash_prefix(sk,4,pk,PublicKeys_bytes); + ZKeyGen(pk, sk); + sk += SecretKeys_bytes; + for (i = 0; i < crypto_kem_sntrup761_PUBLICKEYBYTES; ++i) *sk++ = pk[i]; + randombytes(sk, Small_bytes); + Hash_prefix(sk + Small_bytes, 4, pk, crypto_kem_sntrup761_PUBLICKEYBYTES); + return 0; } -/* c,r_enc = Hide(r,pk,cache); cache is Hash4(pk) */ -static void Hide(unsigned char *c,unsigned char *r_enc,const Inputs r,const unsigned char *pk,const unsigned char *cache) -{ - Inputs_encode(r_enc,r); - ZEncrypt(c,r,pk); c += Ciphertexts_bytes; - HashConfirm(c,r_enc,pk,cache); +static void Hide(unsigned char *c, unsigned char *r_enc, const Inputs r, const unsigned char *pk, const unsigned char *cache) { + Small_encode(r_enc, r); + ZEncrypt(c, r, pk); + HashConfirm(c + crypto_kem_sntrup761_CIPHERTEXTBYTES - Confirm_bytes, r_enc, cache); } -/* c,k = Encap(pk) */ -static void Encap(unsigned char *c,unsigned char *k,const unsigned char *pk) -{ +int crypto_kem_sntrup761_enc(unsigned char *c, unsigned char *k, const unsigned char *pk) { Inputs r; - unsigned char r_enc[Inputs_bytes]; - unsigned char cache[Hash_bytes]; - - Hash_prefix(cache,4,pk,PublicKeys_bytes); - Inputs_random(r); - Hide(c,r_enc,r,pk,cache); - HashSession(k,1,r_enc,c); + unsigned char r_enc[Small_bytes], cache[Hash_bytes]; + Hash_prefix(cache, 4, pk, crypto_kem_sntrup761_PUBLICKEYBYTES); + Short_random(r); + Hide(c, r_enc, r, pk, cache); + HashSession(k, 1, r_enc, c); + return 0; } -/* 0 if matching ciphertext+confirm, else -1 */ -static int Ciphertexts_diff_mask(const unsigned char *c,const unsigned char *c2) -{ - uint16 differentbits = 0; - int len = Ciphertexts_bytes+Confirm_bytes; - - while (len-- > 0) differentbits |= (*c++)^(*c2++); - return (1&((differentbits-1)>>8))-1; +static int Ciphertexts_diff_mask(const unsigned char *c, const unsigned char *c2) { + uint16_t differentbits = 0; + int len = crypto_kem_sntrup761_CIPHERTEXTBYTES; + while (len-- > 0) differentbits |= (*c++) ^ (*c2++); + return (crypto_int64_bitmod_01((differentbits - 1),8)) - 1; } -/* k = Decap(c,sk) */ -static void Decap(unsigned char *k,const unsigned char *c,const unsigned char *sk) -{ +int crypto_kem_sntrup761_dec(unsigned char *k, const unsigned char *c, const unsigned char *sk) { const unsigned char *pk = sk + SecretKeys_bytes; - const unsigned char *rho = pk + PublicKeys_bytes; - const unsigned char *cache = rho + Inputs_bytes; + const unsigned char *rho = pk + crypto_kem_sntrup761_PUBLICKEYBYTES; + const unsigned char *cache = rho + Small_bytes; Inputs r; - unsigned char r_enc[Inputs_bytes]; - unsigned char cnew[Ciphertexts_bytes+Confirm_bytes]; - int mask; - int i; - - ZDecrypt(r,c,sk); - Hide(cnew,r_enc,r,pk,cache); - mask = Ciphertexts_diff_mask(c,cnew); - for (i = 0;i < Inputs_bytes;++i) r_enc[i] ^= mask&(r_enc[i]^rho[i]); - HashSession(k,1+mask,r_enc,c); -} - -/* ----- crypto_kem API */ - - -int crypto_kem_sntrup761_keypair(unsigned char *pk,unsigned char *sk) -{ - KEM_KeyGen(pk,sk); - return 0; -} - -int crypto_kem_sntrup761_enc(unsigned char *c,unsigned char *k,const unsigned char *pk) -{ - Encap(c,k,pk); + unsigned char r_enc[Small_bytes], cnew[crypto_kem_sntrup761_CIPHERTEXTBYTES]; + int mask, i; + ZDecrypt(r, c, sk); + Hide(cnew, r_enc, r, pk, cache); + mask = Ciphertexts_diff_mask(c, cnew); + for (i = 0; i < Small_bytes; ++i) r_enc[i] ^= mask & (r_enc[i] ^ rho[i]); + HashSession(k, 1 + mask, r_enc, c); return 0; } -int crypto_kem_sntrup761_dec(unsigned char *k,const unsigned char *c,const unsigned char *sk) -{ - Decap(k,c,sk); - return 0; -} #endif /* USE_SNTRUP761X25519 */ diff --git a/sntrup761.sh b/sntrup761.sh index db4e9ae..4de8dc3 100644 --- a/sntrup761.sh +++ b/sntrup761.sh @@ -1,25 +1,18 @@ #!/bin/sh -# $OpenBSD: sntrup761.sh,v 1.7 2023/01/11 02:13:52 djm Exp $ +# $OpenBSD: sntrup761.sh,v 1.9 2024/09/16 05:37:05 djm Exp $ # Placed in the Public Domain. # -AUTHOR="supercop-20201130/crypto_kem/sntrup761/ref/implementors" -FILES=" - supercop-20201130/crypto_sort/int32/portable4/int32_minmax.inc - supercop-20201130/crypto_sort/int32/portable4/sort.c - supercop-20201130/crypto_sort/uint32/useint32/sort.c - supercop-20201130/crypto_kem/sntrup761/ref/uint32.c - supercop-20201130/crypto_kem/sntrup761/ref/int32.c - supercop-20201130/crypto_kem/sntrup761/ref/paramsmenu.h - supercop-20201130/crypto_kem/sntrup761/ref/params.h - supercop-20201130/crypto_kem/sntrup761/ref/Decode.h - supercop-20201130/crypto_kem/sntrup761/ref/Decode.c - supercop-20201130/crypto_kem/sntrup761/ref/Encode.h - supercop-20201130/crypto_kem/sntrup761/ref/Encode.c - supercop-20201130/crypto_kem/sntrup761/ref/kem.c +AUTHOR="supercop-20240808/crypto_kem/sntrup761/ref/implementors" +FILES=" supercop-20240808/cryptoint/crypto_int16.h + supercop-20240808/cryptoint/crypto_int32.h + supercop-20240808/cryptoint/crypto_int64.h + supercop-20240808/crypto_sort/int32/portable4/sort.c + supercop-20240808/crypto_sort/uint32/useint32/sort.c + supercop-20240808/crypto_kem/sntrup761/compact/kem.c " ### -set -e +set -euo pipefail cd $1 echo -n '/* $' echo 'OpenBSD: $ */' @@ -32,12 +25,19 @@ echo echo '#include <string.h>' echo '#include "crypto_api.h"' echo +echo '#define crypto_declassify(x, y) do {} while (0)' +echo # Map the types used in this code to the ones in crypto_api.h. We use #define # instead of typedef since some systems have existing intXX types and do not # permit multiple typedefs even if they do not conflict. for t in int8 uint8 int16 uint16 int32 uint32 int64 uint64; do echo "#define $t crypto_${t}" done + +for x in 16 32 64 ; do + echo "extern volatile crypto_int$x crypto_int${x}_optblocker;" +done + echo for i in $FILES; do echo "/* from $i */" @@ -57,14 +57,32 @@ for i in $FILES; do -e 's/[ ]*$//' \ $i | \ case "$i" in - # Use int64_t for intermediate values in int32_MINMAX to prevent signed - # 32-bit integer overflow when called by crypto_sort_uint32. - */int32_minmax.inc) - sed -e "s/int32 ab = b ^ a/int64_t ab = (int64_t)b ^ (int64_t)a/" \ - -e "s/int32 c = b - a/int64_t c = (int64_t)b - (int64_t)a/" + */cryptoint/crypto_int16.h) + sed -e "s/static void crypto_int16_store/void crypto_int16_store/" \ + -e "s/^[#]define crypto_int16_optblocker.*//" \ + -e "s/static void crypto_int16_minmax/void crypto_int16_minmax/" + ;; + */cryptoint/crypto_int32.h) + # Use int64_t for intermediate values in crypto_int32_minmax to + # prevent signed 32-bit integer overflow when called by + # crypto_sort_int32. Original code depends on -fwrapv (we set -ftrapv) + sed -e "s/static void crypto_int32_store/void crypto_int32_store/" \ + -e "s/^[#]define crypto_int32_optblocker.*//" \ + -e "s/crypto_int32 crypto_int32_r = crypto_int32_y ^ crypto_int32_x;/crypto_int64 crypto_int32_r = (crypto_int64)crypto_int32_y ^ (crypto_int64)crypto_int32_x;/" \ + -e "s/crypto_int32 crypto_int32_z = crypto_int32_y - crypto_int32_x;/crypto_int64 crypto_int32_z = (crypto_int64)crypto_int32_y - (crypto_int64)crypto_int32_x;/" \ + -e "s/static void crypto_int32_minmax/void crypto_int32_minmax/" + ;; + */cryptoint/crypto_int64.h) + sed -e "s/static void crypto_int64_store/void crypto_int64_store/" \ + -e "s/^[#]define crypto_int64_optblocker.*//" \ + -e "s/static void crypto_int64_minmax/void crypto_int64_minmax/" ;; */int32/portable4/sort.c) - sed -e "s/void crypto_sort/void crypto_sort_int32/g" + sed -e "s/void crypto_sort[(]/void crypto_sort_int32(/g" + ;; + */int32/portable5/sort.c) + sed -e "s/crypto_sort_smallindices/crypto_sort_int32_smallindices/"\ + -e "s/void crypto_sort[(]/void crypto_sort_int32(/g" ;; */uint32/useint32/sort.c) sed -e "s/void crypto_sort/void crypto_sort_uint32/g" @@ -381,6 +381,10 @@ srclimit_penalise(struct xaddr *addr, int penalty_type) penalty_secs = penalty_cfg.penalty_noauth; reason = "penalty: connections without attempting authentication"; break; + case SRCLIMIT_PENALTY_REFUSECONNECTION: + penalty_secs = penalty_cfg.penalty_refuseconnection; + reason = "penalty: connection prohibited by RefuseConnection"; + break; case SRCLIMIT_PENALTY_GRACE_EXCEEDED: penalty_secs = penalty_cfg.penalty_crash; reason = "penalty: exceeded LoginGraceTime"; @@ -22,16 +22,18 @@ void srclimit_init(int, int, int, int, int srclimit_check_allow(int, int); void srclimit_done(int); -#define SRCLIMIT_PENALTY_NONE 0 -#define SRCLIMIT_PENALTY_CRASH 1 -#define SRCLIMIT_PENALTY_AUTHFAIL 2 -#define SRCLIMIT_PENALTY_GRACE_EXCEEDED 3 -#define SRCLIMIT_PENALTY_NOAUTH 4 +#define SRCLIMIT_PENALTY_NONE 0 +#define SRCLIMIT_PENALTY_CRASH 1 +#define SRCLIMIT_PENALTY_AUTHFAIL 2 +#define SRCLIMIT_PENALTY_GRACE_EXCEEDED 3 +#define SRCLIMIT_PENALTY_NOAUTH 4 +#define SRCLIMIT_PENALTY_REFUSECONNECTION 5 /* meaningful exit values, used by sshd listener for penalties */ #define EXIT_LOGIN_GRACE 3 /* login grace period exceeded */ #define EXIT_CHILD_CRASH 4 /* preauth child crashed */ #define EXIT_AUTH_ATTEMPTED 5 /* at least one auth attempt made */ +#define EXIT_CONFIG_REFUSED 6 /* sshd_config RefuseConnection */ void srclimit_penalise(struct xaddr *, int); int srclimit_penalty_check_allow(int, const char **); @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-add.c,v 1.172 2024/01/11 01:45:36 djm Exp $ */ +/* $OpenBSD: ssh-add.c,v 1.173 2024/09/06 02:30:44 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -698,7 +698,7 @@ parse_dest_constraint_hop(const char *s, struct dest_constraint_hop *dch, memset(dch, '\0', sizeof(*dch)); os = xstrdup(s); - if ((host = strchr(os, '@')) == NULL) + if ((host = strrchr(os, '@')) == NULL) host = os; else { *host++ = '\0'; diff --git a/ssh-ecdsa-sk.c b/ssh-ecdsa-sk.c index 5dcd3c1..27ddf90 100644 --- a/ssh-ecdsa-sk.c +++ b/ssh-ecdsa-sk.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-ecdsa-sk.c,v 1.18 2023/03/08 04:43:12 guenther Exp $ */ +/* $OpenBSD: ssh-ecdsa-sk.c,v 1.19 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -237,11 +237,13 @@ ssh_ecdsa_sk_verify(const struct sshkey *key, struct sshkey_sig_details **detailsp) { ECDSA_SIG *esig = NULL; + EVP_MD_CTX *md_ctx = NULL; BIGNUM *sig_r = NULL, *sig_s = NULL; u_char sig_flags; - u_char msghash[32], apphash[32], sighash[32]; + u_char msghash[32], apphash[32]; u_int sig_counter; - int is_webauthn = 0, ret = SSH_ERR_INTERNAL_ERROR; + u_char *sigb = NULL, *cp; + int is_webauthn = 0, ret = SSH_ERR_INTERNAL_ERROR, len = 0; struct sshbuf *b = NULL, *sigbuf = NULL, *original_signed = NULL; struct sshbuf *webauthn_wrapper = NULL, *webauthn_exts = NULL; char *ktype = NULL, *webauthn_origin = NULL; @@ -252,7 +254,7 @@ ssh_ecdsa_sk_verify(const struct sshkey *key, if (detailsp != NULL) *detailsp = NULL; - if (key == NULL || key->ecdsa == NULL || + if (key == NULL || key->pkey == NULL || sshkey_type_plain(key->type) != KEY_ECDSA_SK || sig == NULL || siglen == 0) return SSH_ERR_INVALID_ARGUMENT; @@ -363,21 +365,43 @@ ssh_ecdsa_sk_verify(const struct sshkey *key, (ret = sshbuf_putb(original_signed, webauthn_exts)) != 0 || (ret = sshbuf_put(original_signed, msghash, sizeof(msghash))) != 0) goto out; - /* Signature is over H(original_signed) */ - if ((ret = ssh_digest_buffer(SSH_DIGEST_SHA256, original_signed, - sighash, sizeof(sighash))) != 0) - goto out; details->sk_counter = sig_counter; details->sk_flags = sig_flags; #ifdef DEBUG_SK fprintf(stderr, "%s: signed buf:\n", __func__); sshbuf_dump(original_signed, stderr); - fprintf(stderr, "%s: signed hash:\n", __func__); - sshbuf_dump_data(sighash, sizeof(sighash), stderr); #endif + if ((md_ctx = EVP_MD_CTX_new()) == NULL) { + ret = SSH_ERR_ALLOC_FAIL; + goto out; + } + if ((len = i2d_ECDSA_SIG(esig, NULL)) <= 0) { + len = 0; + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + if ((sigb = calloc(1, len)) == NULL) { + ret = SSH_ERR_ALLOC_FAIL; + goto out; + } + cp = sigb; /* ASN1_item_i2d increments the pointer past the object */ + if (i2d_ECDSA_SIG(esig, &cp) != len) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } +#ifdef DEBUG_SK + fprintf(stderr, "%s: signed hash:\n", __func__); + sshbuf_dump_data(sigb, len, stderr); +#endif /* Verify it */ - switch (ECDSA_do_verify(sighash, sizeof(sighash), esig, key->ecdsa)) { + if (EVP_DigestVerifyInit(md_ctx, NULL, EVP_sha256(), NULL, + key->pkey) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + switch (EVP_DigestVerify(md_ctx, sigb, len, + sshbuf_ptr(original_signed), sshbuf_len(original_signed))) { case 1: ret = 0; break; @@ -397,7 +421,6 @@ ssh_ecdsa_sk_verify(const struct sshkey *key, explicit_bzero(&sig_flags, sizeof(sig_flags)); explicit_bzero(&sig_counter, sizeof(sig_counter)); explicit_bzero(msghash, sizeof(msghash)); - explicit_bzero(sighash, sizeof(msghash)); explicit_bzero(apphash, sizeof(apphash)); sshkey_sig_details_free(details); sshbuf_free(webauthn_wrapper); @@ -410,6 +433,8 @@ ssh_ecdsa_sk_verify(const struct sshkey *key, BN_clear_free(sig_r); BN_clear_free(sig_s); free(ktype); + freezero(sigb, len); + EVP_MD_CTX_free(md_ctx); return ret; } diff --git a/ssh-ecdsa.c b/ssh-ecdsa.c index 341c324..695ed45 100644 --- a/ssh-ecdsa.c +++ b/ssh-ecdsa.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-ecdsa.c,v 1.26 2023/03/08 04:43:12 guenther Exp $ */ +/* $OpenBSD: ssh-ecdsa.c,v 1.27 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2010 Damien Miller. All rights reserved. @@ -45,6 +45,61 @@ #include "openbsd-compat/openssl-compat.h" +int +sshkey_ecdsa_fixup_group(EVP_PKEY *k) +{ + int nids[] = { + NID_X9_62_prime256v1, + NID_secp384r1, +#ifdef OPENSSL_HAS_NISTP521 + NID_secp521r1, +#endif + -1 + }; + int nid = -1; + u_int i; + const EC_GROUP *g; + EC_KEY *ec = NULL; + EC_GROUP *eg = NULL; + + if ((ec = EVP_PKEY_get1_EC_KEY(k)) == NULL || + (g = EC_KEY_get0_group(ec)) == NULL) + goto out; + /* + * The group may be stored in a ASN.1 encoded private key in one of two + * ways: as a "named group", which is reconstituted by ASN.1 object ID + * or explicit group parameters encoded into the key blob. Only the + * "named group" case sets the group NID for us, but we can figure + * it out for the other case by comparing against all the groups that + * are supported. + */ + if ((nid = EC_GROUP_get_curve_name(g)) > 0) + goto out; + nid = -1; + for (i = 0; nids[i] != -1; i++) { + if ((eg = EC_GROUP_new_by_curve_name(nids[i])) == NULL) + goto out; + if (EC_GROUP_cmp(g, eg, NULL) == 0) + break; + EC_GROUP_free(eg); + eg = NULL; + } + if (nids[i] == -1) + goto out; + + /* Use the group with the NID attached */ + EC_GROUP_set_asn1_flag(eg, OPENSSL_EC_NAMED_CURVE); + if (EC_KEY_set_group(ec, eg) != 1 || + EVP_PKEY_set1_EC_KEY(k, ec) != 1) + goto out; + /* success */ + nid = nids[i]; + out: + EC_KEY_free(ec); + EC_GROUP_free(eg); + return nid; +} + static u_int ssh_ecdsa_size(const struct sshkey *key) { @@ -65,30 +120,16 @@ ssh_ecdsa_size(const struct sshkey *key) static void ssh_ecdsa_cleanup(struct sshkey *k) { - EC_KEY_free(k->ecdsa); - k->ecdsa = NULL; + EVP_PKEY_free(k->pkey); + k->pkey = NULL; } static int ssh_ecdsa_equal(const struct sshkey *a, const struct sshkey *b) { - const EC_GROUP *grp_a, *grp_b; - const EC_POINT *pub_a, *pub_b; - - if (a->ecdsa == NULL || b->ecdsa == NULL) + if (a->pkey == NULL || b->pkey == NULL) return 0; - if ((grp_a = EC_KEY_get0_group(a->ecdsa)) == NULL || - (grp_b = EC_KEY_get0_group(b->ecdsa)) == NULL) - return 0; - if ((pub_a = EC_KEY_get0_public_key(a->ecdsa)) == NULL || - (pub_b = EC_KEY_get0_public_key(b->ecdsa)) == NULL) - return 0; - if (EC_GROUP_cmp(grp_a, grp_b, NULL) != 0) - return 0; - if (EC_POINT_cmp(grp_a, pub_a, pub_b, NULL) != 0) - return 0; - - return 1; + return EVP_PKEY_cmp(a->pkey, b->pkey) == 1; } static int @@ -97,11 +138,11 @@ ssh_ecdsa_serialize_public(const struct sshkey *key, struct sshbuf *b, { int r; - if (key->ecdsa == NULL) + if (key->pkey == NULL) return SSH_ERR_INVALID_ARGUMENT; if ((r = sshbuf_put_cstring(b, sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 || - (r = sshbuf_put_eckey(b, key->ecdsa)) != 0) + (r = sshbuf_put_ec_pkey(b, key->pkey)) != 0) return r; return 0; @@ -118,7 +159,7 @@ ssh_ecdsa_serialize_private(const struct sshkey *key, struct sshbuf *b, return r; } if ((r = sshbuf_put_bignum2(b, - EC_KEY_get0_private_key(key->ecdsa))) != 0) + EC_KEY_get0_private_key(EVP_PKEY_get0_EC_KEY(key->pkey)))) != 0) return r; return 0; } @@ -126,31 +167,64 @@ ssh_ecdsa_serialize_private(const struct sshkey *key, struct sshbuf *b, static int ssh_ecdsa_generate(struct sshkey *k, int bits) { - EC_KEY *private; + EVP_PKEY *res = NULL; + EVP_PKEY_CTX *ctx = NULL; + int ret = SSH_ERR_INTERNAL_ERROR; if ((k->ecdsa_nid = sshkey_ecdsa_bits_to_nid(bits)) == -1) return SSH_ERR_KEY_LENGTH; - if ((private = EC_KEY_new_by_curve_name(k->ecdsa_nid)) == NULL) + + if ((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL)) == NULL) return SSH_ERR_ALLOC_FAIL; - if (EC_KEY_generate_key(private) != 1) { - EC_KEY_free(private); - return SSH_ERR_LIBCRYPTO_ERROR; + + if (EVP_PKEY_keygen_init(ctx) <= 0 || + EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, k->ecdsa_nid) <= 0 || + EVP_PKEY_keygen(ctx, &res) <= 0) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; } - EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE); - k->ecdsa = private; - return 0; + /* success */ + k->pkey = res; + res = NULL; + ret = 0; + out: + EVP_PKEY_free(res); + EVP_PKEY_CTX_free(ctx); + return ret; } static int ssh_ecdsa_copy_public(const struct sshkey *from, struct sshkey *to) { + const EC_KEY *ec_from; + EC_KEY *ec_to = NULL; + int ret = SSH_ERR_INTERNAL_ERROR; + + ec_from = EVP_PKEY_get0_EC_KEY(from->pkey); + if (ec_from == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; + to->ecdsa_nid = from->ecdsa_nid; - if ((to->ecdsa = EC_KEY_new_by_curve_name(from->ecdsa_nid)) == NULL) + if ((ec_to = EC_KEY_new_by_curve_name(from->ecdsa_nid)) == NULL) return SSH_ERR_ALLOC_FAIL; - if (EC_KEY_set_public_key(to->ecdsa, - EC_KEY_get0_public_key(from->ecdsa)) != 1) - return SSH_ERR_LIBCRYPTO_ERROR; /* caller will free k->ecdsa */ - return 0; + if (EC_KEY_set_public_key(ec_to, + EC_KEY_get0_public_key(ec_from)) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + EVP_PKEY_free(to->pkey); + if ((to->pkey = EVP_PKEY_new()) == NULL) { + ret = SSH_ERR_ALLOC_FAIL; + goto out; + } + if (EVP_PKEY_set1_EC_KEY(to->pkey, ec_to) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + ret = 0; + out: + EC_KEY_free(ec_to); + return ret; } static int @@ -159,6 +233,8 @@ ssh_ecdsa_deserialize_public(const char *ktype, struct sshbuf *b, { int r; char *curve = NULL; + EVP_PKEY *pkey = NULL; + EC_KEY *ec = NULL; if ((key->ecdsa_nid = sshkey_ecdsa_nid_from_name(ktype)) == -1) return SSH_ERR_INVALID_ARGUMENT; @@ -168,31 +244,39 @@ ssh_ecdsa_deserialize_public(const char *ktype, struct sshbuf *b, r = SSH_ERR_EC_CURVE_MISMATCH; goto out; } - EC_KEY_free(key->ecdsa); - key->ecdsa = NULL; - if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) == NULL) { + if ((ec = EC_KEY_new_by_curve_name(key->ecdsa_nid)) == NULL) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if ((r = sshbuf_get_eckey(b, key->ecdsa)) != 0) + if ((r = sshbuf_get_eckey(b, ec)) != 0) goto out; - if (sshkey_ec_validate_public(EC_KEY_get0_group(key->ecdsa), - EC_KEY_get0_public_key(key->ecdsa)) != 0) { + if (sshkey_ec_validate_public(EC_KEY_get0_group(ec), + EC_KEY_get0_public_key(ec)) != 0) { r = SSH_ERR_KEY_INVALID_EC_VALUE; goto out; } + if ((pkey = EVP_PKEY_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if (EVP_PKEY_set1_EC_KEY(pkey, ec) != 1) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + EVP_PKEY_free(key->pkey); + key->pkey = pkey; + pkey = NULL; /* success */ r = 0; #ifdef DEBUG_PK - sshkey_dump_ec_point(EC_KEY_get0_group(key->ecdsa), - EC_KEY_get0_public_key(key->ecdsa)); + sshkey_dump_ec_point( + EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(key->pkey)), + EC_KEY_get0_public_key(EVP_PKEY_get0_EC_KEY(key->pkey))); #endif out: + EC_KEY_free(ec); + EVP_PKEY_free(pkey); free(curve); - if (r != 0) { - EC_KEY_free(key->ecdsa); - key->ecdsa = NULL; - } return r; } @@ -202,6 +286,7 @@ ssh_ecdsa_deserialize_private(const char *ktype, struct sshbuf *b, { int r; BIGNUM *exponent = NULL; + EC_KEY *ec = NULL; if (!sshkey_is_cert(key)) { if ((r = ssh_ecdsa_deserialize_public(ktype, b, key)) != 0) @@ -209,16 +294,25 @@ ssh_ecdsa_deserialize_private(const char *ktype, struct sshbuf *b, } if ((r = sshbuf_get_bignum2(b, &exponent)) != 0) goto out; - if (EC_KEY_set_private_key(key->ecdsa, exponent) != 1) { + if ((ec = EVP_PKEY_get1_EC_KEY(key->pkey)) == NULL) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + if (EC_KEY_set_private_key(ec, exponent) != 1) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if ((r = sshkey_ec_validate_private(key->ecdsa)) != 0) + if ((r = sshkey_ec_validate_private(ec)) != 0) goto out; + if (EVP_PKEY_set1_EC_KEY(key->pkey, ec) != 1) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } /* success */ r = 0; out: BN_clear_free(exponent); + EC_KEY_free(ec); return r; } @@ -229,34 +323,35 @@ ssh_ecdsa_sign(struct sshkey *key, const char *alg, const char *sk_provider, const char *sk_pin, u_int compat) { ECDSA_SIG *esig = NULL; + unsigned char *sigb = NULL; + const unsigned char *psig; const BIGNUM *sig_r, *sig_s; int hash_alg; - u_char digest[SSH_DIGEST_MAX_LENGTH]; - size_t len, hlen; + size_t slen = 0; struct sshbuf *b = NULL, *bb = NULL; - int ret = SSH_ERR_INTERNAL_ERROR; + int len = 0, ret = SSH_ERR_INTERNAL_ERROR; if (lenp != NULL) *lenp = 0; if (sigp != NULL) *sigp = NULL; - if (key == NULL || key->ecdsa == NULL || + if (key == NULL || key->pkey == NULL || sshkey_type_plain(key->type) != KEY_ECDSA) return SSH_ERR_INVALID_ARGUMENT; - if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1 || - (hlen = ssh_digest_bytes(hash_alg)) == 0) + if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1) return SSH_ERR_INTERNAL_ERROR; - if ((ret = ssh_digest_memory(hash_alg, data, dlen, - digest, sizeof(digest))) != 0) + + if ((ret = sshkey_pkey_digest_sign(key->pkey, hash_alg, &sigb, &slen, + data, dlen)) != 0) goto out; - if ((esig = ECDSA_do_sign(digest, hlen, key->ecdsa)) == NULL) { + psig = sigb; + if ((esig = d2i_ECDSA_SIG(NULL, &psig, slen)) == NULL) { ret = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if ((bb = sshbuf_new()) == NULL || (b = sshbuf_new()) == NULL) { ret = SSH_ERR_ALLOC_FAIL; goto out; @@ -280,7 +375,7 @@ ssh_ecdsa_sign(struct sshkey *key, *lenp = len; ret = 0; out: - explicit_bzero(digest, sizeof(digest)); + freezero(sigb, slen); sshbuf_free(b); sshbuf_free(bb); ECDSA_SIG_free(esig); @@ -295,20 +390,18 @@ ssh_ecdsa_verify(const struct sshkey *key, { ECDSA_SIG *esig = NULL; BIGNUM *sig_r = NULL, *sig_s = NULL; - int hash_alg; - u_char digest[SSH_DIGEST_MAX_LENGTH]; - size_t hlen; + int hash_alg, len = 0; int ret = SSH_ERR_INTERNAL_ERROR; struct sshbuf *b = NULL, *sigbuf = NULL; char *ktype = NULL; + unsigned char *sigb = NULL, *cp; - if (key == NULL || key->ecdsa == NULL || + if (key == NULL || key->pkey == NULL || sshkey_type_plain(key->type) != KEY_ECDSA || sig == NULL || siglen == 0) return SSH_ERR_INVALID_ARGUMENT; - if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1 || - (hlen = ssh_digest_bytes(hash_alg)) == 0) + if ((hash_alg = sshkey_ec_nid_to_hash_alg(key->ecdsa_nid)) == -1) return SSH_ERR_INTERNAL_ERROR; /* fetch signature */ @@ -334,6 +427,11 @@ ssh_ecdsa_verify(const struct sshkey *key, ret = SSH_ERR_INVALID_FORMAT; goto out; } + if (sshbuf_len(sigbuf) != 0) { + ret = SSH_ERR_UNEXPECTED_TRAILING_DATA; + goto out; + } + if ((esig = ECDSA_SIG_new()) == NULL) { ret = SSH_ERR_ALLOC_FAIL; goto out; @@ -344,28 +442,26 @@ ssh_ecdsa_verify(const struct sshkey *key, } sig_r = sig_s = NULL; /* transferred */ - if (sshbuf_len(sigbuf) != 0) { - ret = SSH_ERR_UNEXPECTED_TRAILING_DATA; + if ((len = i2d_ECDSA_SIG(esig, NULL)) <= 0) { + len = 0; + ret = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if ((ret = ssh_digest_memory(hash_alg, data, dlen, - digest, sizeof(digest))) != 0) - goto out; - - switch (ECDSA_do_verify(digest, hlen, esig, key->ecdsa)) { - case 1: - ret = 0; - break; - case 0: - ret = SSH_ERR_SIGNATURE_INVALID; + if ((sigb = calloc(1, len)) == NULL) { + ret = SSH_ERR_ALLOC_FAIL; goto out; - default: + } + cp = sigb; /* ASN1_item_i2d increments the pointer past the object */ + if (i2d_ECDSA_SIG(esig, &cp) != len) { ret = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - + if ((ret = sshkey_pkey_digest_verify(key->pkey, hash_alg, + data, dlen, sigb, len)) != 0) + goto out; + /* success */ out: - explicit_bzero(digest, sizeof(digest)); + freezero(sigb, len); sshbuf_free(sigbuf); sshbuf_free(b); ECDSA_SIG_free(esig); diff --git a/ssh-keygen.0 b/ssh-keygen.0 index a731a7f..2e65a2b 100644 --- a/ssh-keygen.0 +++ b/ssh-keygen.0 @@ -319,12 +319,14 @@ DESCRIPTION -t ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa Specifies the type of key to create. The possible values are - M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519M-bM-^@M-^], M-bM-^@M-^\ed25519-skM-bM-^@M-^], or M-bM-^@M-^\rsaM-bM-^@M-^]. + M-bM-^@M-^\ecdsaM-bM-^@M-^], M-bM-^@M-^\ecdsa-skM-bM-^@M-^], M-bM-^@M-^\ed25519 (the default),M-bM-^@M-^] M-bM-^@M-^\ed25519-skM-bM-^@M-^], or + M-bM-^@M-^\rsaM-bM-^@M-^]. This flag may also be used to specify the desired signature type when signing certificates using an RSA CA key. The available RSA signature variants are M-bM-^@M-^\ssh-rsaM-bM-^@M-^] (SHA1 signatures, not - recommended), M-bM-^@M-^\rsa-sha2-256M-bM-^@M-^], and M-bM-^@M-^\rsa-sha2-512M-bM-^@M-^] (the default). + recommended), M-bM-^@M-^\rsa-sha2-256M-bM-^@M-^], and M-bM-^@M-^\rsa-sha2-512M-bM-^@M-^] (the default for + RSA keys). -U When used in combination with -s or -Y sign, this option indicates that a CA key resides in a ssh-agent(1). See the @@ -904,4 +906,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.5 June 17, 2024 OpenBSD 7.5 +OpenBSD 7.5 August 17, 2024 OpenBSD 7.5 diff --git a/ssh-keygen.1 b/ssh-keygen.1 index df6803f..06f0555 100644 --- a/ssh-keygen.1 +++ b/ssh-keygen.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: ssh-keygen.1,v 1.232 2024/06/17 13:50:18 naddy Exp $ +.\" $OpenBSD: ssh-keygen.1,v 1.233 2024/08/17 08:35:04 djm Exp $ .\" .\" Author: Tatu Ylonen <ylo@cs.hut.fi> .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -35,7 +35,7 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.Dd $Mdocdate: June 17 2024 $ +.Dd $Mdocdate: August 17 2024 $ .Dt SSH-KEYGEN 1 .Os .Sh NAME @@ -581,7 +581,7 @@ Specifies the type of key to create. The possible values are .Dq ecdsa , .Dq ecdsa-sk , -.Dq ed25519 , +.Dq ed25519 (the default), .Dq ed25519-sk , or .Dq rsa . @@ -594,7 +594,7 @@ The available RSA signature variants are .Dq rsa-sha2-256 , and .Dq rsa-sha2-512 -(the default). +(the default for RSA keys). .It Fl U When used in combination with .Fl s diff --git a/ssh-keygen.c b/ssh-keygen.c index 97c6d13..8396c40 100644 --- a/ssh-keygen.c +++ b/ssh-keygen.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keygen.c,v 1.472 2024/01/11 01:45:36 djm Exp $ */ +/* $OpenBSD: ssh-keygen.c,v 1.475 2024/09/15 00:47:01 djm Exp $ */ /* * Author: Tatu Ylonen <ylo@cs.hut.fi> * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland @@ -261,7 +261,7 @@ ask_filename(struct passwd *pw, const char *prompt) if (key_type_name == NULL) name = _PATH_SSH_CLIENT_ID_ED25519; else { - switch (sshkey_type_from_name(key_type_name)) { + switch (sshkey_type_from_shortname(key_type_name)) { #ifdef WITH_DSA case KEY_DSA_CERT: case KEY_DSA: @@ -313,7 +313,7 @@ ask_filename(struct passwd *pw, const char *prompt) static struct sshkey * load_identity(const char *filename, char **commentp) { - char *pass; + char *prompt, *pass; struct sshkey *prv; int r; @@ -325,8 +325,11 @@ load_identity(const char *filename, char **commentp) fatal_r(r, "Load key \"%s\"", filename); if (identity_passphrase) pass = xstrdup(identity_passphrase); - else - pass = read_passphrase("Enter passphrase: ", RP_ALLOW_STDIN); + else { + xasprintf(&prompt, "Enter passphrase for \"%s\": ", filename); + pass = read_passphrase(prompt, RP_ALLOW_STDIN); + free(prompt); + } r = sshkey_load_private(filename, pass, &prv, commentp); freezero(pass, strlen(pass)); if (r != 0) @@ -375,7 +378,8 @@ do_convert_to_pkcs8(struct sshkey *k) { switch (sshkey_type_plain(k->type)) { case KEY_RSA: - if (!PEM_write_RSA_PUBKEY(stdout, k->rsa)) + if (!PEM_write_RSA_PUBKEY(stdout, + EVP_PKEY_get0_RSA(k->pkey))) fatal("PEM_write_RSA_PUBKEY failed"); break; #ifdef WITH_DSA @@ -386,7 +390,8 @@ do_convert_to_pkcs8(struct sshkey *k) #endif #ifdef OPENSSL_HAS_ECC case KEY_ECDSA: - if (!PEM_write_EC_PUBKEY(stdout, k->ecdsa)) + if (!PEM_write_EC_PUBKEY(stdout, + EVP_PKEY_get0_EC_KEY(k->pkey))) fatal("PEM_write_EC_PUBKEY failed"); break; #endif @@ -401,7 +406,8 @@ do_convert_to_pem(struct sshkey *k) { switch (sshkey_type_plain(k->type)) { case KEY_RSA: - if (!PEM_write_RSAPublicKey(stdout, k->rsa)) + if (!PEM_write_RSAPublicKey(stdout, + EVP_PKEY_get0_RSA(k->pkey))) fatal("PEM_write_RSAPublicKey failed"); break; #ifdef WITH_DSA @@ -412,7 +418,8 @@ do_convert_to_pem(struct sshkey *k) #endif #ifdef OPENSSL_HAS_ECC case KEY_ECDSA: - if (!PEM_write_EC_PUBKEY(stdout, k->ecdsa)) + if (!PEM_write_EC_PUBKEY(stdout, + EVP_PKEY_get0_EC_KEY(k->pkey))) fatal("PEM_write_EC_PUBKEY failed"); break; #endif @@ -490,6 +497,8 @@ do_convert_private_ssh2(struct sshbuf *b) #endif BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL; BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL; + BIGNUM *rsa_dmp1 = NULL, *rsa_dmq1 = NULL; + RSA *rsa = NULL; if ((r = sshbuf_get_u32(b, &magic)) != 0) fatal_fr(r, "parse magic"); @@ -584,15 +593,25 @@ do_convert_private_ssh2(struct sshbuf *b) buffer_get_bignum_bits(b, rsa_iqmp); buffer_get_bignum_bits(b, rsa_q); buffer_get_bignum_bits(b, rsa_p); - if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, rsa_d)) + if ((r = ssh_rsa_complete_crt_parameters(rsa_d, rsa_p, rsa_q, + rsa_iqmp, &rsa_dmp1, &rsa_dmq1)) != 0) + fatal_fr(r, "generate RSA CRT parameters"); + if ((key->pkey = EVP_PKEY_new()) == NULL) + fatal_f("EVP_PKEY_new failed"); + if ((rsa = RSA_new()) == NULL) + fatal_f("RSA_new failed"); + if (!RSA_set0_key(rsa, rsa_n, rsa_e, rsa_d)) fatal_f("RSA_set0_key failed"); rsa_n = rsa_e = rsa_d = NULL; /* transferred */ - if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q)) + if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) fatal_f("RSA_set0_factors failed"); rsa_p = rsa_q = NULL; /* transferred */ - if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0) - fatal_fr(r, "generate RSA parameters"); - BN_clear_free(rsa_iqmp); + if (RSA_set0_crt_params(rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp) != 1) + fatal_f("RSA_set0_crt_params failed"); + rsa_dmp1 = rsa_dmq1 = rsa_iqmp = NULL; + if (EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) + fatal_f("EVP_PKEY_set1_RSA failed"); + RSA_free(rsa); alg = "rsa-sha2-256"; break; } @@ -712,7 +731,8 @@ do_convert_from_pkcs8(struct sshkey **k, int *private) if ((*k = sshkey_new(KEY_UNSPEC)) == NULL) fatal("sshkey_new failed"); (*k)->type = KEY_RSA; - (*k)->rsa = EVP_PKEY_get1_RSA(pubkey); + (*k)->pkey = pubkey; + pubkey = NULL; break; #ifdef WITH_DSA case EVP_PKEY_DSA: @@ -726,9 +746,11 @@ do_convert_from_pkcs8(struct sshkey **k, int *private) case EVP_PKEY_EC: if ((*k = sshkey_new(KEY_UNSPEC)) == NULL) fatal("sshkey_new failed"); + if (((*k)->ecdsa_nid = sshkey_ecdsa_fixup_group(pubkey)) == -1) + fatal("sshkey_ecdsa_fixup_group failed"); (*k)->type = KEY_ECDSA; - (*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey); - (*k)->ecdsa_nid = sshkey_ecdsa_key_to_nid((*k)->ecdsa); + (*k)->pkey = pubkey; + pubkey = NULL; break; #endif default: @@ -750,8 +772,12 @@ do_convert_from_pem(struct sshkey **k, int *private) if ((rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL)) != NULL) { if ((*k = sshkey_new(KEY_UNSPEC)) == NULL) fatal("sshkey_new failed"); + if (((*k)->pkey = EVP_PKEY_new()) == NULL) + fatal("EVP_PKEY_new failed"); (*k)->type = KEY_RSA; - (*k)->rsa = rsa; + if (EVP_PKEY_set1_RSA((*k)->pkey, rsa) != 1) + fatal("EVP_PKEY_set1_RSA failed"); + RSA_free(rsa); fclose(fp); return; } @@ -799,13 +825,15 @@ do_convert_from(struct passwd *pw) #endif #ifdef OPENSSL_HAS_ECC case KEY_ECDSA: - ok = PEM_write_ECPrivateKey(stdout, k->ecdsa, NULL, - NULL, 0, NULL, NULL); + ok = PEM_write_ECPrivateKey(stdout, + EVP_PKEY_get0_EC_KEY(k->pkey), NULL, NULL, 0, + NULL, NULL); break; #endif case KEY_RSA: - ok = PEM_write_RSAPrivateKey(stdout, k->rsa, NULL, - NULL, 0, NULL, NULL); + ok = PEM_write_RSAPrivateKey(stdout, + EVP_PKEY_get0_RSA(k->pkey), NULL, NULL, 0, + NULL, NULL); break; default: fatal_f("unsupported key type %s", sshkey_type(k)); @@ -1115,7 +1143,7 @@ do_gen_all_hostkeys(struct passwd *pw) } printf("%s ", key_types[i].key_type_display); fflush(stdout); - type = sshkey_type_from_name(key_types[i].key_type); + type = sshkey_type_from_shortname(key_types[i].key_type); if ((fd = mkstemp(prv_tmp)) == -1) { error("Could not save your private key in %s: %s", prv_tmp, strerror(errno)); @@ -1821,7 +1849,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent, free(tmp); if (key_type_name != NULL) { - if (sshkey_type_from_name(key_type_name) != ca->type) { + if (sshkey_type_from_shortname(key_type_name) != ca->type) { fatal("CA key type %s doesn't match specified %s", sshkey_ssh_name(ca), key_type_name); } @@ -3108,17 +3136,22 @@ read_check_passphrase(const char *prompt1, const char *prompt2, } static char * -private_key_passphrase(void) +private_key_passphrase(const char *path) { + char *prompt, *ret; + if (identity_passphrase) return xstrdup(identity_passphrase); if (identity_new_passphrase) return xstrdup(identity_new_passphrase); - return read_check_passphrase( - "Enter passphrase (empty for no passphrase): ", + xasprintf(&prompt, "Enter passphrase for \"%s\" " + "(empty for no passphrase): ", path); + ret = read_check_passphrase(prompt, "Enter same passphrase again: ", "Passphrases do not match. Try again."); + free(prompt); + return ret; } static char * @@ -3214,7 +3247,7 @@ do_download_sk(const char *skprovider, const char *device) /* Save the key with the application string as the comment */ if (pass == NULL) - pass = private_key_passphrase(); + pass = private_key_passphrase(path); if ((r = sshkey_save_private(key, path, pass, key->sk_application, private_key_format, openssh_format_cipher, rounds)) != 0) { @@ -3811,7 +3844,7 @@ main(int argc, char **argv) if (key_type_name == NULL) key_type_name = DEFAULT_KEY_TYPE_NAME; - type = sshkey_type_from_name(key_type_name); + type = sshkey_type_from_shortname(key_type_name); type_bits_valid(type, key_type_name, &bits); if (!quiet) @@ -3913,7 +3946,7 @@ main(int argc, char **argv) exit(1); /* Determine the passphrase for the private key */ - passphrase = private_key_passphrase(); + passphrase = private_key_passphrase(identity_file); if (identity_comment) { strlcpy(comment, identity_comment, sizeof(comment)); } else { diff --git a/ssh-keyscan.c b/ssh-keyscan.c index 548eaab..f34e056 100644 --- a/ssh-keyscan.c +++ b/ssh-keyscan.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-keyscan.c,v 1.158 2024/06/14 00:25:25 djm Exp $ */ +/* $OpenBSD: ssh-keyscan.c,v 1.161 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>. * @@ -303,6 +303,7 @@ keygrab_ssh2(con *c) #endif c->c_ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; c->c_ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + c->c_ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ssh_set_verify_host_key_callback(c->c_ssh, key_print_wrapper); /* * do the key-exchange until an error occurs or until @@ -751,7 +752,7 @@ main(int argc, char **argv) get_keytypes = 0; tname = strtok(optarg, ","); while (tname) { - int type = sshkey_type_from_name(tname); + int type = sshkey_type_from_shortname(tname); switch (type) { #ifdef WITH_DSA diff --git a/ssh-pkcs11-client.c b/ssh-pkcs11-client.c index 5fa8bf0..b8d1700 100644 --- a/ssh-pkcs11-client.c +++ b/ssh-pkcs11-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-pkcs11-client.c,v 1.19 2023/12/18 14:46:56 djm Exp $ */ +/* $OpenBSD: ssh-pkcs11-client.c,v 1.20 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2010 Markus Friedl. All rights reserved. * Copyright (c) 2014 Pedro Martelletto. All rights reserved. @@ -264,14 +264,17 @@ rsa_encrypt(int flen, const u_char *from, u_char *to, RSA *rsa, int padding) debug3_f("signing with PKCS11 provider %s", helper->path); if (padding != RSA_PKCS1_PADDING) goto fail; - key = sshkey_new(KEY_UNSPEC); - if (key == NULL) { + if ((key = sshkey_new(KEY_UNSPEC)) == NULL) { error_f("sshkey_new failed"); goto fail; } + if ((key->pkey = EVP_PKEY_new()) == NULL || + EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) { + error_f("pkey setup failed"); + goto fail; + } + key->type = KEY_RSA; - RSA_up_ref(rsa); - key->rsa = rsa; if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) { error_fr(r, "encode key"); goto fail; @@ -339,21 +342,22 @@ ecdsa_do_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv, if ((helper = helper_by_ec(ec)) == NULL || helper->fd == -1) fatal_f("no helper for PKCS11 key"); debug3_f("signing with PKCS11 provider %s", helper->path); - nid = sshkey_ecdsa_key_to_nid(ec); - if (nid < 0) { - error_f("couldn't get curve nid"); - goto fail; - } - key = sshkey_new(KEY_UNSPEC); - if (key == NULL) { + if ((key = sshkey_new(KEY_UNSPEC)) == NULL) { error_f("sshkey_new failed"); goto fail; } - key->ecdsa = ec; + if ((key->pkey = EVP_PKEY_new()) == NULL || + EVP_PKEY_set1_EC_KEY(key->pkey, ec) != 1) { + error("pkey setup failed"); + goto fail; + } + if ((nid = sshkey_ecdsa_pkey_to_nid(key->pkey)) < 0) { + error("couldn't get curve nid"); + goto fail; + } key->ecdsa_nid = nid; key->type = KEY_ECDSA; - EC_KEY_up_ref(ec); if ((r = sshkey_to_blob(key, &blob, &blen)) != 0) { error_fr(r, "encode key"); @@ -408,16 +412,31 @@ ecdsa_do_finish(EC_KEY *ec) static void wrap_key(struct helper *helper, struct sshkey *k) { + RSA *rsa = NULL; + EC_KEY *ecdsa = NULL; + debug3_f("wrap %s for provider %s", sshkey_type(k), helper->path); if (k->type == KEY_RSA) { - RSA_set_method(k->rsa, helper->rsa_meth); + if ((rsa = EVP_PKEY_get1_RSA(k->pkey)) == NULL) + fatal_f("no RSA key"); + if (RSA_set_method(rsa, helper->rsa_meth) != 1) + fatal_f("RSA_set_method failed"); if (helper->nrsa++ >= INT_MAX) fatal_f("RSA refcount error"); + if (EVP_PKEY_set1_RSA(k->pkey, rsa) != 1) + fatal_f("EVP_PKEY_set1_RSA failed"); + RSA_free(rsa); #if defined(OPENSSL_HAS_ECC) && defined(HAVE_EC_KEY_METHOD_NEW) } else if (k->type == KEY_ECDSA) { - EC_KEY_set_method(k->ecdsa, helper->ec_meth); + if ((ecdsa = EVP_PKEY_get1_EC_KEY(k->pkey)) == NULL) + fatal_f("no ECDSA key"); + if (EC_KEY_set_method(ecdsa, helper->ec_meth) != 1) + fatal_f("EC_KEY_set_method failed"); if (helper->nec++ >= INT_MAX) fatal_f("EC refcount error"); + if (EVP_PKEY_set1_EC_KEY(k->pkey, ecdsa) != 1) + fatal_f("EVP_PKEY_set1_EC_KEY failed"); + EC_KEY_free(ecdsa); #endif } else fatal_f("unknown key type"); @@ -437,6 +456,10 @@ pkcs11_make_cert(const struct sshkey *priv, struct helper *helper = NULL; struct sshkey *ret; int r; + RSA *rsa_priv = NULL, *rsa_cert = NULL; +#if defined(OPENSSL_HAS_ECC) && defined(HAVE_EC_KEY_METHOD_NEW) + EC_KEY *ec_priv = NULL, *ec_cert = NULL; +#endif debug3_f("private key type %s cert type %s", sshkey_type(priv), sshkey_type(certpub)); @@ -449,24 +472,42 @@ pkcs11_make_cert(const struct sshkey *priv, } *certprivp = NULL; if (priv->type == KEY_RSA) { - if ((helper = helper_by_rsa(priv->rsa)) == NULL || + if ((rsa_priv = EVP_PKEY_get1_RSA(priv->pkey)) == NULL) + fatal_f("no RSA pkey"); + if ((helper = helper_by_rsa(rsa_priv)) == NULL || helper->fd == -1) fatal_f("no helper for PKCS11 RSA key"); if ((r = sshkey_from_private(priv, &ret)) != 0) fatal_fr(r, "copy key"); - RSA_set_method(ret->rsa, helper->rsa_meth); + if ((rsa_cert = EVP_PKEY_get1_RSA(ret->pkey)) == NULL) + fatal_f("no RSA cert pkey"); + if (RSA_set_method(rsa_cert, helper->rsa_meth) != 1) + fatal_f("RSA_set_method failed"); if (helper->nrsa++ >= INT_MAX) fatal_f("RSA refcount error"); + if (EVP_PKEY_set1_RSA(ret->pkey, rsa_cert) != 1) + fatal_f("EVP_PKEY_set1_RSA failed"); + RSA_free(rsa_priv); + RSA_free(rsa_cert); #if defined(OPENSSL_HAS_ECC) && defined(HAVE_EC_KEY_METHOD_NEW) } else if (priv->type == KEY_ECDSA) { - if ((helper = helper_by_ec(priv->ecdsa)) == NULL || + if ((ec_priv = EVP_PKEY_get1_EC_KEY(priv->pkey)) == NULL) + fatal_f("no EC pkey"); + if ((helper = helper_by_ec(ec_priv)) == NULL || helper->fd == -1) fatal_f("no helper for PKCS11 EC key"); if ((r = sshkey_from_private(priv, &ret)) != 0) fatal_fr(r, "copy key"); - EC_KEY_set_method(ret->ecdsa, helper->ec_meth); + if ((ec_cert = EVP_PKEY_get1_EC_KEY(ret->pkey)) == NULL) + fatal_f("no EC cert pkey"); + if (EC_KEY_set_method(ec_cert, helper->ec_meth) != 1) + fatal_f("EC_KEY_set_method failed"); if (helper->nec++ >= INT_MAX) fatal_f("EC refcount error"); + if (EVP_PKEY_set1_EC_KEY(ret->pkey, ec_cert) != 1) + fatal_f("EVP_PKEY_set1_EC_KEY failed"); + EC_KEY_free(ec_priv); + EC_KEY_free(ec_cert); #endif } else fatal_f("unknown key type %s", sshkey_type(priv)); @@ -485,7 +526,7 @@ pkcs11_make_cert(const struct sshkey *priv, static int pkcs11_start_helper_methods(struct helper *helper) { - RSA_METHOD *rsa_meth; + RSA_METHOD *rsa_meth = NULL; EC_KEY_METHOD *ec_meth = NULL; #if defined(OPENSSL_HAS_ECC) && defined(HAVE_EC_KEY_METHOD_NEW) int (*ec_init)(EC_KEY *key); diff --git a/ssh-pkcs11-helper.c b/ssh-pkcs11-helper.c index 5c3eaae..a8154f2 100644 --- a/ssh-pkcs11-helper.c +++ b/ssh-pkcs11-helper.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-pkcs11-helper.c,v 1.26 2021/11/18 03:31:44 djm Exp $ */ +/* $OpenBSD: ssh-pkcs11-helper.c,v 1.27 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2010 Markus Friedl. All rights reserved. * @@ -45,6 +45,9 @@ #ifdef ENABLE_PKCS11 #ifdef WITH_OPENSSL +#include <openssl/evp.h> +#include <openssl/ec.h> +#include <openssl/rsa.h> /* borrows code from sftp-server and ssh-agent */ @@ -185,10 +188,17 @@ static void process_sign(void) { u_char *blob, *data, *signature = NULL; - size_t blen, dlen, slen = 0; - int r, ok = -1; - struct sshkey *key, *found; + size_t blen, dlen; + u_int slen = 0; + int len, r, ok = -1; + struct sshkey *key = NULL, *found; struct sshbuf *msg; +#ifdef WITH_OPENSSL + RSA *rsa = NULL; +#ifdef OPENSSL_HAS_ECC + EC_KEY *ecdsa = NULL; +#endif /* OPENSSL_HAS_ECC */ +#endif /* WITH_OPENSSL */ /* XXX support SHA2 signature flags */ if ((r = sshbuf_get_string(iqueue, &blob, &blen)) != 0 || @@ -198,41 +208,47 @@ process_sign(void) if ((r = sshkey_from_blob(blob, blen, &key)) != 0) fatal_fr(r, "decode key"); - else { - if ((found = lookup_key(key)) != NULL) { + if ((found = lookup_key(key)) == NULL) + goto reply; + + /* XXX use pkey API properly for signing */ + switch (key->type) { #ifdef WITH_OPENSSL - int ret; - - if (key->type == KEY_RSA) { - slen = RSA_size(key->rsa); - signature = xmalloc(slen); - ret = RSA_private_encrypt(dlen, data, signature, - found->rsa, RSA_PKCS1_PADDING); - if (ret != -1) { - slen = ret; - ok = 0; - } + case KEY_RSA: + if ((rsa = EVP_PKEY_get1_RSA(found->pkey)) == NULL) + fatal_f("no RSA in pkey"); + if ((len = RSA_size(rsa)) < 0) + fatal_f("bad RSA length"); + signature = xmalloc(len); + if ((len = RSA_private_encrypt(dlen, data, signature, + rsa, RSA_PKCS1_PADDING)) < 0) { + error_f("RSA_private_encrypt failed"); + goto reply; + } + slen = (u_int)len; + break; #ifdef OPENSSL_HAS_ECC - } else if (key->type == KEY_ECDSA) { - u_int xslen = ECDSA_size(key->ecdsa); - - signature = xmalloc(xslen); - /* "The parameter type is ignored." */ - ret = ECDSA_sign(-1, data, dlen, signature, - &xslen, found->ecdsa); - if (ret != 0) - ok = 0; - else - error_f("ECDSA_sign returned %d", ret); - slen = xslen; + case KEY_ECDSA: + if ((ecdsa = EVP_PKEY_get1_EC_KEY(found->pkey)) == NULL) + fatal_f("no ECDSA in pkey"); + if ((len = ECDSA_size(ecdsa)) < 0) + fatal_f("bad ECDSA length"); + slen = (u_int)len; + signature = xmalloc(slen); + /* "The parameter type is ignored." */ + if (!ECDSA_sign(-1, data, dlen, signature, &slen, ecdsa)) { + error_f("ECDSA_sign failed"); + goto reply; + } + break; #endif /* OPENSSL_HAS_ECC */ - } else - error_f("don't know how to sign with key " - "type %d", (int)key->type); #endif /* WITH_OPENSSL */ - } - sshkey_free(key); + default: + fatal_f("unsupported key type %d", key->type); } + /* success */ + ok = 0; + reply: if ((msg = sshbuf_new()) == NULL) fatal_f("sshbuf_new failed"); if (ok == 0) { @@ -243,6 +259,11 @@ process_sign(void) if ((r = sshbuf_put_u8(msg, SSH2_AGENT_FAILURE)) != 0) fatal_fr(r, "compose failure response"); } + sshkey_free(key); + RSA_free(rsa); +#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) + EC_KEY_free(ecdsa); +#endif free(data); free(blob); free(signature); diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c index 1e76e8b..fadf9c9 100644 --- a/ssh-pkcs11.c +++ b/ssh-pkcs11.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-pkcs11.c,v 1.62 2024/04/02 12:22:38 deraadt Exp $ */ +/* $OpenBSD: ssh-pkcs11.c,v 1.63 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2010 Markus Friedl. All rights reserved. * Copyright (c) 2014 Pedro Martelletto. All rights reserved. @@ -502,8 +502,10 @@ pkcs11_rsa_wrap(struct pkcs11_provider *provider, CK_ULONG slotidx, memcpy(k11->keyid, keyid_attrib->pValue, k11->keyid_len); } - RSA_set_method(rsa, rsa_method); - RSA_set_ex_data(rsa, rsa_idx, k11); + if (RSA_set_method(rsa, rsa_method) != 1) + fatal_f("RSA_set_method failed"); + if (RSA_set_ex_data(rsa, rsa_idx, k11) != 1) + fatal_f("RSA_set_ex_data failed"); return (0); } @@ -615,8 +617,10 @@ pkcs11_ecdsa_wrap(struct pkcs11_provider *provider, CK_ULONG slotidx, k11->keyid = xmalloc(k11->keyid_len); memcpy(k11->keyid, keyid_attrib->pValue, k11->keyid_len); } - EC_KEY_set_method(ec, ec_key_method); - EC_KEY_set_ex_data(ec, ec_key_idx, k11); + if (EC_KEY_set_method(ec, ec_key_method) != 1) + fatal_f("EC_KEY_set_method failed"); + if (EC_KEY_set_ex_data(ec, ec_key_idx, k11) != 1) + fatal_f("EC_KEY_set_ex_data failed"); return (0); } @@ -803,11 +807,14 @@ pkcs11_fetch_ecdsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, goto fail; } - key->ecdsa = ec; + EVP_PKEY_free(key->pkey); + if ((key->pkey = EVP_PKEY_new()) == NULL) + fatal("EVP_PKEY_new failed"); + if (EVP_PKEY_set1_EC_KEY(key->pkey, ec) != 1) + fatal("EVP_PKEY_set1_EC_KEY failed"); key->ecdsa_nid = nid; key->type = KEY_ECDSA; key->flags |= SSHKEY_FLAG_EXT; - ec = NULL; /* now owned by key */ fail: for (i = 0; i < 3; i++) @@ -899,10 +906,13 @@ pkcs11_fetch_rsa_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, goto fail; } - key->rsa = rsa; + EVP_PKEY_free(key->pkey); + if ((key->pkey = EVP_PKEY_new()) == NULL) + fatal("EVP_PKEY_new failed"); + if (EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) + fatal("EVP_PKEY_set1_RSA failed"); key->type = KEY_RSA; key->flags |= SSHKEY_FLAG_EXT; - rsa = NULL; /* now owned by key */ fail: for (i = 0; i < 3; i++) @@ -1014,10 +1024,13 @@ pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, goto out; } - key->rsa = rsa; + EVP_PKEY_free(key->pkey); + if ((key->pkey = EVP_PKEY_new()) == NULL) + fatal("EVP_PKEY_new failed"); + if (EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) + fatal("EVP_PKEY_set1_RSA failed"); key->type = KEY_RSA; key->flags |= SSHKEY_FLAG_EXT; - rsa = NULL; /* now owned by key */ #if defined(OPENSSL_HAS_ECC) && defined(HAVE_EC_KEY_METHOD_NEW) } else if (EVP_PKEY_base_id(evp) == EVP_PKEY_EC) { if (EVP_PKEY_get0_EC_KEY(evp) == NULL) { @@ -1044,11 +1057,14 @@ pkcs11_fetch_x509_pubkey(struct pkcs11_provider *p, CK_ULONG slotidx, goto out; } - key->ecdsa = ec; + EVP_PKEY_free(key->pkey); + if ((key->pkey = EVP_PKEY_new()) == NULL) + fatal("EVP_PKEY_new failed"); + if (EVP_PKEY_set1_EC_KEY(key->pkey, ec) != 1) + fatal("EVP_PKEY_set1_EC_KEY failed"); key->ecdsa_nid = nid; key->type = KEY_ECDSA; key->flags |= SSHKEY_FLAG_EXT; - ec = NULL; /* now owned by key */ #endif /* OPENSSL_HAS_ECC && HAVE_EC_KEY_METHOD_NEW */ } else { error("unknown certificate key type"); @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-rsa.c,v 1.79 2023/03/05 05:34:09 dtucker Exp $ */ +/* $OpenBSD: ssh-rsa.c,v 1.80 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2000, 2003 Markus Friedl <markus@openbsd.org> * @@ -36,23 +36,18 @@ #include "openbsd-compat/openssl-compat.h" -static int openssh_RSA_verify(int, u_char *, size_t, u_char *, size_t, RSA *); - static u_int -ssh_rsa_size(const struct sshkey *key) +ssh_rsa_size(const struct sshkey *k) { - const BIGNUM *rsa_n; - - if (key->rsa == NULL) + if (k->pkey == NULL) return 0; - RSA_get0_key(key->rsa, &rsa_n, NULL, NULL); - return BN_num_bits(rsa_n); + return EVP_PKEY_bits(k->pkey); } static int ssh_rsa_alloc(struct sshkey *k) { - if ((k->rsa = RSA_new()) == NULL) + if ((k->pkey = EVP_PKEY_new()) == NULL) return SSH_ERR_ALLOC_FAIL; return 0; } @@ -60,29 +55,16 @@ ssh_rsa_alloc(struct sshkey *k) static void ssh_rsa_cleanup(struct sshkey *k) { - RSA_free(k->rsa); - k->rsa = NULL; + EVP_PKEY_free(k->pkey); + k->pkey = NULL; } static int ssh_rsa_equal(const struct sshkey *a, const struct sshkey *b) { - const BIGNUM *rsa_e_a, *rsa_n_a; - const BIGNUM *rsa_e_b, *rsa_n_b; - - if (a->rsa == NULL || b->rsa == NULL) - return 0; - RSA_get0_key(a->rsa, &rsa_n_a, &rsa_e_a, NULL); - RSA_get0_key(b->rsa, &rsa_n_b, &rsa_e_b, NULL); - if (rsa_e_a == NULL || rsa_e_b == NULL) + if (a->pkey == NULL || b->pkey == NULL) return 0; - if (rsa_n_a == NULL || rsa_n_b == NULL) - return 0; - if (BN_cmp(rsa_e_a, rsa_e_b) != 0) - return 0; - if (BN_cmp(rsa_n_a, rsa_n_b) != 0) - return 0; - return 1; + return EVP_PKEY_cmp(a->pkey, b->pkey) == 1; } static int @@ -91,10 +73,14 @@ ssh_rsa_serialize_public(const struct sshkey *key, struct sshbuf *b, { int r; const BIGNUM *rsa_n, *rsa_e; + const RSA *rsa; - if (key->rsa == NULL) + if (key->pkey == NULL) return SSH_ERR_INVALID_ARGUMENT; - RSA_get0_key(key->rsa, &rsa_n, &rsa_e, NULL); + if ((rsa = EVP_PKEY_get0_RSA(key->pkey)) == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; + + RSA_get0_key(rsa, &rsa_n, &rsa_e, NULL); if ((r = sshbuf_put_bignum2(b, rsa_e)) != 0 || (r = sshbuf_put_bignum2(b, rsa_n)) != 0) return r; @@ -108,10 +94,13 @@ ssh_rsa_serialize_private(const struct sshkey *key, struct sshbuf *b, { int r; const BIGNUM *rsa_n, *rsa_e, *rsa_d, *rsa_iqmp, *rsa_p, *rsa_q; + const RSA *rsa; - RSA_get0_key(key->rsa, &rsa_n, &rsa_e, &rsa_d); - RSA_get0_factors(key->rsa, &rsa_p, &rsa_q); - RSA_get0_crt_params(key->rsa, NULL, NULL, &rsa_iqmp); + if ((rsa = EVP_PKEY_get0_RSA(key->pkey)) == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; + RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d); + RSA_get0_factors(rsa, &rsa_p, &rsa_q); + RSA_get0_crt_params(rsa, NULL, NULL, &rsa_iqmp); if (!sshkey_is_cert(key)) { /* Note: can't reuse ssh_rsa_serialize_public: e, n vs. n, e */ @@ -131,28 +120,36 @@ ssh_rsa_serialize_private(const struct sshkey *key, struct sshbuf *b, static int ssh_rsa_generate(struct sshkey *k, int bits) { - RSA *private = NULL; - BIGNUM *f4 = NULL; + EVP_PKEY_CTX *ctx = NULL; + EVP_PKEY *res = NULL; + int ret = SSH_ERR_INTERNAL_ERROR; if (bits < SSH_RSA_MINIMUM_MODULUS_SIZE || bits > SSHBUF_MAX_BIGNUM * 8) return SSH_ERR_KEY_LENGTH; - if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) { + + if ((ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL)) == NULL) { ret = SSH_ERR_ALLOC_FAIL; goto out; } - if (!BN_set_word(f4, RSA_F4) || - !RSA_generate_key_ex(private, bits, f4, NULL)) { + if (EVP_PKEY_keygen_init(ctx) <= 0) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + if (EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, bits) <= 0) { + ret = SSH_ERR_KEY_LENGTH; + goto out; + } + if (EVP_PKEY_keygen(ctx, &res) <= 0 || res == NULL) { ret = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - k->rsa = private; - private = NULL; + /* success */ + k->pkey = res; ret = 0; out: - RSA_free(private); - BN_free(f4); + EVP_PKEY_CTX_free(ctx); return ret; } @@ -162,21 +159,33 @@ ssh_rsa_copy_public(const struct sshkey *from, struct sshkey *to) const BIGNUM *rsa_n, *rsa_e; BIGNUM *rsa_n_dup = NULL, *rsa_e_dup = NULL; int r = SSH_ERR_INTERNAL_ERROR; + const RSA *rsa_from; + RSA *rsa_to = NULL; - RSA_get0_key(from->rsa, &rsa_n, &rsa_e, NULL); + if ((rsa_from = EVP_PKEY_get0_RSA(from->pkey)) == NULL || + (rsa_to = RSA_new()) == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; + + RSA_get0_key(rsa_from, &rsa_n, &rsa_e, NULL); if ((rsa_n_dup = BN_dup(rsa_n)) == NULL || (rsa_e_dup = BN_dup(rsa_e)) == NULL) { r = SSH_ERR_ALLOC_FAIL; goto out; } - if (!RSA_set0_key(to->rsa, rsa_n_dup, rsa_e_dup, NULL)) { + if (!RSA_set0_key(rsa_to, rsa_n_dup, rsa_e_dup, NULL)) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } rsa_n_dup = rsa_e_dup = NULL; /* transferred */ + + if (EVP_PKEY_set1_RSA(to->pkey, rsa_to) != 1) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } /* success */ r = 0; out: + RSA_free(rsa_to); BN_clear_free(rsa_n_dup); BN_clear_free(rsa_e_dup); return r; @@ -188,25 +197,34 @@ ssh_rsa_deserialize_public(const char *ktype, struct sshbuf *b, { int ret = SSH_ERR_INTERNAL_ERROR; BIGNUM *rsa_n = NULL, *rsa_e = NULL; + RSA *rsa = NULL; + + if ((rsa = RSA_new()) == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; if (sshbuf_get_bignum2(b, &rsa_e) != 0 || sshbuf_get_bignum2(b, &rsa_n) != 0) { ret = SSH_ERR_INVALID_FORMAT; goto out; } - if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, NULL)) { + if (!RSA_set0_key(rsa, rsa_n, rsa_e, NULL)) { ret = SSH_ERR_LIBCRYPTO_ERROR; goto out; } rsa_n = rsa_e = NULL; /* transferred */ + if (EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } if ((ret = sshkey_check_rsa_length(key, 0)) != 0) goto out; #ifdef DEBUG_PK - RSA_print_fp(stderr, key->rsa, 8); + RSA_print_fp(stderr, rsa, 8); #endif /* success */ ret = 0; out: + RSA_free(rsa); BN_clear_free(rsa_n); BN_clear_free(rsa_e); return ret; @@ -219,13 +237,25 @@ ssh_rsa_deserialize_private(const char *ktype, struct sshbuf *b, int r; BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL; BIGNUM *rsa_iqmp = NULL, *rsa_p = NULL, *rsa_q = NULL; + BIGNUM *rsa_dmp1 = NULL, *rsa_dmq1 = NULL; + RSA *rsa = NULL; - /* Note: can't reuse ssh_rsa_deserialize_public: e, n vs. n, e */ - if (!sshkey_is_cert(key)) { + if (sshkey_is_cert(key)) { + /* sshkey_private_deserialize already has pubkey from cert */ + if ((rsa = EVP_PKEY_get1_RSA(key->pkey)) == NULL) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + } else { + if ((rsa = RSA_new()) == NULL) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + /* Note: can't reuse ssh_rsa_deserialize_public: e,n vs. n,e */ if ((r = sshbuf_get_bignum2(b, &rsa_n)) != 0 || (r = sshbuf_get_bignum2(b, &rsa_e)) != 0) goto out; - if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, NULL)) { + if (!RSA_set0_key(rsa, rsa_n, rsa_e, NULL)) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } @@ -236,33 +266,46 @@ ssh_rsa_deserialize_private(const char *ktype, struct sshbuf *b, (r = sshbuf_get_bignum2(b, &rsa_p)) != 0 || (r = sshbuf_get_bignum2(b, &rsa_q)) != 0) goto out; - if (!RSA_set0_key(key->rsa, NULL, NULL, rsa_d)) { + if ((r = ssh_rsa_complete_crt_parameters(rsa_d, rsa_p, rsa_q, + rsa_iqmp, &rsa_dmp1, &rsa_dmq1)) != 0) + goto out; + if (!RSA_set0_key(rsa, NULL, NULL, rsa_d)) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } rsa_d = NULL; /* transferred */ - if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q)) { + if (!RSA_set0_factors(rsa, rsa_p, rsa_q)) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } rsa_p = rsa_q = NULL; /* transferred */ - if ((r = sshkey_check_rsa_length(key, 0)) != 0) + if (!RSA_set0_crt_params(rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) { + r = SSH_ERR_LIBCRYPTO_ERROR; goto out; - if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0) + } + rsa_dmp1 = rsa_dmq1 = rsa_iqmp = NULL; + if (RSA_blinding_on(rsa, NULL) != 1) { + r = SSH_ERR_LIBCRYPTO_ERROR; goto out; - if (RSA_blinding_on(key->rsa, NULL) != 1) { + } + if (EVP_PKEY_set1_RSA(key->pkey, rsa) != 1) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } + if ((r = sshkey_check_rsa_length(key, 0)) != 0) + goto out; /* success */ r = 0; out: + RSA_free(rsa); BN_clear_free(rsa_n); BN_clear_free(rsa_e); BN_clear_free(rsa_d); BN_clear_free(rsa_p); BN_clear_free(rsa_q); BN_clear_free(rsa_iqmp); + BN_clear_free(rsa_dmp1); + BN_clear_free(rsa_dmq1); return r; } @@ -317,45 +360,23 @@ rsa_hash_id_from_keyname(const char *alg) return -1; } -static int -rsa_hash_alg_nid(int type) -{ - switch (type) { - case SSH_DIGEST_SHA1: - return NID_sha1; - case SSH_DIGEST_SHA256: - return NID_sha256; - case SSH_DIGEST_SHA512: - return NID_sha512; - default: - return -1; - } -} - int -ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp) +ssh_rsa_complete_crt_parameters(const BIGNUM *rsa_d, const BIGNUM *rsa_p, + const BIGNUM *rsa_q, const BIGNUM *rsa_iqmp, BIGNUM **rsa_dmp1, + BIGNUM **rsa_dmq1) { - const BIGNUM *rsa_p, *rsa_q, *rsa_d; BIGNUM *aux = NULL, *d_consttime = NULL; - BIGNUM *rsa_dmq1 = NULL, *rsa_dmp1 = NULL, *rsa_iqmp = NULL; BN_CTX *ctx = NULL; int r; - if (key == NULL || key->rsa == NULL || - sshkey_type_plain(key->type) != KEY_RSA) - return SSH_ERR_INVALID_ARGUMENT; - - RSA_get0_key(key->rsa, NULL, NULL, &rsa_d); - RSA_get0_factors(key->rsa, &rsa_p, &rsa_q); - + *rsa_dmq1 = *rsa_dmp1 = NULL; if ((ctx = BN_CTX_new()) == NULL) return SSH_ERR_ALLOC_FAIL; if ((aux = BN_new()) == NULL || - (rsa_dmq1 = BN_new()) == NULL || - (rsa_dmp1 = BN_new()) == NULL) + (*rsa_dmq1 = BN_new()) == NULL || + (*rsa_dmp1 = BN_new()) == NULL) return SSH_ERR_ALLOC_FAIL; - if ((d_consttime = BN_dup(rsa_d)) == NULL || - (rsa_iqmp = BN_dup(iqmp)) == NULL) { + if ((d_consttime = BN_dup(rsa_d)) == NULL) { r = SSH_ERR_ALLOC_FAIL; goto out; } @@ -363,25 +384,17 @@ ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp) BN_set_flags(d_consttime, BN_FLG_CONSTTIME); if ((BN_sub(aux, rsa_q, BN_value_one()) == 0) || - (BN_mod(rsa_dmq1, d_consttime, aux, ctx) == 0) || + (BN_mod(*rsa_dmq1, d_consttime, aux, ctx) == 0) || (BN_sub(aux, rsa_p, BN_value_one()) == 0) || - (BN_mod(rsa_dmp1, d_consttime, aux, ctx) == 0)) { + (BN_mod(*rsa_dmp1, d_consttime, aux, ctx) == 0)) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } - if (!RSA_set0_crt_params(key->rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) { - r = SSH_ERR_LIBCRYPTO_ERROR; - goto out; - } - rsa_dmp1 = rsa_dmq1 = rsa_iqmp = NULL; /* transferred */ /* success */ r = 0; out: BN_clear_free(aux); BN_clear_free(d_consttime); - BN_clear_free(rsa_dmp1); - BN_clear_free(rsa_dmq1); - BN_clear_free(rsa_iqmp); BN_CTX_free(ctx); return r; } @@ -393,11 +406,10 @@ ssh_rsa_sign(struct sshkey *key, const u_char *data, size_t datalen, const char *alg, const char *sk_provider, const char *sk_pin, u_int compat) { - const BIGNUM *rsa_n; - u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL; - size_t slen = 0; - u_int hlen, len; - int nid, hash_alg, ret = SSH_ERR_INTERNAL_ERROR; + u_char *sig = NULL; + size_t diff, len = 0; + int slen = 0; + int hash_alg, ret = SSH_ERR_INTERNAL_ERROR; struct sshbuf *b = NULL; if (lenp != NULL) @@ -409,41 +421,28 @@ ssh_rsa_sign(struct sshkey *key, hash_alg = SSH_DIGEST_SHA1; else hash_alg = rsa_hash_id_from_keyname(alg); - if (key == NULL || key->rsa == NULL || hash_alg == -1 || + + if (key == NULL || key->pkey == NULL || hash_alg == -1 || sshkey_type_plain(key->type) != KEY_RSA) return SSH_ERR_INVALID_ARGUMENT; - RSA_get0_key(key->rsa, &rsa_n, NULL, NULL); - if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE) - return SSH_ERR_KEY_LENGTH; - slen = RSA_size(key->rsa); + slen = EVP_PKEY_size(key->pkey); if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM) return SSH_ERR_INVALID_ARGUMENT; + if (EVP_PKEY_bits(key->pkey) < SSH_RSA_MINIMUM_MODULUS_SIZE) + return SSH_ERR_KEY_LENGTH; - /* hash the data */ - nid = rsa_hash_alg_nid(hash_alg); - if ((hlen = ssh_digest_bytes(hash_alg)) == 0) - return SSH_ERR_INTERNAL_ERROR; - if ((ret = ssh_digest_memory(hash_alg, data, datalen, - digest, sizeof(digest))) != 0) - goto out; - - if ((sig = malloc(slen)) == NULL) { - ret = SSH_ERR_ALLOC_FAIL; - goto out; - } - - if (RSA_sign(nid, digest, hlen, sig, &len, key->rsa) != 1) { - ret = SSH_ERR_LIBCRYPTO_ERROR; + if ((ret = sshkey_pkey_digest_sign(key->pkey, hash_alg, &sig, &len, + data, datalen)) < 0) goto out; - } - if (len < slen) { - size_t diff = slen - len; + if (len < (size_t)slen) { + diff = slen - len; memmove(sig + diff, sig, len); explicit_bzero(sig, diff); - } else if (len > slen) { + } else if (len > (size_t)slen) { ret = SSH_ERR_INTERNAL_ERROR; goto out; } + /* encode signature */ if ((b = sshbuf_new()) == NULL) { ret = SSH_ERR_ALLOC_FAIL; @@ -464,7 +463,6 @@ ssh_rsa_sign(struct sshkey *key, *lenp = len; ret = 0; out: - explicit_bzero(digest, sizeof(digest)); freezero(sig, slen); sshbuf_free(b); return ret; @@ -476,19 +474,17 @@ ssh_rsa_verify(const struct sshkey *key, const u_char *data, size_t dlen, const char *alg, u_int compat, struct sshkey_sig_details **detailsp) { - const BIGNUM *rsa_n; char *sigtype = NULL; int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR; - size_t len = 0, diff, modlen, hlen; + size_t len = 0, diff, modlen, rsasize; struct sshbuf *b = NULL; u_char digest[SSH_DIGEST_MAX_LENGTH], *osigblob, *sigblob = NULL; - if (key == NULL || key->rsa == NULL || + if (key == NULL || key->pkey == NULL || sshkey_type_plain(key->type) != KEY_RSA || sig == NULL || siglen == 0) return SSH_ERR_INVALID_ARGUMENT; - RSA_get0_key(key->rsa, &rsa_n, NULL, NULL); - if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE) + if (EVP_PKEY_bits(key->pkey) < SSH_RSA_MINIMUM_MODULUS_SIZE) return SSH_ERR_KEY_LENGTH; if ((b = sshbuf_from(sig, siglen)) == NULL) @@ -524,7 +520,7 @@ ssh_rsa_verify(const struct sshkey *key, goto out; } /* RSA_verify expects a signature of RSA_size */ - modlen = RSA_size(key->rsa); + modlen = EVP_PKEY_size(key->pkey); if (len > modlen) { ret = SSH_ERR_KEY_BITS_MISMATCH; goto out; @@ -540,16 +536,16 @@ ssh_rsa_verify(const struct sshkey *key, explicit_bzero(sigblob, diff); len = modlen; } - if ((hlen = ssh_digest_bytes(hash_alg)) == 0) { - ret = SSH_ERR_INTERNAL_ERROR; + + rsasize = EVP_PKEY_size(key->pkey); + if (rsasize <= 0 || rsasize > SSHBUF_MAX_BIGNUM || + len == 0 || len > rsasize) { + ret = SSH_ERR_INVALID_ARGUMENT; goto out; } - if ((ret = ssh_digest_memory(hash_alg, data, dlen, - digest, sizeof(digest))) != 0) - goto out; + ret = sshkey_pkey_digest_verify(key->pkey, hash_alg, data, dlen, + sigblob, len); - ret = openssh_RSA_verify(hash_alg, digest, hlen, sigblob, len, - key->rsa); out: freezero(sigblob, len); free(sigtype); @@ -558,125 +554,6 @@ ssh_rsa_verify(const struct sshkey *key, return ret; } -/* - * See: - * http://www.rsasecurity.com/rsalabs/pkcs/pkcs-1/ - * ftp://ftp.rsasecurity.com/pub/pkcs/pkcs-1/pkcs-1v2-1.asn - */ - -/* - * id-sha1 OBJECT IDENTIFIER ::= { iso(1) identified-organization(3) - * oiw(14) secsig(3) algorithms(2) 26 } - */ -static const u_char id_sha1[] = { - 0x30, 0x21, /* type Sequence, length 0x21 (33) */ - 0x30, 0x09, /* type Sequence, length 0x09 */ - 0x06, 0x05, /* type OID, length 0x05 */ - 0x2b, 0x0e, 0x03, 0x02, 0x1a, /* id-sha1 OID */ - 0x05, 0x00, /* NULL */ - 0x04, 0x14 /* Octet string, length 0x14 (20), followed by sha1 hash */ -}; - -/* - * See http://csrc.nist.gov/groups/ST/crypto_apps_infra/csor/algorithms.html - * id-sha256 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) - * organization(1) gov(101) csor(3) nistAlgorithm(4) hashAlgs(2) - * id-sha256(1) } - */ -static const u_char id_sha256[] = { - 0x30, 0x31, /* type Sequence, length 0x31 (49) */ - 0x30, 0x0d, /* type Sequence, length 0x0d (13) */ - 0x06, 0x09, /* type OID, length 0x09 */ - 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, /* id-sha256 */ - 0x05, 0x00, /* NULL */ - 0x04, 0x20 /* Octet string, length 0x20 (32), followed by sha256 hash */ -}; - -/* - * See http://csrc.nist.gov/groups/ST/crypto_apps_infra/csor/algorithms.html - * id-sha512 OBJECT IDENTIFIER ::= { joint-iso-itu-t(2) country(16) us(840) - * organization(1) gov(101) csor(3) nistAlgorithm(4) hashAlgs(2) - * id-sha256(3) } - */ -static const u_char id_sha512[] = { - 0x30, 0x51, /* type Sequence, length 0x51 (81) */ - 0x30, 0x0d, /* type Sequence, length 0x0d (13) */ - 0x06, 0x09, /* type OID, length 0x09 */ - 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, /* id-sha512 */ - 0x05, 0x00, /* NULL */ - 0x04, 0x40 /* Octet string, length 0x40 (64), followed by sha512 hash */ -}; - -static int -rsa_hash_alg_oid(int hash_alg, const u_char **oidp, size_t *oidlenp) -{ - switch (hash_alg) { - case SSH_DIGEST_SHA1: - *oidp = id_sha1; - *oidlenp = sizeof(id_sha1); - break; - case SSH_DIGEST_SHA256: - *oidp = id_sha256; - *oidlenp = sizeof(id_sha256); - break; - case SSH_DIGEST_SHA512: - *oidp = id_sha512; - *oidlenp = sizeof(id_sha512); - break; - default: - return SSH_ERR_INVALID_ARGUMENT; - } - return 0; -} - -static int -openssh_RSA_verify(int hash_alg, u_char *hash, size_t hashlen, - u_char *sigbuf, size_t siglen, RSA *rsa) -{ - size_t rsasize = 0, oidlen = 0, hlen = 0; - int ret, len, oidmatch, hashmatch; - const u_char *oid = NULL; - u_char *decrypted = NULL; - - if ((ret = rsa_hash_alg_oid(hash_alg, &oid, &oidlen)) != 0) - return ret; - ret = SSH_ERR_INTERNAL_ERROR; - hlen = ssh_digest_bytes(hash_alg); - if (hashlen != hlen) { - ret = SSH_ERR_INVALID_ARGUMENT; - goto done; - } - rsasize = RSA_size(rsa); - if (rsasize <= 0 || rsasize > SSHBUF_MAX_BIGNUM || - siglen == 0 || siglen > rsasize) { - ret = SSH_ERR_INVALID_ARGUMENT; - goto done; - } - if ((decrypted = malloc(rsasize)) == NULL) { - ret = SSH_ERR_ALLOC_FAIL; - goto done; - } - if ((len = RSA_public_decrypt(siglen, sigbuf, decrypted, rsa, - RSA_PKCS1_PADDING)) < 0) { - ret = SSH_ERR_LIBCRYPTO_ERROR; - goto done; - } - if (len < 0 || (size_t)len != hlen + oidlen) { - ret = SSH_ERR_INVALID_FORMAT; - goto done; - } - oidmatch = timingsafe_bcmp(decrypted, oid, oidlen) == 0; - hashmatch = timingsafe_bcmp(decrypted + oidlen, hash, hlen) == 0; - if (!oidmatch || !hashmatch) { - ret = SSH_ERR_SIGNATURE_INVALID; - goto done; - } - ret = 0; -done: - freezero(decrypted, rsasize); - return ret; -} - static const struct sshkey_impl_funcs sshkey_rsa_funcs = { /* .size = */ ssh_rsa_size, /* .alloc = */ ssh_rsa_alloc, @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh-sk.c,v 1.40 2023/07/19 14:02:27 djm Exp $ */ +/* $OpenBSD: ssh-sk.c,v 1.41 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2019 Google LLC * @@ -32,6 +32,7 @@ #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) #include <openssl/objects.h> #include <openssl/ec.h> +#include <openssl/evp.h> #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */ #include "log.h" @@ -207,7 +208,9 @@ sshsk_ecdsa_assemble(struct sk_enroll_response *resp, struct sshkey **keyp) { struct sshkey *key = NULL; struct sshbuf *b = NULL; + EC_KEY *ecdsa = NULL; EC_POINT *q = NULL; + const EC_GROUP *g = NULL; int r; *keyp = NULL; @@ -217,8 +220,9 @@ sshsk_ecdsa_assemble(struct sk_enroll_response *resp, struct sshkey **keyp) goto out; } key->ecdsa_nid = NID_X9_62_prime256v1; - if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) == NULL || - (q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL || + if ((ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) == NULL || + (g = EC_KEY_get0_group(ecdsa)) == NULL || + (q = EC_POINT_new(g)) == NULL || (b = sshbuf_new()) == NULL) { error_f("allocation failed"); r = SSH_ERR_ALLOC_FAIL; @@ -229,30 +233,41 @@ sshsk_ecdsa_assemble(struct sk_enroll_response *resp, struct sshkey **keyp) error_fr(r, "sshbuf_put_string"); goto out; } - if ((r = sshbuf_get_ec(b, q, EC_KEY_get0_group(key->ecdsa))) != 0) { + if ((r = sshbuf_get_ec(b, q, g)) != 0) { error_fr(r, "parse"); r = SSH_ERR_INVALID_FORMAT; goto out; } - if (sshkey_ec_validate_public(EC_KEY_get0_group(key->ecdsa), q) != 0) { + if (sshkey_ec_validate_public(g, q) != 0) { error("Authenticator returned invalid ECDSA key"); r = SSH_ERR_KEY_INVALID_EC_VALUE; goto out; } - if (EC_KEY_set_public_key(key->ecdsa, q) != 1) { + if (EC_KEY_set_public_key(ecdsa, q) != 1) { /* XXX assume it is a allocation error */ error_f("allocation failed"); r = SSH_ERR_ALLOC_FAIL; goto out; } + if ((key->pkey = EVP_PKEY_new()) == NULL) { + error_f("allocation failed"); + r = SSH_ERR_ALLOC_FAIL; + goto out; + } + if (EVP_PKEY_set1_EC_KEY(key->pkey, ecdsa) != 1) { + error_f("Assigning EC_KEY failed"); + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } /* success */ *keyp = key; key = NULL; /* transferred */ r = 0; out: - EC_POINT_free(q); sshkey_free(key); sshbuf_free(b); + EC_KEY_free(ecdsa); + EC_POINT_free(q); return r; } #endif /* WITH_OPENSSL */ @@ -234,7 +234,8 @@ DESCRIPTION and passed to the master process. Valid commands are: M-bM-^@M-^\checkM-bM-^@M-^] (check that the master process is running), M-bM-^@M-^\forwardM-bM-^@M-^] (request forwardings without command execution), M-bM-^@M-^\cancelM-bM-^@M-^] (cancel - forwardings), M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^] + forwardings), M-bM-^@M-^\proxyM-bM-^@M-^] (connect to a running multiplexing master + in proxy mode), M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^] (request the master to stop accepting further multiplexing requests). @@ -1016,4 +1017,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.5 June 27, 2024 OpenBSD 7.5 +OpenBSD 7.5 July 18, 2024 OpenBSD 7.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh.1,v 1.442 2024/06/27 21:02:16 jmc Exp $ -.Dd $Mdocdate: June 27 2024 $ +.\" $OpenBSD: ssh.1,v 1.443 2024/07/18 01:47:27 djm Exp $ +.Dd $Mdocdate: July 18 2024 $ .Dt SSH 1 .Os .Sh NAME @@ -490,6 +490,8 @@ Valid commands are: (request forwardings without command execution), .Dq cancel (cancel forwardings), +.Dq proxy +(connect to a running multiplexing master in proxy mode), .Dq exit (request the master to exit), and .Dq stop @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh_api.c,v 1.29 2024/05/17 00:30:24 djm Exp $ */ +/* $OpenBSD: ssh_api.c,v 1.31 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright (c) 2012 Markus Friedl. All rights reserved. * @@ -134,6 +134,7 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) #endif /* WITH_OPENSSL */ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_server; ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; ssh->kex->load_host_public_key=&_ssh_host_public_key; ssh->kex->load_host_private_key=&_ssh_host_private_key; ssh->kex->sign=&_ssh_host_key_sign; @@ -152,6 +153,7 @@ ssh_init(struct ssh **sshp, int is_server, struct kex_params *kex_params) #endif /* WITH_OPENSSL */ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ssh->kex->verify_host_key =&_ssh_verify_host_key; } *sshp = ssh; diff --git a/ssh_config.0 b/ssh_config.0 index ef6c093..abb4ac9 100644 --- a/ssh_config.0 +++ b/ssh_config.0 @@ -703,14 +703,15 @@ DESCRIPTION Include Include the specified configuration file(s). Multiple pathnames - may be specified and each pathname may contain glob(7) wildcards - and, for user configurations, shell-like M-bM-^@M-^X~M-bM-^@M-^Y references to user - home directories. Wildcards will be expanded and processed in - lexical order. Files without absolute paths are assumed to be in - ~/.ssh if included in a user configuration file or /etc/ssh if - included from the system configuration file. Include directive - may appear inside a Match or Host block to perform conditional - inclusion. + may be specified and each pathname may contain glob(7) wildcards, + tokens as described in the TOKENS section, environment variables + as described in the ENVIRONMENT VARIABLES section and, for user + configurations, shell-like M-bM-^@M-^X~M-bM-^@M-^Y references to user home + directories. Wildcards will be expanded and processed in lexical + order. Files without absolute paths are assumed to be in ~/.ssh + if included in a user configuration file or /etc/ssh if included + from the system configuration file. Include directive may appear + inside a Match or Host block to perform conditional inclusion. IPQoS Specifies the IPv4 type-of-service or DSCP class for connections. Accepted values are af11, af12, af13, af21, af22, af23, af31, @@ -740,7 +741,7 @@ DESCRIPTION KexAlgorithms Specifies the permitted KEX (Key Exchange) algorithms that will be used and their preference order. The selected algorithm will - the the first algorithm in this list that the server also + be the first algorithm in this list that the server also supports. Multiple algorithms must be comma-separated. If the specified list begins with a M-bM-^@M-^X+M-bM-^@M-^Y character, then the @@ -754,7 +755,8 @@ DESCRIPTION The default is: - sntrup761x25519-sha512@openssh.com, + sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, + mlkem768x25519-sha256, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, @@ -825,9 +827,9 @@ DESCRIPTION LogVerbose Specify one or more overrides to LogLevel. An override consists - of a pattern lists that matches the source file, function and - line number to force detailed logging for. For example, an - override pattern of: + of one or more pattern lists that matches the source file, + function and line number to force detailed logging for. For + example, an override pattern of: kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* @@ -1373,7 +1375,7 @@ TOKENS %t The type of the server host key, e.g. ssh-ed25519. %u The local username. - CertificateFile, ControlPath, IdentityAgent, IdentityFile, + CertificateFile, ControlPath, IdentityAgent, IdentityFile, Include, KnownHostsCommand, LocalForward, Match exec, RemoteCommand, RemoteForward, RevokedHostKeys, and UserKnownHostsFile accept the tokens %%, %C, %d, %h, %i, %j, %k, %L, %l, %n, %p, %r, and %u. @@ -1401,9 +1403,9 @@ ENVIRONMENT VARIABLES the setting for that keyword will be ignored. The keywords CertificateFile, ControlPath, IdentityAgent, IdentityFile, - KnownHostsCommand, and UserKnownHostsFile support environment variables. - The keywords LocalForward and RemoteForward support environment variables - only for Unix domain socket paths. + Include, KnownHostsCommand, and UserKnownHostsFile support environment + variables. The keywords LocalForward and RemoteForward support + environment variables only for Unix domain socket paths. FILES ~/.ssh/config @@ -1428,4 +1430,4 @@ AUTHORS created OpenSSH. Markus Friedl contributed the support for SSH protocol versions 1.5 and 2.0. -OpenBSD 7.5 June 17, 2024 OpenBSD 7.5 +OpenBSD 7.5 September 9, 2024 OpenBSD 7.5 diff --git a/ssh_config.5 b/ssh_config.5 index 2e19022..7c7c5c5 100644 --- a/ssh_config.5 +++ b/ssh_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: ssh_config.5,v 1.396 2024/06/17 08:30:29 djm Exp $ -.Dd $Mdocdate: June 17 2024 $ +.\" $OpenBSD: ssh_config.5,v 1.402 2024/09/09 14:41:21 naddy Exp $ +.Dd $Mdocdate: September 9 2024 $ .Dt SSH_CONFIG 5 .Os .Sh NAME @@ -1182,7 +1182,12 @@ to unknown options that appear before it. Include the specified configuration file(s). Multiple pathnames may be specified and each pathname may contain .Xr glob 7 -wildcards and, for user configurations, shell-like +wildcards, +tokens as described in the +.Sx TOKENS +section, environment variables as described in the +.Sx ENVIRONMENT VARIABLES +section and, for user configurations, shell-like .Sq ~ references to user home directories. Wildcards will be expanded and processed in lexical order. @@ -1262,7 +1267,7 @@ and .It Cm KexAlgorithms Specifies the permitted KEX (Key Exchange) algorithms that will be used and their preference order. -The selected algorithm will the the first algorithm in this list that +The selected algorithm will be the first algorithm in this list that the server also supports. Multiple algorithms must be comma-separated. .Pp @@ -1281,7 +1286,8 @@ default set. .Pp The default is: .Bd -literal -offset indent -sntrup761x25519-sha512@openssh.com, +sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, +mlkem768x25519-sha256, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, @@ -1382,8 +1388,8 @@ DEBUG and DEBUG1 are equivalent. DEBUG2 and DEBUG3 each specify higher levels of verbose output. .It Cm LogVerbose Specify one or more overrides to LogLevel. -An override consists of a pattern lists that matches the source file, function -and line number to force detailed logging for. +An override consists of one or more pattern lists that matches the +source file, function and line number to force detailed logging for. For example, an override pattern of: .Bd -literal -offset indent kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* @@ -2270,6 +2276,7 @@ The local username. .Cm ControlPath , .Cm IdentityAgent , .Cm IdentityFile , +.Cm Include , .Cm KnownHostsCommand , .Cm LocalForward , .Cm Match exec , @@ -2318,6 +2325,7 @@ The keywords .Cm ControlPath , .Cm IdentityAgent , .Cm IdentityFile , +.Cm Include , .Cm KnownHostsCommand , and .Cm UserKnownHostsFile diff --git a/sshbuf-getput-crypto.c b/sshbuf-getput-crypto.c index af3f397..e7bffe2 100644 --- a/sshbuf-getput-crypto.c +++ b/sshbuf-getput-crypto.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf-getput-crypto.c,v 1.11 2024/02/01 02:37:33 djm Exp $ */ +/* $OpenBSD: sshbuf-getput-crypto.c,v 1.12 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -176,5 +176,15 @@ sshbuf_put_eckey(struct sshbuf *buf, const EC_KEY *v) return sshbuf_put_ec(buf, EC_KEY_get0_public_key(v), EC_KEY_get0_group(v)); } + +int +sshbuf_put_ec_pkey(struct sshbuf *buf, EVP_PKEY *pkey) +{ + const EC_KEY *ec; + + if ((ec = EVP_PKEY_get0_EC_KEY(pkey)) == NULL) + return SSH_ERR_LIBCRYPTO_ERROR; + return sshbuf_put_eckey(buf, ec); +} #endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.c,v 1.19 2022/12/02 04:40:27 djm Exp $ */ +/* $OpenBSD: sshbuf.c,v 1.23 2024/08/14 15:42:18 tobias Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -57,6 +57,7 @@ sshbuf_check_sanity(const struct sshbuf *buf) SSHBUF_TELL("sanity"); if (__predict_false(buf == NULL || (!buf->readonly && buf->d != buf->cd) || + buf->parent == buf || buf->refcount < 1 || buf->refcount > SSHBUF_REFS_MAX || buf->cd == NULL || buf->max_size > SSHBUF_SIZE_MAX || @@ -93,7 +94,7 @@ sshbuf_new(void) { struct sshbuf *ret; - if ((ret = calloc(sizeof(*ret), 1)) == NULL) + if ((ret = calloc(1, sizeof(*ret))) == NULL) return NULL; ret->alloc = SSHBUF_SIZE_INIT; ret->max_size = SSHBUF_SIZE_MAX; @@ -113,7 +114,7 @@ sshbuf_from(const void *blob, size_t len) struct sshbuf *ret; if (blob == NULL || len > SSHBUF_SIZE_MAX || - (ret = calloc(sizeof(*ret), 1)) == NULL) + (ret = calloc(1, sizeof(*ret))) == NULL) return NULL; ret->alloc = ret->size = ret->max_size = len; ret->readonly = 1; @@ -132,7 +133,8 @@ sshbuf_set_parent(struct sshbuf *child, struct sshbuf *parent) if ((r = sshbuf_check_sanity(child)) != 0 || (r = sshbuf_check_sanity(parent)) != 0) return r; - if (child->parent != NULL && child->parent != parent) + if ((child->parent != NULL && child->parent != parent) || + child == parent) return SSH_ERR_INTERNAL_ERROR; child->parent = parent; child->parent->refcount++; @@ -179,16 +181,14 @@ sshbuf_free(struct sshbuf *buf) return; /* - * If we are a child, the free our parent to decrement its reference + * If we are a child, then free our parent to decrement its reference * count and possibly free it. */ sshbuf_free(buf->parent); buf->parent = NULL; - if (!buf->readonly) { - explicit_bzero(buf->d, buf->alloc); - free(buf->d); - } + if (!buf->readonly) + freezero(buf->d, buf->alloc); freezero(buf, sizeof(*buf)); } @@ -1,4 +1,4 @@ -/* $OpenBSD: sshbuf.h,v 1.28 2022/12/02 04:40:27 djm Exp $ */ +/* $OpenBSD: sshbuf.h,v 1.29 2024/08/15 00:51:51 djm Exp $ */ /* * Copyright (c) 2011 Damien Miller * @@ -23,6 +23,7 @@ #include <stdio.h> #ifdef WITH_OPENSSL # include <openssl/bn.h> +# include <openssl/evp.h> # ifdef OPENSSL_HAS_ECC # include <openssl/ec.h> # endif /* OPENSSL_HAS_ECC */ @@ -223,6 +224,7 @@ int sshbuf_get_ec(struct sshbuf *buf, EC_POINT *v, const EC_GROUP *g); int sshbuf_get_eckey(struct sshbuf *buf, EC_KEY *v); int sshbuf_put_ec(struct sshbuf *buf, const EC_POINT *v, const EC_GROUP *g); int sshbuf_put_eckey(struct sshbuf *buf, const EC_KEY *v); +int sshbuf_put_ec_pkey(struct sshbuf *buf, EVP_PKEY *pkey); # endif /* OPENSSL_HAS_ECC */ #endif /* WITH_OPENSSL */ diff --git a/sshconnect2.c b/sshconnect2.c index e63bb5e..11fcdea 100644 --- a/sshconnect2.c +++ b/sshconnect2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.373 2024/05/17 06:38:00 jsg Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.375 2024/09/09 02:39:57 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -274,6 +274,7 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port, #endif ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client; ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client; + ssh->kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_client; ssh->kex->verify_host_key=&verify_host_key_callback; ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &ssh->kex->done); diff --git a/sshd-session.c b/sshd-session.c index fe6ae7f..4b79b9b 100644 --- a/sshd-session.c +++ b/sshd-session.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd-session.c,v 1.4 2024/06/26 23:16:52 deraadt Exp $ */ +/* $OpenBSD: sshd-session.c,v 1.9 2024/09/09 02:39:57 djm Exp $ */ /* * SSH2 implementation: * Privilege Separation: @@ -214,7 +214,9 @@ grace_alarm_handler(int sig) memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_IGN; sigfillset(&sa.sa_mask); +#if defined(SA_RESTART) sa.sa_flags = SA_RESTART; +#endif (void)sigaction(SIGTERM, &sa, NULL); kill(0, SIGTERM); } @@ -817,7 +819,6 @@ check_ip_options(struct ssh *ssh) fatal("Connection from %.100s port %d with IP opts: %.800s", ssh_remote_ipaddr(ssh), ssh_remote_port(ssh), text); } - return; #endif /* IP_OPTIONS */ } @@ -881,6 +882,7 @@ main(int ac, char **av) struct connection_info *connection_info = NULL; sigset_t sigmask; uint64_t timing_secret = 0; + struct itimerval itv; sigemptyset(&sigmask); sigprocmask(SIG_SETMASK, &sigmask, NULL); @@ -1275,8 +1277,17 @@ main(int ac, char **av) * are about to discover the bug. */ ssh_signal(SIGALRM, grace_alarm_handler); - if (!debug_flag) - alarm(options.login_grace_time); + if (!debug_flag && options.login_grace_time > 0) { + int ujitter = arc4random_uniform(4 * 1000000); + + timerclear(&itv.it_interval); + itv.it_value.tv_sec = options.login_grace_time; + itv.it_value.tv_sec += ujitter / 1000000; + itv.it_value.tv_usec = ujitter % 1000000; + + if (setitimer(ITIMER_REAL, &itv, NULL) == -1) + fatal("login grace time setitimer failed"); + } if ((r = kex_exchange_identification(ssh, -1, options.version_addendum)) != 0) @@ -1320,7 +1331,10 @@ main(int ac, char **av) * Cancel the alarm we set to limit the time taken for * authentication. */ - alarm(0); + timerclear(&itv.it_interval); + timerclear(&itv.it_value); + if (setitimer(ITIMER_REAL, &itv, NULL) == -1) + fatal("login grace time clear failed"); ssh_signal(SIGALRM, SIG_DFL); authctxt->authenticated = 1; if (startup_pipe != -1) { @@ -1451,6 +1465,7 @@ do_ssh2_kex(struct ssh *ssh) #endif kex->kex[KEX_C25519_SHA256] = kex_gen_server; kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server; + kex->kex[KEX_KEM_MLKEM768X25519_SHA256] = kex_gen_server; kex->load_host_public_key=&get_hostkey_public_by_type; kex->load_host_private_key=&get_hostkey_private_by_type; kex->host_key_index=&get_hostkey_index; @@ -1488,13 +1503,13 @@ cleanup_exit(int i) } } } - /* Override default fatal exit value when auth was attempted */ - if (i == 255 && auth_attempted) - _exit(EXIT_AUTH_ATTEMPTED); #ifdef SSH_AUDIT_EVENTS /* done after do_cleanup so it can cancel the PAM auth 'thread' */ if (the_active_state != NULL && mm_is_monitor()) audit_event(the_active_state, SSH_CONNECTION_ABANDON); #endif + /* Override default fatal exit value when auth was attempted */ + if (i == 255 && auth_attempted) + _exit(EXIT_AUTH_ATTEMPTED); _exit(i); } @@ -40,7 +40,9 @@ DESCRIPTION The keywords are M-bM-^@M-^\addrM-bM-^@M-^], M-bM-^@M-^\userM-bM-^@M-^], M-bM-^@M-^\hostM-bM-^@M-^], M-bM-^@M-^\laddrM-bM-^@M-^], M-bM-^@M-^\lportM-bM-^@M-^], and M-bM-^@M-^\rdomainM-bM-^@M-^] and correspond to source address, user, resolved source host name, local address, local port number and routing domain - respectively. + respectively. Additionally the M-bM-^@M-^\invalid-userM-bM-^@M-^] flag (which does + not take a value argument) may be specified to simulate a + connection from an unrecognised username. -c host_certificate_file Specifies a path to a certificate file to identify sshd during @@ -682,4 +684,4 @@ AUTHORS versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support for privilege separation. -OpenBSD 7.5 June 17, 2024 OpenBSD 7.5 +OpenBSD 7.5 September 15, 2024 OpenBSD 7.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd.8,v 1.326 2024/06/17 08:30:29 djm Exp $ -.Dd $Mdocdate: June 17 2024 $ +.\" $OpenBSD: sshd.8,v 1.327 2024/09/15 01:19:56 djm Exp $ +.Dd $Mdocdate: September 15 2024 $ .Dt SSHD 8 .Os .Sh NAME @@ -115,6 +115,10 @@ and .Dq rdomain and correspond to source address, user, resolved source host name, local address, local port number and routing domain respectively. +Additionally the +.Dq invalid-user +flag (which does not take a value argument) may be specified to simulate +a connection from an unrecognised username. .It Fl c Ar host_certificate_file Specifies a path to a certificate file to identify .Nm @@ -1,4 +1,4 @@ -/* $OpenBSD: sshd.c,v 1.609 2024/06/27 23:01:15 djm Exp $ */ +/* $OpenBSD: sshd.c,v 1.612 2024/09/15 01:11:26 djm Exp $ */ /* * Copyright (c) 2000, 2001, 2002 Markus Friedl. All rights reserved. * Copyright (c) 2002 Niels Provos. All rights reserved. @@ -262,7 +262,7 @@ child_register(int pipefd, int sockfd) } else { laddr = get_local_ipaddr(sockfd); raddr = get_peer_ipaddr(sockfd); - xasprintf(&child->id, "connection from %s to %s", laddr, raddr); + xasprintf(&child->id, "connection from %s to %s", raddr, laddr); } free(laddr); free(raddr); @@ -381,6 +381,13 @@ child_reap(struct early_child *child) (long)child->pid, child->id, child->early ? " (early)" : ""); break; + case EXIT_CONFIG_REFUSED: + penalty_type = SRCLIMIT_PENALTY_REFUSECONNECTION; + debug_f("preauth child %ld for %s prohibited by" + "RefuseConnection %s", + (long)child->pid, child->id, + child->early ? " (early)" : ""); + break; default: penalty_type = SRCLIMIT_PENALTY_NOAUTH; debug_f("preauth child %ld for %s exited " @@ -1341,7 +1348,7 @@ main(int ac, char **av) break; } } - if (!test_flag && !do_dump_cfg && !path_absolute(av[0])) + if (!test_flag && !inetd_flag && !do_dump_cfg && !path_absolute(av[0])) fatal("sshd requires execution with an absolute path"); closefrom(STDERR_FILENO + 1); diff --git a/sshd_config.0 b/sshd_config.0 index 6883dda..f4a8f99 100644 --- a/sshd_config.0 +++ b/sshd_config.0 @@ -644,11 +644,14 @@ DESCRIPTION ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521 + mlkem768x25519-sha256 + sntrup761x25519-sha512 sntrup761x25519-sha512@openssh.com The default is: - sntrup761x25519-sha512@openssh.com, + sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, + mlkem768x25519-sha256, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, @@ -690,9 +693,9 @@ DESCRIPTION LogVerbose Specify one or more overrides to LogLevel. An override consists - of a pattern lists that matches the source file, function and - line number to force detailed logging for. For example, an - override pattern of: + of one or more pattern lists that matches the source file, + function and line number to force detailed logging for. For + example, an override pattern of: kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* @@ -753,10 +756,12 @@ DESCRIPTION the first instance of the keyword is applied. The arguments to Match are one or more criteria-pattern pairs or - the single token All which matches all criteria. The available - criteria are User, Group, Host, LocalAddress, LocalPort, RDomain, - and Address (with RDomain representing the rdomain(4) on which - the connection was received). + one of the single token criteria: All, which matches all + criteria, or Invalid-User, which matches when the requested user- + name does not match any known account. The available criteria + are User, Group, Host, LocalAddress, LocalPort, RDomain, and + Address (with RDomain representing the rdomain(4) on which the + connection was received). The match patterns may consist of single entries or comma- separated lists and may use the wildcard and negation operators @@ -787,10 +792,11 @@ DESCRIPTION PAMServiceName, PasswordAuthentication, PermitEmptyPasswords, PermitListen, PermitOpen, PermitRootLogin, PermitTTY, PermitTunnel, PermitUserRC, PubkeyAcceptedAlgorithms, - PubkeyAuthentication, PubkeyAuthOptions, RekeyLimit, RevokedKeys, - RDomain, SetEnv, StreamLocalBindMask, StreamLocalBindUnlink, - TrustedUserCAKeys, UnusedConnectionTimeout, X11DisplayOffset, - X11Forwarding and X11UseLocalhost. + PubkeyAuthentication, PubkeyAuthOptions, RefuseConnection, + RekeyLimit, RevokedKeys, RDomain, SetEnv, StreamLocalBindMask, + StreamLocalBindUnlink, TrustedUserCAKeys, + UnusedConnectionTimeout, X11DisplayOffset, X11Forwarding and + X11UseLocalhost. MaxAuthTries Specifies the maximum number of authentication attempts permitted @@ -833,7 +839,7 @@ DESCRIPTION PasswordAuthentication Specifies whether password authentication is allowed. The - default is sshd. + default is yes. PermitEmptyPasswords When password authentication is allowed, it specifies whether the @@ -950,8 +956,8 @@ DESCRIPTION accumulated. Penalties are enabled by default with the default settings listed - below but may disabled using the off keyword. The defaults may - be overridden by specifying one or more of the keywords below, + below but may disabled using the no keyword. The defaults may be + overridden by specifying one or more of the keywords below, separated by whitespace. All keywords accept arguments, e.g. "crash:2m". @@ -964,6 +970,11 @@ DESCRIPTION after making one or more unsuccessful authentication attempts (default: 5s). + refuseconnection:duration + Specifies how long to refuse clients that were + administratively prohibited connection via the + RefuseConnection option (default: 10s). + noauth:duration Specifies how long to refuse clients that disconnect without attempting authentication (default: 1s). This @@ -973,7 +984,7 @@ DESCRIPTION grace-exceeded:duration Specifies how long to refuse clients that fail to - authenticate after LoginGraceTime (default: 20s). + authenticate after LoginGraceTime (default: 10s). max:duration Specifies the maximum time a particular source address @@ -1089,6 +1100,13 @@ DESCRIPTION Specifies whether public key authentication is allowed. The default is yes. + RefuseConnection + Indicates that sshd(8) should unconditionally terminate the + connection. Additionally, a refuseconnection penalty may be + recorded against the source of the connection if + PerSourcePenalties are enabled. This option is only really + useful in a Match block. + RekeyLimit Specifies the maximum amount of data that may be transmitted or received before the session key is renegotiated, optionally @@ -1390,4 +1408,4 @@ AUTHORS versions 1.5 and 2.0. Niels Provos and Markus Friedl contributed support for privilege separation. -OpenBSD 7.5 June 24, 2024 OpenBSD 7.5 +OpenBSD 7.5 September 15, 2024 OpenBSD 7.5 diff --git a/sshd_config.5 b/sshd_config.5 index 1ab0f41..dbed44f 100644 --- a/sshd_config.5 +++ b/sshd_config.5 @@ -33,8 +33,8 @@ .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" -.\" $OpenBSD: sshd_config.5,v 1.365 2024/06/24 06:59:39 jmc Exp $ -.Dd $Mdocdate: June 24 2024 $ +.\" $OpenBSD: sshd_config.5,v 1.374 2024/09/15 08:27:38 jmc Exp $ +.Dd $Mdocdate: September 15 2024 $ .Dt SSHD_CONFIG 5 .Os .Sh NAME @@ -1050,12 +1050,17 @@ ecdh-sha2-nistp384 .It ecdh-sha2-nistp521 .It +mlkem768x25519-sha256 +.It +sntrup761x25519-sha512 +.It sntrup761x25519-sha512@openssh.com .El .Pp The default is: .Bd -literal -offset indent -sntrup761x25519-sha512@openssh.com, +sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, +mlkem768x25519-sha256, curve25519-sha256,curve25519-sha256@libssh.org, ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, diffie-hellman-group-exchange-sha256, @@ -1133,8 +1138,8 @@ Logging with a DEBUG level violates the privacy of users and is not recommended. .It Cm LogVerbose Specify one or more overrides to .Cm LogLevel . -An override consists of a pattern lists that matches the source file, function -and line number to force detailed logging for. +An override consists of one or more pattern lists that matches the +source file, function and line number to force detailed logging for. For example, an override pattern of: .Bd -literal -offset indent kex.c:*:1000,*:kex_exchange_identification():*,packet.c:* @@ -1232,9 +1237,11 @@ applied. .Pp The arguments to .Cm Match -are one or more criteria-pattern pairs or the single token -.Cm All -which matches all criteria. +are one or more criteria-pattern pairs or one of the single token criteria: +.Cm All , +which matches all criteria, or +.Cm Invalid-User , +which matches when the requested user-name does not match any known account. The available criteria are .Cm User , .Cm Group , @@ -1319,6 +1326,7 @@ Available keywords are .Cm PubkeyAcceptedAlgorithms , .Cm PubkeyAuthentication , .Cm PubkeyAuthOptions , +.Cm RefuseConnection , .Cm RekeyLimit , .Cm RevokedKeys , .Cm RDomain , @@ -1384,7 +1392,7 @@ The default is .It Cm PasswordAuthentication Specifies whether password authentication is allowed. The default is -.Cm sshd . +.Cm yes . .It Cm PermitEmptyPasswords When password authentication is allowed, it specifies whether the server allows login to accounts with empty password strings. @@ -1586,7 +1594,7 @@ accumulated. .Pp Penalties are enabled by default with the default settings listed below but may disabled using the -.Cm off +.Cm no keyword. The defaults may be overridden by specifying one or more of the keywords below, separated by whitespace. @@ -1599,6 +1607,11 @@ Specifies how long to refuse clients that cause a crash of .It Cm authfail:duration Specifies how long to refuse clients that disconnect after making one or more unsuccessful authentication attempts (default: 5s). +.It Cm refuseconnection:duration +Specifies how long to refuse clients that were administratively prohibited +connection via the +.Cm RefuseConnection +option (default: 10s). .It Cm noauth:duration Specifies how long to refuse clients that disconnect without attempting authentication (default: 1s). @@ -1608,7 +1621,7 @@ scanning tools such as .It Cm grace-exceeded:duration Specifies how long to refuse clients that fail to authenticate after .Cm LoginGraceTime -(default: 20s). +(default: 10s). .It Cm max:duration Specifies the maximum time a particular source address range will be refused access for (default: 10m). @@ -1756,6 +1769,18 @@ options have any effect for other, non-FIDO, public key types. Specifies whether public key authentication is allowed. The default is .Cm yes . +.It Cm RefuseConnection +Indicates that +.Xr sshd 8 +should unconditionally terminate the connection. +Additionally, a +.Cm refuseconnection +penalty may be recorded against the source of the connection if +.Cm PerSourcePenalties +are enabled. +This option is only really useful in a +.Cm Match +block. .It Cm RekeyLimit Specifies the maximum amount of data that may be transmitted or received before the session key is renegotiated, optionally followed by a maximum @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.c,v 1.142 2024/01/11 01:45:36 djm Exp $ */ +/* $OpenBSD: sshkey.c,v 1.146 2024/09/04 05:33:34 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. * Copyright (c) 2008 Alexander von Gernler. All rights reserved. @@ -28,6 +28,7 @@ #include "includes.h" #include <sys/types.h> +#include <sys/mman.h> #include <netinet/in.h> #ifdef WITH_OPENSSL @@ -248,22 +249,36 @@ sshkey_ssh_name_plain(const struct sshkey *k) k->ecdsa_nid); } -int -sshkey_type_from_name(const char *name) +static int +type_from_name(const char *name, int allow_short) { int i; const struct sshkey_impl *impl; for (i = 0; keyimpls[i] != NULL; i++) { impl = keyimpls[i]; + if (impl->name != NULL && strcmp(name, impl->name) == 0) + return impl->type; /* Only allow shortname matches for plain key types */ - if ((impl->name != NULL && strcmp(name, impl->name) == 0) || - (!impl->cert && strcasecmp(impl->shortname, name) == 0)) + if (allow_short && !impl->cert && impl->shortname != NULL && + strcasecmp(impl->shortname, name) == 0) return impl->type; } return KEY_UNSPEC; } +int +sshkey_type_from_name(const char *name) +{ + return type_from_name(name, 0); +} + +int +sshkey_type_from_shortname(const char *name) +{ + return type_from_name(name, 1); +} + static int key_type_is_ecdsa_variant(int type) { @@ -481,6 +496,98 @@ sshkey_type_certified(int type) } #ifdef WITH_OPENSSL +static const EVP_MD * +ssh_digest_to_md(int hash_alg) +{ + switch (hash_alg) { + case SSH_DIGEST_SHA1: + return EVP_sha1(); + case SSH_DIGEST_SHA256: + return EVP_sha256(); + case SSH_DIGEST_SHA384: + return EVP_sha384(); + case SSH_DIGEST_SHA512: + return EVP_sha512(); + } + return NULL; +} + +int +sshkey_pkey_digest_sign(EVP_PKEY *pkey, int hash_alg, u_char **sigp, + size_t *lenp, const u_char *data, size_t datalen) +{ + EVP_MD_CTX *ctx = NULL; + u_char *sig = NULL; + int ret; + size_t slen; + const EVP_MD *evpmd; + + *sigp = NULL; + *lenp = 0; + + slen = EVP_PKEY_size(pkey); + if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM || + (evpmd = ssh_digest_to_md(hash_alg)) == NULL) + return SSH_ERR_INVALID_ARGUMENT; + + if ((sig = malloc(slen)) == NULL) + return SSH_ERR_ALLOC_FAIL; + + if ((ctx = EVP_MD_CTX_new()) == NULL) { + ret = SSH_ERR_ALLOC_FAIL; + goto out; + } + if (EVP_DigestSignInit(ctx, NULL, evpmd, NULL, pkey) != 1 || + EVP_DigestSign(ctx, sig, &slen, data, datalen) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + + *sigp = sig; + *lenp = slen; + /* Now owned by the caller */ + sig = NULL; + ret = 0; + + out: + EVP_MD_CTX_free(ctx); + free(sig); + return ret; +} + +int +sshkey_pkey_digest_verify(EVP_PKEY *pkey, int hash_alg, const u_char *data, + size_t datalen, u_char *sigbuf, size_t siglen) +{ + EVP_MD_CTX *ctx = NULL; + int ret = SSH_ERR_INTERNAL_ERROR; + const EVP_MD *evpmd; + + if ((evpmd = ssh_digest_to_md(hash_alg)) == NULL) + return SSH_ERR_INVALID_ARGUMENT; + if ((ctx = EVP_MD_CTX_new()) == NULL) + return SSH_ERR_ALLOC_FAIL; + if (EVP_DigestVerifyInit(ctx, NULL, evpmd, NULL, pkey) != 1) { + ret = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } + switch (EVP_DigestVerify(ctx, sigbuf, siglen, data, datalen)) { + case 1: + ret = 0; + break; + case 0: + ret = SSH_ERR_SIGNATURE_INVALID; + break; + default: + ret = SSH_ERR_LIBCRYPTO_ERROR; + break; + } + + out: + EVP_MD_CTX_free(ctx); + return ret; +} + /* XXX: these are really begging for a table-driven approach */ int sshkey_curve_name_to_nid(const char *name) @@ -647,6 +754,38 @@ sshkey_sk_cleanup(struct sshkey *k) k->sk_key_handle = k->sk_reserved = NULL; } +#if defined(MAP_CONCEAL) +# define PREKEY_MMAP_FLAG MAP_CONCEAL +#elif defined(MAP_NOCORE) +# define PREKEY_MMAP_FLAG MAP_NOCORE +#else +# define PREKEY_MMAP_FLAG 0 +#endif + +static int +sshkey_prekey_alloc(u_char **prekeyp, size_t len) +{ + u_char *prekey; + + *prekeyp = NULL; + if ((prekey = mmap(NULL, len, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_PRIVATE|PREKEY_MMAP_FLAG, -1, 0)) == MAP_FAILED) + return SSH_ERR_SYSTEM_ERROR; +#if defined(MADV_DONTDUMP) && !defined(MAP_CONCEAL) && !defined(MAP_NOCORE) + (void)madvise(prekey, len, MADV_DONTDUMP); +#endif + *prekeyp = prekey; + return 0; +} + +static void +sshkey_prekey_free(void *prekey, size_t len) +{ + if (prekey == NULL) + return; + munmap(prekey, len); +} + static void sshkey_free_contents(struct sshkey *k) { @@ -660,7 +799,7 @@ sshkey_free_contents(struct sshkey *k) if (sshkey_is_cert(k)) cert_free(k->cert); freezero(k->shielded_private, k->shielded_len); - freezero(k->shield_prekey, k->shield_prekey_len); + sshkey_prekey_free(k->shield_prekey, k->shield_prekey_len); } void @@ -1331,14 +1470,12 @@ int sshkey_check_rsa_length(const struct sshkey *k, int min_size) { #ifdef WITH_OPENSSL - const BIGNUM *rsa_n; int nbits; - if (k == NULL || k->rsa == NULL || + if (k == NULL || k->pkey == NULL || (k->type != KEY_RSA && k->type != KEY_RSA_CERT)) return 0; - RSA_get0_key(k->rsa, &rsa_n, NULL, NULL); - nbits = BN_num_bits(rsa_n); + nbits = EVP_PKEY_bits(k->pkey); if (nbits < SSH_RSA_MINIMUM_MODULUS_SIZE || (min_size > 0 && nbits < min_size)) return SSH_ERR_KEY_LENGTH; @@ -1346,53 +1483,26 @@ sshkey_check_rsa_length(const struct sshkey *k, int min_size) return 0; } -#ifdef WITH_OPENSSL -# ifdef OPENSSL_HAS_ECC +#if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) int -sshkey_ecdsa_key_to_nid(EC_KEY *k) +sshkey_ecdsa_key_to_nid(const EC_KEY *k) { - EC_GROUP *eg; - int nids[] = { - NID_X9_62_prime256v1, - NID_secp384r1, -# ifdef OPENSSL_HAS_NISTP521 - NID_secp521r1, -# endif /* OPENSSL_HAS_NISTP521 */ - -1 - }; + const EC_GROUP *g; int nid; - u_int i; - const EC_GROUP *g = EC_KEY_get0_group(k); - /* - * The group may be stored in a ASN.1 encoded private key in one of two - * ways: as a "named group", which is reconstituted by ASN.1 object ID - * or explicit group parameters encoded into the key blob. Only the - * "named group" case sets the group NID for us, but we can figure - * it out for the other case by comparing against all the groups that - * are supported. - */ - if ((nid = EC_GROUP_get_curve_name(g)) > 0) - return nid; - for (i = 0; nids[i] != -1; i++) { - if ((eg = EC_GROUP_new_by_curve_name(nids[i])) == NULL) - return -1; - if (EC_GROUP_cmp(g, eg, NULL) == 0) - break; - EC_GROUP_free(eg); - } - if (nids[i] != -1) { - /* Use the group with the NID attached */ - EC_GROUP_set_asn1_flag(eg, OPENSSL_EC_NAMED_CURVE); - if (EC_KEY_set_group(k, eg) != 1) { - EC_GROUP_free(eg); - return -1; - } - } - return nids[i]; + if (k == NULL || (g = EC_KEY_get0_group(k)) == NULL) + return -1; + if ((nid = EC_GROUP_get_curve_name(g)) <= 0) + return -1; + return nid; } -# endif /* OPENSSL_HAS_ECC */ -#endif /* WITH_OPENSSL */ + +int +sshkey_ecdsa_pkey_to_nid(EVP_PKEY *pkey) +{ + return sshkey_ecdsa_key_to_nid(EVP_PKEY_get0_EC_KEY(pkey)); +} +#endif /* defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC) */ int sshkey_generate(int type, u_int bits, struct sshkey **keyp) @@ -1557,10 +1667,8 @@ sshkey_shield_private(struct sshkey *k) } /* Prepare a random pre-key, and from it an ephemeral key */ - if ((prekey = malloc(SSHKEY_SHIELD_PREKEY_LEN)) == NULL) { - r = SSH_ERR_ALLOC_FAIL; + if ((r = sshkey_prekey_alloc(&prekey, SSHKEY_SHIELD_PREKEY_LEN)) != 0) goto out; - } arc4random_buf(prekey, SSHKEY_SHIELD_PREKEY_LEN); if ((r = ssh_digest_memory(SSHKEY_SHIELD_PREKEY_HASH, prekey, SSHKEY_SHIELD_PREKEY_LEN, @@ -1638,7 +1746,7 @@ sshkey_shield_private(struct sshkey *k) explicit_bzero(keyiv, sizeof(keyiv)); explicit_bzero(&tmp, sizeof(tmp)); freezero(enc, enclen); - freezero(prekey, SSHKEY_SHIELD_PREKEY_LEN); + sshkey_prekey_free(prekey, SSHKEY_SHIELD_PREKEY_LEN); sshkey_free(kswap); sshbuf_free(prvbuf); return r; @@ -3226,10 +3334,6 @@ sshkey_private_to_blob_pem_pkcs8(struct sshkey *key, struct sshbuf *buf, r = SSH_ERR_ALLOC_FAIL; goto out; } - if (format == SSHKEY_PRIVATE_PKCS8 && (pkey = EVP_PKEY_new()) == NULL) { - r = SSH_ERR_ALLOC_FAIL; - goto out; - } if ((r = sshkey_unshield_private(key)) != 0) goto out; @@ -3240,6 +3344,10 @@ sshkey_private_to_blob_pem_pkcs8(struct sshkey *key, struct sshbuf *buf, success = PEM_write_bio_DSAPrivateKey(bio, key->dsa, cipher, passphrase, len, NULL, NULL); } else { + if ((pkey = EVP_PKEY_new()) == NULL) { + r = SSH_ERR_ALLOC_FAIL; + goto out; + } success = EVP_PKEY_set1_DSA(pkey, key->dsa); } break; @@ -3247,19 +3355,25 @@ sshkey_private_to_blob_pem_pkcs8(struct sshkey *key, struct sshbuf *buf, #ifdef OPENSSL_HAS_ECC case KEY_ECDSA: if (format == SSHKEY_PRIVATE_PEM) { - success = PEM_write_bio_ECPrivateKey(bio, key->ecdsa, + success = PEM_write_bio_ECPrivateKey(bio, + EVP_PKEY_get0_EC_KEY(key->pkey), cipher, passphrase, len, NULL, NULL); } else { - success = EVP_PKEY_set1_EC_KEY(pkey, key->ecdsa); + pkey = key->pkey; + EVP_PKEY_up_ref(key->pkey); + success = 1; } break; #endif case KEY_RSA: if (format == SSHKEY_PRIVATE_PEM) { - success = PEM_write_bio_RSAPrivateKey(bio, key->rsa, + success = PEM_write_bio_RSAPrivateKey(bio, + EVP_PKEY_get0_RSA(key->pkey), cipher, passphrase, len, NULL, NULL); } else { - success = EVP_PKEY_set1_RSA(pkey, key->rsa); + pkey = key->pkey; + EVP_PKEY_up_ref(key->pkey); + success = 1; } break; default: @@ -3428,6 +3542,8 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, struct sshkey *prv = NULL; BIO *bio = NULL; int r; + RSA *rsa = NULL; + EC_KEY *ecdsa = NULL; if (keyp != NULL) *keyp = NULL; @@ -3461,15 +3577,21 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, r = SSH_ERR_ALLOC_FAIL; goto out; } - prv->rsa = EVP_PKEY_get1_RSA(pk); + if ((rsa = EVP_PKEY_get1_RSA(pk)) == NULL) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } prv->type = KEY_RSA; #ifdef DEBUG_PK - RSA_print_fp(stderr, prv->rsa, 8); + RSA_print_fp(stderr, rsa, 8); #endif - if (RSA_blinding_on(prv->rsa, NULL) != 1) { + if (RSA_blinding_on(rsa, NULL) != 1 || + EVP_PKEY_set1_RSA(pk, rsa) != 1) { r = SSH_ERR_LIBCRYPTO_ERROR; goto out; } + EVP_PKEY_up_ref(pk); + prv->pkey = pk; if ((r = sshkey_check_rsa_length(prv, 0)) != 0) goto out; #ifdef WITH_DSA @@ -3492,21 +3614,25 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, r = SSH_ERR_ALLOC_FAIL; goto out; } - prv->ecdsa = EVP_PKEY_get1_EC_KEY(pk); + if ((prv->ecdsa_nid = sshkey_ecdsa_fixup_group(pk)) == -1 || + (ecdsa = EVP_PKEY_get1_EC_KEY(pk)) == NULL) { + r = SSH_ERR_LIBCRYPTO_ERROR; + goto out; + } prv->type = KEY_ECDSA; - prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv->ecdsa); - if (prv->ecdsa_nid == -1 || - sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL || - sshkey_ec_validate_public(EC_KEY_get0_group(prv->ecdsa), - EC_KEY_get0_public_key(prv->ecdsa)) != 0 || - sshkey_ec_validate_private(prv->ecdsa) != 0) { + if (sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL || + sshkey_ec_validate_public(EC_KEY_get0_group(ecdsa), + EC_KEY_get0_public_key(ecdsa)) != 0 || + sshkey_ec_validate_private(ecdsa) != 0) { r = SSH_ERR_INVALID_FORMAT; goto out; } -# ifdef DEBUG_PK - if (prv != NULL && prv->ecdsa != NULL) - sshkey_dump_ec_key(prv->ecdsa); -# endif + EVP_PKEY_up_ref(pk); + prv->pkey = pk; +#ifdef DEBUG_PK + if (prv != NULL && prv->pkey != NULL) + sshkey_dump_ec_key(EVP_PKEY_get0_EC_KEY(prv->pkey)); +#endif #endif /* OPENSSL_HAS_ECC */ #ifdef OPENSSL_HAS_ED25519 } else if (EVP_PKEY_base_id(pk) == EVP_PKEY_ED25519 && @@ -3541,9 +3667,9 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, /* Append the public key to our private key */ memcpy(prv->ed25519_sk + (ED25519_SK_SZ - ED25519_PK_SZ), prv->ed25519_pk, ED25519_PK_SZ); -# ifdef DEBUG_PK +#ifdef DEBUG_PK sshbuf_dump_data(prv->ed25519_sk, ED25519_SK_SZ, stderr); -# endif +#endif #endif /* OPENSSL_HAS_ED25519 */ } else { r = SSH_ERR_INVALID_FORMAT; @@ -3557,6 +3683,10 @@ sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type, out: BIO_free(bio); EVP_PKEY_free(pk); + RSA_free(rsa); +#ifdef OPENSSL_HAS_ECC + EC_KEY_free(ecdsa); +#endif sshkey_free(prv); return r; } @@ -1,4 +1,4 @@ -/* $OpenBSD: sshkey.h,v 1.63 2024/05/17 06:42:04 jsg Exp $ */ +/* $OpenBSD: sshkey.h,v 1.65 2024/09/04 05:33:34 djm Exp $ */ /* * Copyright (c) 2000, 2001 Markus Friedl. All rights reserved. @@ -31,6 +31,7 @@ #ifdef WITH_OPENSSL #include <openssl/rsa.h> #include <openssl/dsa.h> +#include <openssl/evp.h> # ifdef OPENSSL_HAS_ECC # include <openssl/ec.h> # include <openssl/ecdsa.h> @@ -47,6 +48,7 @@ # define EC_KEY void # define EC_GROUP void # define EC_POINT void +# define EVP_PKEY void #define SSH_OPENSSL_VERSION "without OpenSSL" #endif /* WITH_OPENSSL */ @@ -125,13 +127,12 @@ struct sshkey_cert { struct sshkey { int type; int flags; - /* KEY_RSA */ - RSA *rsa; /* KEY_DSA */ DSA *dsa; /* KEY_ECDSA and KEY_ECDSA_SK */ int ecdsa_nid; /* NID of curve */ - EC_KEY *ecdsa; + /* libcrypto-backed keys */ + EVP_PKEY *pkey; /* KEY_ED25519 and KEY_ED25519_SK */ u_char *ed25519_sk; u_char *ed25519_pk; @@ -223,6 +224,7 @@ int sshkey_shield_private(struct sshkey *); int sshkey_unshield_private(struct sshkey *); int sshkey_type_from_name(const char *); +int sshkey_type_from_shortname(const char *); int sshkey_is_cert(const struct sshkey *); int sshkey_is_sk(const struct sshkey *); int sshkey_type_is_cert(int); @@ -258,7 +260,8 @@ int sshkey_curve_name_to_nid(const char *); const char * sshkey_curve_nid_to_name(int); u_int sshkey_curve_nid_to_bits(int); int sshkey_ecdsa_bits_to_nid(int); -int sshkey_ecdsa_key_to_nid(EC_KEY *); +int sshkey_ecdsa_key_to_nid(const EC_KEY *); +int sshkey_ecdsa_pkey_to_nid(EVP_PKEY *); int sshkey_ec_nid_to_hash_alg(int nid); int sshkey_ec_validate_public(const EC_GROUP *, const EC_POINT *); int sshkey_ec_validate_private(const EC_KEY *); @@ -287,6 +290,12 @@ int sshkey_check_sigtype(const u_char *, size_t, const char *); const char *sshkey_sigalg_by_name(const char *); int sshkey_get_sigtype(const u_char *, size_t, char **); +/* Signing and verification backend for libcrypto-backed keys */ +int sshkey_pkey_digest_sign(EVP_PKEY*, int, u_char **, + size_t *, const u_char *, size_t); +int sshkey_pkey_digest_verify(EVP_PKEY *, int, const u_char *, + size_t, u_char *, size_t); + /* for debug */ void sshkey_dump_ec_point(const EC_GROUP *, const EC_POINT *); void sshkey_dump_ec_key(const EC_KEY *); @@ -310,7 +319,8 @@ int sshkey_parse_pubkey_from_private_fileblob_type(struct sshbuf *blob, int sshkey_check_rsa_length(const struct sshkey *, int); /* XXX should be internal, but used by ssh-keygen */ -int ssh_rsa_complete_crt_parameters(struct sshkey *, const BIGNUM *); +int ssh_rsa_complete_crt_parameters(const BIGNUM *, const BIGNUM *, + const BIGNUM *, const BIGNUM *, BIGNUM **, BIGNUM **); /* stateful keys (e.g. XMSS) */ int sshkey_set_filename(struct sshkey *, const char *); @@ -321,6 +331,10 @@ int sshkey_private_serialize_maxsign(struct sshkey *key, void sshkey_sig_details_free(struct sshkey_sig_details *); +#ifdef WITH_OPENSSL +int sshkey_ecdsa_fixup_group(EVP_PKEY *k); /* ssh-ecdsa.c */ +#endif + #ifdef SSHKEY_INTERNAL int sshkey_sk_fields_equal(const struct sshkey *a, const struct sshkey *b); void sshkey_sk_cleanup(struct sshkey *k); @@ -341,6 +355,7 @@ int check_rsa_length(const RSA *rsa); /* XXX remove */ # undef EC_KEY # undef EC_GROUP # undef EC_POINT +# undef EVP_PKEY #elif !defined(OPENSSL_HAS_ECC) # undef EC_KEY # undef EC_GROUP @@ -1,6 +1,6 @@ -/* $OpenBSD: version.h,v 1.102 2024/07/01 04:31:59 djm Exp $ */ +/* $OpenBSD: version.h,v 1.103 2024/09/19 22:17:44 djm Exp $ */ -#define SSH_VERSION "OpenSSH_9.8" +#define SSH_VERSION "OpenSSH_9.9" #define SSH_PORTABLE "p1" #define SSH_RELEASE SSH_VERSION SSH_PORTABLE |