Path: csiph.com!news.neodome.net!news.uzoreto.com!newsfeed.xs4all.nl!newsfeed7.news.xs4all.nl!bofh.it!news.nic.it!robomod From: =?UTF-8?Q?=C3=89tienne?= Mollier Newsgroups: linux.debian.bugs.dist,linux.debian.maint.python Subject: Bug#1001657: Ball fails its autopkgtest - how to properly deal with sip files? Date: Tue, 14 Dec 2021 23:20:01 +0100 Message-ID: References: X-Original-To: Andreas Tille X-Mailbox-Line: From debian-bugs-dist-request@lists.debian.org Tue Dec 14 22:15:08 2021 Old-Return-Path: X-Spam-Flag: NO X-Spam-Score: -3.751 Reply-To: =?UTF-8?Q?=C3=89tienne?= Mollier , 1001657@bugs.debian.org Resent-To: debian-bugs-dist@lists.debian.org Resent-Cc: Debian Med Packaging Team X-Debian-Pr-Message: followup 1001657 X-Debian-Pr-Package: src:ball X-Debian-Pr-Keywords: help ftbfs X-Debian-Pr-Source: ball X-Ea-Auth: TyClEjVk/xevM64cyXVPnPUYJrOfbD3I4GOAxVQNvdIC0PlqUix+CuZUpG9vePwf7yhT7/WfkZ6kGSxvoSxbsO7sk+JBi1TZkiZZIRdAErU= MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="Peblw68vwqywfzHd" Content-Disposition: inline X-Debian-Message: from BTS X-Mailing-List: archive/latest/1695804 List-ID: List-URL: Approved: robomod@news.nic.it Lines: 545 Organization: linux.* mail to news gateway Sender: robomod@news.nic.it X-Original-Cc: 1001657@bugs.debian.org, Nilesh Patra , Debian Med Packaging Team , Debian Python X-Original-Date: Tue, 14 Dec 2021 23:13:21 +0100 X-Original-Message-ID: X-Original-References: <20210923114518.GR28115@an3as.eu> <163942466909.15803.16005549060899380719.reportbug@localhost> Xref: csiph.com linux.debian.bugs.dist:1085717 linux.debian.maint.python:13783 --Peblw68vwqywfzHd Content-Type: multipart/mixed; boundary="W/4ZeVACTkOBakUg" Content-Disposition: inline --W/4ZeVACTkOBakUg Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =C3=89tienne Mollier, on 2021-12-14: > However, once the sip file is caught, the package fails to build > from source due to various errors in the generated code. The > patch also addresses one of them in its second hunk. I think I > was stuck on some "overrides" related errors, but they were > interleaved within sip output, I can send a proper log later > this week after an overnight build if needed. I forgot I had one other patch to address PyString issues, part of the ftbfs. And also forgot to mention that I had to enforce -DSIP_LIBRARIES=3D/usr/lib/python3/dist-packages from the cmake call in d/rules. In hope this helps, --=20 =C3=89tienne Mollier Fingerprint: 8f91 b227 c7d6 f2b1 948c 8236 793c f67e 8f0d 11da Sent from /dev/pts/1, please excuse my verbosity. --W/4ZeVACTkOBakUg Content-Type: text/x-diff; charset=utf-8 Content-Disposition: attachment; filename="fix-missing-PyString.patch" Content-Transfer-Encoding: quoted-printable --- ball.orig/source/PYTHON/pyCAPIKernel.C +++ ball/source/PYTHON/pyCAPIKernel.C @@ -78,14 +78,14 @@ if(type) { auto name =3D PyObject_GetAttrString(type, "__name__"); - auto sname =3D name ? PyString_AsString(name) : nullptr; + auto sname =3D name ? PyBytes_AsString(name) : nullptr; if(sname) err << sname << ": "; Py_DecRef(name); Py_DecRef(type); } =20 // error message - auto svalue =3D value ? PyString_AsString(value) : nullptr; + auto svalue =3D value ? PyBytes_AsString(value) : nullptr; err << (svalue ? svalue : "(no error message given)"); Py_DecRef(value); =20 @@ -121,7 +121,7 @@ auto cio =3D PyObject_GetAttrString(main_module_, "__BALL_CIO"); auto cio_val =3D PyObject_GetAttrString(cio, "getvalue"); auto cio_f =3D PyObject_CallFunction(cio_val, nullptr); - auto ret =3D std::make_pair(true, PyString_AsString(cio_f)= ); + auto ret =3D std::make_pair(true, PyBytes_AsString(cio_f)); Py_DecRef(cio_f); Py_DecRef(cio_val); Py_DecRef(cio); @@ -177,7 +177,7 @@ =20 for (const auto& pair: args) { - auto val =3D PyString_FromString(pair.second.c_str()); + auto val =3D PyBytes_FromString(pair.second.c_str()); if (!val) { Log.error() << "[PyInterpreter] Could not create parameter " @@ -217,7 +217,7 @@ return nullptr; } =20 - auto mod_name =3D PyString_FromString(name.c_str()); + auto mod_name =3D PyBytes_FromString(name.c_str()); =20 PyObject* module =3D nullptr; if (PyDict_Contains(module_dict, mod_name)) --- ball.orig/source/PYTHON/EXTENSIONS/BALL/PDBAtom.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/PDBAtom.sip @@ -48,7 +48,7 @@ virtual bool isValid() const throw(); SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("PDBAtom ") + sipCpp->getNam= e() + sipRes =3D PyBytes_FromString(String(String("PDBAtom ") + sipCpp->getName= () + " { " + sipCpp->getElement().getSymbol() + " @ (" + String(sipCpp->getPosition().x) + " " + String(sipCpp->getPosition().y= ) + " " + String(sipCpp->getPosition().z) + " }").c_str()); --- ball.orig/source/PYTHON/EXTENSIONS/BALL/angle.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/angle.sip @@ -46,6 +46,6 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(sipCpp->toRadian()).c_str()); + sipRes =3D PyBytes_FromString(String(sipCpp->toRadian()).c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/atom.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/atom.sip @@ -23,12 +23,12 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(*sipCpp).c_str()); + sipRes =3D PyBytes_FromString(String(*sipCpp).c_str()); %End =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(*sipCpp).c_str()); + sipRes =3D PyBytes_FromString(String(*sipCpp).c_str()); %End }; =20 @@ -148,7 +148,7 @@ // convert the atom to a string representation SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Atom ") + sipCpp->getName() + sipRes =3D PyBytes_FromString(String(String("Atom ") + sipCpp->getName() + " { " + sipCpp->getElement().getSymbol() + " @ (" + String(sipCpp->getPosition().x) + " " + String(sipCpp->getPosition().y= ) + " " + String(sipCpp->getPosition().z) + ") }").c_str()); @@ -156,7 +156,7 @@ =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Atom ") + sipCpp->getName() + sipRes =3D PyBytes_FromString(String(String("Atom ") + sipCpp->getName() + " { " + sipCpp->getElement().getSymbol() + " @ (" + String(sipCpp->getPosition().x) + " " + String(sipCpp->getPosition().y= ) + " " + String(sipCpp->getPosition().z) + " }").c_str()); --- ball.orig/source/PYTHON/EXTENSIONS/BALL/atomContainer.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/atomContainer.sip @@ -69,7 +69,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("AtomContainer ") + sipCpp->= getName() + sipRes =3D PyBytes_FromString(String(String("AtomContainer ") + sipCpp->g= etName() + " { " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/bond.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/bond.sip @@ -103,6 +103,6 @@ } tmp +=3D " }"; } - return PyString_FromString(tmp.c_str()); + return PyBytes_FromString(tmp.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/box3.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/box3.sip @@ -29,6 +29,6 @@ tmp +=3D String(sipCpp->getPoint().x) + " "; tmp +=3D String(sipCpp->getPoint().y) + " "; tmp +=3D String(sipCpp->getPoint().z) + ") }"; - sipRes =3D PyString_FromString(tmp.c_str()); + sipRes =3D PyBytes_FromString(tmp.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/chain.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/chain.sip @@ -44,7 +44,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Chain ") + sipCpp->getName() + sipRes =3D PyBytes_FromString(String(String("Chain ") + sipCpp->getName() + " { " + String(sipCpp->countResidues()) + " residues }").c_str()); %End =20 --- ball.orig/source/PYTHON/EXTENSIONS/BALL/file.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/file.sip @@ -66,7 +66,7 @@ case (int)std::ios::in: mode_string =3D "std::ios::in"; break; default: mode_string =3D ""; } - sipRes =3D PyString_FromString(mode_string); + sipRes =3D PyBytes_FromString(mode_string); %End =20 %ConvertToTypeCode --- ball.orig/source/PYTHON/EXTENSIONS/BALL/fragment.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/fragment.sip @@ -18,7 +18,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Fragment ") + sipCpp->getNa= me() + sipRes =3D PyBytes_FromString(String(String("Fragment ") + sipCpp->getNam= e() + " { " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/molecule.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/molecule.sip @@ -40,7 +40,7 @@ =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Molecule ") + sipCpp->getNa= me() + sipRes =3D PyBytes_FromString(String(String("Molecule ") + sipCpp->getNam= e() + " { " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/nucleicAcid.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/nucleicAcid.sip @@ -27,14 +27,14 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("NucleicAcid ") + sipCpp->ge= tName() + sipRes =3D PyBytes_FromString(String(String("NucleicAcid ") + sipCpp->get= Name() + " { " + String(sipCpp->countNucleotides()) + " nucleotides, " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(String("NucleicAcid ") + sipCpp->ge= tName() + sipRes =3D PyBytes_FromString(String(String("NucleicAcid ") + sipCpp->get= Name() + " { " + String(sipCpp->countNucleotides()) + " nucleotides, " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End --- ball.orig/source/PYTHON/EXTENSIONS/BALL/options.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/options.sip @@ -38,7 +38,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Options ") + sipCpp->getNam= e() + sipRes =3D PyBytes_FromString(String(String("Options ") + sipCpp->getName= () + " { " + String(sipCpp->getSize()) + " entries }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/peptideBuilder.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/peptideBuilder.sip @@ -22,7 +22,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString((String("{ ") + sipCpp->getType() + " " + + sipRes =3D PyBytes_FromString((String("{ ") + sipCpp->getType() + " " + String(sipCpp->getPhi().toDegree()) + " " + String(sipCpp->getPsi().toDegree()) + " " + String(sipCpp->getOmega().toDegree()) + " }").c_str()); --- ball.orig/source/PYTHON/EXTENSIONS/BALL/property.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/property.sip @@ -25,7 +25,7 @@ %MethodCode if(sipCpp =3D=3D 0) { - sipRes =3D PyString_FromString(""); + sipRes =3D PyBytes_FromString(""); } else { @@ -60,7 +60,7 @@ output +=3D BALL::String("Smart Object, Value: ") + BALL::String((unsi= gned long) &*sipCpp->getSmartObject()); break; } - sipRes =3D PyString_FromString(output.c_str()); + sipRes =3D PyBytes_FromString(output.c_str()); } %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/protein.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/protein.sip @@ -54,7 +54,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Protein ") + sipCpp->getNam= e() + sipRes =3D PyBytes_FromString(String(String("Protein ") + sipCpp->getName= () + " { " + String(sipCpp->countResidues()) + " residues }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/residue.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/residue.sip @@ -67,7 +67,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("Residue ") + sipCpp->getNam= e() + sipCpp->getID() + sipRes =3D PyBytes_FromString(String(String("Residue ") + sipCpp->getName= () + sipCpp->getID() + " { " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/secondaryStructure.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/secondaryStructure.sip @@ -49,13 +49,13 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - return PyString_FromString(String(String("SecondaryStructure ") + sipCpp-= >getName() + return PyBytes_FromString(String(String("SecondaryStructure ") + sipCpp->= getName() + " { " + String(sipCpp->countResidues()) + " residues }").c_str()); %End =20 SIP_PYOBJECT __repr__(); %MethodCode - return PyString_FromString(String(String("SecondaryStructure ") + sipCpp-= >getName() + return PyBytes_FromString(String(String("SecondaryStructure ") + sipCpp->= getName() + " { " + String(sipCpp->countResidues()) + " residues }").c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/simpleBox3.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/simpleBox3.sip @@ -40,6 +40,6 @@ tmp +=3D String(sipCpp->b.x) + " "; tmp +=3D String(sipCpp->b.y) + " "; tmp +=3D String(sipCpp->b.z) + ") }"; - sipRes =3D PyString_FromString(tmp.c_str()); + sipRes =3D PyBytes_FromString(tmp.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/string.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/string.sip @@ -166,11 +166,11 @@ %MethodCode if (sipCpp =3D=3D 0) { - sipRes =3D PyString_FromString(""); + sipRes =3D PyBytes_FromString(""); } else { - sipRes =3D PyString_FromString(sipCpp->c_str()); + sipRes =3D PyBytes_FromString(sipCpp->c_str()); } %End =20 @@ -178,17 +178,17 @@ %MethodCode if (sipCpp =3D=3D 0) { - sipRes =3D PyString_FromString(""); + sipRes =3D PyBytes_FromString(""); } else { - sipRes =3D PyString_FromString(sipCpp->c_str()); + sipRes =3D PyBytes_FromString(sipCpp->c_str()); } %End =20 %ConvertToTypeCode if (sipIsErr =3D=3D NULL) - return (PyString_Check(sipPy) || BALL_IS_SUBCLASS_INSTANCE(sipPy, String= )); + return (PyBytes_Check(sipPy) || BALL_IS_SUBCLASS_INSTANCE(sipPy, String)= ); =20 if (sipPy =3D=3D Py_None) { @@ -196,9 +196,9 @@ return 1; } =20 - if (PyString_Check(sipPy)) + if (PyBytes_Check(sipPy)) { - *sipCppPtr =3D new String(PyString_AS_STRING(sipPy)); + *sipCppPtr =3D new String(PyBytes_AS_STRING(sipPy)); return 1; } =20 --- ball.orig/source/PYTHON/EXTENSIONS/BALL/system.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/system.sip @@ -67,7 +67,7 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("System ") + sipCpp->getName= () + sipRes =3D PyBytes_FromString(String(String("System ") + sipCpp->getName() + " { " + String(sipCpp->countMolecules()) + " molecules, " + String(sipCpp->countAtoms()) + " atoms }").c_str()); %End --- ball.orig/source/PYTHON/EXTENSIONS/BALL/timeStamp.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/timeStamp.sip @@ -30,7 +30,7 @@ String usec_str(sipCpp->getMicroSeconds() / 1.0e6); time_str.append(usec_str.after(".")); =20 - sipRes =3D PyString_FromString(time_str.c_str()); + sipRes =3D PyBytes_FromString(time_str.c_str()); %End }; =20 @@ -61,6 +61,6 @@ String usec_str(sipCpp->getTime().getMicroSeconds() / 1.0e6); time_str.append(usec_str.after(".")); =20 - sipRes =3D PyString_FromString(time_str.c_str()); + sipRes =3D PyBytes_FromString(time_str.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/vector2.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/vector2.sip @@ -56,6 +56,6 @@ tmp =3D "("; tmp +=3D String(sipCpp->x) + " "; tmp +=3D String(sipCpp->y) + ")"; - sipRes =3D PyString_FromString(tmp.c_str()); + sipRes =3D PyBytes_FromString(tmp.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/vector3.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/vector3.sip @@ -66,6 +66,6 @@ tmp +=3D String(sipCpp->x) + " "; tmp +=3D String(sipCpp->y) + " "; tmp +=3D String(sipCpp->z) + ")"; - sipRes =3D PyString_FromString(tmp.c_str()); + sipRes =3D PyBytes_FromString(tmp.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/BALL/version.sip +++ ball/source/PYTHON/EXTENSIONS/BALL/version.sip @@ -21,6 +21,6 @@ =20 SIP_PYOBJECT __str__(); %MethodCode - return PyString_FromString(VersionInfo::getVersion()); + return PyBytes_FromString(VersionInfo::getVersion()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/VIEW/colorRGBA.sip +++ ball/source/PYTHON/EXTENSIONS/VIEW/colorRGBA.sip @@ -43,7 +43,7 @@ String s("ColorRGBA {"); s +=3D (String) *sipCpp; s +=3D " }"; - sipRes =3D PyString_FromString(s.c_str()); + sipRes =3D PyBytes_FromString(s.c_str()); %End =20 SIP_PYOBJECT __repr__(); @@ -51,6 +51,6 @@ String s("ColorRGBA {"); s +=3D (String) *sipCpp; s +=3D " }"; - sipRes =3D PyString_FromString(s.c_str()); + sipRes =3D PyBytes_FromString(s.c_str()); %End }; --- ball.orig/source/PYTHON/EXTENSIONS/VIEW/geometricObject.sip +++ ball/source/PYTHON/EXTENSIONS/VIEW/geometricObject.sip @@ -61,7 +61,7 @@ // convert to a string representation SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("GeometricObject") + sipRes =3D PyBytes_FromString(String(String("GeometricObject") + " { " + " Composite: " + String((long int)sipCpp->getComposite()) + " }").c_str()); @@ -69,7 +69,7 @@ =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(String("GeometricObject") + sipRes =3D PyBytes_FromString(String(String("GeometricObject") + " { " + " Composite: " + String((long int)sipCpp->getComposite()) + " }").c_str()); --- ball.orig/source/PYTHON/EXTENSIONS/VIEW/gridVisualisation.sip +++ ball/source/PYTHON/EXTENSIONS/VIEW/gridVisualisation.sip @@ -38,7 +38,7 @@ // convert to a string representation SIP_PYOBJECT __str__(); %MethodCode - sipRes =3D PyString_FromString(String(String("GridVisualisation ") + sipRes =3D PyBytes_FromString(String(String("GridVisualisation ") + " { " + " Grid: " + String((long int)sipCpp->getGrid()) + " Texture: " + String(sipCpp->getTexture()) @@ -47,7 +47,7 @@ =20 SIP_PYOBJECT __repr__(); %MethodCode - sipRes =3D PyString_FromString(String(String("GridVisualisation ") + sipRes =3D PyBytes_FromString(String(String("GridVisualisation ") + " { " + " Grid: " + String((long int)sipCpp->getGrid()) + " Texture: " + String(sipCpp->getTexture()) --W/4ZeVACTkOBakUg-- --Peblw68vwqywfzHd Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEj5GyJ8fW8rGUjII2eTz2fo8NEdoFAmG5FwEACgkQeTz2fo8N EdrQ5Q/+IQdjDnj3oPldlMqm/Dh0qL8bJLnEsoWtUrEi2MOQm/Dlh3hzLkezPLdT n/s8UDZmknUSFAVZo0UEvJ788kYsMlr5nNogv0hxtAej6BFPNE6kSn2ChfcgLQHV iaeGwedUODAxOtUhKyPtKJtNa3KPLvAVEotcQyZz9vPliLv6kyh+ENGuQK7kyT/h /2NTcPEMCGbyeKS00BwRU5H5aiBSK639z37yHfqx3f5bhfFebNKM26JOeFweFl3H gzK5Rj1UFf40zNC15momh89BQA7kMRbu2yyYIgFOp3so9CraOhI3WjEFLtrmKNdH nt6WsMY4YAe6Y0kag7xPO5qAPSne06ET0Pe36ZrSfCKJgCKJ847rF2jSq/n1HWKb NngY5qIBXyIwMcdq2c0XT/1T4fKN5GRokyJAdW7sL1Lv/pg5/DT4bmPjAq3xzIZS pYQ8BXetg8jEtlU7Tf+A2Y0N/GQDTkEKOpG2lrCK9EzxngBRBjm16B69SDZBrdQj W3aQUh7GxJTrpBDxGJPBrFpsH4B+x50gJtviaNmbUPgIaNsQCrSrApKcZGKwmUwZ VCpSDkz5k5Wvf2cdkpnP7VIdPaM5yhmIH7jymcxNUvizYFSiDo9KS6lCQhfPeV6a VFROWqj3mOLjj+ZOXq0g8T1EhKAvYJrv2Nr4ne0KajryLGYvJxc= =bylb -----END PGP SIGNATURE----- --Peblw68vwqywfzHd--