bug#79446: 9.7: cp(1): Unnecessary writes / incorrect logging messages

Kye Hunter <[email protected]>
Newsgroups gmane.comp.gnu.core-utils.bugs
Message-ID <[email protected]>
Hi all,

While trying to use cp for a fairly simple script I'm writing, I noticed 
two sort of odd things going on. The first might not really be a bug, 
but I find it rather inconvenient. The second seems to involve a bug, 
but it doesn't really affect my use-case.

The command I can see the reproduced with is the following:
strace cp --verbose --preserve=all --no-preserve=timestamps --parents 
--recursive --update=older --target-directory="/home/kye/test" "."
where the "." directory contains three files (some random build files), 
two of which happen to be identical binaries. (I've attached the full 
trace to this message.)

More specifically, the odd behavior occurs when I run the same command 
multiple times in a row, without changing any of the data being copied. 
Due to the --update=older flag, I would more or less expect that no 
writes should be made, but a few writes continue to occur every time the 
command is rerun. From the strace output, we can see that there are two 
things going on:

 1. The one that is more inconvenient for me is that at the end of the
    process, cp rewrites the permission bits on the target directory,
    even when they match the current permission bits (line 93 of the
    trace). Writes to the target directory are specifically undesirable
    because in my case the target directory will be an external btrfs
    subvolume which has very little IO, so the usual way to tell if
    there have been any changes to the subvolume is with its "generation
    number"; if cp is unnecessarily overwriting identical permission
    bits though, the generation number will be incremented even when no
    data has changed. Even outside of my use-case, an extra chmod that
    isn't actually changing anything is still a small opportunity for
    better optimization, especially since, when recursively copying
    (updating) a large directory tree, every directory in the tree will
    have it's permission bits overwritten. I should also note that this
    kind of behavior is not limited to btrfs, but I have also observed
    it on ZFS. On ZFS, a diff taken between two snapshots of a volume
    taken before and after a (ideally) null copy will also show that
    also the directories were modified.
 2. The other odd thing in the trace is that there are some kind of odd
    shenanigans going on with the two identical binary files, and a
    third temporary file that cp makes and then removes. I don't really
    follow the logic of the series of "linkat"s, "renameat"s, and
    "unlinkat"s around lines 70-80 of the trace, but while I could
    accept that they're somehow useful, what definitely seems like a bug
    is the message printed (due to being in verbose mode) at line 98 of
    the trace. The message makes the claim that a certain file in the
    target directory was removed, but it's definitely still present, and
    the trace doesn't show any equivalent writes to the target
    directory, only the ones in the source directory that I mentioned
    above. This kind of behavior occurs with a lot of files in the
    directory tree I would like to be able to copy, but not all of them,
    nor even the majority of them. It's not really clear what causes it
    besides that in this case the files are identical binaries. It's
    also not really causing me any problems, it's just weird.

While I think it's true that there isn't really any reason that cp 
should need to guarantee that --update=older creates exactly 0 writes in 
the target directory when there are no differences between the source 
and the target, in this case it seems like the current behavior is 
already close enough to getting it right that it would be worth making 
the change (avoiding "chmod"s that don't actually change any mode), if 
possible.

Let me know if you need any other information from me!

Thanks,

-Kye

-- 
Kye E. Hunter
PGP: 6859 E2DE D598 49EA 9319  10CD DEF2 BA03 A6BE 3062
--
trace_from_cp_20250911.txt (text/plain, 7.5 KB)
execve("/usr/bin/cp", ["cp", "--verbose", "--preserve=all", "--no-preserve=timestamps", "--parents", "--recursive", "--update=older", "--target-directory=/home/kye/tes"..., "."], 0x7ffff4ac2b30 /* 38 vars */) = 0
brk(NULL)                               = 0x56522d8ab000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=174571, ...}) = 0
mmap(NULL, 174571, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb613780000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libacl.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=34688, ...}) = 0
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb61377e000
mmap(NULL, 32800, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb613775000
mmap(0x7fb613777000, 16384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb613777000
mmap(0x7fb61377b000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6000) = 0x7fb61377b000
mmap(0x7fb61377c000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7000) = 0x7fb61377c000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libattr.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=26496, ...}) = 0
mmap(NULL, 28696, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb61376d000
mmap(0x7fb61376f000, 12288, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7fb61376f000
mmap(0x7fb613772000, 4096, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7fb613772000
mmap(0x7fb613773000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x5000) = 0x7fb613773000
close(3)                                = 0
openat(AT_FDCWD, "/usr/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000x\2\0\0\0\0\0"..., 832) = 832
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 896, 64) = 896
fstat(3, {st_mode=S_IFREG|0755, st_size=2149728, ...}) = 0
pread64(3, "\6\0\0\0\4\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0@\0\0\0\0\0\0\0"..., 896, 64) = 896
mmap(NULL, 2174000, PROT_READ, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fb613400000
mmap(0x7fb613424000, 1515520, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x7fb613424000
mmap(0x7fb613596000, 454656, PROT_READ, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x196000) = 0x7fb613596000
mmap(0x7fb613605000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x204000) = 0x7fb613605000
mmap(0x7fb61360b000, 31792, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7fb61360b000
close(3)                                = 0
mmap(NULL, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb61376a000
arch_prctl(ARCH_SET_FS, 0x7fb61376a740) = 0
set_tid_address(0x7fb61376aa10)         = 56095
set_robust_list(0x7fb61376aa20, 24)     = 0
rseq(0x7fb61376a680, 0x20, 0, 0x53053053) = 0
mprotect(0x7fb613605000, 16384, PROT_READ) = 0
mprotect(0x7fb613773000, 4096, PROT_READ) = 0
mprotect(0x7fb61377c000, 4096, PROT_READ) = 0
mprotect(0x56520054e000, 4096, PROT_READ) = 0
mprotect(0x7fb6137ec000, 8192, PROT_READ) = 0
prlimit64(0, RLIMIT_STACK, NULL, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
getrandom("\x73\xb1\xab\x58\x43\x79\x03\x41", 8, GRND_NONBLOCK) = 8
munmap(0x7fb613780000, 174571)          = 0
brk(NULL)                               = 0x56522d8ab000
brk(0x56522d8cc000)                     = 0x56522d8cc000
openat(AT_FDCWD, "/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=3063024, ...}) = 0
mmap(NULL, 3063024, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fb613000000
close(3)                                = 0
geteuid()                               = 1000
openat(AT_FDCWD, "/home/kye/test", O_RDONLY|O_PATH|O_DIRECTORY) = 3
newfstatat(AT_FDCWD, ".", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(3, ".", {st_mode=S_IFDIR|0755, st_size=4096, ...}, AT_SYMLINK_NOFOLLOW) = 0
openat(AT_FDCWD, ".", O_RDONLY|O_NONBLOCK|O_CLOEXEC|O_DIRECTORY) = 4
fstat(4, {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
getdents64(4, 0x56522d8acdb0 /* 5 entries */, 32768) = 208
getdents64(4, 0x56522d8acdb0 /* 0 entries */, 32768) = 0
close(4)                                = 0
newfstatat(AT_FDCWD, "./build_script_build-ed34004021de38b5.d", {st_mode=S_IFREG|0644, st_size=468, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(3, "./build_script_build-ed34004021de38b5.d", {st_mode=S_IFREG|0644, st_size=468, ...}, 0) = 0
newfstatat(AT_FDCWD, "./build-script-build", {st_mode=S_IFREG|0755, st_size=4164448, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(3, "./build-script-build", {st_mode=S_IFREG|0755, st_size=4164448, ...}, 0) = 0
newfstatat(AT_FDCWD, "./build_script_build-ed34004021de38b5", {st_mode=S_IFREG|0755, st_size=4164448, ...}, AT_SYMLINK_NOFOLLOW) = 0
newfstatat(3, "./build_script_build-ed34004021de38b5", {st_mode=S_IFREG|0755, st_size=4164448, ...}, 0) = 0
linkat(3, "./build-script-build", 3, "./build_script_build-ed34004021de38b5", 0) = -1 EEXIST (File exists)
rt_sigprocmask(SIG_BLOCK, ~[], [], 8)   = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_DROPPABLE|MAP_ANONYMOUS, -1, 0) = 0x7fb6137aa000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb6137a9000
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
getrandom("\xb1\x9d\x7d\x12\xaf\x81\xa0\xd0\x95\xb9\x7e\x7f\x6a\xd3\x64\x57\x21\x82\x79\x4c\xa5\xfe\xa0\xbc\x4b\x74\x25\xa0\xc6\x5a\xd1\xa5", 32, 0) = 32
linkat(3, "./build-script-build", 3, "./CuYCWUCU", 0) = 0
renameat(3, "./CuYCWUCU", 3, "./build_script_build-ed34004021de38b5") = 0
unlinkat(3, "./CuYCWUCU", 0)            = 0
openat(AT_FDCWD, "/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=2998, ...}) = 0
read(4, "# Locale name alias data base.\n#"..., 4096) = 2998
read(4, "", 4096)                       = 0
close(4)                                = 0
openat(AT_FDCWD, "/usr/share/locale/en_US.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en_US/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.UTF-8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en.utf8/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/share/locale/en/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
fstat(1, {st_mode=S_IFREG|0644, st_size=7021, ...}) = 0
llistxattr(".", NULL, 0)                = 0
llistxattr(".", 0x7fff3e1c89f0, 0)      = 0
chmod("/home/kye/test/.", 040755)       = 0
llistxattr(".", NULL, 0)                = 0
llistxattr(".", 0x7fff3e1c89e0, 0)      = 0
lseek(0, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
close(0)                                = 0
write(1, "removed '/home/kye/test/./build_"..., 63removed '/home/kye/test/./build_script_build-ed34004021de38b5'
) = 63
close(1)                                = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++
OpenPGP_0xDEF2BA03A6BE3062.asc (application/pgp-keys, 16.5 KB)
-----BEGIN PGP PUBLIC KEY BLOCK-----

xsFNBGTyRlkBEADPcZ3/QT7cOuZb+QSyVi9FF5b1ig08Zv/9DmsxSsgV2VoE6mRW
T2S+Dchw5Bc9x8ji3lIfiU83IcKTRLAH5tVswdb8bSCdAFbh51pPyfnHlW+7HiWf
X9YOEVw7cMzqONgIj9y4I3iph68YIFPE0x++bsyaVAZu/ftZixW19331qrf45oD/
dXXWwTdS2MJnFgby3v5hu4qe7EMp4Zbxh4lnE9ZQ/EyVD3olNazgjL4A8wiAOz0q
O2NXFnAlOugLvRRN2NVSirn9CZczCZoMm2ThXCnHArUeCqi3W5infCeFEmN5YuKA
4VSQ+0AObir1lvyR3vZoQoGMPo5N0ye2EQ83YBvbQTSJu3etbzaBw8UwnwGWK0kK
eFzHRj+8iTRzw26x0xUisbFDQYJCWR2E0mVSlysROtp7YcBbg8nWX72Gbo4jFj1s
xqRAW5Zur2ZHyoqgXz26hkIYtlYSVpeFaEaZP/qnBaDNbR9KgIXGiDesAtWe9k6w
1v69AJvTH+41fyKxsmrhAw21iPDadpQOgxPKZ8EnxvuH9Pb0kZg0+keUFiZRCw0h
2yiXays+Sr8H00o9cEfdCDehHGHwv/1Y64meNTGi9ghmCVjAPNELl/ERZLhz9b8J
YB7H+8T+IClxvNj+hD2XxzOssoxcqCbVALbA+RiWAjpBM+TcqjzOQNKfHwARAQAB
zSZLeWUgSHVudGVyIDxreWUuZXZhbi5odW50ZXJAZ21haWwuY29tPsLBmgQTAQgA
RAIbAwUJA8JnAAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBGhZ4t7VmEnq
kxkQzd7yugOmvjBiBQJmXlogAhkBAAoJEN7yugOmvjBiXJ4P/Aqrc6zv7RbjCL44
AnLcQv8OwLRES0ZjXZ5qKebV3LDG8v+9WTsbhO50NjUv0nlcbGc8w4iwj1NTDTAq
4xpPCSQyJtMgHj3VjZJuF40ALhfF2R9ajHH5Tq7WKBOT3dOHWmnlFpABwtJ4wBRp
rufVFspJcV3V5994Dp6tp/rzCix/mFviaSPFJyvK8BU1FiXbZIenFGNDXyBu6RQq
Sz/9t+LXUgaCVD5TpP1K0YK/zrv/Kv01MvgKupTV1rWzq+xMvIGHYl/ruXuTM45r
lYU+V1IbSEgasSC1lNNRTdRdSpM9EreYFLXZF38iq/KFXA8M147j/c86z3XTSelE
ybeCFfUp5o3s+dgYyS7FRq3uwkejlsxQizFIywSC0P183i2kZQeEULf3vKzjVikt
OkyfPiG3mmYGuMZVVp7RyeD4BElPC/hq5/pgs8mPmNvtuGoNxhojq0p0yUGM/ImV
48IoyHttMbTJYjNCpvGfJiTy4M5Fn7a6MvChDh8gYegsM4NkuWv1pOM6nX9IZVfQ
z55NaC74IMFyfl0vVY0lNIgHie5WiSSSe3W1tyZ3dlIhMFFH89zkwXzRf78idsrI
oMDfZ4JHXXiNDNYfM6ne9uC3TcIeUKn+HVAlwED1Owz6doysr1fbYJtQruCNHhaM
ygin9mxXR7XIFL+JE1slhX//jjvvwsGaBBMBCABEAhsDBQsJCAcCAiICBhUKCQgL
AgQWAgMBAh4HAheAAhkBFiEEaFni3tWYSeqTGRDN3vK6A6a+MGIFAmipdJMFCQWY
YboACgkQ3vK6A6a+MGLQ0hAAjGiGoJPgEu/3rzctA6jxaZZg0fMCo7+PPKYtwG1C
9lp1u0qipZ3N3swwYwkJqBAiBG7Xe3rgio92Ngw1x/riJUc9htvnMt5V86OdE2um
vrpDiERnnCVy4QpCiyvZaURKKsoep9T2qLkEDAr9kDsJVJbkY8wjADiVPx2hSdef
5XFvcVGGvF+fTDWMo743Ih0VASCbwCblRDUB6pqUBevL7AdPFUKZeYjvMfxzn4ZK
U8ZdC5sGl4GEk9ZXi7Zk9LC1wGdQXvfaIXtmvcbDiljD6J4KqBqfXUjoIwO4wYLL
kpL79NxLqxQXvXqfz44BP74l/0eVbkvNn02WyHP9ScUdaVPfA08P8Pu5ccDHFe5a
LCt+poErlYGbYNyMmxbofp7h6GwULOIrc4eZ0/WIGTAfDWC28j2TZKJpvPdDVzNw
4UmpXKpOGOyI7s63jaX9j698mxkVAAeZTs0FEqB3p1DDa4kihGan8l0djQ+UwFA3
a0hxcs6GLZuFzhgFpjCjDsusYZs+HaUBJGq7LIur6CyXFPiAd9cVbIZHBGj+ajsE
h4cdJT5N/OKbBicecqrjZx/Q10q+MVlyCTgFNuGT/5IzEfPL8KRl053Kyos59yTL
0PhI4P6cQU9CLrsXk3uUtPY2P0eOB21KXsMiO+DEghZeljXeSSSLKTJZRw0AzSHt
3YXNGkt5ZSBIdW50ZXIgPGt5ZWhAZW52cy5uZXQ+wsGXBBMBCABBFiEEaFni3tWY
SeqTGRDN3vK6A6a+MGIFAmZeWfMCGwMFCQPCZwAFCwkIBwICIgIGFQoJCAsCBBYC
AwECHgcCF4AACgkQ3vK6A6a+MGLSYw//UdYCA0XKQjrC/Kt8xjJHTDZTSKDBWY7X
mMgtLkFsvGkJCViGcMjQdzbDGMDrdVjIMqrvAJIpgItDWxk7kH5g+BfVworpVxKz
9ISE+P46ZOQYSjuZoTLBGTNfvfK4mzPwE1uDGuabBKrljdON+o0O2dhAQ4gwZKNF
MD0E0YWVWLG2XlWbytcOj0iF/dCDSfVQGBIMHfdQUW2nkbrppEvuy71N1kJeIT1T
WcPFqf0qNYnpnQUkaTcw60D1MR1uzvWOdazYROwDyUUQpPtNZ1VRKZ3CknnJ0P7E
4+z5BNgJNxyhOAt/bmvc8X7mvXpw8lOH5pB5wqUe+QLTrJFb2fU6YFVwIguOLJjV
DB/jc71mGQuz3WA3hTFdMdvSoJTKlxada/bVGgXAPe4NbxPtTH2aiXKHHqjDsxej
//avFn001CeYP7JEbz/PAhi4uCszEbKOkx0EZ0T+woi9ADmCOgwMwFSlADMEGQGV
aU1LKI/SBf3BNn/+L7zSR1jqS6uXQK+dRFKiZ7t5mCQ/ux0a5RitKXWfkiD52BrV
VwS4hm8QLfULaA2OZoBYa/vya622gZ+FLULV2bVpQiB1XqFUOdSN3wFXRzCpAXZi
tLN20BosipTpA9gBn4Ikabu++jn0hkCEfv4r3P+UMPwIF75x8QJQG5tUJKR8xJgn
UtRBqc+qGqnCwZcEEwEIAEECGwMFCwkIBwICIgIGFQoJCAsCBBYCAwECHgcCF4AW
IQRoWeLe1ZhJ6pMZEM3e8roDpr4wYgUCaKl0tQUJBZhhugAKCRDe8roDpr4wYqOr
D/9w4IKPSEqd7I8it8GVRcRiMpspOOOUgdU1xXXkR7BaouZ5D8058aqfnp8IceG0
MkkP7xAG2n3LJfq7kMKFZu60XJMdNaEjH3jhsF/uMh1HkgGyev48KoxdusJyrjAO
LtHXk8kHe2g1LvMTHKmRlVIfrPCpHgPna09rODxr0B/QvKdfw6qathm7VPe5fZIF
vCOW0DrdSkqUgm9q9juinvpQPNLwxRjeUSAPZQDa5cnL79RNNm8o0zFccAbnHOUy
NX1CyrkhxUnmPt9MT9pSaxvCBXLjVE/byIFhawhan5/yAdf3SoAHXD00s4iXnri1
k2F8RvrcWF7uPRqie7p6TXc24DfrZ90v2oxnULgnJsPIVgsIq1hSli8QJmGfewfo
tlPNc3ICep3ml1Ii+dzHmtwVO8XbtK6viTvQgkOWoE/qF7YoyCXV+lQpiK/OaOhg
GAUVyzViBlY5LTNGPXJ84tlAkOQZbw5jAZPDSAEPmmRR6Y6a1GVNjKOz7az7PEVq
jF8Xt21mM5VVV7J7jl+LeHcEu8qBXAYgtmBGMlLK3D9fAV8JuUKcxxc2Xo9+lTwA
IJ/WtMO2w4q9G7CM9FHqbN4ZnYlcG9f/Mt5YASlxYihd4aVhopqkP6guMxDABys0
n7ROzyRmZxirDi5lbD5tRrU5R9+AhahT0G4lBQb9aGsRvM0lS3llIEh1bnRlciA8
aHVudGVreWVAb3JlZ29uc3RhdGUuZWR1PsLBlwQTAQgAQRYhBGhZ4t7VmEnqkxkQ
zd7yugOmvjBiBQJmXlm+AhsDBQkDwmcABQsJCAcCAiICBhUKCQgLAgQWAgMBAh4H
AheAAAoJEN7yugOmvjBigN0P/jtXraxC57mYGTtdl2BeKd+i9dYTaYrgDs3mSvgd
+tKj5Z891tPrtaTx/9d+ce/W41SdxnCtgCSJKe9ZiYxQHS77BMeQ8EzG2QacVD3+
FaoZwabyL7jLcHU/Kul2DpsMkB7Zc1PghFlXG+ZMfyDLfbIQtj+vNSQUprYfBYO+
tdAbiqZ4P1MTY0PYtqMGu2k3GA6RW788BkjiwCkTq1iGeQGWGsrSyPPYvZlVlxAZ
3Hxu7NVlEWJujfHzdOc6HPzdCz6IjwOHT6qwOcBI+JKWRGAi5JoPUdV1PN+8WM1O
1j/L6W0jK4n8cInDhR/Qb3HpcI3NtHBEGwHPsPSbbSymPDSJKzPQM40XaWaCd1uf
xLDiTkn2lw9AygNUSi/yZVJcCgQ89Ll5NBj1YnXrCT6G3NHeN1BtpB19qITEyZg5
fZHrPsf6SOV5PJSVwKPpBRY3BqH0EY8s036iQ4rVAMMr0R6ZJ2R0Jt6HWyfcU+lF
BuryUpCIaoY0wKfGMlrxcZZ3PRHNqYfJYJ8A7YKvHN3iIrCgJAetObMvq/DavPiX
fc7QAuQCNbV5i6D6qcWi7U+j7ddpAiU2F95aEUYmfbVU98cLJTGPodOiUGlmF5rh
1BtfGJ3H9tfTbWlWAXKjZt+1YqzHUbgdtD0kXzK++R+Dp8udDeLF5Dqh1taHwGaR
1SmPwsGXBBMBCABBAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEaFni
3tWYSeqTGRDN3vK6A6a+MGIFAmipdLUFCQWYYboACgkQ3vK6A6a+MGKrwxAAhskv
pxvPbgX9w3rsWlnTd27+cfhIb+vzMf2WN1MMMVnG0GzZUtkj2yCjiVhtsLpc8rb5
BX6uU3/0NbBJG+6Ht72JCanAoo+0/gKPupvQiHiZFmp1aio3Kn3yqjLmlRYNLwmb
RUGQaTQwBXCPx4TkMDKLKX2dunpc5LaaoayIel9Hc+HG7PxlO5JMCKCqBbWjnb1R
uCWyA+t1kRT1u6m9lwVjWp66nIUMCKWfNaUBJ8sJovJsa1PJzuYb1oh8ZLHgWA26
26PD+elnA+6+ebPPy6BofziUR4W4UW4S7XxDXda/K2W4zDDMWGijikRmwu+XJk4G
z+wNcrFe9yYGN5TxmUI/YHe7wjIBRWieHuFQBcKIsOVykVxnnDlAcWjHmekwltPn
EzHbOKc6k46kvOdSf4bOZ48vjtqcC3yJakTX6ioBpPRjWLNpMChrdlsRG1Rf5jLA
f16hbFODv+htXQRWPcvZssYMbFtp7qA0qlI9PAHuphNfYW2grYgDF2zb7Pasmn01
tYqsL6y/uqn+xO1g89/82BQWmFDxTJLPTUWT5MdmEWqb8KcH1JnNtD5SI1ZoK+fB
2V+UXCPrIZK+KTY0Qrc7DIDJ+zN1kqgTdq+Uj6sIeDTY8MlG9A33ZyZVhAsjKoS+
0wTdR0do0HfLyyZR6DgERxdcItXhzPDBxfutoIPNJUt5ZSBIdW50ZXIgPHVuc2Vw
dHRyaXVtMTczQGdtYWlsLmNvbT7CwZQEEwEIAD4WIQRoWeLe1ZhJ6pMZEM3e8roD
pr4wYgUCZPJGWQIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDe
8roDpr4wYuIREADNywX5jUgdrvohgzigrgZ9Rxhamb5C9h1MGgoQE1tffJNhyVvX
iaoTButDP3NaBaF/TYlZ8kQyZ64bgU67tn94eUdbGbVeUHFWkp6G7OsmRGpgH+0g
KIl0Unzs76wEA5OqQv/dOhaxMDzCxl5MP/FeYuJ0LYVng+Gp5v2O3iwNvcR60i0T
eZxIJUCJIJgo44Z4RaJZNckxWRYgX8zMcOuj6RMNNDO6GOIXin8tH2x2YCVgrroq
jJFzy3re0HMR4NKeKszTPReG5x0SJzF7xDujLUvt/3tHchEJGo33jq7pewGK4T0U
boT7tlfsoakROYr+FWIH1Hl6Bq/x3T51ggaUN4aQxdOh+6wJ7ouHWkPO1iBb0Rvg
zTr3dy6Z93Zjoezm4DOJaMxJpXkVXs3e1NwTIS/BQ9LX/Vy06l9wR7awISRvfGhq
fsJ8LsQWzC3f/08ZYlMxaLMalgWlkCYAgiLBMGOx8oXbHpcx7Al9k1Pr8njAWeZm
U98DmB6JwU4ItWUel6lqMEt9EiEjZ63QpKR3TcnTUAYYLfAkEDnEesDnlH+YjCTp
r6NmUtNcgHqry4MG5WYklEBYp1gX7q4yyGtZkrnFnpSCypz32w6O2YqSQCKNgIdy
MDVVmAU5GTbH/PMk26HvDErdznlEOO4x8fB8Z6d5VH2dy4mqKksTvFDwacLBlAQT
AQgAPgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBGhZ4t7VmEnqkxkQzd7y
ugOmvjBiBQJoqXS1BQkFmGG6AAoJEN7yugOmvjBibqQP/ifJnmbXGGT8cko1Ax+i
SLuL7XjTuyNYakPdUyeh2vpOsglOhep26/WYQufmrHkQ7Eptwuqe8YV8jAxoOpfV
9EuK9FvAu0hyNItVy7Ul3KNHxnKk4ebGReLPtV/yNK4bBg1M6e5MLat2o96YXiEw
XMpRLoxV0JjI5LLhNEm9dWH+Cp/LPpHhHojNgv2PH1UXAMDa5qZHb+LKXugZeUv8
joSZ9O30cnK5kGl6cVHR7ODPC8DiJw7PbW83eezu/y9tLWaxlBFISeUmH1ltiqkz
0LLU7eMvJZWisazahW+jqKVluo/frDSm0jAs316T4Pfhwkc2rrv5FwCrtZTbwamV
5MMqpHOQAmiBq7h2NLhlC+8wN5bheIH05EnbSj8OjIMivi5OE7dMLHR345Dq4QBC
RAMlqBOeHEYLCq9ictfou/BIXL7fQwxi1d48DI27SPXNshFKrSl043H0XQkRJOCJ
ULgEiCqRkt3tYLtYDPSJUYEZn+nDjBpYhztVHRBVCMXPyqOTgWMjt3yrPLP2F/wH
juC8Th3r9MxvtsIQZ+rJlzDUfBOTP3Fj/0hqz0wijSMo66gxBpnb80B3dtcg8wOy
QTP9lUv3tRiTctiBhtoF6d2O95hfJOy/f0yYwaMGNavt3absNo1fwS80iu49XBF7
1TpcU00TSPyCbieye60KYED6zR5LeWUgSHVudGVyIDxreWUuaHVudGVyQGNyZy5l
dT7CwZcEEwEIAEEWIQRoWeLe1ZhJ6pMZEM3e8roDpr4wYgUCZ0XTxwIbAwUJA8Jn
AAULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAKCRDe8roDpr4wYqPdD/9AtELr
diN8Z20y+4BJQMhbMphB7F8n4uyoPrUzrQSJcVS6WvgbOVCG5FYZAleUaHg5bR85
Aa2d6Bt43QkQ0qAKo8UUHz5XqFWBLM8YZDPl2StsDbKubP91AKUD0IbZmdyn2Za8
1tykQUJrPEdygPad4la9yvj41kDOrLbYuAWogB//1oAngOu6uPrSG6ByoSXQHu5R
TUhoxXNxNfsd2YOInRfKwxHTVdVkCeXBbrNVdVbL85BXFK+7h9l3SUyX21ElaEQL
dS/bdcsgB5RV+bbswvrQHho6nePDyrXmiMq9a3sO2f6Ll+mt67JZFxZNnrVWV5P1
ptVEhzpZm49dqEsr5b25/xe4WH2zOYwHCHwJe8RCudmzUEY4V5QCqF1ScxdORQur
nEy/csxkEsYPuuSC5cqNLHIW3aPHbczgHs3w3GV3KUU6/h72sF5D+knL1oestJM7
M4OX7s3LSvLLBFcFs58+PfRZmro5eRIdHDlOcSy74HYYFVs+ED+t+wRAh7i2ga0w
V6owf8kJsqQ6lAO5Wj8bdo0ebQuONf43apnML6MtWKzctMtiA514Rx1AmkUANlAN
GWHb9/ufqG4rC2HnafDf0PYaERKHbYFthfrod8ynZi6VpPIJb4eJUsNTfzy35tar
hIBfR9Nys8yapIB5cdkAjcBlIMlmUHwh1o/VJ8LBlwQTAQgAQQIbAwULCQgHAgIi
AgYVCgkICwIEFgIDAQIeBwIXgBYhBGhZ4t7VmEnqkxkQzd7yugOmvjBiBQJoqXS1
BQkFmGG6AAoJEN7yugOmvjBiav4P/R1reaQA4VUoapgjRXJof4slPvjmkygfB4kE
FpUD+qnp50yCjklGbT92AA+JDy12CSKw2aQlLNFOOSSKGpCixaZFHBldwFKxxGJE
X5/wFNo7dbmhxqbQq4OiVLOsgAV9oi+kdboonWLEcxWTa6CYWeiqjowdk6zz/ANl
OOWkF60zanNj08Eu97jCPLT6ecqexG65nEyZ0UtfhkyJg8hvydvfW/fTzMWiCar/
2EEmPC8ZTFe3Zd0ZGDFWnNCg1xoj489jzqy1Bhh6Lxg4lzr99/pdtxLPkgjh5axK
ADoNiSH//FdyePnn64tJnjVbxsLmJrV/Gt8utKNAFffgRVdmsAbFZRs+H+wHvH9T
xW5UEYqvQXVqi4rHevz7kn2JaffBGcSwxZLZxXUU7O9tNKY3e4OMQC4fN7ZTK9cX
FMMTD6BDVWR6Nzq6Cz4gW7GOt0CnsSfCLLCLmwLSw3QrfNP6fqmGUDStuE/gM9J+
90Ln6NmWrMYANOx7bIBMABX+0M6ysbNwcteezXsWJChTlVCRHoOjSVpCXqbgtbhR
MALPfbbX3CtG1F8XW6r+qtFp7Fx4vNUOVEixf9jciGbw1VZv+OGKqm8Ojchu1iK+
4jlqnhh2hePNDLGLnVMaJ6lGtZ4qEgDtRys1Xi5i8xgYNa7ufNCiC6ydAZDx7TuO
imU6CJaxzSNLeWUgSHVudGVyIDxreWh1bnRlaDg4QGRvY3QudWIuZWR1PsLBlwQT
AQgAQRYhBGhZ4t7VmEnqkxkQzd7yugOmvjBiBQJnRdRvAhsDBQkDwmcABQsJCAcC
AiICBhUKCQgLAgQWAgMBAh4HAheAAAoJEN7yugOmvjBiR60P/1JaFGzgsSnT0KO5
nGBxpriMwvn6GSczobTUyc6PW4v3I2IwknYpI3Cdrtwt+mnPBEj4385XS/N6DqkY
hzTwd/1Y7mzj2Km4NmvC1nR2QdBOZZtk5Zqi05JllS0d+bzBqi7Wr8XleBUlk9/f
Mh4pbswlGHZd8aGr1Xqd4b0fcwxNU5DsBgtPrrfjsKPJNZyIdZdrpxTFevNFLqMF
u95UbAbtFuyiZjE33yVBgi04/m8W9wrsrLERuQLJDJI2Rol5x9LtvURxVrBIWzAX
ksfaRS4f7oDTY5G7G3U6aH7WhLX3oiDDHJrKMLMURbj36L9UMhz9ROLna+O7o/zt
SjEuNzgFCM9FRe3+XXn9pf1f+axr0TcU6tQ4EqCFRXkv3bYM0emx7vcPgPEG5f2T
vGz5gx35Ip2h6tJiyqjK+Dv+pXRfxCXBkV9WUtCRNpdQi96MRVKZla5OUQWJn0J4
gBUnp/aoiUV+UolG4Kiwut5EwNKl5LAO5dYk0hVLSaCz6w/saliMJMsauXFuSuc0
g8egjuzooK/eMbwSf8kfKLS7yNuA3K7n/iTii+ZDyEX+E+yWUKvyhsSRSCQ2XYGp
Xn8nCd1/lZmFsfLf9+TNJwJlpvFK85w/xSTrH6umFTwSbooM+47HLaOVDNhhtDw3
n/gOITbKYtVe2D8NYyOU/4yatHTLwsGXBBMBCABBAhsDBQsJCAcCAiICBhUKCQgL
AgQWAgMBAh4HAheAFiEEaFni3tWYSeqTGRDN3vK6A6a+MGIFAmipdLUFCQWYYboA
CgkQ3vK6A6a+MGJd4Q/8DugveHnJME6r/EQg4UfpL0cMYSDR5efqX5YKx55t8sMc
26thO2e+AcwrG6vx9TdQ7ywDJ7DPMY46XZxxGFlN+BYUF8HCx2shDJr8Y4+GvBMa
TbpIUkjLArk+/V3z1wChlLwGxOXxbW9faBMUqYK1VF07WIQlLqXST5Hat0/bhSCW
vsvQXo3N6eZb4aAcXObvX0r8ptBNOH8kvtqkzNmjknQj77uO3zs0UDAkdwJFMK9y
ANmH3LZY7kYVU1cCuiGLsYqOTF4sLmjVl3b+aKj3aAixylWyBFjLsUzUOkU9LmWb
TS8FrZKbQkHUlsbtnO8uMztC2JpkCeohLeBzwEdhhp/o5uXYixMPbnEq4Zs1InMX
FP/AO/VKr7g7rJbBvSZvqmz9eNjOYiqrY4g0SQjw0gsyBDJy/WX0QuZuhsjZkmWM
zqTQBH2h0BNA+T5dEkxLBa5Rkm8u7ll6pkfacYZguG4CD1bENTKWVQW0Mgp0QIa0
Xft5GCXRbs/Yq0n3g0+o77T4Dnq3HPHgbcdBXX9yZu3FFfUSrR8KU5E7Jj+hjxWv
lunQSF76f3XCRqRcr2Wbk5heGG3h0YlWlRjMYnyJrSu2n9IDkzZdDSd5cPkq+dTV
bRYe9DMvdJTcF4FrjAcKO9YUSAgx/oxs2eSpKUTqiij1LfmaD2ECC7RmTeuKGuTO
wU0EZPJGWQEQAPHEB4gsM7vrh7c8iZ4IEC5s1383ml1S2at7gcyyI5+FAPxinPXc
ZWITk3/6bQglp7apy7TqlvDLO8iuViob4HF8E458gSN6/b8sg55UlVXB+OW8l8GW
yc64XTcldE2YvNps+1KQMTSXKpknBdJCQ8glgNmF6eTbEm/umMQzhiprFIpaJGS+
jEf+4V10iZOhbWALE4QK1A/OluhD3ViZQxC6GKfmvoc0anOmC+7TuBvCsbhge4M+
vlLCd4Kb2PEE1REgPq6pz+IOg4VSamfFCp6NWuO551fobVu2CzykOM93TsdjpSwk
w8TIKxqPt9+qTGU17nenGvJBhTiWD1hWgq+SS700QGZiWXW+FtWAx9Tk9Za0duN4
6PWY5spmyYvo8NltjWw7toVVfNnLUMj9GW5QIcD3SgC9Dq3x6JIuBJweevuVwNJN
Q0wl0s6m3C+O4vmFHsFC/uim2Z/Gpo6H7YQ395WFvymJ2Y+j3y7SoEYz4bStb4k7
Uvj8j9nUmyswnMZL7NKxD/7W/mlhLmXtxYr5BYuOvHdqvoHywZPoxwk9+0OS3Vq6
hV9zuBL2zQSaYDyYAGd9BSUMB/VM2oI8GZZEOFSRHygTSmDaNDJcipp1IxPQ9ggB
B5hR7VXCEH0rBm0L/oGvmMUJSQRBgwpK/sHnNFX0Qr1pIZzOx5WwgbebABEBAAHC
wXwEGAEIACYWIQRoWeLe1ZhJ6pMZEM3e8roDpr4wYgUCZPJGWQIbDAUJA8JnAAAK
CRDe8roDpr4wYrcLD/0fwL/q6sGBAbz1DJ4H8lQAPDfgM9V7HBUb6EssGRdGac/U
QRu/nN5O5i22I/j7ZcF/j3QmACeK/4G5WaNN5ncXcW1oXd43f91GoNijvvv6W6c5
8p3inQGkXciG5uiaXVN0QAQdPcYe6nuRncwv4+I0Jv+Ow39BFeJjkZ7jNP3NYp99
bE5clIQ8AzX8zgdy168LZNdt8O3RJL0/Rf5/iHBNZdVjKKp56ww4883sjefQW6U6
Wzx5g0wjzKBOqhGGFgDopOxdGjqD7/mhQNnQzBR0RAoUIccKAun1YAvhjN4bf9sA
kMvtvmuH/D3Qg3s8xJezzP6QHAP2C+gO0hxHXPa/48ZEtIoyGZhaOVxvGKQXKu5z
MfPM3K8cMzV5kILVDMh2TkeRa32IQ2QEfr4VZ6HXQvef5VaPlX8kk1px+HJ2PNVB
81KOuaOPcL2sZDWuw2VGtYToW7WedWuMSirM2jos/wJ0i2c5raMIwEyuWxLhfDpa
7i4S3/cUXvhgS/Bqxz/E3quL3AjJfFV+1QFYorA1CbUe5JMgEDluREel4S3QXrjN
K0jJH5o+5XK1+dvvUdyknPxBMFQy10HzCltQTrOpplj9mx46QkQlp9yZGUMh1oVa
nYPVWiw1HklM5plBSyfDrStyp7vO8JQB0rtB9cWWKBN9ov3AC29A9hs2cg+ZD8LB
fAQYAQgAJgIbDBYhBGhZ4t7VmEnqkxkQzd7yugOmvjBiBQJoqXTUBQkFmGH7AAoJ
EN7yugOmvjBi7l8P+QExeg8wUgsUw7IyyHCZkEmnLcMc6ZlTdE/F4Y5zVTuCO/lM
QTqMO+gCPsVuD/XAls1U+hyvu9jVqJkiWwz37ZsCBk3XAUCGeIcSzO+FkQeFM5S+
dG2OK9o0c9g6V16qBx3Es6LdTrp4oPdFYDLKS4lTZFzTONkKQRMNrMGXwOYssX/Q
FKJ6WqdK4jvqDrweUmEQ5yMMGLIPBPO1oFSGCZymWDh9QK5Fw8OhpqR+o4U0ugnv
fNzwb8Iqr+txBMwcfnaz3sKgRl0jI0bmaw6Wh8sDQKCnE9wj/aHUu0TSMaeZ5tUn
w17+aSbdt6B3g27jYmgmVHlW02tkW0IExw0Xp4KKhnRXCiGGDhLiEXRaapSl/Pnx
+0DFlqaRBcvhzbVVFiUnD1Uy8E0utICtMYXX2s+K3o5SIk8kW6s0E5hoffWxoaoP
saFIujLoHUSJ/Z7TQDUd/JCPrDEYwS+qsN3Cp6Tp6dVYL4wvtQY0n8CtkiKUy574
IIde2ZQHxo29rzoy376VpFGEJop+g0oGotdhy9J/6j9JJ8MQJh78toS+yB441nsl
yH1BuckKgxOG5rIECNWWoIMZa/Fsuiy2OxyGinJ94Qqv9ip/AuAw2qMcN67Ld1sd
QfYztr27yM7YOG1kIdBIxUKdn/rwQ2z5cZtTNuDTxLsTm+jyPsoo3ffnEf1FzsFN
BGZeY2MBEACoqZahBjT4DqaxiFceLtQQuQ6YjUjpG8PRt9aAndMefKS6KfQl70sv
PtYGzht0eJYpVoWFHEGoisJAL6r5p1C24G3ViTZM/PtPW+vaZVPviFTwQTEDbVS8
sk68wnK+lVOXsGToj+4GvX2ci0SRrvvQ/6E2Qy4qcxy6K0Tn8pGMfBsNkJOk981r
eLjrajMmJqo15+lSgUmjlALOrxiS3ahfMZ9u7dGNHtvMqi9DcV+j35yr3IV5CPcN
VeoDoc/3mTN7NsfQsprnDcAHWAQH2nHWuTaoiRfBIaBQtGnLNm25pePIUMewdp4Q
rD8aLzzFmlsLJr4Wp74vkMzl6YV+0WEAWJY2hmgr5TJrDOBv6ictVTTyPHWpoxjq
9yaryk07lj9KLudHwC5Z3lRweru8AFJqKJTB5jh4uEnvEU0e8MbVdg/hI3MNi3Cw
uRP+0XrrNxUgfKktXUqt/VGtfYK26XlXG+P0LiNMgOd8KxSS8jZWNBldeK2Ik+vI
aN8k54KlGdOWqca+++GWN4HjJX63xWorlOcgFuAuBxOCiE7MhT2GF9ZPKeodfPsZ
0btyGORT2FymX+LsaVz6V6Co1lzcnLVdFU60HduA64uZtBPMnFYFpMZfN8Oms4nq
XdoC5TiVKKrSBpdttx2TOklbBHjUOZhLNj6N8de1kCQV1K3leJ/aUQARAQABwsOy
BBgBCAAmFiEEaFni3tWYSeqTGRDN3vK6A6a+MGIFAmZeY2MCGwIFCQJVN4ACQAkQ
3vK6A6a+MGLBdCAEGQEIAB0WIQTqu13//5UkuOlVWSUqBNGRgMFwlgUCZl5jYwAK
CRAqBNGRgMFwlgslD/wOXamqg0AiVuHoTWzmtwWAMLHr6cBfuJqjg4eXX7k5Y/sf
t8BfKmHSKZ9VXdLdFVDVglPWCdwGS8wUZXMjeq+2QZW6sD0uaG3wD3fmRKlikfnv
0GKvzpE8l7An1zOhRCGSD5+LtwvnXGBgBY8HVxCwZ00YFQNrFrPzr23w6VPWodqS
bpxlkj0wk/9IRP+YnTgep6/54cSgNlcXTIIvpLWZQ21zd95K2oc6vHULX6Mc9YSo
7c++XzJtqCGCobeRwCfQ4gIntkB0J5qWA01y2zsDD4Pm2FT35iTqguFy0fa/9em2
5sRFN8Dd8Y+xVWD4MmSLdT2ZdmdXalYfushqzwpGszBqvqsrykRnbDhxpM7V/T9B
GS4wlS1dgnosw3xd0Lq8dedbSSWNOrQCvw/uUckixZciyynCmaDChZ3cZrWad1OT
aOb5ZoG3yEH3RK6cHujJiRwGWV+PIbiNj9B9GsvDAGVcZCPrEPfMrDiVw4AE1gQs
qiWY3CEZ9ZFN6VfnYLo80sLxDOfxtJmYeWodp+fbVCbC8j8g79/TUfRyWNFwK82R
tFGYbiBzU/mFC9obE2MP+dGRhYwIFgOeV+yDq+GB0dOkT3bgmOKZwWbfZ3AKL2bM
pCgorOGYu+axY+7GxIT5uIPBG4/oOJMVbJ+q+bcAEFZhxKnDr8+FYWqqLWnlSEGc
D/4n/A4tV6khtS5nzLuP+/OATERsAReOCxuZScybLqwx2nNfZ0D8WrK5O+kb1rVX
ECsWveKp/cH1BH86i++B5pBBcuKggKWHOmYs1MdlovloxT34lM+ukY8M/XjEEXmR
uMRptu02xv2mD9MKE1rpS766YwxGBUwOH9c/kB+m0qxl6+pqVfjHYqDQwjLfwRax
rRfqs/+VCRVAY3QTVzAc/S/prASsgJSP3M6IZZFsY2G90x5dJNCEUd9kubqZ+JDH
G4LWRipH0fx2Ab+2NYBMiQRt2KkpLCtQthCQ2OnA+d8roJUcM5q5o4gtroqSXJZk
9nVOTyYC7qjMmdUxrs+FmQIXkfKet5JiziA6W/kXsh8bmqSsHPR2ef+rz+O8gu3o
YrzNbnw01j+JS9ia31Gjy7atmAMCnpbiJmItBVj5dCHIWRRLmO7Ka+4vDbbnFJR2
N72zC/vIxKBgVpxBY4NVbwxRm0i2QxfffRzaXv8nBI5/MGKjsDGWpCQ6nvZTzg0l
M9e69zqLpejqt/bZwtgxbQf/hqVjZdcbMVUr3Q4Z4CAiTU5KsaQ9hCjYdBVFFBSp
EX0AGNEa2gwdibfHYQ6psrC7QXCpabHHKMdgJsRCZcgGvL4RWLwNz6Yd2QYdOeOe
2hHlqXtG+dsRfRNz5AviCCP/WCAd7zEPQ4Vi+6LCVpHP/MLDsgQYAQgAJgIbAhYh
BGhZ4t7VmEnqkxkQzd7yugOmvjBiBQJoqXTUBQkELETxAkDBdCAEGQEIAB0WIQTq
u13//5UkuOlVWSUqBNGRgMFwlgUCZl5jYwAKCRAqBNGRgMFwlgslD/wOXamqg0Ai
VuHoTWzmtwWAMLHr6cBfuJqjg4eXX7k5Y/sft8BfKmHSKZ9VXdLdFVDVglPWCdwG
S8wUZXMjeq+2QZW6sD0uaG3wD3fmRKlikfnv0GKvzpE8l7An1zOhRCGSD5+Ltwvn
XGBgBY8HVxCwZ00YFQNrFrPzr23w6VPWodqSbpxlkj0wk/9IRP+YnTgep6/54cSg
NlcXTIIvpLWZQ21zd95K2oc6vHULX6Mc9YSo7c++XzJtqCGCobeRwCfQ4gIntkB0
J5qWA01y2zsDD4Pm2FT35iTqguFy0fa/9em25sRFN8Dd8Y+xVWD4MmSLdT2ZdmdX
alYfushqzwpGszBqvqsrykRnbDhxpM7V/T9BGS4wlS1dgnosw3xd0Lq8dedbSSWN
OrQCvw/uUckixZciyynCmaDChZ3cZrWad1OTaOb5ZoG3yEH3RK6cHujJiRwGWV+P
IbiNj9B9GsvDAGVcZCPrEPfMrDiVw4AE1gQsqiWY3CEZ9ZFN6VfnYLo80sLxDOfx
tJmYeWodp+fbVCbC8j8g79/TUfRyWNFwK82RtFGYbiBzU/mFC9obE2MP+dGRhYwI
FgOeV+yDq+GB0dOkT3bgmOKZwWbfZ3AKL2bMpCgorOGYu+axY+7GxIT5uIPBG4/o
OJMVbJ+q+bcAEFZhxKnDr8+FYWqqLWnlSAkQ3vK6A6a+MGKarA//cUMCD74WffIr
ABzfKPbPwGma8B5eMyMOo+fIvSeuVydMxnDCorZsEo3BRRgJm7qU7Om/qLIZBpAx
Rb7Ys65miefykXJ46ROtnzMjC/uPXv5qmYffB47AUk8eYuUz/uMCbbpbYQDuFYkI
xBK9xeyaFRxQBtG1eFiZvHPS3rUxcAYJwFjlV0yFz28ryUMwXkjT+iGJaBG/Ah5H
0GeN2heGWTW2Nh9QBzkgE44CiG1SU2F640af/CGgBC6egm0STMFK0hYx0Q/2163p
MIWJ1kCfGgBNR3Y7+471INBy4RYA6nhJ1FGAkQF4SA00DrAhCYdVdMuQ9FMmYUVD
oOEz7HYQmIRdmzn4uphc7adjPTfndq+eqp8nwK20lHeja5poyY9KGQ6Nyzd0lwnX
3HP9wtc7Dz/Y9uFMh2BsGKgYt0rXs7sETmDz0J8j399yRVw2R17CJBtLISwt/ntT
7sr6b0UnZ1Q3RWB6YzGTErS+rnvMD56011WpqMzKbrUzFViSRgjIVpOH1mqkYHBC
H0uQhEI44T3PHkO07+53nJlV4TEgVCOOW7UooXN/8oHC58UGUHkbteA5gG0aH1mQ
YAyxxVVXiUHY4ImTmj5JtD9ZUuxmvgtKVNJu9fjmkf5yIe+c7Vz2u1aWYGnVo+vU
2Yxey97PeCAaDmfIDyOKaszbiaWia54=
=C8LG
-----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc (application/pgp-signature, 840 B)
-----BEGIN PGP SIGNATURE-----

wsF5BAABCAAjFiEE6rtd//+VJLjpVVklKgTRkYDBcJYFAmjFdT0FAwAAAAAACgkQKgTRkYDBcJbw
HhAAm/yUqdKRR+YYnLZRe+bWQF5DAbFYrVKlPuhhcZuKEcMZLcXQtWzC/6qqcYxz7OtjdloEZaLU
TO05nso1wOh9RRGDyZ85i51ArYEyA103UfkJJO0Ng9yxyOWGrI0ysTLT446ouIrU5vZCCCeG6NvM
jggsCIrotD9QVNcA54VTOcu2DLVSE47kqbTlKS5ATJG3RUtcehjpPmCp3M/vhqHL5vvlsJRy4LbZ
LxZFVBwNy2jeMB0c0KjUHXDtxLcqoKrhm/CQEkcVObpLuoUltjc01Hm1JBbAzjaOrtRxQWxXtLPK
x94dBQbUrQ9YrxUH+eemLIUaLwBMwW60JUClOt025ldAI6EjLZn+ucS0IlRYptxhSzNLmFJmadme
Q8krbhMzd8qf2FVc9B4PxvPWziKkoS9Kjymb2QGgCEg3K/0N0Xu9wtH3mZ+FeADWpdFoHZ/cTpVZ
uVycclSGlr36UAd9dWuYk22JFIxubNn/9xKRX7pQU3qEmtgimw0nAH2knJ8wIF51Zuebb/xW6lzO
AyP3KZzKfykIpyaGONpir6d5xVIHzhCFe4r1mhwVhjyBZneh9k4UTwSaglJ5U6N1cdV1s87SYqe3
TNwj9SR3sMuTeBSxU4xSkzcHY8WjAEFS1f0aSzOEWskBMHoJGZjWexu+Xgw/oq3Tp4+JlM/QyI9L
o5Q=
=y1lN
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.