From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35267) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5I1e-0002BK-Mk for qemu-devel@nongnu.org; Wed, 17 Jun 2015 14:25:28 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Z5I1a-00005u-De for qemu-devel@nongnu.org; Wed, 17 Jun 2015 14:25:26 -0400 Received: from isrv.corpit.ru ([86.62.121.231]:33387) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Z5I1Z-00005U-Vl for qemu-devel@nongnu.org; Wed, 17 Jun 2015 14:25:22 -0400 Message-ID: <5581BB90.2030802@msgid.tls.msk.ru> Date: Wed, 17 Jun 2015 21:25:20 +0300 From: Michael Tokarev MIME-Version: 1.0 References: <553E0514.5030700@msgid.tls.msk.ru> <553E115B.40303@redhat.com> In-Reply-To: <553E115B.40303@redhat.com> Content-Type: multipart/mixed; boundary="------------080209020403060203090906" Subject: Re: [Qemu-devel] libcacard: use the library? List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Paolo Bonzini , qemu-devel This is a multi-part message in MIME format. --------------080209020403060203090906 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable 27.04.2015 13:37, Paolo Bonzini =D0=BF=D0=B8=D1=88=D0=B5=D1=82: >=20 >=20 > On 27/04/2015 11:44, Michael Tokarev wrote: >> Currently we link individual object files from libcacard >> to qemu-system binaries, this way (from Makefile.objs): >> >> libcacard-y +=3D libcacard/cac.o libcacard/event.o >> libcacard-y +=3D libcacard/vcard.o libcacard/vreader.o >> ... >> common-obj-$(CONFIG_SMARTCARD_NSS) +=3D $(libcacard-y) >> >> Why can't we use the actual library, and just add the >> linker flag, -Ilibcacard -lcacard? >=20 > Because that would require people to use "libtool --mode=3Dexecute gdb"= to > debug qemu. This is not a problem for me, but I know that some people > on the list are allergic to the GNU build tools. >=20 > I would be okay for this, and I would also be okay with making libcacar= d > standalone. Making it standalone would also bypass the problem of > verbose debugging command lines. You've already done most of the work > with your patches to stop using libqemuutil.a. As a small step in that > direction, I've sent a patch to remove use of qemu-common.h. >=20 > Somebody has to write some Autoconf/Automake and package it up, I guess= . Ok. I wrote small configure script (just a simple shell script, no auto*tools, since the configuration of it is stright-forward, we just need to check libglib and libnss versions using pkg-config and check if libtool works) and a small Makefile for libcacard. Now the question is what to do with it? How to make it external and where to put it? What to use for its version? How to migrate to its usage in qemu? I propose to put it in a separate git repository on qemu project site and remove it from qemu source, since it is definitely not a hard requiriment to have smartcard support. Or maybe we can keep it for a release in qemu source, adding it as a submodule, with a tweak to be able to use external lib instead of embedded copy if external is available. Thanks, /mjt --------------080209020403060203090906 Content-Type: text/plain; charset=UTF-8; name="configure" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="configure" IyEgL2Jpbi9zaAoKIyBkZWZhdWx0cwpjYz1jYwpjcm9zc19wcmVmaXg9CnNoYXJlZD0KCnBy ZWZpeD0vdXNyL2xvY2FsCmV4ZWNfcHJlZml4PScke3ByZWZpeH0nCmJpbmRpcj0nJHtleGVj X3ByZWZpeH0vYmluJwpsaWJkaXI9JyR7ZXhlY19wcmVmaXh9L2xpYicKaW5jbHVkZWRpcj0n JHtwcmVmaXh9L2luY2x1ZGUnCgpmb3Igb3B0IGluICIkQCI7IGRvCgogIG9wdGFyZz1gZXhw ciAieCRvcHQiIDogJ3hbXj1dKj1cKC4qXCknYAoKICBjYXNlICIkb3B0IiBpbgogIC0tY3Jv c3MtcHJlZml4PSopIGNyb3NzX3ByZWZpeD0iJG9wdGFyZyIgOzsKICAtLWVuYWJsZS1zaGFy ZWQpIHNoYXJlZD15ZXMgOzsKICAtLWRpc2FibGUtc2hhcmVkKSBzaGFyZWQ9bm8gOzsKCiAg LS1wcmVmaXg9KikgcHJlZml4PSIkb3B0YXJnIiA7OwogIC0tZXhlYy1wcmVmaXg9KikgZXhl Y19wcmVmaXg9IiRvcHRhcmciIDs7CiAgLS1saWJkaXI9KikgbGliZGlyPSIkb3B0YXJnIiA7 OwogIC0taW5jbHVkZWRpcj0qKSBpbmNsdWRlZGlyPSIkb3B0YXJnIiA7OwogIC0tbGliZXhl Y2Rpcj0qfFwKICAtLW1hbmRpcj0qfFwKICAtLWRhdGFkaXI9KnxcCiAgLS1kb2NkaXI9Knxc CiAgLS1zeXNjb25mZGlyPSp8XAogIC0tbG9jYWxzdGF0ZWRpcj0qfFwKICAtLXNiaW5kaXI9 KnxcCiAgLS1zaGFyZWRzdGF0ZWRpcj0qfFwKICAtLW9sZGluY2x1ZGVkaXI9KnxcCiAgLS1k YXRhcm9vdGRpcj0qfFwKICAtLWluZm9kaXI9KnxcCiAgLS1sb2NhbGVkaXI9KnxcCiAgLS1o dG1sZGlyPSp8XAogIC0tZHZpZGlyPSp8XAogIC0tcGRmZGlyPSp8XAogIC0tcHNkaXI9KikK ICAgIDs7ICMgVGhlc2UgYXV0b2NvbmYgc3dpdGNoZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQK ICAtLWhlbHApCiAgICBjYXQgPDxFT0YKVXNhZ2U6IC4vY29uZmlndXJlIFtvcHRpb25zXQpP cHRpb25zIChkZWZhdWx0cyBzaG93biBpbiBicmFja2V0cyk6CiAtLWhlbHAJCQlwcmludCB0 aGlzIGhlbHAgYW5kIGV4aXQKIC0tY3Jvc3MtcHJlZml4PVBGWAl1c2UgUEZYIGZvciBjb21w aWxlIHRvb2xzCiAtLXByZWZpeD1QRlgJCWluc3RhbGwgZGF0YSBpbiBQRlggWyRwcmVmaXhd CiAtLWV4ZWMtcHJlZml4PUVQRlgJaW5zdGFsbCBiaW5hcmllcyBpbiBFUEZYIFskZXhlY19w cmVmaXhdCiAtLWJpbmRpcj1CSU5ESVIJaW5zdGFsbCBiaW5hcmllcyBpbiBCSU5ESVIgWyRi aW5kaXJdCiAtLWxpYmRpcj1MSUJESVIJaW5zdGFsbCBsaWJyYXJpZXMgaW4gTElCRElSIFsk bGliZGlyXQogLS1pbmNsdWRlZGlyPUlOQ0RJUglpbnN0YWxsIGluY2x1ZGVzaW4gSU5DRElS IFskaW5jbHVkZWRpcl0KIC0tZGlzYWJsZS1zaGFyZWQsIC0tZW5hYmxlLXNoYXJlZAoJCQlk aXNhYmxlIG9yIGVuYWJsZSBzaGFyZWQgbGlicmFyeSBidWlsZAoJCQkoYSB3b3JraW5nIGxp YnRvb2wgaXMgbmVlZGVkIGZvciBzaGFyZWQpCkVudmlyb25tZW50IHZhcmlhYmxlczoKIEND LCBDRkxBR1MJdGhlIEMgY29tcGlsZXIgWyRjY10KIExELCBMREZMQUdTCWxpbmtlciBbXCRD Q10KIFBLR19DT05GSUcJcGtnLWNvbmZpZwogTElCVE9PTAlsaWJ0b29sCiBBUgkJYXIgKHRo ZSBhcmNoaXZlcikKRU9GCiAgICBleGl0IDA7OwoKICAqKSBlY2hvICJFOiB1bmtub3duIG9w dGlvbiBcYCRvcHQnIiA+JjI7IGV4aXQgMSA7OwogIGVzYWMKCmRvbmUKCiMgUHJlZmVycmVk IGNvbXBpbGVyCmlmIFsgLXogIiR7Q0N9JHtjcm9zc19wcmVmaXh9IiBdOyB0aGVuCiAgQ0M9 IiRjYyIKZWxzZQogIDogJHtDQzotJHtjcm9zc19wcmVmaXh9Z2NjfQpmaQo6ICR7TEQ6PSck e0NDfSd9CjogJHtMSUJUT09MOj0ke2Nyb3NzX3ByZWZpeH1saWJ0b29sfQo6ICR7UEtHX0NP TkZJRzo9JHtjcm9zc19wcmVmaXh9cGtnLWNvbmZpZ30KCmNsZWFudXAoKSB7CiAgcm0gLWYg Y29uZnRlc3QuKiBsaWJjb25mdGVzdC5sYQp9CmNsZWFudXAKcm0gLWYgY29uZmlnLmxvZwpl eGVjIDM+Y29uZmlnLmxvZwoKZXJyb3IoKSB7CiAgZWNobyAiRTogJCoiID4mMgogIGVjaG8g IkU6ICQqIiA+JjMKICBjbGVhbnVwCiAgZXhpdCAxCn0Kd2FybmluZygpIHsKICBlY2hvICJX OiAkKiIgPiYyCiAgZWNobyAiVzogJCoiID4mMwp9CgpoYXMoKSB7CiAgdHlwZSAiJDEiID4v ZGV2L251bGwgMj4mMQp9Cgpwa2dfY29uZmlnKCkgewogICMgUnVuIHBrZy1jb25maWcsIGNh cHR1cmluZyBpdHMgb3V0cHV0IHRvIHRoZSBsb2cKICBlY2hvICI9PSBydW5uaW5nOiAkUEtH X0NPTkZJRyAkQCIgPiYzCiAgJFBLR19DT05GSUcgIiRAIiA+JjMgMj4mMQp9CgppZiAhIGhh cyAkUEtHX0NPTkZJRyA7IHRoZW4KICBlcnJvciAicGtnLWNvbmZpZyBiaW5hcnkgJFBLR19D T05GSUcgbm90IGZvdW5kIgpmaQoKZ2xpYj1nbGliLTIuMAptaW5fZ2xpYl92ZXI9Mi4yMgpp ZiAhIHBrZ19jb25maWcgLS1hdGxlYXN0LXZlcnNpb249JG1pbl9nbGliX3ZlciAkZ2xpYiA7 IHRoZW4KICBlcnJvciAicmVxdWlyZWQgZ2xpYi0kbWluX2dsaWJfdmVyIG5vdCBmb3VuZCIK ZmkKR0xJQl9DRkxBR1M9YCRQS0dfQ09ORklHIC0tY2ZsYWdzICRnbGliYApHTElCX0xJQlM9 YCRQS0dfQ09ORklHIC0tbGlicyAkZ2xpYmAKCiMgY2hlY2sgZm9yIHNtYXJ0Y2FyZCBzdXBw b3J0CmlmICEgcGtnX2NvbmZpZyAtLWF0bGVhc3QtdmVyc2lvbj0zLjEyLjggbnNzIDsgdGhl bgogIGVycm9yICJOU1MgcGFja2FnZSBub3QgZm91bmQiCmZpCk5TU19DRkxBR1M9YCRQS0df Q09ORklHIC0tY2ZsYWdzIG5zc2AKTlNTX0xJQlM9YCRQS0dfQ09ORklHIC0tbGlicyBuc3Ng Cgpkb19saWJ0b29sKCkgewogIHRtcD0kMTsgc2hpZnQKICAjIFJ1biB0aGUgY29tcGlsZXIg dW5kZXIgbGlidG9vbCwgY2FwdHVyaW5nIGl0cyBvdXRwdXQgdG8gdGhlIGxvZy4KICBlY2hv ICIkTElCVE9PTCAkdG1wIC0tdGFnPUNDICRDQyAkQCIgPiYzCiAgJExJQlRPT0wgJHRtcCAt LXRhZz1DQyAkQ0MgIiRAIiA+JjMgMj4mMQp9CgppZiBbICIkc2hhcmVkIiA9IG5vIF07IHRo ZW4KICBMSUJUT09MPQplbHNlCiAgY2F0ID4gY29uZnRlc3QuYyA8PEVPRgp2b2lkICpmKHVu c2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbik7CnZvaWQgKmcodW5zaWduZWQgY2hhciAqYnVm LCBpbnQgbGVuKTsKdm9pZCAqZih1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pIHsgcmV0 dXJuICh2b2lkKikwTDsgfQp2b2lkICpnKHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikg eyByZXR1cm4gZihidWYsIGxlbik7IH0KRU9GCiAgaWYgZG9fbGlidG9vbCAtLW1vZGU9Y29t cGlsZSAkQ0ZMQUdTIC1jIC1mUElFIC1EUElFIC1vIGNvbmZ0ZXN0LmxvIGNvbmZ0ZXN0LmMg JiYgXAogICAgIGRvX2xpYnRvb2wgLS1tb2RlPWxpbmsgJExERkxBR1MgLW8gbGliY29uZnRl c3QubGEgY29uZnRlc3QubG8KICB0aGVuCiAgICA6CiAgZWxpZiBbICIkc2hhcmVkIiA9IHll cyBdOyB0aGVuCiAgICAgZXJyb3IgImxpYnRvb2wgY2FuIG5vdCBiZSB1c2VkLCBjYW4gbm90 IGJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMiCiAgZWxzZQogICAgd2FybmluZyAiZGlzYWJsaW5n IHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQsIG5vIHdvcmtpbmcgbGlidG9vbCBmb3VuZCIKICAg IExJQlRPT0w9CiAgZmkKZmkKCmNsZWFudXAKCmNhdCA+TWFrZWZpbGUudG1wIC0gTWFrZWZp bGUuaW4gPDxFT0YgfHwgZXhpdCAxCiMgTWFrZWZpbGUgZm9yIGxpYmNhY2FyZAojIEBjb25m aWd1cmVfb3V0cHV0QAoKcHJlZml4ID0gJHByZWZpeApleGVjX3ByZWZpeCA9ICRleGVjX3By ZWZpeApiaW5kaXIgPSAkYmluZGlyCmxpYmRpciA9ICRsaWJkaXIKaW5jbHVkZWRpciA9ICRp bmNsdWRlZGlyCgpDQyA9ICRDQwpDRkxBR1MgPSAkQ0ZMQUdTCkxEID0gJExECkxERkxBR1Mg PSAkTERGTEFHUwpMSUJUT09MID0gJExJQlRPT0wKQVIgPSAke0FSOi0ke2Nyb3NzX3ByZWZp eH1hcn0KUkFOTElCID0gJHtSQU5MSUI6LSR7Y3Jvc3NfcHJlZml4fXJhbmxpYn0KCklOU1RB TEwgPSBpbnN0YWxsClNFRCA9IHNlZAoKR0xJQl9DRkxBR1MgPSAkR0xJQl9DRkxBR1MKR0xJ Ql9MSUJTID0gJEdMSUJfTElCUwpOU1NfQ0ZMQUdTID0gJE5TU19DRkxBR1MKTlNTX0xJQlMg PSAkTlNTX0xJQlMKCiMgZW5kIGNvbmZpZ3VyYXRpb24gc2VjdGlvbgpFT0YKCm12IE1ha2Vm aWxlLnRtcCBNYWtlZmlsZQo= --------------080209020403060203090906 Content-Type: text/x-chdr; name="glib-compat.h" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="glib-compat.h" /* * GLIB Compatibility Functions * * Copyright IBM, Corp. 2013 * * Authors: * Anthony Liguori * Michael Tokarev * Paolo Bonzini * * This work is licensed under the terms of the GNU GPL, version 2 or later. * See the COPYING file in the top-level directory. * */ #ifndef QEMU_GLIB_COMPAT_H #define QEMU_GLIB_COMPAT_H #include #if !GLIB_CHECK_VERSION(2, 31, 0) /* before glib-2.31, GMutex and GCond was dynamic-only (there was a separate * GStaticMutex, but it didn't work with condition variables). * * Our implementation uses GOnce to fake a static implementation that does * not require separate initialization. * We need to rename the types to avoid passing our CompatGMutex/CompatGCond * by mistake to a function that expects GMutex/GCond. However, for ease * of use we keep the GLib function names. GLib uses macros for the * implementation, we use inline functions instead and undefine the macros. */ typedef struct CompatGMutex { GOnce once; } CompatGMutex; typedef struct CompatGCond { GOnce once; } CompatGCond; static inline gpointer do_g_mutex_new(gpointer unused) { return (gpointer) g_mutex_new(); } static inline void g_mutex_init(CompatGMutex *mutex) { mutex->once = (GOnce) G_ONCE_INIT; } static inline void g_mutex_clear(CompatGMutex *mutex) { g_assert(mutex->once.status != G_ONCE_STATUS_PROGRESS); if (mutex->once.retval) { g_mutex_free((GMutex *) mutex->once.retval); } mutex->once = (GOnce) G_ONCE_INIT; } static inline void (g_mutex_lock)(CompatGMutex *mutex) { g_once(&mutex->once, do_g_mutex_new, NULL); g_mutex_lock((GMutex *) mutex->once.retval); } #undef g_mutex_lock static inline gboolean (g_mutex_trylock)(CompatGMutex *mutex) { g_once(&mutex->once, do_g_mutex_new, NULL); return g_mutex_trylock((GMutex *) mutex->once.retval); } #undef g_mutex_trylock static inline void (g_mutex_unlock)(CompatGMutex *mutex) { g_mutex_unlock((GMutex *) mutex->once.retval); } #undef g_mutex_unlock static inline gpointer do_g_cond_new(gpointer unused) { return (gpointer) g_cond_new(); } static inline void g_cond_init(CompatGCond *cond) { cond->once = (GOnce) G_ONCE_INIT; } static inline void g_cond_clear(CompatGCond *cond) { g_assert(cond->once.status != G_ONCE_STATUS_PROGRESS); if (cond->once.retval) { g_cond_free((GCond *) cond->once.retval); } cond->once = (GOnce) G_ONCE_INIT; } static inline void (g_cond_wait)(CompatGCond *cond, CompatGMutex *mutex) { g_assert(mutex->once.status != G_ONCE_STATUS_PROGRESS); g_once(&cond->once, do_g_cond_new, NULL); g_cond_wait((GCond *) cond->once.retval, (GMutex *) mutex->once.retval); } #undef g_cond_wait static inline void (g_cond_broadcast)(CompatGCond *cond) { g_once(&cond->once, do_g_cond_new, NULL); g_cond_broadcast((GCond *) cond->once.retval); } #undef g_cond_broadcast static inline void (g_cond_signal)(CompatGCond *cond) { g_once(&cond->once, do_g_cond_new, NULL); g_cond_signal((GCond *) cond->once.retval); } #undef g_cond_signal /* before 2.31 there was no g_thread_new() */ static inline GThread *g_thread_new(const char *name, GThreadFunc func, gpointer data) { GThread *thread = g_thread_create(func, data, TRUE, NULL); if (!thread) { g_error("creating thread"); } return thread; } #else #define CompatGMutex GMutex #define CompatGCond GCond #endif /* glib 2.31 */ #endif --------------080209020403060203090906 Content-Type: text/plain; charset=UTF-8; name="Makefile.in" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="Makefile.in" IyBNYWtlZmlsZSBmb3IgbGliY2FjYXJkCgpsaWJjYWNhcmRfaW5jbHVkZWRpciA9ICR7aW5j bHVkZWRpcn0vY2FjYXJkCgpsaWJjYWNhcmRfU1JDUyA9IGNhYy5jIGV2ZW50LmMgdmNhcmQu YyB2cmVhZGVyLmMgXAogdmNhcmRfZW11bF9uc3MuYyB2Y2FyZF9lbXVsX3R5cGUuYyBjYXJk Xzc4MTYuYyBcCiB2Y2FyZHQuYwoKYWxsOiB2c2NjbGllbnQKCi5TVUZGSVhFUzoKLlNVRkZJ WEVTOiAuYyAubyAubG8KCkNPTVBJTEUgOj0gJHtDQ30gJHtDRkxBR1N9ICR7R0xJQl9DRkxB R1N9ICR7TlNTX0NGTEFHU30KTElOSyA6PSAke0xEfSAke0xERkxBR1N9CgouYy5vOgoJJHtD T01QSUxFfSAtYyAtbyAkQCAkPAoKaWZuZXEgKCR7TElCVE9PTH0sKQojIHNoYXJlZCBsaWJy YXJ5IGJ1aWxkCkxUIDo9ICR7TElCVE9PTH0gLS10YWc9Q0MKCi5jLmxvOgoJJHtMVH0gLS1t b2RlPWNvbXBpbGUgJHtDT01QSUxFfSAtYyAtbyAkQCAkPAoKTFRBIDo9IGxhCmxpYmNhY2Fy ZC5sYTogJHtsaWJjYWNhcmRfU1JDUzouYz0ubG99Cgkke0xUfSAtLW1vZGU9bGluayAke0xJ Tkt9IC1ycGF0aCAke2xpYmRpcn0gLWV4cG9ydC1zeW1ib2xzIGxpYmNhY2FyZC5zeW1zIC1v ICRAICReICR7R0xJQl9MSUJTfSAke05TU19MSUJTfQp2c2NjbGllbnQ6IHZzY2NsaWVudC5v IGxpYmNhY2FyZC5sYQoJJHtMVH0gLS1tb2RlPWxpbmsgJHtMSU5LfSAtbyAkQCB2c2NjbGll bnQubyBsaWJjYWNhcmQubGEgJHtHTElCX0xJQlN9CkxUX0lOU1RBTEwgOj0gJHtMVH0gLS1t b2RlPWluc3RhbGwgJHtJTlNUQUxMfQoKZWxzZQojIHN0YXRpYyBidWlsZAoKTFRBIDo9IGEK bGliY2FjYXJkLmE6ICR7bGliY2FjYXJkX1NSQ1M6LmM9Lm99Cgkke0FSfSBydiAkQCAkXgoJ JHtSQU5MSUJ9ICRACnZzY2NsaWVudDogdnNjY2xpZW50Lm8gbGliY2FjYXJkLmEKCSR7TElO S30gLW8gJEAgdnNjY2xpZW50Lm8gLUwuIC1sY2FjYXJkICR7R0xJQl9MSUJTfSAke05TU19M SUJTfQpMVF9JTlNUQUxMIDo9ICR7SU5TVEFMTH0KCmVuZGlmCgppbnN0YWxsOiBsaWJjYWNh cmQuJHtMVEF9IHZzY2NsaWVudAoJbWtkaXIgLXAgJyR7REVTVERJUn0ke2xpYmRpcn0nICck e0RFU1RESVJ9JHtsaWJkaXJ9L3BrZ2NvbmZpZycgJyR7REVTVERJUn0ke2xpYmNhY2FyZF9p bmNsdWRlZGlyfScgJyR7REVTVERJUn0ke2JpbmRpcn0nCgkke0xUX0lOU1RBTEx9IGxpYmNh Y2FyZC4ke0xUQX0gJyR7REVTVERJUn0ke2xpYmRpcn0nCgkke0xUX0lOU1RBTEx9IHZzY2Ns aWVudCAnJHtERVNURElSfSR7YmluZGlyfS92c2NjbGllbnQnCgkke1NFRH0gXAoJIC1lICdz fEBMSUJESVJAfCR7bGliZGlyfXwnIFwKCSAtZSAnc3xASU5DTFVERURJUkB8JHtsaWJjYWNh cmRfaW5jbHVkZWRpcn18JyBcCgkgLWUgJ3N8QFZFUlNJT05AfCR7VkVSU0lPTn18JyBcCgkg LWUgJ3N8QFBSRUZJWEB8JHtwcmVmaXh9fCcgXAoJIGxpYmNhY2FyZC5wYy5pbiA+ICcke0RF U1RESVJ9JHtsaWJkaXJ9L3BrZ2NvbmZpZycvbGliY2FjYXJkLnBjCgpjbGVhbjoKCXJtIC1m ICoubyAqLmxvIGxpYmNhY2FyZC5hIGxpYmNhY2FyZC5sYSB2c2NjbGllbnQgY29uZmlnLmxv ZwoJcm0gLXJmIC5saWJzCmRpc3RjbGVhbjogY2xlYW4KCXJtIC1mIE1ha2VmaWxlCg== --------------080209020403060203090906--