From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 809AC139694 for ; Sat, 18 Mar 2017 07:37:35 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 8ADCA21C21C; Sat, 18 Mar 2017 07:35:22 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 0D0D321C217 for ; Sat, 18 Mar 2017 07:35:17 +0000 (UTC) Received: from pomiot (d202-252.icpnet.pl [109.173.202.252]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id 9F945340F2A; Sat, 18 Mar 2017 07:35:15 +0000 (UTC) Message-ID: <1489822512.1289.5.camel@gentoo.org> Subject: Re: [gentoo-dev] [PATCH v3] estack.eclass: Split estack* logic from eutils From: =?UTF-8?Q?Micha=C5=82_G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Date: Sat, 18 Mar 2017 08:35:12 +0100 In-Reply-To: <20170312101332.10442-1-mgorny@gentoo.org> References: <20170311135058.3223-1-mgorny@gentoo.org> <20170312101332.10442-1-mgorny@gentoo.org> Organization: Gentoo Content-Type: multipart/signed; micalg="pgp-sha512"; protocol="application/pgp-signature"; boundary="=-JTTqF2ds4lb3QBWrlI5L" X-Mailer: Evolution 3.22.6 Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org Mime-Version: 1.0 X-Archives-Salt: 88ce4c25-d4b3-4d01-ad72-6e1b9db27b89 X-Archives-Hash: 5bbc3889421adb990ebdbcf79f878c49 --=-JTTqF2ds4lb3QBWrlI5L Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On nie, 2017-03-12 at 11:13 +0100, Micha=C5=82 G=C3=B3rny wrote: > Split the estack_* and related functions from eutils into a dedicated > estack.eclass. Those functions have significant complexity and are not > used frequently, therefore they benefit from having a separate file > and an explicit dedicated maintainer. >=20 > The new eclass is implicitly inherited by eutils to preserve > compatibility. However, the inherit will be removed in EAPI 7, > and the ebuilds should switch to using estack directly. >=20 > Thanks to Ulrich M=C3=BCller for doing the research on this. >=20 > // v3: also rename&update tests > --- > eclass/estack.eclass | 217 +++++++++++++++= ++++++ > eclass/eutils.eclass | 210 +--------------= ----- > .../tests/{eutils_eshopts.sh =3D> estack_eshopts.sh} | 4 +- > .../tests/{eutils_estack.sh =3D> estack_estack.sh} | 4 +- > eclass/tests/{eutils_evar.sh =3D> estack_evar.sh} | 4 +- > 5 files changed, 230 insertions(+), 209 deletions(-) > create mode 100644 eclass/estack.eclass > rename eclass/tests/{eutils_eshopts.sh =3D> estack_eshopts.sh} (93%) > rename eclass/tests/{eutils_estack.sh =3D> estack_estack.sh} (93%) > rename eclass/tests/{eutils_evar.sh =3D> estack_evar.sh} (96%) >=20 > diff --git a/eclass/estack.eclass b/eclass/estack.eclass > new file mode 100644 > index 000000000000..19c388f3d8d2 > --- /dev/null > +++ b/eclass/estack.eclass > @@ -0,0 +1,217 @@ > +# Copyright 1999-2017 Gentoo Foundation > +# Distributed under the terms of the GNU General Public License v2 > + > +# @ECLASS: estack.eclass > +# @MAINTAINER: > +# base-system@gentoo.org > +# @BLURB: stack-like value storage support > +# @DESCRIPTION: > +# Support for storing values on stack-like variables. > + > +if [[ -z ${_ESTACK_ECLASS} ]]; then > + > +# @FUNCTION: estack_push > +# @USAGE: [items to push] > +# @DESCRIPTION: > +# Push any number of items onto the specified stack. Pick a name that > +# is a valid variable (i.e. stick to alphanumerics), and push as many > +# items as you like onto the stack at once. > +# > +# The following code snippet will echo 5, then 4, then 3, then ... > +# @CODE > +# estack_push mystack 1 2 3 4 5 > +# while estack_pop mystack i ; do > +# echo "${i}" > +# done > +# @CODE > +estack_push() { > + [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments" > + local stack_name=3D"_ESTACK_$1_" ; shift > + eval ${stack_name}+=3D\( \"\$@\" \) > +} > + > +# @FUNCTION: estack_pop > +# @USAGE: [variable] > +# @DESCRIPTION: > +# Pop a single item off the specified stack. If a variable is specified= , > +# the popped item is stored there. If no more items are available, retu= rn > +# 1, else return 0. See estack_push for more info. > +estack_pop() { > + [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments= " > + > + # We use the fugly _estack_xxx var names to avoid collision with > + # passing back the return value. If we used "local i" and the > + # caller ran `estack_pop ... i`, we'd end up setting the local > + # copy of "i" rather than the caller's copy. The _estack_xxx > + # garbage is preferable to using $1/$2 everywhere as that is a > + # bit harder to read. > + local _estack_name=3D"_ESTACK_$1_" ; shift > + local _estack_retvar=3D$1 ; shift > + eval local _estack_i=3D\${#${_estack_name}\[@\]} > + # Don't warn -- let the caller interpret this as a failure > + # or as normal behavior (akin to `shift`) > + [[ $(( --_estack_i )) -eq -1 ]] && return 1 > + > + if [[ -n ${_estack_retvar} ]] ; then > + eval ${_estack_retvar}=3D\"\${${_estack_name}\[${_estack_i}\]}\" > + fi > + eval unset \"${_estack_name}\[${_estack_i}\]\" > +} > + > +# @FUNCTION: evar_push > +# @USAGE: [more vars to save] > +# @DESCRIPTION: > +# This let's you temporarily modify a variable and then restore it (incl= uding > +# set vs unset semantics). Arrays are not supported at this time. > +# > +# This is meant for variables where using `local` does not work (such as > +# exported variables, or only temporarily changing things in a func). > +# > +# For example: > +# @CODE > +# evar_push LC_ALL > +# export LC_ALL=3DC > +# ... do some stuff that needs LC_ALL=3DC set ... > +# evar_pop > +# > +# # You can also save/restore more than one var at a time > +# evar_push BUTTERFLY IN THE SKY > +# ... do stuff with the vars ... > +# evar_pop # This restores just one var, SKY > +# ... do more stuff ... > +# evar_pop 3 # This pops the remaining 3 vars > +# @CODE > +evar_push() { > + local var val > + for var ; do > + [[ ${!var+set} =3D=3D "set" ]] \ > + && val=3D${!var} \ > + || val=3D"unset_76fc3c462065bb4ca959f939e6793f94" > + estack_push evar "${var}" "${val}" > + done > +} > + > +# @FUNCTION: evar_push_set > +# @USAGE: [new value to store] > +# @DESCRIPTION: > +# This is a handy shortcut to save and temporarily set a variable. If a= value > +# is not specified, the var will be unset. > +evar_push_set() { > + local var=3D$1 > + evar_push ${var} > + case $# in > + 1) unset ${var} ;; > + 2) printf -v "${var}" '%s' "$2" ;; > + *) die "${FUNCNAME}: incorrect # of args: $*" ;; > + esac > +} > + > +# @FUNCTION: evar_pop > +# @USAGE: [number of vars to restore] > +# @DESCRIPTION: > +# Restore the variables to the state saved with the corresponding > +# evar_push call. See that function for more details. > +evar_pop() { > + local cnt=3D${1:-bad} > + case $# in > + 0) cnt=3D1 ;; > + 1) isdigit "${cnt}" || die "${FUNCNAME}: first arg must be a number: $*= " ;; > + *) die "${FUNCNAME}: only accepts one arg: $*" ;; > + esac > + > + local var val > + while (( cnt-- )) ; do > + estack_pop evar val || die "${FUNCNAME}: unbalanced push" > + estack_pop evar var || die "${FUNCNAME}: unbalanced push" > + [[ ${val} =3D=3D "unset_76fc3c462065bb4ca959f939e6793f94" ]] \ > + && unset ${var} \ > + || printf -v "${var}" '%s' "${val}" > + done > +} > + > +# @FUNCTION: eshopts_push > +# @USAGE: [options to `set` or `shopt`] > +# @DESCRIPTION: > +# Often times code will want to enable a shell option to change code beh= avior. > +# Since changing shell options can easily break other pieces of code (wh= ich > +# assume the default state), eshopts_push is used to (1) push the curren= t shell > +# options onto a stack and (2) pass the specified arguments to set. > +# > +# If the first argument is '-s' or '-u', we assume you want to call `sho= pt` > +# rather than `set` as there are some options only available via that. > +# > +# A common example is to disable shell globbing so that special meaning/= care > +# may be used with variables/arguments to custom functions. That would = be: > +# @CODE > +# eshopts_push -o noglob > +# for x in ${foo} ; do > +# if ...some check... ; then > +# eshopts_pop > +# return 0 > +# fi > +# done > +# eshopts_pop > +# @CODE > +eshopts_push() { > + if [[ $1 =3D=3D -[su] ]] ; then > + estack_push eshopts "$(shopt -p)" > + [[ $# -eq 0 ]] && return 0 > + shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*" > + else > + estack_push eshopts $- > + [[ $# -eq 0 ]] && return 0 > + set "$@" || die "${FUNCNAME}: bad options to set: $*" > + fi > +} > + > +# @FUNCTION: eshopts_pop > +# @USAGE: > +# @DESCRIPTION: > +# Restore the shell options to the state saved with the corresponding > +# eshopts_push call. See that function for more details. > +eshopts_pop() { > + local s > + estack_pop eshopts s || die "${FUNCNAME}: unbalanced push" > + if [[ ${s} =3D=3D "shopt -"* ]] ; then > + eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}" > + else > + set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-" > + set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell= settings: ${s}" > + fi > +} > + > +# @FUNCTION: eumask_push > +# @USAGE: > +# @DESCRIPTION: > +# Set the umask to the new value specified while saving the previous > +# value onto a stack. Useful for temporarily changing the umask. > +eumask_push() { > + estack_push eumask "$(umask)" > + umask "$@" || die "${FUNCNAME}: bad options to umask: $*" > +} > + > +# @FUNCTION: eumask_pop > +# @USAGE: > +# @DESCRIPTION: > +# Restore the previous umask state. > +eumask_pop() { > + [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options" > + local s > + estack_pop eumask s || die "${FUNCNAME}: unbalanced push" > + umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}" > +} > + > +# @FUNCTION: isdigit > +# @USAGE: [more numbers] > +# @DESCRIPTION: > +# Return true if all arguments are numbers. > +isdigit() { > + local d > + for d ; do > + [[ ${d:-bad} =3D=3D *[!0-9]* ]] && return 1 > + done > + return 0 > +} > + > +_ESTACK_ECLASS=3D1 > +fi #_ESTACK_ECLASS > diff --git a/eclass/eutils.eclass b/eclass/eutils.eclass > index ac6a4854d17b..79ec00042a3f 100644 > --- a/eclass/eutils.eclass > +++ b/eclass/eutils.eclass > @@ -19,6 +19,13 @@ _EUTILS_ECLASS=3D1 > =20 > inherit multilib toolchain-funcs > =20 > +# implicitly inherited (now split) eclasses > +case ${EAPI:-0} in > +0|1|2|3|4|5|6) > + inherit estack > + ;; > +esac > + > # @FUNCTION: eqawarn > # @USAGE: [message] > # @DESCRIPTION: > @@ -63,209 +70,6 @@ egit_clean() { > find "$@" -type d -name '.git*' -prune -print0 | xargs -0 rm -rf > } > =20 > -# @FUNCTION: estack_push > -# @USAGE: [items to push] > -# @DESCRIPTION: > -# Push any number of items onto the specified stack. Pick a name that > -# is a valid variable (i.e. stick to alphanumerics), and push as many > -# items as you like onto the stack at once. > -# > -# The following code snippet will echo 5, then 4, then 3, then ... > -# @CODE > -# estack_push mystack 1 2 3 4 5 > -# while estack_pop mystack i ; do > -# echo "${i}" > -# done > -# @CODE > -estack_push() { > - [[ $# -eq 0 ]] && die "estack_push: incorrect # of arguments" > - local stack_name=3D"_ESTACK_$1_" ; shift > - eval ${stack_name}+=3D\( \"\$@\" \) > -} > - > -# @FUNCTION: estack_pop > -# @USAGE: [variable] > -# @DESCRIPTION: > -# Pop a single item off the specified stack. If a variable is specified= , > -# the popped item is stored there. If no more items are available, retu= rn > -# 1, else return 0. See estack_push for more info. > -estack_pop() { > - [[ $# -eq 0 || $# -gt 2 ]] && die "estack_pop: incorrect # of arguments= " > - > - # We use the fugly _estack_xxx var names to avoid collision with > - # passing back the return value. If we used "local i" and the > - # caller ran `estack_pop ... i`, we'd end up setting the local > - # copy of "i" rather than the caller's copy. The _estack_xxx > - # garbage is preferable to using $1/$2 everywhere as that is a > - # bit harder to read. > - local _estack_name=3D"_ESTACK_$1_" ; shift > - local _estack_retvar=3D$1 ; shift > - eval local _estack_i=3D\${#${_estack_name}\[@\]} > - # Don't warn -- let the caller interpret this as a failure > - # or as normal behavior (akin to `shift`) > - [[ $(( --_estack_i )) -eq -1 ]] && return 1 > - > - if [[ -n ${_estack_retvar} ]] ; then > - eval ${_estack_retvar}=3D\"\${${_estack_name}\[${_estack_i}\]}\" > - fi > - eval unset \"${_estack_name}\[${_estack_i}\]\" > -} > - > -# @FUNCTION: evar_push > -# @USAGE: [more vars to save] > -# @DESCRIPTION: > -# This let's you temporarily modify a variable and then restore it (incl= uding > -# set vs unset semantics). Arrays are not supported at this time. > -# > -# This is meant for variables where using `local` does not work (such as > -# exported variables, or only temporarily changing things in a func). > -# > -# For example: > -# @CODE > -# evar_push LC_ALL > -# export LC_ALL=3DC > -# ... do some stuff that needs LC_ALL=3DC set ... > -# evar_pop > -# > -# # You can also save/restore more than one var at a time > -# evar_push BUTTERFLY IN THE SKY > -# ... do stuff with the vars ... > -# evar_pop # This restores just one var, SKY > -# ... do more stuff ... > -# evar_pop 3 # This pops the remaining 3 vars > -# @CODE > -evar_push() { > - local var val > - for var ; do > - [[ ${!var+set} =3D=3D "set" ]] \ > - && val=3D${!var} \ > - || val=3D"unset_76fc3c462065bb4ca959f939e6793f94" > - estack_push evar "${var}" "${val}" > - done > -} > - > -# @FUNCTION: evar_push_set > -# @USAGE: [new value to store] > -# @DESCRIPTION: > -# This is a handy shortcut to save and temporarily set a variable. If a= value > -# is not specified, the var will be unset. > -evar_push_set() { > - local var=3D$1 > - evar_push ${var} > - case $# in > - 1) unset ${var} ;; > - 2) printf -v "${var}" '%s' "$2" ;; > - *) die "${FUNCNAME}: incorrect # of args: $*" ;; > - esac > -} > - > -# @FUNCTION: evar_pop > -# @USAGE: [number of vars to restore] > -# @DESCRIPTION: > -# Restore the variables to the state saved with the corresponding > -# evar_push call. See that function for more details. > -evar_pop() { > - local cnt=3D${1:-bad} > - case $# in > - 0) cnt=3D1 ;; > - 1) isdigit "${cnt}" || die "${FUNCNAME}: first arg must be a number: $*= " ;; > - *) die "${FUNCNAME}: only accepts one arg: $*" ;; > - esac > - > - local var val > - while (( cnt-- )) ; do > - estack_pop evar val || die "${FUNCNAME}: unbalanced push" > - estack_pop evar var || die "${FUNCNAME}: unbalanced push" > - [[ ${val} =3D=3D "unset_76fc3c462065bb4ca959f939e6793f94" ]] \ > - && unset ${var} \ > - || printf -v "${var}" '%s' "${val}" > - done > -} > - > -# @FUNCTION: eshopts_push > -# @USAGE: [options to `set` or `shopt`] > -# @DESCRIPTION: > -# Often times code will want to enable a shell option to change code beh= avior. > -# Since changing shell options can easily break other pieces of code (wh= ich > -# assume the default state), eshopts_push is used to (1) push the curren= t shell > -# options onto a stack and (2) pass the specified arguments to set. > -# > -# If the first argument is '-s' or '-u', we assume you want to call `sho= pt` > -# rather than `set` as there are some options only available via that. > -# > -# A common example is to disable shell globbing so that special meaning/= care > -# may be used with variables/arguments to custom functions. That would = be: > -# @CODE > -# eshopts_push -o noglob > -# for x in ${foo} ; do > -# if ...some check... ; then > -# eshopts_pop > -# return 0 > -# fi > -# done > -# eshopts_pop > -# @CODE > -eshopts_push() { > - if [[ $1 =3D=3D -[su] ]] ; then > - estack_push eshopts "$(shopt -p)" > - [[ $# -eq 0 ]] && return 0 > - shopt "$@" || die "${FUNCNAME}: bad options to shopt: $*" > - else > - estack_push eshopts $- > - [[ $# -eq 0 ]] && return 0 > - set "$@" || die "${FUNCNAME}: bad options to set: $*" > - fi > -} > - > -# @FUNCTION: eshopts_pop > -# @USAGE: > -# @DESCRIPTION: > -# Restore the shell options to the state saved with the corresponding > -# eshopts_push call. See that function for more details. > -eshopts_pop() { > - local s > - estack_pop eshopts s || die "${FUNCNAME}: unbalanced push" > - if [[ ${s} =3D=3D "shopt -"* ]] ; then > - eval "${s}" || die "${FUNCNAME}: sanity: invalid shopt options: ${s}" > - else > - set +$- || die "${FUNCNAME}: sanity: invalid shell settings: $-" > - set -${s} || die "${FUNCNAME}: sanity: unable to restore saved shell= settings: ${s}" > - fi > -} > - > -# @FUNCTION: eumask_push > -# @USAGE: > -# @DESCRIPTION: > -# Set the umask to the new value specified while saving the previous > -# value onto a stack. Useful for temporarily changing the umask. > -eumask_push() { > - estack_push eumask "$(umask)" > - umask "$@" || die "${FUNCNAME}: bad options to umask: $*" > -} > - > -# @FUNCTION: eumask_pop > -# @USAGE: > -# @DESCRIPTION: > -# Restore the previous umask state. > -eumask_pop() { > - [[ $# -eq 0 ]] || die "${FUNCNAME}: we take no options" > - local s > - estack_pop eumask s || die "${FUNCNAME}: unbalanced push" > - umask ${s} || die "${FUNCNAME}: sanity: could not restore umask: ${s}" > -} > - > -# @FUNCTION: isdigit > -# @USAGE: [more numbers] > -# @DESCRIPTION: > -# Return true if all arguments are numbers. > -isdigit() { > - local d > - for d ; do > - [[ ${d:-bad} =3D=3D *[!0-9]* ]] && return 1 > - done > - return 0 > -} > - > # @VARIABLE: EPATCH_SOURCE > # @DESCRIPTION: > # Default directory to search for patches. > diff --git a/eclass/tests/eutils_eshopts.sh b/eclass/tests/estack_eshopts= .sh > similarity index 93% > rename from eclass/tests/eutils_eshopts.sh > rename to eclass/tests/estack_eshopts.sh > index 2e9bbb6d4612..606a17cfb053 100755 > --- a/eclass/tests/eutils_eshopts.sh > +++ b/eclass/tests/estack_eshopts.sh > @@ -1,10 +1,10 @@ > #!/bin/bash > -# Copyright 1999-2015 Gentoo Foundation > +# Copyright 1999-2017 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > =20 > source tests-common.sh > =20 > -inherit eutils > +inherit estack > =20 > test-it() { > local s0 s1 s2 > diff --git a/eclass/tests/eutils_estack.sh b/eclass/tests/estack_estack.s= h > similarity index 93% > rename from eclass/tests/eutils_estack.sh > rename to eclass/tests/estack_estack.sh > index c1fecf323133..4845243d3ae4 100755 > --- a/eclass/tests/eutils_estack.sh > +++ b/eclass/tests/estack_estack.sh > @@ -1,10 +1,10 @@ > #!/bin/bash > -# Copyright 1999-2015 Gentoo Foundation > +# Copyright 1999-2017 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > =20 > source tests-common.sh > =20 > -inherit eutils > +inherit estack > =20 > tbegin "initial stack state" > estack_pop teststack > diff --git a/eclass/tests/eutils_evar.sh b/eclass/tests/estack_evar.sh > similarity index 96% > rename from eclass/tests/eutils_evar.sh > rename to eclass/tests/estack_evar.sh > index f8db340f723d..29badba0079e 100755 > --- a/eclass/tests/eutils_evar.sh > +++ b/eclass/tests/estack_evar.sh > @@ -1,10 +1,10 @@ > #!/bin/bash > -# Copyright 1999-2015 Gentoo Foundation > +# Copyright 1999-2017 Gentoo Foundation > # Distributed under the terms of the GNU General Public License v2 > =20 > source tests-common.sh > =20 > -inherit eutils > +inherit estack > =20 > tbegin "simple push/pop" > VAR=3D1 Merged. --=20 Best regards, Micha=C5=82 G=C3=B3rny --=-JTTqF2ds4lb3QBWrlI5L Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- iQKTBAABCgB9FiEEXr8g+Zb7PCLMb8pAur8dX/jIEQoFAljM4zBfFIAAAAAALgAo aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDVF QkYyMEY5OTZGQjNDMjJDQzZGQ0E0MEJBQkYxRDVGRjhDODExMEEACgkQur8dX/jI EQpaBw/8DguiHbVZ0YPBTlIurAsDmQuzWrAgpxHeX96v6eWFHFzjjoCZWQDcMu2k 8KqVrNdRhCS5IlCVE90Jwt/M0uZ4UUzz8yRiwf6Yi2gxw2JhKRXB9drmqC7lFopv foUWCbd1Qtzwgs02ytaOz9YYGIRDEdMJbrd8mCgmsJfDR6qgy7OTj+H5/ufOQsjO rcr8pecAc7chjF+XdODom0NKXR5q+qfQFkwZxBN2VU0xSg53iPyORuJDnYjUXFy4 IornRW0bZQKLPMktOp6iuihDtmBv5aev2T8sK59Q+xb7GQNj3sVB/8JF7F3hji99 /Oh0mqYxwEDIpBv25O3c+jzHJalUNuGKfSuWhB5GdbXgnd8J9js6U8Rw9SZf2cME yvTwyBwrnI4nFtddNb/Nu//RLK0ZchQqm//IurGvXU9nTZzMCYMHTbrysPrhfWjS 7DhXK62R+0yQzfu0Ju2D1E/03Ws95gKyUwkOaJVpw1jKI9bGAIq7VjAMyja/+2c+ eM0NQs2CBADK4GLgfAyTlkPde+PwVltvzTuikwZf2I/rOMQyciR5jaeuL652fgjj zmcyvhS/7HtjgFvHKk59OvPnx9AJmeUgqW+K0NeuhLxDBMXvv/5lis/+ewalxUaU IdM3FytJ65AcWIaJ5ImqiRqnSL2uez9GjhovkdC3gQrqgqnV7MI= =byw7 -----END PGP SIGNATURE----- --=-JTTqF2ds4lb3QBWrlI5L--