bug#19614: [PATCH] dist: fix automake bug #19614

Kamila Szewczyk <[email protected]>
Newsgroups gmane.comp.sysutils.automake.bugs,gmane.comp.sysutils.automake.patches
Message-ID <[email protected]>
`make dist' now fails when tar fails, instead of exiting
successfully with a truncated archive. The uncompressed tarball is
built by a rule of its own, $(distdir).tar, rather than piped into
the compressors, whose exit status was the only one the shell
reported.  As a side effect, tar is run only once, whatever the
number of enabled formats; on the other hand, `make dist' now needs
room for the uncompressed tarball.  Since some tar implementations
merely warn about the files they fail to archive and still exit
successfully, anything tar writes to standard error is treated as a
failure too (unless AM_DIST_TAR_IGNORE_STDERR is set to `yes').
(bug#19614)
---
 NEWS                |   3 ++
 doc/automake.texi   |  23 ++++++++++
 lib/am/distdir.am   |  64 +++++++++++++++++++-------
 m4/optional.m4      |  11 +++--
 m4/tar.m4           |  11 +++++
 t/dist-formats.tap  |   7 ++-
 t/dist-shar.sh      |  19 ++++++++
 t/dist-tar-fails.sh | 108 ++++++++++++++++++++++++++++++++++++++++++++
 t/list-of-tests.mk  |   1 +
 9 files changed, 224 insertions(+), 23 deletions(-)
 create mode 100644 t/dist-tar-fails.sh

--
With Valediction,
Kamila Szewczyk (https://iczelia.net)
0001-dist-fix-automake-bug-19614.patch (text/x-patch, 16 KB)
From d5fc3ae245c81140825ecdd5ad2c82f335d07452 Mon Sep 17 00:00:00 2001
From: Kamila Szewczyk <[email protected]>
Date: Wed, 5 Aug 2026 19:59:37 +0200
Subject: [PATCH] dist: fix automake bug #19614

`make dist' now fails when tar fails, instead of exiting
successfully with a truncated archive. The uncompressed tarball is
built by a rule of its own, $(distdir).tar, rather than piped into
the compressors, whose exit status was the only one the shell
reported.  As a side effect, tar is run only once, whatever the
number of enabled formats; on the other hand, `make dist' now needs
room for the uncompressed tarball.  Since some tar implementations
merely warn about the files they fail to archive and still exit
successfully, anything tar writes to standard error is treated as a
failure too (unless AM_DIST_TAR_IGNORE_STDERR is set to `yes').
(bug#19614)
---
 NEWS                |   3 ++
 doc/automake.texi   |  23 ++++++++++
 lib/am/distdir.am   |  64 +++++++++++++++++++-------
 m4/optional.m4      |  11 +++--
 m4/tar.m4           |  11 +++++
 t/dist-formats.tap  |   7 ++-
 t/dist-shar.sh      |  19 ++++++++
 t/dist-tar-fails.sh | 108 ++++++++++++++++++++++++++++++++++++++++++++
 t/list-of-tests.mk  |   1 +
 9 files changed, 224 insertions(+), 23 deletions(-)
 create mode 100644 t/dist-tar-fails.sh

diff --git a/NEWS b/NEWS
index b798fbbd2..372ea46f3 100644
--- a/NEWS
+++ b/NEWS
@@ -18,6 +18,9 @@ New in 1.18.2 (????-??-??):
   - Busybox tar no longer assumed to be GNU tar just because it
     supports --version.
 
+  - `make dist' now fails when tar fails, instead of exiting
+    successfully with a truncated archive.
+
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 New in 1.18.1 (2025-06-25):
 
diff --git a/doc/automake.texi b/doc/automake.texi
index f2bf092b3..c9a72ca66 100644
--- a/doc/automake.texi
+++ b/doc/automake.texi
@@ -9585,6 +9585,29 @@ will create archives in all the enabled formats (@pxref{List of
 Automake options} for how to change this list).  By default, only
 the @code{dist-gzip} target is enabled by @code{dist}.
 
+@cindex Distribution archive, failures of @command{tar}
+All the tar-based formats above compress one and the same
+@file{@var{package}-@var{version}.tar} file; it is created once, no
+matter how many formats are requested, and removed again as soon as the
+archives have been built.  Beware that this needs room for the
+uncompressed tarball, in addition to the @file{@var{package}-@var{version}}
+directory.  Automake used to pipe @command{tar} directly into the
+compressors instead, but then a failure of @command{tar} went unnoticed,
+since the exit status of a shell pipeline is the one of its last
+command; @samp{make dist} would exit successfully after creating a
+truncated archive.
+
+@vindex AM_DIST_TAR_IGNORE_STDERR
+Some @command{tar} implementations do not fail when they cannot archive
+a file, for instance because its name is too long for the selected
+format: they merely print a diagnostic, and still exit successfully.
+For this reason, anything @command{tar} writes to its standard error
+also makes @samp{make dist} fail.  If your @command{tar} is known to
+write harmless messages there, set @code{AM_DIST_TAR_IGNORE_STDERR} to
+@samp{yes}, either in @file{Makefile.am} or on the @command{make}
+command line; its messages are then still printed, but no longer
+considered errors.
+
 
 @node Tests
 @chapter Support for test suites
diff --git a/lib/am/distdir.am b/lib/am/distdir.am
index 7b286cef6..e83fbe987 100644
--- a/lib/am/distdir.am
+++ b/lib/am/distdir.am
@@ -33,7 +33,9 @@ am__remove_distdir = \
 ## See automake bug#10470.
       || { sleep 5 && rm -rf "$(distdir)"; }; \
   else :; fi
-am__post_remove_distdir = $(am__remove_distdir)
+am__post_remove_distdir = \
+  rm -f $(distdir).tar; \
+  $(am__remove_distdir)
 endif %?TOPDIR_P%
 
 if %?SUBDIRS%
@@ -330,51 +332,78 @@ endif %?TOPDIR_P%
 
 if %?TOPDIR_P%
 
+## Do not pipe tar into the compressor: the exit status of a shell
+## pipeline is that of its last command only, so a failure of tar would
+## go unnoticed, and "make dist" would exit successfully after creating
+## a truncated archive.  There is no portable equivalent of the
+## 'pipefail' shell option, so build the uncompressed tarball in a rule
+## of its own, and let each dist-* target compress it.  This also means
+## running tar just once, no matter how many formats are requested.
+## See automake bug#19614.
+##
+## Some tar implementations do not fail when they cannot archive a file
+## (say, because its name is too long for the selected format): they
+## only print a diagnostic and exit successfully.  So treat any output
+## on tar's standard error as a failure, too.  Archivers that write to
+## standard error even when all went well (cpio reports the number of
+## blocks written) are exempted by configure.
+
+# Exists only to be overridden by the user if desired.
+AM_DIST_TAR_IGNORE_STDERR = $(am__tar_ignore_stderr)
+
+$(distdir).tar: distdir
+	am__tar_msg=`tardir=$(distdir) && $(am__tar) 2>&1 >$(distdir).tar`; \
+	am__tar_rc=$$?; \
+	test -z "$$am__tar_msg" || { printf '%s\n' "$$am__tar_msg" >&2; \
+	  test x"$(AM_DIST_TAR_IGNORE_STDERR)" = xyes || am__tar_rc=1; }; \
+	test $$am__tar_rc -eq 0 || { rm -f $(distdir).tar; \
+	  echo "$(distdir).tar: cannot create the distribution archive" >&2; exit 1; }
+
 ?GZIP?DIST_ARCHIVES += $(distdir).tar.gz
 GZIP_ENV = -9
 .PHONY: dist-gzip
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz
+dist-gzip: $(distdir).tar
+	eval GZIP= gzip $(GZIP_ENV) -c <$(distdir).tar >$(distdir).tar.gz
 	$(am__post_remove_distdir)
 
 ?BZIP2?DIST_ARCHIVES += $(distdir).tar.bz2
 .PHONY: dist-bzip2
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+dist-bzip2: $(distdir).tar
+	BZIP2=$${BZIP2--9} bzip2 -c <$(distdir).tar >$(distdir).tar.bz2
 	$(am__post_remove_distdir)
 
 ?BZIP3?DIST_ARCHIVES += $(distdir).tar.bz3
 .PHONY: dist-bzip3
 ## bzip3 does not read any envvars.
-dist-bzip3: distdir
-	tardir=$(distdir) && $(am__tar) | bzip3 -c >$(distdir).tar.bz3
+dist-bzip3: $(distdir).tar
+	bzip3 -c <$(distdir).tar >$(distdir).tar.bz3
 	$(am__post_remove_distdir)
 
 ?LZIP?DIST_ARCHIVES += $(distdir).tar.lz
 .PHONY: dist-lzip
-dist-lzip: distdir
-	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+dist-lzip: $(distdir).tar
+	lzip -c $${LZIP_OPT--9} <$(distdir).tar >$(distdir).tar.lz
 	$(am__post_remove_distdir)
 
 ?XZ?DIST_ARCHIVES += $(distdir).tar.xz
 .PHONY: dist-xz
-dist-xz: distdir
-	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+dist-xz: $(distdir).tar
+	XZ_OPT=$${XZ_OPT--e} xz -c <$(distdir).tar >$(distdir).tar.xz
 	$(am__post_remove_distdir)
 
 ?ZSTD?DIST_ARCHIVES += $(distdir).tar.zst
 .PHONY: dist-zstd
-dist-zstd: distdir
-	tardir=$(distdir) && $(am__tar) | zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} >$(distdir).tar.zst
+dist-zstd: $(distdir).tar
+	zstd -c $${ZSTD_CLEVEL-$${ZSTD_OPT--19}} <$(distdir).tar >$(distdir).tar.zst
 	$(am__post_remove_distdir)
 
 ?COMPRESS?DIST_ARCHIVES += $(distdir).tar.Z
 .PHONY: dist-tarZ
-dist-tarZ: distdir
+dist-tarZ: $(distdir).tar
 	@echo WARNING: "Support for distribution archives compressed with" \
 		       "legacy program 'compress' is deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
+	compress -c <$(distdir).tar >$(distdir).tar.Z
 	$(am__post_remove_distdir)
 
 ?SHAR?DIST_ARCHIVES += $(distdir).shar.gz
@@ -383,7 +412,10 @@ dist-shar: distdir
 	@echo WARNING: "Support for shar distribution archives is" \
 	               "deprecated." >&2
 	@echo WARNING: "It will be removed altogether in Automake 2.0" >&2
-	shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz
+## shar is expected to be chatty on its standard error, so only its exit
+## status is checked here.
+	shar $(distdir) >$(distdir).shar || { rm -f $(distdir).shar; exit 1; }
+	eval GZIP= gzip $(GZIP_ENV) -f $(distdir).shar
 	$(am__post_remove_distdir)
 
 ?ZIP?DIST_ARCHIVES += $(distdir).zip
diff --git a/m4/optional.m4 b/m4/optional.m4
index 9d0e96bb4..314b9f5da 100644
--- a/m4/optional.m4
+++ b/m4/optional.m4
@@ -15,7 +15,7 @@
 # dist' builds each archive when its tool is present and skips it
 # otherwise, without failing.  Unknown OPTION warns at autoreconf; a
 # tool absent at configure appends no rule; a tool lost afterwards
-# fails the pipeline, which the recipe catches.  See bug#81040.
+# fails, which the recipe catches.  See bug#81040.
 AC_DEFUN([AM_OPTIONAL_AUTOMAKE],
 [m4_foreach_w([_am_opt_o], [$1],
    [_AM_OPTIONAL_AUTOMAKE_ONE(_m4_defn([_am_opt_o]))])dnl
@@ -80,13 +80,14 @@ fi
 
 # _AM_OPTIONAL_TAR(TOOL, VAR-TAG, EXT, FLAGS)
 # -------------------------------------------
-# Single-tool tar pipe; TOOL is last, so its failure is what's caught.
+# Compress the tarball built by the $(distdir).tar rule, which the
+# built-in dist-* targets share and which reports the failures of tar
+# itself (see automake bug#19614); only TOOL failing is tolerated here.
 AC_DEFUN([_AM_OPTIONAL_TAR],
 [_AM_OPTIONAL_RULE([$1], [$2],
-[am--optional-dist-$1: distdir
+[am--optional-dist-$1: $(distdir).tar
 	@if test -n "$(am__optional_$2)"; then \
-	  { tardir=$(distdir) \
-	    && $(am__tar) | "$(am__optional_$2)" $4 > $(distdir).tar.$3; } \
+	  "$(am__optional_$2)" $4 < $(distdir).tar > $(distdir).tar.$3 \
 	  || { rm -f $(distdir).tar.$3; \
 	       echo "am-optional: dist-$1 failed; archive not built" >&2; }; \
 	else \
diff --git a/m4/tar.m4 b/m4/tar.m4
index fa6d12a93..154025f6f 100644
--- a/m4/tar.m4
+++ b/m4/tar.m4
@@ -25,6 +25,14 @@ AC_DEFUN([_AM_PROG_TAR],
 # in the wild, let's not break things.
 AC_SUBST([AMTAR], ['$${TAR-tar}'])
 
+# The rules that build the distribution archives consider anything the
+# command in $(am__tar) writes to its standard error to be an error,
+# since some tar implementations merely warn about the files they fail
+# to archive, and still exit successfully (see automake bug#19614).
+# Set this to "yes" for the archivers that are chatty even when they
+# succeed; cpio, for one, always reports the number of blocks written.
+am__tar_ignore_stderr=no
+
 # We'll loop over all known methods to create a tar archive until one works.
 _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
 
@@ -76,6 +84,7 @@ m4_if([$1], [v7],
   _am_tools=${am_cv_prog_tar_$1-$_am_tools}
 
   for _am_tool in $_am_tools; do
+    am__tar_ignore_stderr=no
     case $_am_tool in
     gnutar)
       for _am_tar in tar gnutar gtar; do
@@ -102,6 +111,7 @@ m4_if([$1], [v7],
       am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
       am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
       am__untar='cpio -i -H $1 -d'
+      am__tar_ignore_stderr=yes
       ;;
     none)
       am__tar=false
@@ -133,4 +143,5 @@ m4_if([$1], [v7],
 
 AC_SUBST([am__tar])
 AC_SUBST([am__untar])
+AC_SUBST([am__tar_ignore_stderr])
 ]) # _AM_PROG_TAR
diff --git a/t/dist-formats.tap b/t/dist-formats.tap
index 84e795626..b76e12470 100644
--- a/t/dist-formats.tap
+++ b/t/dist-formats.tap
@@ -429,10 +429,13 @@ fi
 
 mkdir bin
 cd bin
+# Keep the standard error of this stub clean: 'make dist' considers
+# anything the archiver writes there to be an error (bug#19614).
 cat > check-distdir <<END
 #!/bin/sh
-{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } >&2 \
-  || { echo "== distdir fail =="; exit 1; }
+{ ls -l '$tarname' && diff Makefile.am '$tarname'/Makefile.am; } \
+  > check-distdir.log 2>&1 \
+  || { cat check-distdir.log >&2; echo "== distdir fail =="; exit 1; }
 END
 cat > grep-distdir-error <<'END'
 #!/bin/sh
diff --git a/t/dist-shar.sh b/t/dist-shar.sh
index f6f83a7b7..f2584caf4 100644
--- a/t/dist-shar.sh
+++ b/t/dist-shar.sh
@@ -44,4 +44,23 @@ $AUTOCONF
 $MAKE distcheck
 test -f $distdir.shar.gz
 
+# A failure of shar must not go unnoticed just because its output used
+# to be fed to gzip, which happily succeeded.  See automake bug#19614.
+
+mkdir bin
+echo '#!/bin/sh' > bin/shar
+echo 'echo "fake shar: cannot do that" >&2; exit 1' >> bin/shar
+chmod a+x bin/shar
+
+rm -f $distdir.shar.gz
+saved_PATH=$PATH
+PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
+$MAKE dist-shar > output 2>&1 && { cat output; exit 1; }
+PATH=$saved_PATH; export PATH
+
+cat output
+grep 'cannot do that' output
+test ! -e $distdir.shar
+test ! -e $distdir.shar.gz
+
 :
diff --git a/t/dist-tar-fails.sh b/t/dist-tar-fails.sh
new file mode 100644
index 000000000..31fbafb56
--- /dev/null
+++ b/t/dist-tar-fails.sh
@@ -0,0 +1,108 @@
+#! /bin/sh
+# Copyright (C) 2026 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# 'make dist' must fail when the archiver fails, even though its output
+# used to be fed to a compressor that exits successfully.  Also check
+# that the archiver is run only once, whatever the number of requested
+# formats.  See automake bug#19614.
+
+. test-init.sh
+
+cat > configure.ac << END
+AC_INIT([$me], [1.0])
+AM_INIT_AUTOMAKE([dist-xz dist-bzip2])
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
+END
+: > Makefile.am
+
+# Stub compressors, so that this test does not depend on 'xz' and
+# 'bzip2' being installed ('gzip' is assumed to be available on every
+# reasonable portability target).  They just copy their input, which is
+# all the checks below care about.
+mkdir bin
+for c in xz bzip2; do
+  echo '#!/bin/sh' > bin/$c
+  echo 'exec cat' >> bin/$c
+  chmod a+x bin/$c
+done
+PATH=$(pwd)/bin$PATH_SEPARATOR$PATH; export PATH
+
+# Stub archivers, to be used in place of $(am__tar).  Their names
+# contain no whitespace, so that overriding am__tar from the 'make'
+# command line works with any make implementation.
+
+cat > tar-fails << 'END'
+#!/bin/sh
+echo "fake tar: cannot archive that" >&2
+exit 2
+END
+
+# Some tar implementations merely warn about the files they cannot
+# archive, and still exit successfully.
+cat > tar-warns << 'END'
+#!/bin/sh
+echo "fake tar: cannot archive that" >&2
+echo "definitely not a valid tar archive"
+END
+
+cat > tar-counts << 'END'
+#!/bin/sh
+echo x >> tar-runs
+echo "definitely not a valid tar archive"
+END
+
+chmod a+x tar-fails tar-warns tar-counts
+
+$ACLOCAL
+$AUTOCONF
+$AUTOMAKE
+./configure
+
+for fake_tar in tar-fails tar-warns; do
+  $MAKE dist am__tar=./$fake_tar > output 2>&1 && { cat output; exit 1; }
+  cat output
+  grep 'cannot archive that' output
+  grep "$distdir\.tar: cannot create the distribution archive" output
+  # No archive, and no leftovers, must have been created.
+  test ! -e $distdir.tar
+  test ! -e $distdir.tar.gz
+  test ! -e $distdir.tar.xz
+  test ! -e $distdir.tar.bz2
+done
+
+# Diagnostics from tar can be declared harmless by the user.
+$MAKE dist am__tar=./tar-warns AM_DIST_TAR_IGNORE_STDERR=yes > output 2>&1 \
+  || { cat output; exit 1; }
+cat output
+grep 'cannot archive that' output
+test ! -e $distdir.tar
+test -s $distdir.tar.gz
+test -s $distdir.tar.xz
+test -s $distdir.tar.bz2
+
+rm -f $distdir.tar.*
+
+# Three formats, but a single run of the archiver.
+$MAKE dist am__tar=./tar-counts
+cat tar-runs # For debugging.
+test "$(cat tar-runs)" = x
+test ! -e $distdir.tar
+test -s $distdir.tar.gz
+test -s $distdir.tar.xz
+test -s $distdir.tar.bz2
+
+:
diff --git a/t/list-of-tests.mk b/t/list-of-tests.mk
index 6c522bd8e..cd9b6bc55 100644
--- a/t/list-of-tests.mk
+++ b/t/list-of-tests.mk
@@ -425,6 +425,7 @@ t/dist-pr109765.sh \
 t/dist-readonly.sh \
 t/dist-repeated.sh \
 t/dist-shar.sh \
+t/dist-tar-fails.sh \
 t/dist-tarZ.sh \
 t/dist-vs-built-sources.sh \
 t/dist-with-unreadable-makefile-fails.sh \
-- 
2.53.0
OpenPGP_0xC868F0B6DE38409D.asc (application/pgp-keys, 17.7 KB)
-----BEGIN PGP PUBLIC KEY BLOCK-----

xsFNBGLmODgBEADBp0q+9tuJS6fMMVI39FNoS4zo9CCvYXrp8wvO095wnh0vho8M
xsBLLzkT8mI9Nn/ShC2Z9MdWPxVkyZTW8TfuZWTKA5nepcnGHpRE9zsF/fXsWsAE
ijOkNcVNOt3zzbodr1gwFW/7O3AgJL1gMWn6yyY3nOL1AgjiLqJnflXzti8doFEi
LQgKiM3DZaOqSejWHJZ5ywW5b4Gg0DkbiZXr0Un6E7NMHce1ExVE66S6d+bUfOSn
L/BEnBUV3Eil2d1sAJct4bhsChR8qfZQSmHxasrbW8Z4rvimlO+LxnLwtO8TSMTH
cKVVOWI6UJi742OPwsNfNOiSsbo9b09fggD766opil36UH4ba3Ii9IDYyG8BPSGm
IK+Uvgjf0eamShjvfHZkohCTHzJ6egrV5K8JsTbdfGtjyVc4Q3oM+uod5ygpFswe
06o3Gre/0hcE1qI7pKYXZEaI2dKXoeBySRBVCI9CBPPWIXDB2IPSTCS9fGFGg3dD
KXnh8fqsK9CpTofqj/8Bs8Pkctnmb1edeH0ULOIlEYFjaMoYIy08j+QJVlbkTKyV
EsqYTCg4AACVhbhUSvJIOn21I2MrAQP8j0Do//PBPLvki8iBMEylHoGA16nkzM5m
EtkusUUJs+e3K6jWb8hRfrEPVAGrE0yXEiu91P1HG1kipiOnPbssgnAq8QARAQAB
zSlLYW1pbGEgU3pld2N6eWsgPGtzcGFsYWlvbG9nb3NAZ21haWwuY29tPsLBlAQT
AQoAPhYhBGwiLqayvSFqpAZRasho8LbeOECdBQJkuUORAhsDBQkUXSNZBQsJCAcC
BhUKCQgLAgQWAgMBAh4BAheAAAoJEMho8LbeOECdFygP/1NB34XX/v8ag7NiMC4K
6BMUswfhrr2bN+2zHU4uEJF7i4R8WSZfAYyheqNN9Wv3j8HRPwHGtidL17HXt0CY
XYIFl/3UxsM6TmN0Aq0WiNH2IrjVb+DDGjWpPqeMwaFFycJEOwFJ65VlHfPH3r1k
zat9OM6zE5d3diBHFzhWhBA+wvnTwWq9/1aEF2W8lo+MxXwzkYzO58i+A1MkFhAC
8eOePywXX5Dw1BjFXkeuOf5riq0LgRxBlsQ0dDUtCJLaxHFLPmP0EE3VXQTidEsr
8urHhinjUdFnxUvlqUCreSu31zL6Z3JxqfrZ3Wk5/g32SERzRTMeFHSELM0LdO/O
+SRBcXL67hzXjLUCfHFYHTdyNdmxJPKC+DNNvWO/FeJreeRrF3q9U1CCYc7DXJQc
bJ02iNHoauoFcoMTJHYyoRS7ST3mzSDbcE3kyyA20whgXGrqXSp41VLgy3wL1sQt
5K44KzKpjGXTLx2Q4iXt8a/XdYR5iprgnl3eJpjfMNnqqkWVBxBYXe1r25wzBH/y
5XYGLj6e6aRP6HoMPfWxjTVOVKJM96ZcxG7OwoJJTVVim2nSaN930/t/mbPY3IHD
X3DztHWgmYQs2dFPsEvRtkyM8H5TwwY8i+93IYdVnqhVE2x8pITsJmYTkFcYBIKN
ZTBCOEDsiaqz/JWai2P6U42/wsGUBBMBCgA+FiEEbCIuprK9IWqkBlFqyGjwtt44
QJ0FAmLmODgCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyGjw
tt44QJ3P7hAAjY7/qYXQ9dHFLtQy7xoo9+7RUrn38+SsYvhEmcLWXpLBJL8ZIW3l
EqD/c0cQfQidd82rdAjICwhJJMq+SJQ7mbp9oEircimg5xmn+4XkkKHFvmz6DlFV
F0elB1gJS5BpHEOPgMMwVhr9hxfz5IZ/C2cTrhQkft0BY9MYmbgE1tPC4yS1IJgs
zetFAkEJWzRpPi0mNppwkzkXop/GzF/T/jthM+rWxthEcCqqsU0UGGXuFUy+KCWq
ZyKbFxzZfopff1jEbT5XFu/z7Yi31ylChoPMkXa4FFLzA+JAzdyrHvh3sJPIiyDv
F/xfsBqN724/quhXrj67nAdalJ7mUEUIWNKEdiFpVVwbk/PKfTFrJb74W2x5ylxD
SfsZRURKxNCXr2Vu4phlZGYIfuCmQMqvHl8hTNkzco/xj4hvgJVj0FZwUvHCBclN
+xLoEAhZ/TuxkXhafGeMeEei88eqGw7muQA3aP5QmONhkL+PS8tjJDuuebLk2x5o
UxIIaYOw3l1Hl0lkukQuyDm0D0HN7tZsnM8MqQ+G7fkg2PJPCzbWd+fWJTldD03E
I9pT1sTFZmEgqkOGX5DgI1V2oI9lDnwMusYUL56RN6o6tmEEF0X7Z0O1P1SczJKD
rsKPfnDZuxKlHn51K8yN1+8zwz+aEZtd4KYyHuhnXBo1cRCEWP/5E67NI0thbWls
YSBTemV3Y3p5ayA8a2FtaWxhQGR5YWxvZy5jb20+wsGUBBMBCgA+FiEEbCIuprK9
IWqkBlFqyGjwtt44QJ0FAmU+xkwCGwMFCRRdI1kFCwkIBwIGFQoJCAsCBBYCAwEC
HgECF4AACgkQyGjwtt44QJ0qfhAAiJNEnfPo5lMX/QlP5Yg6LnaRaQQl4pZ/dEkj
8LUTmyEhGaTwX7XKSC16qC2B4iPCn4V6yLZ/qfmj7fXmZePLLj/OxlOIqLVXzeWe
zyrGREJZaDhYy0Bd3BVz2NN7+/rdBLi0DRDuTHZ0uC3panfBpI9T+1hGrnp0MMhL
2slJQ/ukSjEhcaiJIrfY6zczCwM0pntEQrCEGwFo+JeJ/o0naNEE60XEznsrViEt
/A0NomxfYIBWRb4YKAmYehGylQ+CbXxApQCj9hT28uoYJo5RGO7C7sUbnxRrseq8
odxL4ueYILMLlzieyGrLVQiJFf/KGOezPE2nzmm9D4q1vgKaIgvSH9PnRoszD7xd
jRlb47C0V44UQBtueaOaiAEc3qF4P89S+Hub7KYSFKpCAIHswx2WXsxYKrUYX+JS
XG6MP4mBh4QDK/xs1fG+dIgfWyhrFPAoMs9FiaC9E5eLtFM10dvPr52QelHYnTo8
yf37OEVOG5sKkSDT7S6t5U3Ew1UI1EPTSJZtcoshIrLBbPP4VrT8eFn1bKzHSRG5
GmjCFSp+Ygi36l53VjA18VpyD3P4z59O0f05QsPIaGFFr8zRy71dcY1NOelngKbC
+uevikeJdMYZ9my72agPZNj7Y/pZH+q0NXyWLZJIcimof8vf4vshd8Sw5fwWutkM
N5/uG/vCwZQEEwEKAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQRsIi6m
sr0haqQGUWrIaPC23jhAnQUCagW3PAUJGeuCBAAKCRDIaPC23jhAncJDD/4/s2rv
7YUnCipwg/ibFr8GvuH4mdcMy4lc/zodQwEc+b5RpCccSX0oLsh3Q4IgUnTRXrb0
4RTZI2gb30fxby7qB+slpLzmqD+rOiM4eOc+1EP1I17D5iSVf5b32UMyc56Vk4WP
PjeCrrx6snwrvEjIzNCz/7TfeISxgiUPozXuT200cWfl/XIht6XnwtBY5GVWOAXA
x1LUi+8glHOyQU8wvRvmK1/CJRcNBJJk+B+no2K4w2ELfSRD1oAoxeEEvVDe+JGs
vzvLQqZ5QCq9F09iQPVZYpK/4LGD4ONh5wPWofk6Z3apu6JHkb8UKY7YjIWLkjRg
GqoDJW8jacrUpCxpnUWOE3XMvbrNyh5qt7vmjnt60qjO8K9uZnlpsjryw6frlcyi
vDuXtQOO7nwZOzayAGdzsEf5edjbs/Np8NKJQn77r+6an7uLCGeLvxbtc6MUuY8u
w9r7hzBifWwuVSyRAUliDNoL2y+9zC9WP7Bzc+g5h2zQvFQwKNpnbWWO++c5JLbi
UfbMZBWk1gcct+vOqPhUphYTfP/Irx8gm/KZrlZU19fiMC+A0tRR2bk+Qyaa7nDd
6tkGkWY9PMm5NccrqfY7qAzFYXCiLZ/wctUsDJAFszARm7mWy+41UyEPc4LNrS9K
VEfiSID1J5Lxqk+Yp+hn3g/WvKFDdR0fpepGLs0wS2FtaWxhIFN6ZXdjenlrIDxr
YXN6MDAwMDFAc3R1ZC51bmktc2FhcmxhbmQuZGU+wsGUBBMBCgA+FiEEbCIuprK9
IWqkBlFqyGjwtt44QJ0FAmU+xl0CGwMFCRRdI1kFCwkIBwIGFQoJCAsCBBYCAwEC
HgECF4AACgkQyGjwtt44QJ0EoQ/+K/c2nlf586bVPriIAQV9uuWUKHDnyETdqAIW
kN1nQQJHfktPZZj7RQM/Lk57/lPz/71bdi2gzajURpbzpnkSKbWEzAs1yXpJH9Vx
a0IaLkxhVh1URp+cvZjRyga7nuOXZqDEGCdiViVWZw5mCJZgbrcV/aU/KZWQpdQ2
zstFKqHMtylNbXdUCcxx26cGsQRG3DPGPOEd7rVd9uxIzUOST17lG6nwcNrrgaBJ
ajP/36zKgXPORhQJIwONIKLJhaoUVBhLlV9PGkbq559GHnVrIqwi+ibzBGTDgktk
ZItPOx4WmZ8sUTzN9Jh8KUKyDMgiPHzIgaSoY8qZuYQ+Ah6vinCvCPhMMHzpN+i2
rDbJbRRjNQJ46WEfH+R4dvre9KFVBZ1K+zW8aNobV9CMwq+5Ntddu56gQEDZ1DIM
0/6qbR82R9ulijANjWT58B/h+S5sMGaD5ccljMrBlUM8hfZehdS1Qri7nQyoxibK
oRYzUstlcK1dDyuwryC34J8bGD4DRSrUf4WgA1CneAIKuao035dFNlezyf+WUsPR
JcgVmHEdZ72UO5CahPHjlMzENPyF4CyH9PSnt1gjwozQibyHzV97dl/Z1oo06lN4
1MvJLIu7yfZDAJ52LjcL7uw/AmAN/JhtJwtVcCVwEjR/h3X1p7v0ewDsbkDeBA9e
173JmNfCwZQEEwEKAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQRsIi6m
sr0haqQGUWrIaPC23jhAnQUCagW3PAUJGeuCBAAKCRDIaPC23jhAnUckD/9JbM6+
CAjHYHtmM/3TDmzeDN7vFY2HOb249eR3xJKSI2zESPu16QW66L7K++UUiVjhtwKf
GaxKpf2LYR+qFBYUBfLOSNRFxpMG7I8jGzXgLn47wjMw9HmpQ30iv43NLq/ALq65
qHWbK6S6wvZHfCxCNseMaRGkVVrN8yi53CLVmsJtRyPmuSsBfysd8FMzhcIsfWu9
82+w42rtEnNJE5UpCyfxOZpLlTc5DTt7UMp0pzUK+Ff2bXuye9viUZXHRHv5VZHi
XY/b8pVA75jbO7HZ7oRw40cE7e/R7lD4CT+CRyLvLTRW4n4A5yOJ/JckRqGPgsg/
Mrz7NlT+vplXaUPjera/iYse8QE2V/Ns4WbVsiQ/C+MAV7HCq3UYqS2cd1sfi4ff
0jMz7JqV/qt1Bbb7SEbwbD9uX/K2KqeMZ8usxwbpOQ9d43pWSw1S7ixl4r1i2Pi1
V3EUtVBh9FRAqgIz7ImQBiCSTTBAH7XTjiC+M1fX/OLQspkfWTSgUgaRrrlkYh9m
O45749/HeVpEP6WZXMk6v7Rqwc4krc8+I0hViSWgogCV+oNYKNHVv9+236yse2sw
az/W+qs0URSqmqROLP7/joNYj+VT3SPJNv3ZUwDgt5L4cbg0ryoCGyxqAmN5vpmk
K5aLtxMYsmrI68ZrS33N823/l1WBgqJRIMjpg80uS2FtaWxhIFN6ZXdjenlrIDxr
YW1pbGFAY3MuZnMudW5pLXNhYXJsYW5kLmRlPsLBlAQTAQoAPhYhBGwiLqayvSFq
pAZRasho8LbeOECdBQJn00ILAhsDBQkUXSNZBQsJCAcCBhUKCQgLAgQWAgMBAh4B
AheAAAoJEMho8LbeOECd2gIP/2qOLQjXHhh2sSSXhARdTLKvVhZb/hRvtq/Mhbbk
ArZyOE4ZBOetz+vs7k8b8Sp7i7vp1J03SRRzhcTWH+ifrgDhRXPv5q3MF5snF7F7
9Ejv73FaVlvdTmqA4QVi377ZXXBd238I6/CkPYjfXWetBcAs8qBodBwpk/daP+9g
tjwZ0VkQE/egSBo0vFL6/E2USK7stkcODP6Q9YXTlLyfOJYSR9hDFwmN79wiBGJF
Ph0p2ktDi1XB7jMv2n8sWz6sQSDLRk/S7uz5PA5bWuP+LF4eZgm0H+A+ttYz6fPT
Q+s5r2j11S/0r4r/xDk0wXr/p1vzHQ7WjKZWEs+jOYB+qQHFnOMZrngBhTXqNXH8
NXpmVXNSbXRn7hJC+7gvYFgeyHsboSWnWatRLRAwwmDES9APfyYv+/FykT+j0SU/
HYe864rcCCSzIa0dnz53T7fWqmRT6v0aF8tguN/ARrRf5V9H11djAcqMo+WWxR78
9qrEAHP4rl2dl3CdwyaGS82JaKTdPpeGgT4ynEdImukYsTiEsyVcY/5GtQCR+NyZ
s1KAS8O1iqvL0Ii0AR6jd1rnVXoxPbhoUMpdTVpL61rMc8O0XcgfEAOF3qz2hBpq
HtC9xRf1Yje5GeP+nfxzVJZ7GN2YGhax1kQHUtCI9WBk9ZpGfdmBNPkZLoYxc5K8
0N0kwsGUBBMBCgA+AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAFiEEbCIuprK9
IWqkBlFqyGjwtt44QJ0FAmoFtzwFCRnrggQACgkQyGjwtt44QJ2qSQ//RQxzbS6F
rgaCiOM+i/IyFxJbucLhXtCawkS+BdilYNmZxwr0RDwWjOXLXqZby6EvMc4W0Idh
KvtIe4d7FpEJhYDeVGiTKCbiyOv4WoPPT5n+mrW36SS3ATb2yWk0i+w9A+7IPF+8
nVSc2fFFld41LFct0TpzoNrWZb9pHVx+m3AH2xrlX6b3rI7NBuyT+YsWMZHLPzL5
SrLzXHjiDDzNAjR6q3bKq9np4SZtD6VBX3DFQ8uV1e0brXz+jf4T1iKHf0iKMmzb
Aqjrj8PNRtWKmIkwS2iZ7T+Y8PR1Uh8RbrRg2YvWQFU5vuEbmgbF/fUEJ/WMQ30c
aor3/JqjRFJq7p4srFhoIFIR+myVHmwMB8tdF8WSA5adc+C6zKP4Ui8//HvRh5cc
cN3c8ou5nqKaSdIs0KOrXO34S8lnzkFMZV3PZcCI5ac1ucg7KZQ3XLm6c9IUtBLK
AXoIODOKmEvBPQAjOyJJ2dVaZMxElWaQUw3nX5gT9d6m7XAZmPtCIwDAN4+oYYfr
d2RKPNEnb7BZGJN9XFDSIw6NIAq1SSGjaNgU6w9kpEhzGDtnytAkcKg4I6UnuuTF
Wdkf3m8aY5MLZHEfYrrIAHFCAptEFLekQLmljeQo7KMUvZykMCrid659c4RvpOIt
hJ6yrc46fZ5Z0biB2GTiU4AniZHNHrdHWdfNI0thbWlsYSBTemV3Y3p5ayA8a3N6
ZXdjenlrQGFjbS5vcmc+wsGUBBMBCgA+FiEEbCIuprK9IWqkBlFqyGjwtt44QJ0F
AmfTQcECGwMFCRRdI1kFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyGjwtt44
QJ26Yg//edlF2MU9K9kYnV013mwzDG7CVlyM/m5371t82eIVvRmbE1zA/1jY/Rw+
sr6xhg1gLL/0yGHtoFYotHFye3IeW87fAGsdjFm22O1zcxNxWD/YjkBCFeqelBYu
Q05mMdw/TCmGkiEmT58P8juPPg0Tskcn8upqFbVHRuTVPReeKIFJAKlTnl9DrTYL
IYygefl5nf4hIgqAma3uGzVugNFDb5zR/yox64YZ7XFEMgNrvm86I6rty+csVzsH
PdbBCpPld0vUmATDGN+oXdALr+Bj31Y6EIHr5tMm9jsDp/vh+Kxd8/nVfqhBte8r
pxgn9157LwDuCsPqvW3FQiJwG+FRJ+Qe6AkfNtruSR3s5VKa8b1MReDinjpfa39N
70mglnJcqjNSFY9CWkzVW8oxTqCaUgSUGqlvsvURVcOxeH6wkgrquzGqF5NBbq+I
Gn5XUh8as7eaykNUK3zKMznwQ57XVYOKrvaxfzaclS//JMTQdyJDfCeghVb4gDda
SLQJSXTSBaTOICHkWrwbaQOq+xJGrq+13BSYnQsObXRYFv0tZuori1G1XsTbogpA
BsPiTI+lL9FqcFMl7awEHlh0SVoF3oN+fMv7bgfoq3tKEC3JfU1c0zIJmFBXzJQY
wSe97hwR88Wp7IC6b8E13MrcqYfVB/df6aS3WOGYI5WJuodhPATCwZQEEwEKAD4C
GwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQRsIi6msr0haqQGUWrIaPC23jhA
nQUCagW3PAUJGeuCBAAKCRDIaPC23jhAnRe5D/48g5ueI+PC4rUf1bliuQWLEimG
UJiWdk9JPuoa6Ibnw7cnUi+d/nWZ98N8NrIbzTJNUk7CC6Pf03cNxhLv5uj6YZMr
RYJMbloVkOHT7Mz4/3/DM4PukilsPVRPcjRZuLtrQRRSulGoAX/BSRfqM37DxES6
Ck4UD6cZljfQRGC933ybEo9h9UOZ5dS3xWpIn4BMhSd1oEuVwuuXDVwxfUPgWw4O
IXqZZUUqr4lTYZuzXuug95qIA7oLUwz2rbuvURbeT2a/PggptgfAzHFo2JvN4yCO
5djDISLviI2uciMFRVGABKoziDQ3pNgI1YWUvlG1FLB2xW+E/63xrKbuipBuaJPA
3v7FLWPvo81g8R+3Xwpl0DROFP8heNO1csPUMtb0d0YWGkPVefgmKvhftr8zfjdz
oMA3jF1hTpTo4aUABgdAvE9DxA5IgKGTeIapOjuvVj233HouGfnXtHp/GjXCtjIz
yobU6FDp6WIEUNpl0X8RUsXUoTqIHD7ePQ0D+RIcHLn4zwFoFJTY11QYAOr6cgQ6
oAPueD4f4ZAKQ6CdnfYO/MrEeWfOevNMMq0EpPWd1DYLd4FzR9BD7j7Ub711U5E9
YlgpVs97klHgTBKNdLeNG3XQh+CgpCqAFgjzErn6X3cR4hk8Dc5LHXg5ZJV3IgzL
4M0mIMc9dUTXIyCrws0fS2FtaWxhIFN6ZXdjenlrIDxrQGljemVsaWEubmV0PsLB
lAQTAQoAPhYhBGwiLqayvSFqpAZRasho8LbeOECdBQJocpXVAhsDBQkUXSNZBQsJ
CAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMho8LbeOECd0ngP/11onwQuPAdnxPUv
SlP61SBFDxRFInACHe7RLmhvDc8aYeYqTiZDE5mjdto5HYTI5qRuJeZS8AB6S5vD
e1F/YD8J5B4gonx2Jy74pVG8jQw+mUfqh1sCxqy1KKayGsaINg5uDwVagQ/fIkrs
+FwYDPgMg2XJkyFhSjkLDewulPjuNRcJoTcn4d32M6Sh0dLuO7H9zUB6UkFLcA7b
LxtVYoKk1OSDni1FMW+aqkqO8pZ6M1tUHfUB8M/xuJYot5zRTzxDOmiqhRAuiF0t
Jkv5iTT7z7M+z7lnoZwP+zfG/zQ7Bs4v4J5ZRnaAS9gMNQuY/v2NKk2UmhfdQHgj
EHfrYaeIMls8rRXXKLuKleipXZ+hXrHXkqgyIlwGNXkEP5IFAu3INt14q3+WLXyU
Vefl2iWtDCDGQlPWDVCRdZsjquwGnS1f2fUShjIKtam7SSEjTnfU+aDZjEdIkxwJ
KaWbCxpOCfcKrZRRMz+vKE9OflzGPioVq3MZWY1WkPMiJvyXJwlmupxE7JjEGLJ2
s4NbGJS6XYM8s+3TwtsXg/qbdYh2ohaX20bLwP3rDF7MqClBoXznbTfvA5u7+QTf
u7uk7ar6zyIXZESHKHjmaEDQagLEKlHsCk+38EiSFt8vLGQ07Tj/aOY7RtF9ydy8
/Oh2oRHc5P45iKqJfwNynpH4HKWPwsGXBBMBCgBBAhsDBQsJCAcCBhUKCQgLAgQW
AgMBAh4BAheAAhkBFiEEbCIuprK9IWqkBlFqyGjwtt44QJ0FAmoFtzwFCRnrggQA
CgkQyGjwtt44QJ0rng//cA5rJwT+4WRd4fBIk4tkfYA0pe7yGnf5co3Rd6fys8xd
jA5a+hkvv/KMM5yhd5LzZT6FnSq+VBDdH2MTB/F6sXwjncAccX2zJcU0qeBhPCUC
ozeI+FnQkBZkmTHDPYpP7ooOEULp4vx2tNDiBnCNZZOkyyjjO8FM5jI2Z7VT/fig
Xcne07aAbxwObry5fu7SIAUvxXgV3mMtDfNzhFovRhl569e8wKswbcbRrI0RkS91
3ZNp5opk35mvj7neqBj7OBDgKu50l/X7+XHQz43TS4Yr9zLNalHkhElk7M7KJraz
gpo8ciBT19Q8l4XbpfOlL7eX586lvK2OGSHqB/kL9uLJ6qSqN8rRaZIIlDFwpuoX
KjqrgBd3J379Q+PIUcnVuZnjSTilA+4CV6yME+dKMgy+ukRSui9+H/t4KjfYIw83
CCCIeFSUkj4jwTmNhlCZRttNiPYCQq+xlsWPU+EGT2QoFZPA/NCCILy3yQSpRMNR
mOHc0m2CgcrP9TaaXk8xJAbPbZwbV76T0VMhDlbrmW7fp81QQB09fbUuEFfQNdKh
4Wu8Y68tTpWNnMfNMS/UQirQfYOjERSikzxsKpu3PW3D08D6P50PA+wR5ZxfFz99
j0+IFP2qW/i84Y5WMu13JB4mYJFbvgemKNjsmRW3yFYycnIuPJA84beWROF9fO3N
LUthbWlsYSBTemV3Y3p5ayA8c3pld2N6eWtAY3MudW5pLXNhYXJsYW5kLmRlPsLB
lAQTAQoAPgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgBYhBGwiLqayvSFqpAZR
asho8LbeOECdBQJqBbc8BQkZ64IEAAoJEMho8LbeOECdbeAQAKIW98ssPPmD0uMy
KH4wDfbV4jHkbJcq8HSvCsADKA7p8i97bNoK0osBO/LjCBvxA1QCtUaVXpNjsuVk
2Xx49LU/IDVUgF9CcQAAR2hMTUw6Y1nToqWM+N5KfmyssUCqerrX9qsCxvEH3trQ
gVNJTlhxthXguvz7rvH43B5zhl4aVk3fmqacL9Q3b/76JNB03Q/Q7VHVsnwEvbpj
JV9CdSKZa55idjFipxRQokiQhh34SwZ6tub/ejPOFW6MyrbyO1RPqEgyZnpNPGyj
ZxQkVb+IiuYZO2ae2yz1Upw3IMP5FVapFPqAjfLzoouPElaTvaJ6uMiNp5eDY3/7
VC9XF57ntJmLl6swijKjnEBRYVtadzyX3+ywGahCiOOjQWCIFvJ8SeThPrHMaZQk
0Nbat2ugQK5dIQb6yDPwVyNDos95/vAQXAtljJiWg2Uja0gL6BQsmChACFCuzVR3
/0la95xqA8dY46QVdwnFwT+ST1J91jYDjUD9XNZHBtl6r+M8a2eo4aLHV2Ym01j2
8NrB27+lqOawxmHgWZkdl1ovY/twZNU+ZLQ48BQBi6RV0GTiB8h9tcRDXHZyEFxw
/Hd2J+vn6SgnbPlbnr9ajgUZEWvAP/UiPKLjYhO7z7KF6l8B9/6e+o2i+/OdQNtk
I/AKUPWJx5we1UZ7AaNSIo2YMSrKzsFNBGLmODgBEAD0A2KWMlPXcQCqJREl0o+s
27H0toJ2A1tPJzqr0ijSKkZvUPbjFkmEVwNW/iV4m3rxtb+q5p1eE+aIcX8UARP6
MSUIlEpz2qRZqeKErVUVAelpTUEx/SqpL1YOLwPgheKCkX5gS841XbcE8csICPSe
udFN8ZzUovFqf1I8aC7Jk28vNjEKnAZHZ2KFzjk/Lf4YRgj0+qRRRetLir+zDveP
Dok/euZTqLjbnlU9rW0dGdymuDu7/eoZNhokokg07pBjAFHi0ovWw49M8Jh4/HhK
aF6T98/zSK/SyX9taDAhZXO9/6NkZukxomSuNlp0x2LW5dK8K8eACnpRYLpsdWQg
uWjQi6Z4OTnWHRSmR6qYd2U8lvZnxJzoVA8jasWNLeTBmfOXKRnONhdjWAHFxCPG
fBEUdQe7k2vwLnjPxaWtmUkjmsXevZDQqxBS2YKozIXN/RT3d783czwnM6btwVra
5zIFyj6hbvcMRjgyLxucczy7TMeUD9zAlxI6t5CwRvcYmK0uUScThC2kQ+iiBiAd
r39IDb7DIRSrVWDmZvVnZfzv9zhQD+kjhz7jJpKlvzm1b0qExxEawGfUXUXMkGQ5
e7DjfMhcaz7TCDpGIKciBi0dvkYWFngK7Zymx+qZpswhouyOwRhZ8Dw9Rh7R0DDh
lRmk6DGc75BC5wAU0zGRDwARAQABwsOyBBgBCgAmFiEEbCIuprK9IWqkBlFqyGjw
tt44QJ0FAmS5Q5ICGy4FCRRdI1kCQAkQyGjwtt44QJ3BdCAEGQEKAB0WIQQSN1oS
vLXfl6Ga+cXjTXuto9rMFAUCYuY4OAAKCRDjTXuto9rMFEK7EADc1zLI7Q3yTja+
fsoGoUT9JsJBZBuGBSi9j8amaH0wWgjrfmFsOpTE7BDzQMARiza1gWhJ4ro8j0Qs
pW6to/NCebLww5b3RPvbS/js8ytYLMy85QGgNYmSNbL1Sh3MvEaqT6D0f3/31Ecx
s8/f4sWNXzUpsjvVlYo92fCiAarzhetj6AUcfpP8azHfFUVjtAZD98cvQnm5/5gQ
sgqWklZsKMypUxsyXNtzC6sqtpgNm02UAV63KPn8pnZACNvTkF2U01l/zqQT0SJc
KZazzMTqwPEujhh2ulRK8zPO9m7SC47RY2ZWRVLuDtk3dkLfyZBbGve2inGsYft9
udJI482V3MSDP4Z5BZzDz3xVaeYGPRHzTSWxOeTtQdJ2GRoMF/XXDLIRJtNRMQbH
JNZkMx8LeP/wkyl7ZUm0w8lGi04La9vmM5Gl8WMZoAVgUnCWAFaER0VctMpYikMr
217J7dOqyLZWFx65o2y6bOdH84wLm0zzgLKETmVeQoD650WcpgC4p2IfXIOENgha
CpBhcDhzJnkvktLSjSygeXxRnS1BrrJj824F/1f0RSxs+R9Lq6NVIk4L21CD1QFj
0yk5AzAWCQfKH55fA7Q+fj/KDEo574MhJoYUpW8R5hRZEaZ5b0J78aVXQMGds/yi
eFEhRyaL88qtwGOcPAGFtx7MlfaQgrVTEACoY3uW+tOzg3lIOvnrpQE1++SsD2/K
Tf+RxiG1IjAmDNfqiQTWi5IOBx7hQA+0MVR/xX8mtXEYhcHcuEvfCsqQ18R4AVlI
avxI3SGZ/CVcvIxTrm7fLSTMyelgGpNNACjuh8twea4iDodlh/hekDN9F+rSnbmg
bPOlbFysGAKaGT3fbsLZcCeb0UVZIEJrkM9NNutiPuUdh/m+2OU0ohq+BAUDW35p
WJOTIOV2CvkP4oSBs+YssxRIQxcdYI0CBUhyRS86CPMKdtzku7pPkJ0XJK1FCrFG
VacaYdNnoyFR/PFZCZg1bdYvgcoFxp4gE2XDakQkZ193urE1WEsxmchXEEYX0lsC
H4EdndS4D6LJUobnKG9k+vDjk5CkG42rPdC5QYVso2FiEq24jjpSbTxnPy4pfgb7
Tdzx/WFALn3MGhVNk4PHLye9zLmhPSuyVaUWCBJ0sRvUBd7ozNx7b+nLWCAnrWk0
ag05P2xc81g9lVSZ/RbIKf3Z+m+HdgUl1l+bNUPb31fVUytZDdx5v85i27UzYRG6
sSkZ+nUY9st1vjQ3jpjtpQDSDLbG2Zc4fvhY7dnsUxsuyziGLWhuM09/GZl9l9R1
1+H+dUMV4HCFwKsrjd8xipa9TySryEnyck+vwLQZNnpsVjt1gRxl1EgPM8S0McC+
mHcCTx1NC6vansLDsgQYAQoAJhYhBGwiLqayvSFqpAZRasho8LbeOECdBQJi5jg4
AhsuBQkDwmcAAkAJEMho8LbeOECdwXQgBBkBCgAdFiEEEjdaEry135ehmvnF4017
raPazBQFAmLmODgACgkQ4017raPazBRCuxAA3NcyyO0N8k42vn7KBqFE/SbCQWQb
hgUovY/Gpmh9MFoI635hbDqUxOwQ80DAEYs2tYFoSeK6PI9ELKVuraPzQnmy8MOW
90T720v47PMrWCzMvOUBoDWJkjWy9UodzLxGqk+g9H9/99RHMbPP3+LFjV81KbI7
1ZWKPdnwogGq84XrY+gFHH6T/Gsx3xVFY7QGQ/fHL0J5uf+YELIKlpJWbCjMqVMb
MlzbcwurKraYDZtNlAFetyj5/KZ2QAjb05BdlNNZf86kE9EiXCmWs8zE6sDxLo4Y
drpUSvMzzvZu0guO0WNmVkVS7g7ZN3ZC38mQWxr3topxrGH7fbnSSOPNldzEgz+G
eQWcw898VWnmBj0R800lsTnk7UHSdhkaDBf11wyyESbTUTEGxyTWZDMfC3j/8JMp
e2VJtMPJRotOC2vb5jORpfFjGaAFYFJwlgBWhEdFXLTKWIpDK9teye3Tqsi2Vhce
uaNsumznR/OMC5tM84CyhE5lXkKA+udFnKYAuKdiH1yDhDYIWgqQYXA4cyZ5L5LS
0o0soHl8UZ0tQa6yY/NuBf9X9EUsbPkfS6ujVSJOC9tQg9UBY9MpOQMwFgkHyh+e
XwO0Pn4/ygxKOe+DISaGFKVvEeYUWRGmeW9Ce/GlV0DBnbP8onhRIUcmi/PKrcBj
nDwBhbcezJX2kIJE5g/+PhMRz3HrqG9w0n5fauzDNWWercXiau0xGGtZvY34QNzx
Uh1l8FHbCskbvVAe7Tb/YRrN4oE1aclFfffSbf64ANIM2VXYKT02mVe9tj4m93t7
cA6H+7h98K3QEnzqtkPjJE3D0PzTwcTcRGVshcb0DuLhEyPql7HdqLDkzSb4enhY
RDNla6eeFM0nZhf6twjTeDQPBoLyjS1ypXlQM6azC5car5eYwHiMpFoGZ/fOG9Qc
wR5qvUid8rMDeoJ1BEHUyYsJoLc1m6gkSjf007PyqPVJTw4tQesEawk2xIjfuglG
KFJDTa7lW5GHMfb8ablWh0KrT01oH9YK3y5iCyAH3dk3wUB1Tg7NDrBiK8R9F42J
ZVi0BhrZkKowz/Xocs58TqhcNg1Cfyii73law5ZcdbxseddFDSkdTNykbG2c7Pln
UiGknXWki+GuDLn/nwkSgo7NlGOem6ue0g0z1uDGx3GjHJ3z0ZNtfnpRd7SaDAfH
laBHQZaZYSZDqQOCmo04ILL7FDFQwQ6rs7d4AcfisUVbhCDfMVi+GibB5FkbD01A
j/9sEpmSZmwjIS+dfwFWtrEUv6cq/JGwa1TpVroqnQa12tk1/WI+iHt90P9SeFsy
EdwDaDqxk53940dGppGRnsfWuCM0rUeJwSol15R1u+MHRqG4V/ksBbERXQt+MG3C
w7IEGAEKACYCGy4WIQRsIi6msr0haqQGUWrIaPC23jhAnQUCagW3hQUJGeuCTQJA
CRDIaPC23jhAncF0IAQZAQoAHRYhBBI3WhK8td+XoZr5xeNNe62j2swUBQJi5jg4
AAoJEONNe62j2swUQrsQANzXMsjtDfJONr5+ygahRP0mwkFkG4YFKL2PxqZofTBa
COt+YWw6lMTsEPNAwBGLNrWBaEniujyPRCylbq2j80J5svDDlvdE+9tL+OzzK1gs
zLzlAaA1iZI1svVKHcy8RqpPoPR/f/fURzGzz9/ixY1fNSmyO9WVij3Z8KIBqvOF
62PoBRx+k/xrMd8VRWO0BkP3xy9Cebn/mBCyCpaSVmwozKlTGzJc23MLqyq2mA2b
TZQBXrco+fymdkAI29OQXZTTWX/OpBPRIlwplrPMxOrA8S6OGHa6VErzM872btIL
jtFjZlZFUu4O2Td2Qt/JkFsa97aKcaxh+3250kjjzZXcxIM/hnkFnMPPfFVp5gY9
EfNNJbE55O1B0nYZGgwX9dcMshEm01ExBsck1mQzHwt4//CTKXtlSbTDyUaLTgtr
2+YzkaXxYxmgBWBScJYAVoRHRVy0yliKQyvbXsnt06rItlYXHrmjbLps50fzjAub
TPOAsoROZV5CgPrnRZymALinYh9cg4Q2CFoKkGFwOHMmeS+S0tKNLKB5fFGdLUGu
smPzbgX/V/RFLGz5H0uro1UiTgvbUIPVAWPTKTkDMBYJB8ofnl8DtD5+P8oMSjnv
gyEmhhSlbxHmFFkRpnlvQnvxpVdAwZ2z/KJ4USFHJovzyq3AY5w8AYW3HsyV9pCC
fdoP/0fX3fO23uV8um+ZlCV54sNTkdGqyQQH6CKMxgCyT9nfVdWOUavbbQwtSjUN
WzgFEhLyK/b15HN+JYagyRNnSRcvKumTNzqYX0HEiZIsk/Eg1wfzoHzoqzPtzGea
86Vxa01FLLIoWvtY4LZ+GvasYYCsdojZCs3r5UXwdi1EOcdFkFer4IWZ1Ru8v0Qw
iL/DunFhf/9fET/JetK8JbUXARlgSVsngZArATHVobIRi7lkXRsfWo7Idn2Mx9d4
PCeEsO9auQlMG8Lgdr8UQzJT9KITv22FqyIaxa7NNeUc2MCh1jL1tBKy753SZSwf
gUyjL0zy+hqx5X+mD8yRDd9Ml5Hm15ILyciSBM3yUwm8zRw6+kLYUi1MeJ8p9D8v
HTUJHbPiV77MB3jTAPdz6W5BnTycwYM2Nq9wg4hrd08ZKgEPpZIILgtfyYVUTar8
iS2pLrFkz1OLafXE39stEmyfcLJg9oTKRn42djeNETqXhw0t2g5WFaJwNDJvnOhK
jRBZWdPhIObGxobFIodFh2+7iyTmKv5c0IsNLMD0uMzxo6sRjkhbzTlisUg5W2UE
fwRJS/HvC4UdB+00T+6UmhJ2Qvq87dJAi1nmxMf38z//6BquxZOKcd0dzjdETzP8
LnWVavRK9kOkLIWiLj8nH4seKRh0OgS9GHYFc8r7UfO7REo0zjMEakKW4BYJKwYB
BAHaRw8BAQdA9sOQdVojfyOVLJoRFeKILElBLFmqLqv5K6OJEnzyptHCwe0EGAEK
ACAWIQRsIi6msr0haqQGUWrIaPC23jhAnQUCakKW4AIbAgCBCRDIaPC23jhAnXYg
BBkWCgAdFiEE1dUn5+M4poLLrbHBIX/PcxRjbAcFAmpCluAACgkQIX/PcxRjbAfO
5QEAypJDBM3jSBEJ3h43xmDO1PytJTI2+7GZaTipCNe601QBAOlmYBrYKEiQJ6Jm
B6jJ0oLLGI74aX8XqotygGMmxyIH+zEP/1BtOkS2vZ23kywkq09NuaAfQVCX1Iuf
iz5UhAdb16O2for/6QuFzMaBBlOVEHEE/6X9NMPBKhRqRm3PGt4IJERJocWOUZMR
C12sF2EO53BJPgwnkW/f+N7wJp0utYCtdbXbwCTOHTXb5pg0frjLYdP2kIxEoQA/
hRMDj5vt0PsDlYBywuQtKcefOqjkzM9F9+JS7JxmPmuq3oEUVp7yhTU2DAZeGcFK
81Vu15aTIfW/3xPb0HDKqQheo4henNzmf/zpZDeD3KQQGrYK8wlalO3quAy1wk2m
UkKnqIvofsJWBOXMYpkYgfKc4BdMk82rESq8CqN5++DMCp1dg+bEuRzCgQoNS2Y6
4ZIczCOI/FpVvlvsSwuJwMTornHisA2+NtYUdPHuhiaJiLb06ces0jSsLx5fNAP/
vL3D0KiAQSQSFjyO561tMTaT7AghAN/zRtBPCNYFmMmSi+yuP/fzulZ2NS/kuL0B
7FwzSliUpTe6/z2pBeHCbsSR4c9cWFBmXifstQFJVeJKtQDdfiJfbES+oK/KQNrL
k3ORV6yqNRdnyTJQaQ22lXeL5AZwq6BSYdcgRMtTRzx6qlK7WIJlI6qk45p3DMbf
8C1TIpl2YrmeHJGd2W2vaBPiW96yAmrFRD20zycENfryVk0FF0kzOZ/h3zwCDa0v
xduOmaKpvtEs
=hUfZ
-----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc (application/pgp-signature, 236 B)
-----BEGIN PGP SIGNATURE-----

wnsEABYIACMWIQTV1Sfn4zimgsutscEhf89zFGNsBwUCanN7RAUDAAAAAAAKCRAhf89zFGNsB/88
AQCBT+GccBr0v0M0hNtkfOWzUS24mr46Ycl05YYBrUqsJgEAoqQnA6PvzEHqwDZVfxnriUxuu2QC
zJOwqHppKtAHVAg=
=gbR6
-----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.