Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1YMp3Y-00010f-Nf for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Feb 2015 02:35:37 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.80) (envelope-from ) id 1YMp3X-0002qZ-G9 for pgsql-hackers@arkaria.postgresql.org; Sun, 15 Feb 2015 02:35:35 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.80) (envelope-from ) id 1YMp3T-0002qQ-RK for pgsql-hackers@postgresql.org; Sun, 15 Feb 2015 02:35:32 +0000 Received: from [2600:3c00::f03c:91ff:fe69:8d76] (helo=mail.thelabyrinth.net) by magus.postgresql.org with esmtps (TLS1.1:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.80) (envelope-from ) id 1YMp3F-0003gh-0M for pgsql-hackers@postgresql.org; Sun, 15 Feb 2015 02:35:29 +0000 Received: from theseus.local (unknown [73.0.171.94]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: dsteele) by mail.thelabyrinth.net (Postfix) with ESMTPSA id A68C712D2D for ; Sun, 15 Feb 2015 02:34:54 +0000 (UTC) Message-ID: <54E005CC.1060605@pgmasters.net> Date: Sat, 14 Feb 2015 21:34:52 -0500 From: David Steele User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:31.0) Gecko/20100101 Thunderbird/31.4.0 MIME-Version: 1.0 To: pgsql-hackers@postgresql.org Subject: Auditing extension for PostgreSQL (Take 2) OpenPGP: id=A2739CF3 Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="1adMNuBcwfArGS0kNeoa5pjIR0ScR47th" X-Host-Lookup-Failed: Reverse DNS lookup failed for 2600:3c00::f03c:91ff:fe69:8d76 (failed) X-Pg-Spam-Score: -1.1 (-) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --1adMNuBcwfArGS0kNeoa5pjIR0ScR47th Content-Type: multipart/mixed; boundary="------------020605060204080802000702" This is a multi-part message in MIME format. --------------020605060204080802000702 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable I've posted a couple of messages over the last few weeks about the work I've been doing on the pg_audit extension. The lack of response could be due to either universal acclaim or complete apathy, but in any case I think this is a very important topic so I want to give it another try. I've extensively reworked the code that was originally submitted by 2ndQuandrant. This is not an indictment of their work, but rather an attempt to redress concerns that were expressed by members of the community. I've used core functions to determine how audit events should be classified and simplified and tightened the code wherever possible. I've removed deparse and event triggers and opted for methods that rely only on existing hooks. In my last message I provided numerous examples of configuration, usage, and output which I hoped would alleviate concerns of complexity. I've also written a ton of unit tests to make sure that the code works as expected. Auditing has been a concern everywhere I've used or introduced PostgreSQL. Over time I've developed a reasonably comprehensive (but complex) system of triggers, tables and functions to provide auditing for customers. While this has addressed most requirements, there are always questions of auditing aborted transactions, DDL changes, configurability, etc. which I have been unable to satisfy. There has been some discussion of whether or not this module needs to be in contrib. One reason customers trust contrib is that the modules are assumed to be held to a higher standard than code found on GitHub. This has already been pointed out. But I believe another important reason is that they know packages will be made available for a variety of platforms, and bugs are more likely to be experienced by many users and not just a few (or one). For this reason my policy is not to run custom-compiled code in production. This is especially true for something as mission critical as a relational database. I realize this is not an ideal solution. Everybody (including me) wants something that is in core with real policies and more options. It's something that I am personally really eager to work on. But the reality is that's not going to happen for 9.5 and probably not for 9.6 either. Meanwhile, I believe the lack of some form of auditing is harming adoption of PostgreSQL, especially in the financial and government sector= s. The patch I've attached satisfies the requirements that I've had from customers in the past. I'm confident that if it gets out into the wild it will bring all kinds of criticism and comments which will be valuable in designing a robust in-core solution. I'm submitting this patch to the Commitfest. I'll do everything I can to address the concerns of the community and I'm happy to provide more examples as needed. I'm hoping the sgml docs I've provided with the patch will cover any questions, but of course feedback is always appreciated. -- - David Steele david@pgmasters.net --------------020605060204080802000702 Content-Type: text/plain; charset=UTF-8; x-mac-type="0"; x-mac-creator="0"; name="pg_audit-v1.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="pg_audit-v1.patch" ZGlmZiAtLWdpdCBhL2NvbnRyaWIvTWFrZWZpbGUgYi9jb250cmliL01ha2VmaWxlCmluZGV4 IDE5NWQ0NDcuLmQ4ZTc1ZjQgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIvTWFrZWZpbGUKKysrIGIv Y29udHJpYi9NYWtlZmlsZQpAQCAtMjksNiArMjksNyBAQCBTVUJESVJTID0gXAogCQlwYWdl aW5zcGVjdAlcCiAJCXBhc3N3b3JkY2hlY2sJXAogCQlwZ19hcmNoaXZlY2xlYW51cCBcCisJ CXBnX2F1ZGl0CVwKIAkJcGdfYnVmZmVyY2FjaGUJXAogCQlwZ19mcmVlc3BhY2VtYXAgXAog CQlwZ19wcmV3YXJtCVwKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfYXVkaXQvTWFrZWZpbGUg Yi9jb250cmliL3BnX2F1ZGl0L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjMyYmM2ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250cmliL3BnX2F1ZGl0 L01ha2VmaWxlCkBAIC0wLDAgKzEsMjAgQEAKKyMgcGdfYXVkaXQvTWFrZWZpbGUKKworTU9E VUxFID0gcGdfYXVkaXQKK01PRFVMRV9iaWcgPSBwZ19hdWRpdAorT0JKUyA9IHBnX2F1ZGl0 Lm8KKworRVhURU5TSU9OID0gcGdfYXVkaXQKKworREFUQSA9IHBnX2F1ZGl0LS0xLjAuMC5z cWwKKworaWZkZWYgVVNFX1BHWFMKK1BHX0NPTkZJRyA9IHBnX2NvbmZpZworUEdYUyA6PSAk KHNoZWxsICQoUEdfQ09ORklHKSAtLXBneHMpCitpbmNsdWRlICQoUEdYUykKK2Vsc2UKK3N1 YmRpciA9IGNvbnRyaWIvcGdfYXVkaXQKK3RvcF9idWlsZGRpciA9IC4uLy4uCitpbmNsdWRl ICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCitpbmNsdWRlICQodG9wX3Ny Y2RpcikvY29udHJpYi9jb250cmliLWdsb2JhbC5taworZW5kaWYKZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQtLTEuMC4wLnNxbCBiL2NvbnRyaWIvcGdfYXVkaXQv cGdfYXVkaXQtLTEuMC4wLnNxbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li4yZWVlM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udHJpYi9wZ19hdWRpdC9wZ19hdWRp dC0tMS4wLjAuc3FsCkBAIC0wLDAgKzEsNCBAQAorLyogcGdfYXVkaXQvcGdfYXVkaXQtLTEu MC4wLnNxbCAqLworCistLSBjb21wbGFpbiBpZiBzY3JpcHQgaXMgc291cmNlZCBpbiBwc3Fs LCByYXRoZXIgdGhhbiB2aWEgQ1JFQVRFIEVYVEVOU0lPTgorXGVjaG8gVXNlICJDUkVBVEUg RVhURU5TSU9OIHBnX2F1ZGl0IiB0byBsb2FkIHRoaXMgZmlsZS5ccXVpdApkaWZmIC0tZ2l0 IGEvY29udHJpYi9wZ19hdWRpdC9wZ19hdWRpdC5jIGIvY29udHJpYi9wZ19hdWRpdC9wZ19h dWRpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOTE0YWMKLS0t IC9kZXYvbnVsbAorKysgYi9jb250cmliL3BnX2F1ZGl0L3BnX2F1ZGl0LmMKQEAgLTAsMCAr MSwxMDk5IEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcGdfYXVkaXQuYwor ICoKKyAqIEFuIGF1ZGl0aW5nIGV4dGVuc2lvbiBmb3IgUG9zdGdyZVNRTC4gSW1wcm92ZXMg b24gc3RhbmRhcmQgc3RhdGVtZW50IGxvZ2dpbmcKKyAqIGJ5IGFkZGluZyBtb3JlIGxvZ2dp bmcgY2xhc3Nlcywgb2JqZWN0IGxldmVsIGxvZ2dpbmcsIGFuZCBwcm92aWRpbmcKKyAqIGZ1 bGx5LXF1YWxpZmllZCBvYmplY3QgbmFtZXMgZm9yIGFsbCBETUwgYW5kIG1hbnkgRERMIHN0 YXRlbWVudHMuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTUsIFBvc3RncmVTUUwg R2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKgorICogSURFTlRJRklDQVRJT04KKyAqCQkg IGNvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3YXJtLmMKKyAqLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAiYWNjZXNz L2h0dXBfZGV0YWlscy5oIgorI2luY2x1ZGUgImFjY2Vzcy9zeXNhdHRyLmgiCisjaW5jbHVk ZSAiYWNjZXNzL3hhY3QuaCIKKyNpbmNsdWRlICJjYXRhbG9nL2NhdGFsb2cuaCIKKyNpbmNs dWRlICJjYXRhbG9nL29iamVjdGFjY2Vzcy5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdfY2xh c3MuaCIKKyNpbmNsdWRlICJjYXRhbG9nL25hbWVzcGFjZS5oIgorI2luY2x1ZGUgImNvbW1h bmRzL2RiY29tbWFuZHMuaCIKKyNpbmNsdWRlICJjYXRhbG9nL3BnX3Byb2MuaCIKKyNpbmNs dWRlICJjb21tYW5kcy9ldmVudF90cmlnZ2VyLmgiCisjaW5jbHVkZSAiZXhlY3V0b3IvZXhl Y3V0b3IuaCIKKyNpbmNsdWRlICJleGVjdXRvci9zcGkuaCIKKyNpbmNsdWRlICJtaXNjYWRt aW4uaCIKKyNpbmNsdWRlICJsaWJwcS9hdXRoLmgiCisjaW5jbHVkZSAibm9kZXMvbm9kZXMu aCIKKyNpbmNsdWRlICJ0Y29wL3V0aWxpdHkuaCIKKyNpbmNsdWRlICJ1dGlscy9hY2wuaCIK KyNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2luY2x1ZGUgInV0aWxzL2d1Yy5oIgor I2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL21lbXV0aWxz LmgiCisjaW5jbHVkZSAidXRpbHMvcmVsLmgiCisjaW5jbHVkZSAidXRpbHMvc3lzY2FjaGUu aCIKKyNpbmNsdWRlICJ1dGlscy90aW1lc3RhbXAuaCIKKworUEdfTU9EVUxFX01BR0lDOwor Cit2b2lkIF9QR19pbml0KHZvaWQpOworCisvKgorICogYXVkaXRSb2xlIGlzIHRoZSBzdHJp bmcgdmFsdWUgb2YgdGhlIHBnYXVkaXQucm9sZSBHVUMsIHdoaWNoIGNvbnRhaW5zIHRoZQor ICogcm9sZSBmb3IgZ3JhbnQtYmFzZWQgYXVkaXRpbmcuCisgKi8KK2NoYXIgKmF1ZGl0Um9s ZSA9IE5VTEw7CisKKy8qCisgKiBhdWRpdExvZyBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRo ZSBwZ2F1ZGl0LmxvZyBHVUMsIGUuZy4gInJlYWQsIHdyaXRlLCBkZGwiCisgKiAoaXQncyBu b3QgdXNlZCBieSB0aGUgbW9kdWxlIGJ1dCBpcyByZXF1aXJlZCBieSBEZWZpbmVDdXN0b21T dHJpbmdWYXJpYWJsZSkuCisgKiBFYWNoIHRva2VuIGNvcnJlc3BvbmRzIHRvIGEgZmxhZyBp biBlbnVtIExvZ0NsYXNzIGJlbG93LiBXZSBjb252ZXJ0IHRoZSBsaXN0CisgKiBvZiB0b2tl bnMgaW50byBhIGJpdG1hcCBpbiBhdWRpdExvZ0JpdG1hcCBmb3IgaW50ZXJuYWwgdXNlLgor ICovCitjaGFyICphdWRpdExvZyA9IE5VTEw7CitzdGF0aWMgdWludDY0IGF1ZGl0TG9nQml0 bWFwID0gMDsKKworLyoKKyAqIFN0cmluZyBjb250YW50cyBmb3IgYXVkaXQgdHlwZXMgLSB1 c2VkIHdoZW4gbG9nZ2luZyB0byBkaXN0aW5ndWlzaCBzZXNzaW9uCisgKiB2cy4gb2JqZWN0 IGF1ZGl0aW5nLgorICovCisjZGVmaW5lIEFVRElUX1RZUEVfT0JKRUNUCSJPQkpFQ1QiCisj ZGVmaW5lIEFVRElUX1RZUEVfU0VTU0lPTgkiU0VTU0lPTiIKKworLyoKKyAqIFN0cmluZyBj b250YW50cyBmb3IgbG9nIGNsYXNzZXMgLSB1c2VkIHdoZW4gcHJvY2Vzc2luZyB0b2tlbnMg aW4gdGhlCisgKiBwZ2F1ZGl0LmxvZyBHVUMuCisgKi8KKyNkZWZpbmUgQ0xBU1NfRERMCQkJ IkRETCIKKyNkZWZpbmUgQ0xBU1NfRlVOQ1RJT04JCSJGVU5DVElPTiIKKyNkZWZpbmUgQ0xB U1NfTUlTQwkJICAgICJNSVNDIgorI2RlZmluZSBDTEFTU19SRUFECQkJIlJFQUQiCisjZGVm aW5lIENMQVNTX1dSSVRFCQkJIldSSVRFIgorCisjZGVmaW5lIENMQVNTX0FMTAkJCSJBTEwi CisjZGVmaW5lIENMQVNTX05PTkUJCQkiTk9ORSIKKworLyogTG9nIGNsYXNzIGVudW0gdXNl ZCB0byByZXByZXNlbnQgYml0cyBpbiBhdWRpdExvZ0JpdG1hcCAqLworZW51bSBMb2dDbGFz cworeworCUxPR19OT05FID0gMCwKKworCS8qIFNFTEVDVCAqLworCUxPR19SRUFEID0gKDEg PDwgMCksCisKKwkvKiBJTlNFUlQsIFVQREFURSwgREVMRVRFLCBUUlVOQ0FURSAqLworCUxP R19XUklURSA9ICgxIDw8IDEpLAorCisJLyogRERMOiBDUkVBVEUvRFJPUC9BTFRFUiAqLwor CUxPR19EREwgPSAoMSA8PCAyKSwKKworCS8qIEZ1bmN0aW9uIGV4ZWN1dGlvbiAqLworCUxP R19GVU5DVElPTiA9ICgxIDw8IDQpLAorCisJLyogRnVuY3Rpb24gZXhlY3V0aW9uICovCisJ TE9HX01JU0MgPSAoMSA8PCA1KSwKKworCS8qIEFic29sdXRlbHkgZXZlcnl0aGluZyAqLwor CUxPR19BTEwgPSB+KHVpbnQ2NCkwCit9OworCisvKiBTdHJpbmcgY29udGFudHMgZm9yIGxv Z2dpbmcgY29tbWFuZHMgKi8KKyNkZWZpbmUgQ09NTUFORF9ERUxFVEUJCSJERUxFVEUiCisj ZGVmaW5lIENPTU1BTkRfRVhFQ1VURQkJIkVYRUNVVEUiCisjZGVmaW5lIENPTU1BTkRfSU5T RVJUCQkiSU5TRVJUIgorI2RlZmluZSBDT01NQU5EX1VQREFURQkJIlVQREFURSIKKyNkZWZp bmUgQ09NTUFORF9TRUxFQ1QJCSJTRUxFQ1QiCisKKyNkZWZpbmUgQ09NTUFORF9VTktOT1dO CQkiVU5LTk9XTiIKKworLyogU3RyaW5nIGNvbnN0YW50cyBmb3IgbG9nZ2luZyBvYmplY3Qg dHlwZXMgKi8KKyNkZWZpbmUgT0JKRUNUX1RZUEVfQ09NUE9TSVRFX1RZUEUJIkNPTVBPU0lU RSBUWVBFIgorI2RlZmluZSBPQkpFQ1RfVFlQRV9GT1JFSUdOX1RBQkxFCSJGT1JFSUdOIFRB QkxFIgorI2RlZmluZSBPQkpFQ1RfVFlQRV9GVU5DVElPTgkJIkZVTkNUSU9OIgorI2RlZmlu ZSBPQkpFQ1RfVFlQRV9JTkRFWAkJCSJJTkRFWCIKKyNkZWZpbmUgT0JKRUNUX1RZUEVfVEFC TEUJCQkiVEFCTEUiCisjZGVmaW5lIE9CSkVDVF9UWVBFX1RPQVNUVkFMVUUJCSJUT0FTVFZB TFVFIgorI2RlZmluZSBPQkpFQ1RfVFlQRV9NQVRWSUVXCQkJIk1BVEVSSUFMSVpFRCBWSUVX IgorI2RlZmluZSBPQkpFQ1RfVFlQRV9TRVFVRU5DRQkJIlNFUVVFTkNFIgorI2RlZmluZSBP QkpFQ1RfVFlQRV9WSUVXCQkJIlZJRVciCisKKyNkZWZpbmUgT0JKRUNUX1RZUEVfVU5LTk9X TgkJCSJVTktOT1dOIgorCisvKgorICogVGhpcyBtb2R1bGUgY29sbGVjdHMgQXVkaXRFdmVu dHMgZnJvbSB2YXJpb3VzIHNvdXJjZXMgKGV2ZW50IHRyaWdnZXJzLCBhbmQKKyAqIGV4ZWN1 dG9yL3V0aWxpdHkgaG9va3MpIGFuZCBwYXNzZXMgdGhlbSB0byB0aGUgbG9nX2F1ZGl0X2V2 ZW50KCkgZnVuY3Rpb24uCisgKgorICogQW4gQXVkaXRFdmVudCByZXByZXNlbnRzIGFuIG9w ZXJhdGlvbiB0aGF0IHBvdGVudGlhbGx5IGFmZmVjdHMgYSBzaW5nbGUKKyAqIG9iamVjdC4g SWYgYW4gdW5kZXJseWluZyBjb21tYW5kIGFmZmVjdHMgbXVsdGlwbGUgb2JqZWN0cyBtdWx0 aXBsZQorICogQXVkaXRFdmVudHMgbXVzdCBiZSBjcmVhdGVkIHRvIHJlcHJlc2VudCBpdC4K KyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKwlMb2dTdG10TGV2ZWwgbG9nU3RtdExldmVsOwor CU5vZGVUYWcgY29tbWFuZFRhZzsKKwljb25zdCBjaGFyICpjb21tYW5kOworCWNvbnN0IGNo YXIgKm9iamVjdFR5cGU7CisJY2hhciAqb2JqZWN0TmFtZTsKKwljb25zdCBjaGFyICpjb21t YW5kVGV4dDsKKwlib29sIGdyYW50ZWQ7Cit9IEF1ZGl0RXZlbnQ7CisKKy8qCisgKiBTZXQg aWYgYSBmdW5jdGlvbiBiZWxvdyBsb2dfdXRpbGl0eV9jb21tYW5kKCkgaGFzIGxvZ2dlZCB0 aGUgZXZlbnQgLSBwcmV2ZW50cworICogbW9yZSB0aGFuIG9uZSBmdW5jdGlvbiBmcm9tIGxv Z2dpbmcgd2hlbiB0aGUgZXZlbnQgY291bGQgYmUgbG9nZ2VkIGluCisgKiBtdWx0aXBsZSBw bGFjZXMuCisgKi8KK2Jvb2wgdXRpbGl0eUNvbW1hbmRMb2dnZWQgPSBmYWxzZTsKK0F1ZGl0 RXZlbnQgdXRpbGl0eUF1ZGl0RXZlbnQ7CisKKy8qCisgKiBSZXR1cm5zIHRoZSBvaWQgb2Yg dGhlIHJvbGUgc3BlY2lmaWVkIGluIHBnYXVkaXQucm9sZS4KKyAqLworc3RhdGljIE9pZAor YXVkaXRfcm9sZV9vaWQoKQoreworCUhlYXBUdXBsZSByb2xlVHVwOworCU9pZCBvaWQgPSBJ bnZhbGlkT2lkOworCisJcm9sZVR1cCA9IFNlYXJjaFN5c0NhY2hlMShBVVRITkFNRSwgUG9p bnRlckdldERhdHVtKGF1ZGl0Um9sZSkpOworCisJaWYgKEhlYXBUdXBsZUlzVmFsaWQocm9s ZVR1cCkpCisJeworCQlvaWQgPSBIZWFwVHVwbGVHZXRPaWQocm9sZVR1cCk7CisJCVJlbGVh c2VTeXNDYWNoZShyb2xlVHVwKTsKKwl9CisKKwlyZXR1cm4gb2lkOworfQorCisvKgorICog VGFrZXMgYW4gQXVkaXRFdmVudCBhbmQgcmV0dXJucyB0cnVlIG9yIGZhbHNlIGRlcGVuZGlu ZyBvbiB3aGV0aGVyIHRoZSBldmVudAorICogc2hvdWxkIGJlIGxvZ2dlZCBhY2NvcmRpbmcg dG8gdGhlIHBnYXVkaXQucm9sZXMvbG9nIHNldHRpbmdzLiBJZiBpdCByZXR1cm5zCisgKiB0 cnVlLCBhbHNvIGZpbGxzIGluIHRoZSBuYW1lIG9mIHRoZSBMb2dDbGFzcyB3aGljaCBpdCBp cyBsb2dnZWQgdW5kZXIuCisgKi8KK3N0YXRpYyBib29sCitsb2dfY2hlY2soQXVkaXRFdmVu dCAqZSwgY29uc3QgY2hhciAqKmNsYXNzbmFtZSkKK3sKKwllbnVtIExvZ0NsYXNzIGNsYXNz ID0gTE9HX05PTkU7CisKKwkvKiBCeSBkZWZhdWx0IHB1dCBldmVyeXRoaW5nIGluIHRoZSBN SVNDIGNsYXNzLiAqLworCSpjbGFzc25hbWUgPSBDTEFTU19NSVNDOworCWNsYXNzID0gTE9H X01JU0M7CisKKwkvKgorCSAqIExvb2sgYXQgdGhlIHR5cGUgb2YgdGhlIGNvbW1hbmQgYW5k IGRlY2lkZSB3aGF0IExvZ0NsYXNzIG5lZWRzIHRvIGJlCisJICogZW5hYmxlZCBmb3IgdGhl IGNvbW1hbmQgdG8gYmUgbG9nZ2VkLgorCSAqLworCXN3aXRjaCAoZS0+bG9nU3RtdExldmVs KQorCXsKKwkJY2FzZSBMT0dTVE1UX01PRDoKKwkJCSpjbGFzc25hbWUgPSBDTEFTU19XUklU RTsKKwkJCWNsYXNzID0gTE9HX1dSSVRFOworCQkJYnJlYWs7CisKKwkJY2FzZSBMT0dTVE1U X0RETDoKKwkJCSpjbGFzc25hbWUgPSBDTEFTU19EREw7CisJCQljbGFzcyA9IExPR19EREw7 CisKKwkJY2FzZSBMT0dTVE1UX0FMTDoKKwkJCXN3aXRjaCAoZS0+Y29tbWFuZFRhZykKKwkJ CXsKKwkJCQljYXNlIFRfQ29weVN0bXQ6CisJCQkJY2FzZSBUX1NlbGVjdFN0bXQ6CisJCQkJ Y2FzZSBUX1ByZXBhcmVTdG10OgorCQkJCWNhc2UgVF9QbGFubmVkU3RtdDoKKwkJCQljYXNl IFRfRXhlY3V0ZVN0bXQ6CisJCQkJCSpjbGFzc25hbWUgPSBDTEFTU19SRUFEOworCQkJCQlj bGFzcyA9IExPR19SRUFEOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVF9WYWN1dW1TdG10 OgorCQkJCWNhc2UgVF9SZWluZGV4U3RtdDoKKwkJCQkJKmNsYXNzbmFtZSA9IENMQVNTX0RE TDsKKwkJCQkJY2xhc3MgPSBMT0dfRERMOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVF9E b1N0bXQ6CisJCQkJCSpjbGFzc25hbWUgPSBDTEFTU19GVU5DVElPTjsKKwkJCQkJY2xhc3Mg PSBMT0dfRlVOQ1RJT047CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJYnJl YWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIExPR1NUTVRfTk9ORToKKwkJCWJyZWFr OworCX0KKworCS8qCisJICogV2UgbG9nIGF1ZGl0IGV2ZW50cyB1bmRlciB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisJICoKKwkgKiAxLiBJZiB0aGUgYXVkaXQgcm9sZSBoYXMgYmVl biBleHBsaWNpdGx5IGdyYW50ZWQgcGVybWlzc2lvbiBmb3IKKwkgKiAgICBhbiBvcGVyYXRp b24uCisJICovCisJaWYgKGUtPmdyYW50ZWQpCisJeworCQlyZXR1cm4gdHJ1ZTsKKwl9CisK KwkvKiAyLiBJZiB0aGUgZXZlbnQgYmVsb25ncyB0byBhIGNsYXNzIGNvdmVyZWQgYnkgcGdh dWRpdC5sb2cuICovCisJaWYgKChhdWRpdExvZ0JpdG1hcCAmIGNsYXNzKSA9PSBjbGFzcykK Kwl7CisJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAq IFRha2VzIGFuIEF1ZGl0RXZlbnQgYW5kLCBpZiBpdCBsb2dfY2hlY2soKSwgd3JpdGVzIGl0 IHRvIHRoZSBhdWRpdCBsb2cuIFRoZQorICogQXVkaXRFdmVudCBpcyBhc3N1bWVkIHRvIGJl IGNvbXBsZXRlbHkgZmlsbGVkIGluIGJ5IHRoZSBjYWxsZXIgKHVua25vd24KKyAqIHZhbHVl cyBtdXN0IGJlIHNldCB0byAiIiBzbyB0aGF0IHRoZXkgY2FuIGJlIGxvZ2dlZCB3aXRob3V0 IGVycm9yIGNoZWNraW5nKS4KKyAqLworc3RhdGljIHZvaWQKK2xvZ19hdWRpdF9ldmVudChB dWRpdEV2ZW50ICplKQoreworCWNvbnN0IGNoYXIgKmNsYXNzbmFtZTsKKworCS8qIENoZWNr IHRoYXQgdGhpcyBldmVudCBzaG91bGQgYmUgbG9nZ2VkLiAqLworCWlmICghbG9nX2NoZWNr KGUsICZjbGFzc25hbWUpKQorCQlyZXR1cm47CisKKwkvKiBMb2cgdmlhIGVyZXBvcnQoKS4g Ki8KKwllcmVwb3J0KExPRywKKwkJCShlcnJtc2coIkFVRElUOiAlcywlcywlcywlcywlcywl cyIsCisJCQkJCWUtPmdyYW50ZWQgPyBBVURJVF9UWVBFX09CSkVDVCA6IEFVRElUX1RZUEVf U0VTU0lPTiwKKwkJCQkJY2xhc3NuYW1lLCBlLT5jb21tYW5kLCBlLT5vYmplY3RUeXBlLCBl LT5vYmplY3ROYW1lLAorCQkJCQllLT5jb21tYW5kVGV4dCksCisJCQkgZXJyaGlkZXN0bXQo dHJ1ZSkpKTsKK30KKworLyoKKyAqIENoZWNrIGlmIHRoZSByb2xlIG9yIGFueSBpbmhlcml0 ZWQgcm9sZSBoYXMgYW55IHBlcm1pc3Npb24gaW4gdGhlIG1hc2suICBUaGUKKyAqIHB1Ymxp YyByb2xlIGlzIGV4Y2x1ZGVkIGZyb20gdGhpcyBjaGVjayBhbmQgc3VwZXJ1c2VyIHBlcm1p c3Npb25zIGFyZSBub3QKKyAqIGNvbnNpZGVyZWQuCisgKi8KK3N0YXRpYyBib29sCitsb2df YWNsX2NoZWNrKERhdHVtIGFjbERhdHVtLCBPaWQgYXVkaXRPaWQsIEFjbE1vZGUgbWFzaykK K3sKKwlib29sCQlyZXN1bHQgPSBmYWxzZTsKKwlBY2wJCSAgICphY2w7CisJQWNsSXRlbSAg ICAqYWNsSXRlbURhdGE7CisJaW50CQkJYWNsSW5kZXg7CisJaW50CQkJYWNsVG90YWw7CisK KwkvKiBEZXRvYXN0IGNvbHVtbidzIEFDTCBpZiBuZWNlc3NhcnkgKi8KKwlhY2wgPSBEYXR1 bUdldEFjbFAoYWNsRGF0dW0pOworCisJLyogR2V0IHRoZSBhY2wgbGlzdCBhbmQgdG90YWwg Ki8KKwlhY2xUb3RhbCA9IEFDTF9OVU0oYWNsKTsKKwlhY2xJdGVtRGF0YSA9IEFDTF9EQVQo YWNsKTsKKworCS8qIENoZWNrIHByaXZpbGVnZXMgZ3JhbnRlZCBkaXJlY3RseSB0byBhdWRp dE9pZCAqLworCWZvciAoYWNsSW5kZXggPSAwOyBhY2xJbmRleCA8IGFjbFRvdGFsOyBhY2xJ bmRleCsrKQorCXsKKwkJQWNsSXRlbSAqYWNsSXRlbSA9ICZhY2xJdGVtRGF0YVthY2xJbmRl eF07CisKKwkJaWYgKGFjbEl0ZW0tPmFpX2dyYW50ZWUgPT0gYXVkaXRPaWQgJiYKKwkJCWFj bEl0ZW0tPmFpX3ByaXZzICYgbWFzaykKKwkJeworCQkJcmVzdWx0ID0gdHJ1ZTsKKwkJCWJy ZWFrOworCQl9CisJfQorCisJLyoKKwkgKiBDaGVjayBwcml2aWxlZ2VzIGdyYW50ZWQgaW5k aXJlY3RseSB2aWEgcm9sZSBtZW1iZXJzaGlwcy4gV2UgZG8gdGhpcyBpbgorCSAqIGEgc2Vw YXJhdGUgcGFzcyB0byBtaW5pbWl6ZSBleHBlbnNpdmUgaW5kaXJlY3QgbWVtYmVyc2hpcCB0 ZXN0cy4gIEluCisJICogcGFydGljdWxhciwgaXQncyB3b3J0aCB0ZXN0aW5nIHdoZXRoZXIg YSBnaXZlbiBBQ0wgZW50cnkgZ3JhbnRzIGFueQorCSAqIHByaXZpbGVnZXMgc3RpbGwgb2Yg aW50ZXJlc3QgYmVmb3JlIHdlIHBlcmZvcm0gdGhlIGhhc19wcml2c19vZl9yb2xlCisJICog dGVzdC4KKwkgKi8KKwlpZiAoIXJlc3VsdCkKKwl7CisJCWZvciAoYWNsSW5kZXggPSAwOyBh Y2xJbmRleCA8IGFjbFRvdGFsOyBhY2xJbmRleCsrKQorCQl7CisJCQlBY2xJdGVtICphY2xJ dGVtID0gJmFjbEl0ZW1EYXRhW2FjbEluZGV4XTsKKworCQkJLyogRG9uJ3QgdGVzdCBwdWJs aWMgb3IgYXVkaXRPaWQgKGl0IGhhcyBiZWVuIHRlc3RlZCBhbHJlYWR5KSAqLworCQkJaWYg KGFjbEl0ZW0tPmFpX2dyYW50ZWUgPT0gQUNMX0lEX1BVQkxJQyB8fAorCQkJCWFjbEl0ZW0t PmFpX2dyYW50ZWUgPT0gYXVkaXRPaWQpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkg KiBDaGVjayB0aGF0IHRoZSByb2xlIGhhcyB0aGUgcmVxdWlyZWQgcHJpdmlsZWdlcyBhbmQg dGhhdCBpdCBpcworCQkJICogaW5oZXJpdGVkIGJ5IGF1ZGl0T2lkLgorCQkJICovCisJCQlp ZiAoYWNsSXRlbS0+YWlfcHJpdnMgJiBtYXNrICYmCisJCQkJaGFzX3ByaXZzX29mX3JvbGUo YXVkaXRPaWQsIGFjbEl0ZW0tPmFpX2dyYW50ZWUpKQorCQkJeworCQkJCXJlc3VsdCA9IHRy dWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBpZiB3ZSBoYXZlIGEgZGV0 b2FzdGVkIGNvcHksIGZyZWUgaXQgKi8KKwlpZiAoYWNsICYmIChQb2ludGVyKSBhY2wgIT0g RGF0dW1HZXRQb2ludGVyKGFjbERhdHVtKSkKKwkJcGZyZWUoYWNsKTsKKworCXJldHVybiBy ZXN1bHQ7Cit9CisKKy8qCisgKiBDaGVjayBpZiBhIHJvbGUgaGFzIGFueSBvZiB0aGUgcGVy bWlzc2lvbnMgaW4gdGhlIG1hc2sgb24gYSByZWxhdGlvbi4KKyAqLworc3RhdGljIGJvb2wK K2xvZ19yZWxhdGlvbl9jaGVjayhPaWQgcmVsT2lkLAorCQkJCSAgIE9pZCBhdWRpdE9pZCwK KwkJCQkgICBBY2xNb2RlIG1hc2spCit7CisJYm9vbAkJcmVzdWx0ID0gZmFsc2U7CisJSGVh cFR1cGxlCXR1cGxlOworCURhdHVtCQlhY2xEYXR1bTsKKwlib29sCQlpc051bGw7CisKKwkv KiBHZXQgcmVsYXRpb24gdHVwbGUgZnJvbSBwZ19jbGFzcyAqLworCXR1cGxlID0gU2VhcmNo U3lzQ2FjaGUxKFJFTE9JRCwgT2JqZWN0SWRHZXREYXR1bShyZWxPaWQpKTsKKworCS8qIFJl dHVybiBmYWxzZSBpZiB0dXBsZSBpcyBub3QgdmFsaWQgKi8KKwlpZiAoIUhlYXBUdXBsZUlz VmFsaWQodHVwbGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBHZXQgdGhlIHJlbGF0aW9u J3MgQUNMICovCisJYWNsRGF0dW0gPSBTeXNDYWNoZUdldEF0dHIoUkVMT0lELCB0dXBsZSwg QW51bV9wZ19jbGFzc19yZWxhY2wsCisJCQkJCQkJICAgJmlzTnVsbCk7CisKKwkvKiBJZiBu b3QgbnVsbCB0aGVuIHRlc3QgKi8KKwlpZiAoIWlzTnVsbCkKKwkJcmVzdWx0ID0gbG9nX2Fj bF9jaGVjayhhY2xEYXR1bSwgYXVkaXRPaWQsIG1hc2spOworCisJLyogRnJlZSB0aGUgcmVs YXRpb24gdHVwbGUgKi8KKwlSZWxlYXNlU3lzQ2FjaGUodHVwbGUpOworCisJcmV0dXJuIHJl c3VsdDsKK30KKworLyoKKyAqIENoZWNrIGlmIGEgcm9sZSBoYXMgYW55IG9mIHRoZSBwZXJt aXNzaW9ucyBpbiB0aGUgbWFzayBvbiBhbiBhdHRyaWJ1dGUuCisgKi8KK3N0YXRpYyBib29s Citsb2dfYXR0cmlidXRlX2NoZWNrKE9pZCByZWxPaWQsCisJCQkJCUF0dHJOdW1iZXIgYXR0 TnVtLAorCQkJCQlPaWQgYXVkaXRPaWQsCisJCQkJCUFjbE1vZGUgbWFzaykKK3sKKwlib29s CQlyZXN1bHQgPSBmYWxzZTsKKwlIZWFwVHVwbGUJYXR0VHVwbGU7CisJRGF0dW0JCWFjbERh dHVtOworCWJvb2wJCWlzTnVsbDsKKworCS8qIEdldCB0aGUgYXR0cmlidXRlJ3MgQUNMICov CisJYXR0VHVwbGUgPSBTZWFyY2hTeXNDYWNoZTIoQVRUTlVNLAorCQkJCQkJCSAgIE9iamVj dElkR2V0RGF0dW0ocmVsT2lkKSwKKwkJCQkJCQkgICBJbnQxNkdldERhdHVtKGF0dE51bSkp OworCisJLyogUmV0dXJuIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBpbnZhbGlkICovCisJaWYg KCFIZWFwVHVwbGVJc1ZhbGlkKGF0dFR1cGxlKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyog T25seSBwcm9jZXNzIGF0dHJpYnV0ZSB0aGF0IGhhdmUgbm90IGJlZW4gZHJvcHBlZCAqLwor CWlmICghKChGb3JtX3BnX2F0dHJpYnV0ZSkgR0VUU1RSVUNUKGF0dFR1cGxlKSktPmF0dGlz ZHJvcHBlZCkKKwl7CisJCWFjbERhdHVtID0gU3lzQ2FjaGVHZXRBdHRyKEFUVE5VTSwgYXR0 VHVwbGUsIEFudW1fcGdfYXR0cmlidXRlX2F0dGFjbCwKKwkJCQkJCQkJICAgJmlzTnVsbCk7 CisKKwkJaWYgKCFpc051bGwpCisJCQlyZXN1bHQgPSBsb2dfYWNsX2NoZWNrKGFjbERhdHVt LCBhdWRpdE9pZCwgbWFzayk7CisJfQorCisJLyogRnJlZSBhdHRyaWJ1dGUgKi8KKwlSZWxl YXNlU3lzQ2FjaGUoYXR0VHVwbGUpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAq IENoZWNrIGlmIGEgcm9sZSBoYXMgYW55IG9mIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFz ayBvbiBhbiBhdHRyaWJ1dGUgaW4KKyAqIHRoZSBwcm92aWRlZCBzZXQuICBJZiB0aGUgc2V0 IGlzIGVtcHR5LCB0aGVuIGFsbCB2YWxpZCBhdHRyaWJ1dGVzIGluIHRoZQorICogcmVsYXRp b24gd2lsbCBiZSB0ZXN0ZWQuCisgKi8KK3N0YXRpYyBib29sCitsb2dfYXR0cmlidXRlX2No ZWNrX2FueShPaWQgcmVsT2lkLAorCQkJCQkJT2lkIGF1ZGl0T2lkLAorCQkJCQkJQml0bWFw c2V0ICphdHRyaWJ1dGVTZXQsCisJCQkJCQlBY2xNb2RlIG1vZGUpCit7CisJYm9vbCByZXN1 bHQgPSBmYWxzZTsKKwlBdHRyTnVtYmVyIGNvbDsKKwlCaXRtYXBzZXQgKnRtcFNldDsKKwor CS8qIElmIGJtcyBpcyBlbXB0eSB0aGVuIGNoZWNrIGZvciBhbnkgY29sdW1uIG1hdGNoICov CisJaWYgKGJtc19pc19lbXB0eShhdHRyaWJ1dGVTZXQpKQorCXsKKwkJSGVhcFR1cGxlCWNs YXNzVHVwbGU7CisJCUF0dHJOdW1iZXIJbmF0dHJzOworCQlBdHRyTnVtYmVyCWN1cnJfYXR0 OworCisJCS8qIEdldCByZWxhdGlvbiB0byBkZXRlcm1pbmUgdG90YWwgYXR0cmlidXRlICov CisJCWNsYXNzVHVwbGUgPSBTZWFyY2hTeXNDYWNoZTEoUkVMT0lELCBPYmplY3RJZEdldERh dHVtKHJlbE9pZCkpOworCisJCWlmICghSGVhcFR1cGxlSXNWYWxpZChjbGFzc1R1cGxlKSkK KwkJCXJldHVybiBmYWxzZTsKKworCQluYXR0cnMgPSAoKEZvcm1fcGdfY2xhc3MpIEdFVFNU UlVDVChjbGFzc1R1cGxlKSktPnJlbG5hdHRzOworCQlSZWxlYXNlU3lzQ2FjaGUoY2xhc3NU dXBsZSk7CisKKwkJLyogQ2hlY2sgZWFjaCBjb2x1bW4gKi8KKwkJZm9yIChjdXJyX2F0dCA9 IDE7IGN1cnJfYXR0IDw9IG5hdHRyczsgY3Vycl9hdHQrKykKKwkJeworCQkJaWYgKGxvZ19h dHRyaWJ1dGVfY2hlY2socmVsT2lkLCBjdXJyX2F0dCwgYXVkaXRPaWQsIG1vZGUpKQorCQkJ CXJldHVybiB0cnVlOworCQl9CisJfQorCisJLyogTWFrZSBhIGNvcHkgb2YgdGhlIGNvbHVt biBzZXQgKi8KKwl0bXBTZXQgPSBibXNfY29weShhdHRyaWJ1dGVTZXQpOworCisJLyogQ2hl Y2sgZWFjaCBjb2x1bW4gKi8KKwl3aGlsZSAoKGNvbCA9IGJtc19maXJzdF9tZW1iZXIodG1w U2V0KSkgPj0gMCkKKwl7CisJCWNvbCArPSBGaXJzdExvd0ludmFsaWRIZWFwQXR0cmlidXRl TnVtYmVyOworCisJCWlmIChjb2wgIT0gSW52YWxpZEF0dHJOdW1iZXIgJiYKKwkJCWxvZ19h dHRyaWJ1dGVfY2hlY2socmVsT2lkLCBjb2wsIGF1ZGl0T2lkLCBtb2RlKSkKKwkJeworCQkJ cmVzdWx0ID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogRnJlZSB0aGUgY29s dW1uIHNldCAqLworCWJtc19mcmVlKHRtcFNldCk7CisKKwlyZXR1cm4gcmVzdWx0OworfQor CisvKgorICogQ3JlYXRlIEF1ZGl0RXZlbnRzIGZvciBETUwgb3BlcmF0aW9ucyB2aWEgZXhl Y3V0b3IgcGVybWlzc2lvbnMgY2hlY2tzLgorICovCitzdGF0aWMgdm9pZAorbG9nX2RtbChP aWQgYXVkaXRPaWQsIExpc3QgKnJhbmdlVGFibHMpCit7CisJTGlzdENlbGwgKmxyOworCWJv b2wgZmlyc3QgPSB0cnVlOworCisJZm9yZWFjaChsciwgcmFuZ2VUYWJscykKKwl7CisJCU9p ZCByZWxPaWQ7CisJCVJlbGF0aW9uIHJlbDsKKwkJUmFuZ2VUYmxFbnRyeSAqcnRlID0gbGZp cnN0KGxyKTsKKwkJQXVkaXRFdmVudCBhdWRpdEV2ZW50OworCisJCS8qIFdlIG9ubHkgY2Fy ZSBhYm91dCB0YWJsZXMsIGFuZCBjYW4gaWdub3JlIHN1YnF1ZXJpZXMgZXRjLiAqLworCQlp ZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTikKKwkJCWNvbnRpbnVlOworCisJCS8q CisJCSAqIEZpbHRlciBvdXQgYW55IHN5c3RlbSByZWxhdGlvbnMKKwkJICovCisJCXJlbE9p ZCA9IHJ0ZS0+cmVsaWQ7CisJCXJlbCA9IHJlbGF0aW9uX29wZW4ocmVsT2lkLCBOb0xvY2sp OworCisJCWlmIChJc1N5c3RlbU5hbWVzcGFjZShSZWxhdGlvbkdldE5hbWVzcGFjZShyZWwp KSkKKwkJeworCQkJcmVsYXRpb25fY2xvc2UocmVsLCBOb0xvY2spOworCQkJcmV0dXJuOwor CQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHBhcnNldHJl ZSBoZXJlLCBzbyB3ZSBoYXZlIHRvIGdlbmVyYXRlCisJCSAqIHRoZSBub2RlIHR5cGUsIG9i amVjdCB0eXBlLCBhbmQgY29tbWFuZCB0YWcgYnkgZGVjb2RpbmcKKwkJICogcnRlLT5yZXF1 aXJlZFBlcm1zIGFuZCBydGUtPnJlbGtpbmQuCisJCSAqLworCQlhdWRpdEV2ZW50LmxvZ1N0 bXRMZXZlbCA9IExPR1NUTVRfTU9EOworCisJCWlmIChydGUtPnJlcXVpcmVkUGVybXMgJiBB Q0xfSU5TRVJUKQorCQl7CisJCQlhdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBUX0luc2VydFN0 bXQ7CisJCQlhdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX0lOU0VSVDsKKwkJfQorCQll bHNlIGlmIChydGUtPnJlcXVpcmVkUGVybXMgJiBBQ0xfVVBEQVRFKQorCQl7CisJCQlhdWRp dEV2ZW50LmNvbW1hbmRUYWcgPSBUX1VwZGF0ZVN0bXQ7CisJCQlhdWRpdEV2ZW50LmNvbW1h bmQgPSBDT01NQU5EX1VQREFURTsKKwkJfQorCQllbHNlIGlmIChydGUtPnJlcXVpcmVkUGVy bXMgJiBBQ0xfREVMRVRFKQorCQl7CisJCQlhdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBUX0Rl bGV0ZVN0bXQ7CisJCQlhdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX0RFTEVURTsKKwkJ fQorCQllbHNlIGlmIChydGUtPnJlcXVpcmVkUGVybXMgJiBBQ0xfU0VMRUNUKQorCQl7CisJ CQlhdWRpdEV2ZW50LmxvZ1N0bXRMZXZlbCA9IExPR1NUTVRfQUxMOworCQkJYXVkaXRFdmVu dC5jb21tYW5kVGFnID0gVF9TZWxlY3RTdG10OworCQkJYXVkaXRFdmVudC5jb21tYW5kID0g Q09NTUFORF9TRUxFQ1Q7CisJCX0KKwkJZWxzZQorCQl7CisJCQlhdWRpdEV2ZW50LmNvbW1h bmRUYWcgPSBUX0ludmFsaWQ7CisJCQlhdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX1VO S05PV047CisJCX0KKworCQkvKgorCQkgKiBGaWxsIHZhbHVlcyBpbiB0aGUgZXZlbnQgc3Ry dWN0IHRoYXQgYXJlIHJlcXVpcmVkIGZvciBzZXNzaW9uCisJCSAqIGxvZ2dpbmcuCisJCSAq LworCQlhdWRpdEV2ZW50LmdyYW50ZWQgPSBmYWxzZTsKKwkJYXVkaXRFdmVudC5jb21tYW5k VGV4dCA9IGRlYnVnX3F1ZXJ5X3N0cmluZzsKKworCQkvKiBJZiB0aGlzIGlzIHRoZSBmaXJz dCBydGUgdGhlbiBzZXNzaW9uIGxvZyAqLworCQlpZiAoZmlyc3QpCisJCXsKKwkJCWF1ZGl0 RXZlbnQub2JqZWN0TmFtZSA9ICIiOworCQkJYXVkaXRFdmVudC5vYmplY3RUeXBlID0gIiI7 CisKKwkJCWxvZ19hdWRpdF9ldmVudCgmYXVkaXRFdmVudCk7CisKKwkJCWZpcnN0ID0gZmFs c2U7CisJCX0KKworCQkvKiBHZXQgdGhlIHJlbGF0aW9uIHR5cGUgKi8KKwkJc3dpdGNoIChy dGUtPnJlbGtpbmQpCisJCXsKKwkJCWNhc2UgUkVMS0lORF9SRUxBVElPTjoKKwkJCQlhdWRp dEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9UQUJMRTsKKwkJCQlicmVhazsKKwor CQkJY2FzZSBSRUxLSU5EX0lOREVYOgorCQkJCWF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9IE9C SkVDVF9UWVBFX0lOREVYOworCQkJCWJyZWFrOworCisJCQljYXNlIFJFTEtJTkRfU0VRVUVO Q0U6CisJCQkJYXVkaXRFdmVudC5vYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfU0VRVUVOQ0U7 CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVMS0lORF9UT0FTVFZBTFVFOgorCQkJCWF1ZGl0 RXZlbnQub2JqZWN0VHlwZSA9IE9CSkVDVF9UWVBFX1RPQVNUVkFMVUU7CisJCQkJYnJlYWs7 CisKKwkJCWNhc2UgUkVMS0lORF9WSUVXOgorCQkJCWF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9 IE9CSkVDVF9UWVBFX1ZJRVc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVMS0lORF9DT01Q T1NJVEVfVFlQRToKKwkJCQlhdWRpdEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9D T01QT1NJVEVfVFlQRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUxLSU5EX0ZPUkVJR05f VEFCTEU6CisJCQkJYXVkaXRFdmVudC5vYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfRk9SRUlH Tl9UQUJMRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUxLSU5EX01BVFZJRVc6CisJCQkJ YXVkaXRFdmVudC5vYmplY3RUeXBlID0gT0JKRUNUX1RZUEVfTUFUVklFVzsKKwkJCQlicmVh azsKKworCQkJZGVmYXVsdDoKKwkJCQlhdWRpdEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1Rf VFlQRV9VTktOT1dOOworCQkJCWJyZWFrOworCQl9CisKKwkJLyogR2V0IHRoZSByZWxhdGlv biBuYW1lICovCisJCWF1ZGl0RXZlbnQub2JqZWN0TmFtZSA9CisJCQlxdW90ZV9xdWFsaWZp ZWRfaWRlbnRpZmllcihnZXRfbmFtZXNwYWNlX25hbWUoCisJCQkJCQkJCQkgICBSZWxhdGlv bkdldE5hbWVzcGFjZShyZWwpKSwKKwkJCQkJCQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25O YW1lKHJlbCkpOworCQlyZWxhdGlvbl9jbG9zZShyZWwsIE5vTG9jayk7CisKKworCQkvKiBQ ZXJmb3JtIG9iamVjdCBhdWRpdGluZyBvbmx5IGlmIHRoZSBhdWRpdCByb2xlIGlzIHZhbGlk ICovCisJCWlmIChhdWRpdE9pZCAhPSBJbnZhbGlkT2lkKQorCQl7CisJCQlBY2xNb2RlIGF1 ZGl0UGVybXMgPSAoQUNMX1NFTEVDVCB8IEFDTF9VUERBVEUgfCBBQ0xfSU5TRVJUKSAmCisJ CQkJCQkJCSBydGUtPnJlcXVpcmVkUGVybXM7CisKKwkJCS8qCisJCQkgKiBJZiBhbnkgb2Yg dGhlIHJlcXVpcmVkIHBlcm1pc3Npb25zIGZvciB0aGUgcmVsYXRpb24gYXJlIGdyYW50ZWQK KwkJCSAqIHRvIHRoZSBhdWRpdCByb2xlIHRoZW4gYXVkaXQgdGhlIHJlbGF0aW9uCisJCQkg Ki8KKwkJCWlmIChsb2dfcmVsYXRpb25fY2hlY2socmVsT2lkLCBhdWRpdE9pZCwgYXVkaXRQ ZXJtcykpCisJCQl7CisJCQkJYXVkaXRFdmVudC5ncmFudGVkID0gdHJ1ZTsKKwkJCX0KKwor CQkJLyoKKwkJCSAqIEVsc2UgY2hlY2sgaWYgdGhlIGF1ZGl0IHJvbGUgaGFzIGNvbHVtbi1s ZXZlbCBwZXJtaXNzaW9ucyBmb3IKKwkJCSAqIHNlbGVjdCwgaW5zZXJ0LCBvciB1cGRhdGUu CisJCQkgKi8KKwkJCWVsc2UgaWYgKGF1ZGl0UGVybXMgIT0gMCkKKwkJCXsKKwkJCQkvKgor CQkJCSAqIENoZWNrIHRoZSBzZWxlY3QgY29sdW1ucyB0byBzZWUgaWYgdGhlIGF1ZGl0IHJv bGUgaGFzCisJCQkJICogcHJpdmVsZWdlcyBvbiBhbnkgb2YgdGhlbS4KKwkJCQkgKi8KKwkJ CQlpZiAoYXVkaXRQZXJtcyAmIEFDTF9TRUxFQ1QpCisJCQkJeworCQkJCQlhdWRpdEV2ZW50 LmdyYW50ZWQgPQorCQkJCQkJbG9nX2F0dHJpYnV0ZV9jaGVja19hbnkocmVsT2lkLCBhdWRp dE9pZCwKKwkJCQkJCQkJCQkJCXJ0ZS0+c2VsZWN0ZWRDb2xzLAorCQkJCQkJCQkJCQkJQUNM X1NFTEVDVCk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBDaGVjayB0aGUgbW9kaWZpZWQg Y29sdW1ucyB0byBzZWUgaWYgdGhlIGF1ZGl0IHJvbGUgaGFzCisJCQkJICogcHJpdmlsZWdl cyBvbiBhbnkgb2YgdGhlbS4KKwkJCQkgKi8KKwkJCQlpZiAoIWF1ZGl0RXZlbnQuZ3JhbnRl ZCkKKwkJCQl7CisJCQkJCWF1ZGl0UGVybXMgJj0gKEFDTF9JTlNFUlQgfCBBQ0xfVVBEQVRF KTsKKworCQkJCQlpZiAoYXVkaXRQZXJtcykKKwkJCQkJeworCQkJCQkJYXVkaXRFdmVudC5n cmFudGVkID0KKwkJCQkJCQlsb2dfYXR0cmlidXRlX2NoZWNrX2FueShyZWxPaWQsIGF1ZGl0 T2lkLAorCQkJCQkJCQkJCQkJCXJ0ZS0+bW9kaWZpZWRDb2xzLAorCQkJCQkJCQkJCQkJCWF1 ZGl0UGVybXMpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogT25seSBkbyBy ZWxhdGlvbiBsZXZlbCBsb2dnaW5nIGlmIGEgZ3JhbnQgd2FzIGZvdW5kLiAqLworCQlpZiAo YXVkaXRFdmVudC5ncmFudGVkKQorCQl7CisJCQlsb2dfYXVkaXRfZXZlbnQoJmF1ZGl0RXZl bnQpOworCQl9CisKKwkJcGZyZWUoYXVkaXRFdmVudC5vYmplY3ROYW1lKTsKKwl9Cit9CisK Ky8qCisgKiBDcmVhdGUgQXVkaXRFdmVudHMgZm9yIGNlcnRhaW4ga2luZHMgb2YgQ1JFQVRF LCBBTFRFUiwgYW5kIERFTEVURSBzdGF0ZW1lbnRzCisgKiB3aGVyZSB0aGUgb2JqZWN0IGNh biBiZSBsb2dnZWQuCisgKi8KK3N0YXRpYyB2b2lkCitsb2dfY3JlYXRlX2FsdGVyX2Ryb3Ao T2lkIGNsYXNzSWQsCisJCQkJCSAgT2lkIG9iamVjdElkKQoreworCS8qIE9ubHkgcGVyZm9y bSB3aGVuIGNsYXNzIGlzIHJlbGF0aW9uICovCisJaWYgKGNsYXNzSWQgPT0gUmVsYXRpb25S ZWxhdGlvbklkKQorCXsKKwkJUmVsYXRpb24gcmVsOworCQlGb3JtX3BnX2NsYXNzIGNsYXNz OworCisJCS8qIE9wZW4gdGhlIHJlbGF0aW9uICovCisJCXJlbCA9IHJlbGF0aW9uX29wZW4o b2JqZWN0SWQsIE5vTG9jayk7CisKKwkJLyogRmlsdGVyIG91dCBhbnkgc3lzdGVtIHJlbGF0 aW9ucyAqLworCQlpZiAoSXNUb2FzdE5hbWVzcGFjZShSZWxhdGlvbkdldE5hbWVzcGFjZShy ZWwpKSkKKwkJeworCQkJcmVsYXRpb25fY2xvc2UocmVsLCBOb0xvY2spOworCQkJcmV0dXJu OworCQl9CisKKwkJLyogR2V0IHJlbCBpbmZvcm1hdGlvbiBhbmQgY2xvc2UgaXQgKi8KKwkJ Y2xhc3MgPSBSZWxhdGlvbkdldEZvcm0ocmVsKTsKKwkJdXRpbGl0eUF1ZGl0RXZlbnQub2Jq ZWN0TmFtZSA9CisJCQlxdW90ZV9xdWFsaWZpZWRfaWRlbnRpZmllcihnZXRfbmFtZXNwYWNl X25hbWUoCisJCQkJCQkJCQkgICBSZWxhdGlvbkdldE5hbWVzcGFjZShyZWwpKSwKKwkJCQkJ CQkJCSAgIFJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpOworCQlyZWxhdGlvbl9jbG9z ZShyZWwsIE5vTG9jayk7CisKKwkJLyogU2V0IG9iamVjdCB0eXBlIGJhc2VkIG9uIHJlbGtp bmQgKi8KKwkJc3dpdGNoIChjbGFzcy0+cmVsa2luZCkKKwkJeworCQkJY2FzZSBSRUxLSU5E X1JFTEFUSU9OOgorCQkJCXV0aWxpdHlBdWRpdEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1Rf VFlQRV9UQUJMRTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBSRUxLSU5EX0lOREVYOgorCQkJ CXV0aWxpdHlBdWRpdEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9JTkRFWDsKKwkJ CQlicmVhazsKKworCQkJY2FzZSBSRUxLSU5EX1NFUVVFTkNFOgorCQkJCXV0aWxpdHlBdWRp dEV2ZW50Lm9iamVjdFR5cGUgPSBPQkpFQ1RfVFlQRV9TRVFVRU5DRTsKKwkJCQlicmVhazsK KworCQkJY2FzZSBSRUxLSU5EX1ZJRVc6CisJCQkJdXRpbGl0eUF1ZGl0RXZlbnQub2JqZWN0 VHlwZSA9IE9CSkVDVF9UWVBFX1ZJRVc7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVMS0lO RF9DT01QT1NJVEVfVFlQRToKKwkJCQl1dGlsaXR5QXVkaXRFdmVudC5vYmplY3RUeXBlID0g T0JKRUNUX1RZUEVfQ09NUE9TSVRFX1RZUEU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUkVM S0lORF9GT1JFSUdOX1RBQkxFOgorCQkJCXV0aWxpdHlBdWRpdEV2ZW50Lm9iamVjdFR5cGUg PSBPQkpFQ1RfVFlQRV9GT1JFSUdOX1RBQkxFOworCQkJCWJyZWFrOworCisJCQljYXNlIFJF TEtJTkRfTUFUVklFVzoKKwkJCQl1dGlsaXR5QXVkaXRFdmVudC5vYmplY3RUeXBlID0gT0JK RUNUX1RZUEVfTUFUVklFVzsKKwkJCQlicmVhazsKKworCQkJLyoKKwkJCSAqIEFueSBvdGhl ciBjYXNlcyB3aWxsIGJlIGhhbmRsZWQgYnkgbG9nX3V0aWxpdHlfY29tbWFuZCgpLgorCQkJ ICovCisJCQlkZWZhdWx0OgorCQkJCXJldHVybjsKKwkJCQlicmVhazsKKwkJfQorCisJCS8q IExvZyB0aGUgZXZlbnQgKi8KKwkJbG9nX2F1ZGl0X2V2ZW50KCZ1dGlsaXR5QXVkaXRFdmVu dCk7CisJCXV0aWxpdHlDb21tYW5kTG9nZ2VkID0gdHJ1ZTsKKwl9Cit9CisKKy8qCisgKiBD cmVhdGUgQXVkaXRFdmVudHMgZm9yIG5vbi1jYXRhbG9nIGZ1bmN0aW9uIGV4ZWN1dGlvbiwg YXMgZGV0ZWN0ZWQgYnkKKyAqIGxvZ19vYmplY3RfYWNjZXNzKCkgYmVsb3cuCisgKi8KK3N0 YXRpYyB2b2lkCitsb2dfZnVuY3Rpb25fZXhlY3V0ZShPaWQgb2JqZWN0SWQpCit7CisJSGVh cFR1cGxlIHByb2N0dXA7CisJRm9ybV9wZ19wcm9jIHByb2M7CisKKwkvKiBHZXQgaW5mbyBh Ym91dCB0aGUgZnVuY3Rpb24uICovCisJcHJvY3R1cCA9IFNlYXJjaFN5c0NhY2hlMShQUk9D T0lELCBPYmplY3RJZEdldERhdHVtKG9iamVjdElkKSk7CisKKwlpZiAoIXByb2N0dXApCisJ CWVsb2coRVJST1IsICJjYWNoZSBsb29rdXAgZmFpbGVkIGZvciBmdW5jdGlvbiAldSIsIG9i amVjdElkKTsKKwlwcm9jID0gKEZvcm1fcGdfcHJvYykgR0VUU1RSVUNUKHByb2N0dXApOwor CisJLyoKKwkgKiBMb2dnaW5nIGV4ZWN1dGlvbiBvZiBhbGwgcGdfY2F0YWxvZyBmdW5jdGlv bnMgd291bGQgbWFrZSB0aGUgbG9nCisJICogdW51c2FibHkgbm9pc3kuCisJICovCisJaWYg KElzU3lzdGVtTmFtZXNwYWNlKHByb2MtPnByb25hbWVzcGFjZSkpCisJeworCQlSZWxlYXNl U3lzQ2FjaGUocHJvY3R1cCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBHZW5lcmF0ZSB0aGUg ZnVsbHktcXVhbGlmaWVkIGZ1bmN0aW9uIG5hbWUuICovCisJdXRpbGl0eUF1ZGl0RXZlbnQu b2JqZWN0TmFtZSA9CisJCXF1b3RlX3F1YWxpZmllZF9pZGVudGlmaWVyKGdldF9uYW1lc3Bh Y2VfbmFtZShwcm9jLT5wcm9uYW1lc3BhY2UpLAorCQkJCQkJCQkgICBOYW1lU3RyKHByb2Mt PnByb25hbWUpKTsKKwlSZWxlYXNlU3lzQ2FjaGUocHJvY3R1cCk7CisKKwkvKiBMb2cgdGhl IGV2ZW50ICovCisJdXRpbGl0eUF1ZGl0RXZlbnQubG9nU3RtdExldmVsID0gTE9HU1RNVF9B TEw7CisJdXRpbGl0eUF1ZGl0RXZlbnQuY29tbWFuZFRhZyA9IFRfRG9TdG10OworCXV0aWxp dHlBdWRpdEV2ZW50LmNvbW1hbmQgPSBDT01NQU5EX0VYRUNVVEU7CisJdXRpbGl0eUF1ZGl0 RXZlbnQub2JqZWN0VHlwZSA9IE9CSkVDVF9UWVBFX0ZVTkNUSU9OOworCXV0aWxpdHlBdWRp dEV2ZW50LmNvbW1hbmRUZXh0ID0gZGVidWdfcXVlcnlfc3RyaW5nOworCisJbG9nX2F1ZGl0 X2V2ZW50KCZ1dGlsaXR5QXVkaXRFdmVudCk7CisJdXRpbGl0eUNvbW1hbmRMb2dnZWQgPSB0 cnVlOworfQorCisvKgorICogTG9nIG9iamVjdCBhY2Nlc3NlcyAod2hpY2ggaXMgbW9yZSBh Ym91dCBEREwgdGhhbiBETUwsIGV2ZW4gdGhvdWdoIGl0CisgKiBzb3VuZHMgbGlrZSB0aGUg bGF0dGVyKS4KKyAqLworc3RhdGljIHZvaWQKK2xvZ19vYmplY3RfYWNjZXNzKE9iamVjdEFj Y2Vzc1R5cGUgYWNjZXNzLAorCQkJCSAgT2lkIGNsYXNzSWQsCisJCQkJICBPaWQgb2JqZWN0 SWQsCisJCQkJICBpbnQgc3ViSWQsCisJCQkJICB2b2lkICphcmcpCit7CisJc3dpdGNoIChh Y2Nlc3MpCisJeworCQkvKiBMb2cgZXhlY3V0ZS4gKi8KKwkJY2FzZSBPQVRfRlVOQ1RJT05f RVhFQ1VURToKKwkJCWxvZ19mdW5jdGlvbl9leGVjdXRlKG9iamVjdElkKTsKKwkJCWJyZWFr OworCisJCS8qIExvZyBjcmVhdGUuICovCisJCWNhc2UgT0FUX1BPU1RfQ1JFQVRFOgorCQkJ eworCQkJCU9iamVjdEFjY2Vzc1Bvc3RDcmVhdGUgKnBjID0gYXJnOworCisJCQkJaWYgKHBj LT5pc19pbnRlcm5hbCkKKwkJCQkJcmV0dXJuOworCisJCQkJbG9nX2NyZWF0ZV9hbHRlcl9k cm9wKGNsYXNzSWQsIG9iamVjdElkKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIExvZyBh bHRlci4gKi8KKwkJY2FzZSBPQVRfUE9TVF9BTFRFUjoKKwkJCXsKKwkJCQlPYmplY3RBY2Nl c3NQb3N0QWx0ZXIgKnBhID0gYXJnOworCisJCQkJaWYgKHBhLT5pc19pbnRlcm5hbCkKKwkJ CQkJcmV0dXJuOworCisJCQkJbG9nX2NyZWF0ZV9hbHRlcl9kcm9wKGNsYXNzSWQsIG9iamVj dElkKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIExvZyBkcm9wLiAqLworCQljYXNlIE9B VF9EUk9QOgorCQl7CisJCQlPYmplY3RBY2Nlc3NEcm9wICpkcm9wID0gYXJnOworCisJCQlp ZiAoZHJvcC0+ZHJvcGZsYWdzICYgUEVSRk9STV9ERUxFVElPTl9JTlRFUk5BTCkKKwkJCQly ZXR1cm47CisKKwkJCWxvZ19jcmVhdGVfYWx0ZXJfZHJvcChjbGFzc0lkLCBvYmplY3RJZCk7 CisJCX0KKwkJYnJlYWs7CisKKwkJLyogQWxsIG90aGVycyBwcm9jZXNzZWQgYnkgbG9nX3V0 aWxpdHlfY29tbWFuZCgpICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9Cit9CisKKy8q CisgKiBIb29rIGZ1bmN0aW9ucworICovCitzdGF0aWMgRXhlY3V0b3JDaGVja1Blcm1zX2hv b2tfdHlwZSBuZXh0X0V4ZWN1dG9yQ2hlY2tQZXJtc19ob29rID0gTlVMTDsKK3N0YXRpYyBQ cm9jZXNzVXRpbGl0eV9ob29rX3R5cGUgbmV4dF9Qcm9jZXNzVXRpbGl0eV9ob29rID0gTlVM TDsKK3N0YXRpYyBvYmplY3RfYWNjZXNzX2hvb2tfdHlwZSBuZXh0X29iamVjdF9hY2Nlc3Nf aG9vayA9IE5VTEw7CisKKy8qCisgKiBIb29rIEV4ZWN1dG9yQ2hlY2tQZXJtcyB0byBkbyBz ZXNzaW9uIGFuZCBvYmplY3QgYXVkaXRpbmcgZm9yIERNTC4KKyAqLworc3RhdGljIGJvb2wK K3BnYXVkaXRfRXhlY3V0b3JDaGVja1Blcm1zX2hvb2soTGlzdCAqcmFuZ2VUYWJscywgYm9v bCBhYm9ydCkKK3sKKwlPaWQgYXVkaXRPaWQgPSBhdWRpdF9yb2xlX29pZCgpOworCisJaWYg KChhdWRpdE9pZCAhPSBJbnZhbGlkT2lkIHx8IGF1ZGl0TG9nQml0bWFwICE9IDApICYmCisJ CSFJc0Fib3J0ZWRUcmFuc2FjdGlvbkJsb2NrU3RhdGUoKSkKKwkJbG9nX2RtbChhdWRpdE9p ZCwgcmFuZ2VUYWJscyk7CisKKwlpZiAobmV4dF9FeGVjdXRvckNoZWNrUGVybXNfaG9vayAm JgorCQkhKCpuZXh0X0V4ZWN1dG9yQ2hlY2tQZXJtc19ob29rKSAocmFuZ2VUYWJscywgYWJv cnQpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIEhv b2sgUHJvY2Vzc1V0aWxpdHkgdG8gZG8gc2Vzc2lvbiBhdWRpdGluZyBmb3IgRERMIGFuZCB1 dGlsaXR5IGNvbW1hbmRzLgorICovCitzdGF0aWMgdm9pZAorcGdhdWRpdF9Qcm9jZXNzVXRp bGl0eV9ob29rKE5vZGUgKnBhcnNldHJlZSwKKwkJCQkJCQljb25zdCBjaGFyICpxdWVyeVN0 cmluZywKKwkJCQkJCQlQcm9jZXNzVXRpbGl0eUNvbnRleHQgY29udGV4dCwKKwkJCQkJCQlQ YXJhbUxpc3RJbmZvIHBhcmFtcywKKwkJCQkJCQlEZXN0UmVjZWl2ZXIgKmRlc3QsCisJCQkJ CQkJY2hhciAqY29tcGxldGlvblRhZykKK3sKKwkvKiBDcmVhdGUgdGhlIHV0aWxpdHkgYXVk aXQgZXZlbnQuICovCisJdXRpbGl0eUNvbW1hbmRMb2dnZWQgPSBmYWxzZTsKKworCXV0aWxp dHlBdWRpdEV2ZW50LmxvZ1N0bXRMZXZlbCA9IEdldENvbW1hbmRMb2dMZXZlbChwYXJzZXRy ZWUpOworCXV0aWxpdHlBdWRpdEV2ZW50LmNvbW1hbmRUYWcgPSBub2RlVGFnKHBhcnNldHJl ZSk7CisJdXRpbGl0eUF1ZGl0RXZlbnQuY29tbWFuZCA9IENyZWF0ZUNvbW1hbmRUYWcocGFy c2V0cmVlKTsKKwl1dGlsaXR5QXVkaXRFdmVudC5vYmplY3ROYW1lID0gIiI7CisJdXRpbGl0 eUF1ZGl0RXZlbnQub2JqZWN0VHlwZSA9ICIiOworCXV0aWxpdHlBdWRpdEV2ZW50LmNvbW1h bmRUZXh0ID0gZGVidWdfcXVlcnlfc3RyaW5nOworCXV0aWxpdHlBdWRpdEV2ZW50LmdyYW50 ZWQgPSBmYWxzZTsKKworCS8qIENhbGwgdGhlIHN0YW5kYXJkIHByb2Nlc3MgdXRpbGl0eSBj aGFpbi4gKi8KKwlpZiAobmV4dF9Qcm9jZXNzVXRpbGl0eV9ob29rKQorCQkoKm5leHRfUHJv Y2Vzc1V0aWxpdHlfaG9vaykgKHBhcnNldHJlZSwgcXVlcnlTdHJpbmcsIGNvbnRleHQsCisJ CQkJCQkJCQkgcGFyYW1zLCBkZXN0LCBjb21wbGV0aW9uVGFnKTsKKwllbHNlCisJCXN0YW5k YXJkX1Byb2Nlc3NVdGlsaXR5KHBhcnNldHJlZSwgcXVlcnlTdHJpbmcsIGNvbnRleHQsCisJ CQkJCQkJCXBhcmFtcywgZGVzdCwgY29tcGxldGlvblRhZyk7CisKKwkvKiBMb2cgdGhlIHV0 aWxpdHkgY29tbWFuZCBpZiBsb2dnaW5nIGlzIG9uLCB0aGUgY29tbWFuZCBoYXMgbm90IGFs cmVhZHkKKwkgKiBiZWVuIGxvZ2dlZCBieSBhbm90aGVyIGhvb2ssIGFuZCB0aGUgdHJhbnNh Y3Rpb24gaXMgbm90IGFib3J0ZWQgKi8KKwlpZiAoYXVkaXRMb2dCaXRtYXAgIT0gMCAmJiAh dXRpbGl0eUNvbW1hbmRMb2dnZWQgJiYKKwkJIUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tT dGF0ZSgpKQorCXsKKwkJbG9nX2F1ZGl0X2V2ZW50KCZ1dGlsaXR5QXVkaXRFdmVudCk7CisJ fQorfQorCisvKgorICogSG9vayBvYmplY3RfYWNjZXNzX2hvb2sgdG8gcHJvdmlkZSBmdWxs eS1xdWFsaWZpZWQgb2JqZWN0IG5hbWVzIGZvciBleGVjdXRlLAorICogY3JlYXRlLCBkcm9w LCBhbmQgYWx0ZXIgY29tbWFuZHMuICBNb3N0IG9mIHRoZSBhdWRpdCBpbmZvcm1hdGlvbiBp cyBmaWxsZWQgaW4KKyAqIGJ5IGxvZ191dGlsaXR5X2NvbW1hbmQoKS4KKyAqLworc3RhdGlj IHZvaWQKK3BnYXVkaXRfb2JqZWN0X2FjY2Vzc19ob29rKE9iamVjdEFjY2Vzc1R5cGUgYWNj ZXNzLAorCQkJCQkJICAgT2lkIGNsYXNzSWQsCisJCQkJCQkgICBPaWQgb2JqZWN0SWQsCisJ CQkJCQkgICBpbnQgc3ViSWQsCisJCQkJCQkgICB2b2lkICphcmcpCit7CisJaWYgKGF1ZGl0 TG9nQml0bWFwICE9IDAgJiYgIUlzQWJvcnRlZFRyYW5zYWN0aW9uQmxvY2tTdGF0ZSgpKQor CQlsb2dfb2JqZWN0X2FjY2VzcyhhY2Nlc3MsIGNsYXNzSWQsIG9iamVjdElkLCBzdWJJZCwg YXJnKTsKKworCWlmIChuZXh0X29iamVjdF9hY2Nlc3NfaG9vaykKKwkJKCpuZXh0X29iamVj dF9hY2Nlc3NfaG9vaykgKGFjY2VzcywgY2xhc3NJZCwgb2JqZWN0SWQsIHN1YklkLCBhcmcp OworfQorCisvKgorICogR1VDIGNoZWNrIGFuZCBhc3NpZ24gZnVuY3Rpb25zCisgKi8KKwor LyoKKyAqIFRha2UgYSBwZ2F1ZGl0LmxvZyB2YWx1ZSBzdWNoIGFzICJyZWFkLCB3cml0ZSwg ZG1sIiwgdmVyaWZ5IHRoYXQgZWFjaCBvZiB0aGUKKyAqIGNvbW1hLXNlcGFyYXRlZCB0b2tl bnMgY29ycmVzcG9uZHMgdG8gYSBMb2dDbGFzcyB2YWx1ZSwgYW5kIGNvbnZlcnQgdGhlbSBp bnRvCisgKiBhIGJpdG1hcCB0aGF0IGxvZ19hdWRpdF9ldmVudCBjYW4gY2hlY2suCisgKi8K K3N0YXRpYyBib29sCitjaGVja19wZ2F1ZGl0X2xvZyhjaGFyICoqbmV3dmFsLCB2b2lkICoq ZXh0cmEsIEd1Y1NvdXJjZSBzb3VyY2UpCit7CisJTGlzdCAqZmxhZ3M7CisJY2hhciAqcmF3 dmFsOworCUxpc3RDZWxsICpsdDsKKwl1aW50NjQgKmY7CisKKwkvKiBNYWtlIHN1cmUgbmV3 dmFsIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdG9rZW5zLiAqLworCXJhd3ZhbCA9 IHBzdHJkdXAoKm5ld3ZhbCk7CisJaWYgKCFTcGxpdElkZW50aWZpZXJTdHJpbmcocmF3dmFs LCAnLCcsICZmbGFncykpCisJeworCQlHVUNfY2hlY2tfZXJyZGV0YWlsKCJMaXN0IHN5bnRh eCBpcyBpbnZhbGlkIik7CisJCWxpc3RfZnJlZShmbGFncyk7CisJCXBmcmVlKHJhd3ZhbCk7 CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgd2UgcmVjb2du aXNlIGVhY2ggdG9rZW4sIGFuZCBhZGQgaXQgdG8gdGhlIGJpdG1hcCB3ZSdyZQorCSAqIGJ1 aWxkaW5nIHVwIGluIGEgbmV3bHktYWxsb2NhdGVkIHVpbnQ2NCAqZi4KKwkgKi8KKwlmID0g KHVpbnQ2NCAqKSBtYWxsb2Moc2l6ZW9mKHVpbnQ2NCkpOworCWlmICghZikKKwkJcmV0dXJu IGZhbHNlOworCSpmID0gMDsKKworCWZvcmVhY2gobHQsIGZsYWdzKQorCXsKKwkJYm9vbCBz dWJ0cmFjdCA9IGZhbHNlOworCQl1aW50NjQgY2xhc3M7CisKKwkJLyogUmV0cmlldmUgYSB0 b2tlbiAqLworCQljaGFyICp0b2tlbiA9IChjaGFyICopbGZpcnN0KGx0KTsKKworCQkvKiBJ ZiB0b2tlbiBpcyBwcmVjZWRlZCBieSAtLCB0aGVuIHRoZW4gdG9rZW4gaXMgc3VidHJhY3Rp dmUuICovCisJCWlmIChzdHJzdHIodG9rZW4sICItIikgPT0gdG9rZW4pCisJCXsKKwkJCXRv a2VuID0gdG9rZW4gKyAxOworCQkJc3VidHJhY3QgPSB0cnVlOworCQl9CisKKwkJLyogVGVz dCBlYWNoIHRva2VuLiAqLworCQlpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfTk9O RSkgPT0gMCkKKwkJCWNsYXNzID0gTE9HX05PTkU7CisJCWVsc2UgaWYgKHBnX3N0cmNhc2Vj bXAodG9rZW4sIENMQVNTX0FMTCkgPT0gMCkKKwkJCWNsYXNzID0gTE9HX0FMTDsKKwkJZWxz ZSBpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfRERMKSA9PSAwKQorCQkJY2xhc3Mg PSBMT0dfRERMOworCQllbHNlIGlmIChwZ19zdHJjYXNlY21wKHRva2VuLCBDTEFTU19GVU5D VElPTikgPT0gMCkKKwkJCWNsYXNzID0gTE9HX0ZVTkNUSU9OOworCQllbHNlIGlmIChwZ19z dHJjYXNlY21wKHRva2VuLCBDTEFTU19NSVNDKSA9PSAwKQorCQkJY2xhc3MgPSBMT0dfTUlT QzsKKwkJZWxzZSBpZiAocGdfc3RyY2FzZWNtcCh0b2tlbiwgQ0xBU1NfUkVBRCkgPT0gMCkK KwkJCWNsYXNzID0gTE9HX1JFQUQ7CisJCWVsc2UgaWYgKHBnX3N0cmNhc2VjbXAodG9rZW4s IENMQVNTX1dSSVRFKSA9PSAwKQorCQkJY2xhc3MgPSBMT0dfV1JJVEU7CisJCWVsc2UKKwkJ eworCQkJZnJlZShmKTsKKwkJCXBmcmVlKHJhd3ZhbCk7CisJCQlsaXN0X2ZyZWUoZmxhZ3Mp OworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyogQWRkIG9yIHN1YnRyYWN0IGNsYXNz IGJpdHMgZnJvbSB0aGUgbG9nIGJpdG1hcC4gKi8KKwkJaWYgKHN1YnRyYWN0KQorCQkJKmYg Jj0gfmNsYXNzOworCQllbHNlCisJCQkqZiB8PSBjbGFzczsKKwl9CisKKwlwZnJlZShyYXd2 YWwpOworCWxpc3RfZnJlZShmbGFncyk7CisKKwkvKgorCSAqIFN0b3JlIHRoZSBiaXRtYXAg Zm9yIGFzc2lnbl9wZ2F1ZGl0X2xvZy4KKwkgKi8KKwkqZXh0cmEgPSBmOworCisJcmV0dXJu IHRydWU7Cit9CisKKy8qCisgKiBTZXQgcGdhdWRpdF9sb2cgZnJvbSBleHRyYSAoaWdub3Jp bmcgbmV3dmFsLCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZAorICogdG8gYSBi aXRtYXAgYWJvdmUpLiBOb3RlIHRoYXQgZXh0cmEgbWF5IG5vdCBiZSBzZXQgaWYgdGhlIGFz c2lnbm1lbnQgaXMgdG8gYmUKKyAqIHN1cHByZXNzZWQuCisgKi8KK3N0YXRpYyB2b2lkCith c3NpZ25fcGdhdWRpdF9sb2coY29uc3QgY2hhciAqbmV3dmFsLCB2b2lkICpleHRyYSkKK3sK KwlpZiAoZXh0cmEpCisJCWF1ZGl0TG9nQml0bWFwID0gKih1aW50NjQgKilleHRyYTsKK30K KworLyoKKyAqIERlZmluZSBHVUMgdmFyaWFibGVzIGFuZCBpbnN0YWxsIGhvb2tzIHVwb24g bW9kdWxlIGxvYWQuCisgKi8KK3ZvaWQKK19QR19pbml0KHZvaWQpCit7CisJaWYgKElzVW5k ZXJQb3N0bWFzdGVyKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVf T0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RBVEUpLAorCQkJCSBlcnJtc2coInBnYXVk aXQgbXVzdCBiZSBsb2FkZWQgdmlhIHNoYXJlZF9wcmVsb2FkX2xpYnJhcmllcyIpKSk7CisK KwkvKgorCSAqIHBnYXVkaXQucm9sZSA9ICJyb2xlMSIKKwkgKgorCSAqIFRoaXMgdmFyaWFi bGUgZGVmaW5lcyBhIHJvbGUgdG8gYmUgdXNlZCBmb3IgYXVkaXRpbmcuCisJICovCisJRGVm aW5lQ3VzdG9tU3RyaW5nVmFyaWFibGUoInBnYXVkaXQucm9sZSIsCisJCQkJCQkJICAgIkVu YWJsZSBhdWRpdGluZyBmb3Igcm9sZSIsCisJCQkJCQkJICAgTlVMTCwKKwkJCQkJCQkgICAm YXVkaXRSb2xlLAorCQkJCQkJCSAgICIiLAorCQkJCQkJCSAgIFBHQ19TVVNFVCwKKwkJCQkJ CQkgICBHVUNfTElTVF9JTlBVVCB8IEdVQ19OT1RfSU5fU0FNUExFLAorCQkJCQkJCSAgIE5V TEwsIE5VTEwsIE5VTEwpOworCisJLyoKKwkgKiBwZ2F1ZGl0LmxvZyA9ICJyZWFkLCB3cml0 ZSwgZGRsIgorCSAqCisJICogVGhpcyB2YXJpYWJsZXMgY29udHJvbHMgd2hhdCBjbGFzc2Vz IG9mIGNvbW1hbmRzIGFyZSBsb2dnZWQuCisJICovCisJRGVmaW5lQ3VzdG9tU3RyaW5nVmFy aWFibGUoInBnYXVkaXQubG9nIiwKKwkJCQkJCQkgICAiRW5hYmxlIGF1ZGl0aW5nIGZvciBj bGFzc2VzIG9mIGNvbW1hbmRzIiwKKwkJCQkJCQkgICBOVUxMLAorCQkJCQkJCSAgICZhdWRp dExvZywKKwkJCQkJCQkgICAibm9uZSIsCisJCQkJCQkJICAgUEdDX1NVU0VULAorCQkJCQkJ CSAgIEdVQ19MSVNUX0lOUFVUIHwgR1VDX05PVF9JTl9TQU1QTEUsCisJCQkJCQkJICAgY2hl Y2tfcGdhdWRpdF9sb2csCisJCQkJCQkJICAgYXNzaWduX3BnYXVkaXRfbG9nLAorCQkJCQkJ CSAgIE5VTEwpOworCisJLyoKKwkgKiBJbnN0YWxsIG91ciBob29rIGZ1bmN0aW9ucyBhZnRl ciBzYXZpbmcgdGhlIGV4aXN0aW5nIHBvaW50ZXJzIHRvIHByZXNlcnZlCisJICogdGhlIGNo YWluLgorCSAqLworCW5leHRfRXhlY3V0b3JDaGVja1Blcm1zX2hvb2sgPSBFeGVjdXRvckNo ZWNrUGVybXNfaG9vazsKKwlFeGVjdXRvckNoZWNrUGVybXNfaG9vayA9IHBnYXVkaXRfRXhl Y3V0b3JDaGVja1Blcm1zX2hvb2s7CisKKwluZXh0X1Byb2Nlc3NVdGlsaXR5X2hvb2sgPSBQ cm9jZXNzVXRpbGl0eV9ob29rOworCVByb2Nlc3NVdGlsaXR5X2hvb2sgPSBwZ2F1ZGl0X1By b2Nlc3NVdGlsaXR5X2hvb2s7CisKKwluZXh0X29iamVjdF9hY2Nlc3NfaG9vayA9IG9iamVj dF9hY2Nlc3NfaG9vazsKKwlvYmplY3RfYWNjZXNzX2hvb2sgPSBwZ2F1ZGl0X29iamVjdF9h Y2Nlc3NfaG9vazsKK30KZGlmZiAtLWdpdCBhL2NvbnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQu Y29udHJvbCBiL2NvbnRyaWIvcGdfYXVkaXQvcGdfYXVkaXQuY29udHJvbApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM5MDgyCi0tLSAvZGV2L251bGwKKysrIGIv Y29udHJpYi9wZ19hdWRpdC9wZ19hdWRpdC5jb250cm9sCkBAIC0wLDAgKzEsNSBAQAorIyBw Z19hdWRpdCBleHRlbnNpb24KK2NvbW1lbnQgPSAncHJvdmlkZXMgYXVkaXRpbmcgZnVuY3Rp b25hbGl0eScKK2RlZmF1bHRfdmVyc2lvbiA9ICcxLjAuMCcKK21vZHVsZV9wYXRobmFtZSA9 ICckbGliZGlyL3BnYXVkaXQnCityZWxvY2F0YWJsZSA9IHRydWUKZGlmZiAtLWdpdCBhL2Nv bnRyaWIvcGdfYXVkaXQvdGVzdC90ZXN0LnBsIGIvY29udHJpYi9wZ19hdWRpdC90ZXN0L3Rl c3QucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2E4OWQ1MAotLS0g L2Rldi9udWxsCisrKyBiL2NvbnRyaWIvcGdfYXVkaXQvdGVzdC90ZXN0LnBsCkBAIC0wLDAg KzEsMTIyMCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IworIyB0ZXN0LnBsIC0gcGdBdWRpdCBVbml0IFRlc3RzCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZXJsIGluY2x1ZGVz CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5n czsKK3VzZSBDYXJwOworCit1c2UgR2V0b3B0OjpMb25nOwordXNlIFBvZDo6VXNhZ2U7Cit1 c2UgREJJOwordXNlIEN3ZCBxdyhhYnNfcGF0aCk7Cit1c2UgSVBDOjpTeXN0ZW06OlNpbXBs ZSBxdyhjYXB0dXJlKTsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29uc3Rh bnRzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwordXNlIGNvbnN0YW50Cit7CisJdHJ1 ZSAgPT4gMSwKKwlmYWxzZSA9PiAwCit9OworCit1c2UgY29uc3RhbnQKK3sKKwlDT05URVhU X0dMT0JBTCAgID0+ICdHTE9CQUwnLAorCUNPTlRFWFRfREFUQUJBU0UgPT4gJ0RBVEFCQVNF JywKKwlDT05URVhUX1JPTEUJID0+ICdST0xFJworfTsKKwordXNlIGNvbnN0YW50Cit7CisJ Q0xBU1MJCQk9PiAnQ0xBU1MnLAorCisJQ0xBU1NfRERMCQk9PiAnRERMJywKKwlDTEFTU19G VU5DVElPTgk9PiAnRlVOQ1RJT04nLAorCUNMQVNTX01JU0MJCT0+ICdNSVNDJywKKwlDTEFT U19SRUFECQk9PiAnUkVBRCcsCisJQ0xBU1NfV1JJVEUJCT0+ICdXUklURScsCisKKwlDTEFT U19BTEwJCT0+ICdBTEwnLAorCUNMQVNTX05PTkUJCT0+ICdOT05FJworfTsKKwordXNlIGNv bnN0YW50Cit7CisJQ09NTUFORAkJCQkJCT0+ICdDT01NQU5EJywKKwlDT01NQU5EX0xPRwkJ CQkJPT4gJ0NPTU1BTkRfTE9HJywKKworCUNPTU1BTkRfQU5BTFlaRQkJCQk9PiAnQU5BTFla RScsCisJQ09NTUFORF9BTFRFUl9BR0dSRUdBVEUJCT0+ICdBTFRFUiBBR0dSRUdBVEUnLAor CUNPTU1BTkRfQUxURVJfQ09MTEFUSU9OCQk9PiAnQUxURVIgQ09MTEFUSU9OJywKKwlDT01N QU5EX0FMVEVSX0NPTlZFUlNJT04JPT4gJ0FMVEVSIENPTlZFUlNJT04nLAorCUNPTU1BTkRf QUxURVJfREFUQUJBU0UJCT0+ICdBTFRFUiBEQVRBQkFTRScsCisJQ09NTUFORF9BTFRFUl9S T0xFCQkJPT4gJ0FMVEVSIFJPTEUnLAorCUNPTU1BTkRfQUxURVJfUk9MRV9TRVQJCT0+ICdB TFRFUiBST0xFIFNFVCcsCisJQ09NTUFORF9BTFRFUl9UQUJMRQkJCT0+ICdBTFRFUiBUQUJM RScsCisJQ09NTUFORF9BTFRFUl9UQUJMRV9JTkRFWAk9PiAnQUxURVIgVEFCTEUgSU5ERVgn LAorCUNPTU1BTkRfQkVHSU4JCQkJPT4gJ0JFR0lOJywKKwlDT01NQU5EX0NMT1NFCQkJCT0+ ICdDTE9TRSBDVVJTT1InLAorCUNPTU1BTkRfQ09NTUlUCQkJCT0+ICdDT01NSVQnLAorCUNP TU1BTkRfQ09QWQkJCQk9PiAnQ09QWScsCisJQ09NTUFORF9DT1BZX1RPCQkJCT0+ICdDT1BZ IFRPJywKKwlDT01NQU5EX0NPUFlfRlJPTQkJCT0+ICdDT1BZIEZST00nLAorCUNPTU1BTkRf Q1JFQVRFX0FHR1JFR0FURQk9PiAnQ1JFQVRFIEFHR1JFR0FURScsCisJQ09NTUFORF9DUkVB VEVfQ09MTEFUSU9OCT0+ICdDUkVBVEUgQ09MTEFUSU9OJywKKwlDT01NQU5EX0NSRUFURV9D T05WRVJTSU9OCT0+ICdDUkVBVEUgQ09OVkVSU0lPTicsCisJQ09NTUFORF9DUkVBVEVfREFU QUJBU0UJCT0+ICdDUkVBVEUgREFUQUJBU0UnLAorCUNPTU1BTkRfQ1JFQVRFX0lOREVYCQk9 PiAnQ1JFQVRFIElOREVYJywKKwlDT01NQU5EX0RFQUxMT0NBVEUJCQk9PiAnREVBTExPQ0FU RScsCisJQ09NTUFORF9ERUNMQVJFX0NVUlNPUgkJPT4gJ0RFQ0xBUkUgQ1VSU09SJywKKwlD T01NQU5EX0RPCQkJCQk9PiAnRE8nLAorCUNPTU1BTkRfRElTQ0FSRF9BTEwJCQk9PiAnRElT Q0FSRCBBTEwnLAorCUNPTU1BTkRfQ1JFQVRFX0ZVTkNUSU9OCQk9PiAnQ1JFQVRFIEZVTkNU SU9OJywKKwlDT01NQU5EX0NSRUFURV9ST0xFCQkJPT4gJ0NSRUFURSBST0xFJywKKwlDT01N QU5EX0NSRUFURV9TQ0hFTUEJCT0+ICdDUkVBVEUgU0NIRU1BJywKKwlDT01NQU5EX0NSRUFU RV9UQUJMRQkJPT4gJ0NSRUFURSBUQUJMRScsCisJQ09NTUFORF9DUkVBVEVfVEFCTEVfQVMJ CT0+ICdDUkVBVEUgVEFCTEUgQVMnLAorCUNPTU1BTkRfRFJPUF9EQVRBQkFTRQkJPT4gJ0RS T1AgREFUQUJBU0UnLAorCUNPTU1BTkRfRFJPUF9TQ0hFTUEJCQk9PiAnRFJPUCBTQ0hFTUEn LAorCUNPTU1BTkRfRFJPUF9UQUJMRQkJCT0+ICdEUk9QIFRBQkxFJywKKwlDT01NQU5EX0RS T1BfVEFCTEVfSU5ERVgJPT4gJ0RST1AgVEFCTEUgSU5ERVgnLAorCUNPTU1BTkRfRFJPUF9U QUJMRV9UWVBFCQk9PiAnRFJPUCBUQUJMRSBUWVBFJywKKwlDT01NQU5EX0VYRUNVVEUJCQkJ PT4gJ0VYRUNVVEUnLAorCUNPTU1BTkRfRVhFQ1VURV9SRUFECQk9PiAnRVhFQ1VURSBSRUFE JywKKwlDT01NQU5EX0VYRUNVVEVfV1JJVEUJCT0+ICdFWEVDVVRFIFdSSVRFJywKKwlDT01N QU5EX0VYRUNVVEVfRlVOQ1RJT04JPT4gJ0VYRUNVVEUgRlVOQ1RJT04nLAorCUNPTU1BTkRf RkVUQ0gJCQkJPT4gJ0ZFVENIJywKKwlDT01NQU5EX0dSQU5UCQkJCT0+ICdHUkFOVCcsCisJ Q09NTUFORF9JTlNFUlQJCQkJPT4gJ0lOU0VSVCcsCisJQ09NTUFORF9QUkVQQVJFCQkJCT0+ ICdQUkVQQVJFJywKKwlDT01NQU5EX1BSRVBBUkVfUkVBRAkJPT4gJ1BSRVBBUkUgUkVBRCcs CisJQ09NTUFORF9QUkVQQVJFX1dSSVRFCQk9PiAnUFJFUEFSRSBXUklURScsCisJQ09NTUFO RF9SRVZPS0UJCQkJPT4gJ1JFVk9LRScsCisJQ09NTUFORF9TRUxFQ1QJCQkJPT4gJ1NFTEVD VCcsCisJQ09NTUFORF9TRVQJCQkJCT0+ICdTRVQnLAorCUNPTU1BTkRfVVBEQVRFCQkJCT0+ ICdVUERBVEUnCit9OworCit1c2UgY29uc3RhbnQKK3sKKwlUWVBFCQkJPT4gJ1RZUEUnLAor CVRZUEVfTk9ORQkJPT4gJycsCisKKwlUWVBFX0ZVTkNUSU9OCT0+ICdGVU5DVElPTicsCisJ VFlQRV9JTkRFWAkJPT4gJ0lOREVYJywKKwlUWVBFX1RBQkxFCQk9PiAnVEFCTEUnLAorCVRZ UEVfVFlQRQkJPT4gJ1RZUEUnCit9OworCit1c2UgY29uc3RhbnQKK3sKKwlOQU1FCQkJPT4g J05BTUUnCit9OworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDb21tYW5kIGxp bmUgcGFyYW1ldGVycworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215ICRzdHJQZ1Nx bEJpbiA9ICcuLi8uLi8uLi8uLi9iaW4vYmluJzsJIyBQYXRoIG9mIFBHIGJpbmFyaWVzIHRv IHVzZSBmb3IKKwkJCQkJCQkJCQkJIyB0aGlzIHRlc3QKK215ICRzdHJUZXN0UGF0aCA9ICcu Li8uLi8uLi8uLi9kYXRhJzsJCSMgUGF0aCB3aGVyZSB0ZXN0aW5nIHdpbGwgb2NjdXIKK215 ICRpRGVmYXVsdFBvcnQgPSA2MDAwOwkJCQkJIyBEZWZhdWx0IHBvcnQgdG8gcnVuIFBvc3Rn cmVzIG9uCitteSAkYkhlbHAgPSBmYWxzZTsJCQkJCQkJIyBEaXNwbGF5IGhlbHAKK215ICRi UXVpZXQgPSBmYWxzZTsJCQkJCQkJIyBTdXByZXNzIG91dHB1dCBleGNlcHQgZm9yIGVycm9y cworbXkgJGJOb0NsZWFudXAgPSBmYWxzZTsJCQkJCQkjIENsZWFudXAgZGF0YWJhc2Ugb24g ZXhpdAorCitHZXRPcHRpb25zICgncXxxdWlldCcgPT4gXCRiUXVpZXQsCisJCQknbm8tY2xl YW51cCcgPT4gXCRiTm9DbGVhbnVwLAorCQkJJ2hlbHAnID0+IFwkYkhlbHAsCisJCQkncGdz cWwtYmluPXMnID0+IFwkc3RyUGdTcWxCaW4sCisJCQkndGVzdC1wYXRoPXMnID0+IFwkc3Ry VGVzdFBhdGgpCisJb3IgcG9kMnVzYWdlKDIpOworCisjIERpc3BsYXkgdmVyc2lvbiBhbmQg ZXhpdCBpZiByZXF1ZXN0ZWQKK2lmICgkYkhlbHApCit7CisJcHJpbnQgJ3BnX2F1ZGl0IHVu aXQgdGVzdFxuXG4nOworCXBvZDJ1c2FnZSgpOworCisJZXhpdCAwOworfQorCisjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIworIyBHbG9iYWwgdmFyaWFibGVzCisjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIworbXkgJGhEYjsJCQkJCSMgQ29ubmVjdGlvbiB0byBQb3N0Z3Jlcwor bXkgJHN0ckxvZ0V4cGVjdGVkID0gJyc7CSMgVGhlIGV4cGVjdGVkIGxvZyBjb21wYXJlZCB3 aXRoIGdyZXBwaW5nIEFVRElUCisJCQkJCQkJIyBlbnRyaWVzIGZyb20gdGhlIHBvc3RncmVz IGxvZy4KKworbXkgJHN0ckRhdGFiYXNlID0gJ3Bvc3RncmVzJzsJIyBDb25uZWN0ZWQgZGF0 YWJhc2UgKG1vZGlmaWVkIGJ5IFBnU2V0RGF0YWJhc2UpCitteSAkc3RyVXNlciA9ICdwb3N0 Z3Jlcyc7CQkjIENvbm5lY3RlZCB1c2VyIChtb2RpZmllZCBieSBQZ1NldFVzZXIpCitteSAk c3RyQXVkaXRSb2xlID0gJ2F1ZGl0JzsJCSMgUm9sZSB0byB1c2UgZm9yIGF1ZGl0aW5nCisK K215ICVvQXVkaXRMb2dIYXNoOwkJCQkjIEhhc2ggdG8gc3RvcmUgcGdhdWRpdC5sb2cgR1VD UworbXkgJW9BdWRpdEdyYW50SGFzaDsJCQkjIEhhc2ggdG8gc3RvcmUgcGdhdWRpdCBncmFu dHMKKworbXkgJHN0ckN1cnJlbnRBdWRpdExvZzsJCSMgcGdhdWRpdC5sb2cgc2V0dGluZyB0 aGF0IFBvc3RncmVzIHdhcyBzdGFydGVkIHdpdGgKK215ICRzdHJUZW1wb3JhcnlBdWRpdExv ZzsJIyBwZ2F1ZGl0LmxvZyBzZXR0aW5nIHRoYXQgd2FzIHNldCBob3QKKworIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKKyMgU3RvcmVzIHRoZSBtYXBwaW5nIGJldHdlZW4gY29tbWFu ZHMsIGNsYXNzZXMsIGFuZCB0eXBlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK215 ICVvQ29tbWFuZEhhc2ggPQorKCZDT01NQU5EX0FOQUxZWkUgPT4geworCSZDTEFTUyA9PiAm Q0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9BTFRFUl9BR0dS RUdBVEUgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwK KwkmQ09NTUFORF9BTFRFUl9EQVRBQkFTRSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZU WVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0FMVEVSX0NPTExBVElPTiA9PiB7JkNM QVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0FM VEVSX0NPTlZFUlNJT04gPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQ RV9OT05FfSwKKwkmQ09NTUFORF9BTFRFUl9ST0xFID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RE TCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQUxURVJfUk9MRV9TRVQgPT4g eyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09NTUFO RCA9PiAmQ09NTUFORF9BTFRFUl9ST0xFfSwKKwkmQ09NTUFORF9BTFRFUl9UQUJMRSA9PiB7 JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX1RBQkxFfSwKKwkmQ09NTUFO RF9BTFRFUl9UQUJMRV9JTkRFWCA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ ICZUWVBFX0lOREVYLAorCQkmQ09NTUFORCA9PiAmQ09NTUFORF9BTFRFUl9UQUJMRX0sCisJ JkNPTU1BTkRfQkVHSU4gPT4geyZDTEFTUyA9PiAmQ0xBU1NfTUlTQywgJlRZUEUgPT4gJlRZ UEVfTk9ORX0sCisJJkNPTU1BTkRfQ0xPU0UgPT4geyZDTEFTUyA9PiAmQ0xBU1NfTUlTQywg JlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQ09NTUlUID0+IHsmQ0xBU1MgPT4g JkNMQVNTX01JU0MsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0NPUFlfRlJP TSA9PiB7JkNMQVNTID0+ICZDTEFTU19XUklURSwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJ JkNPTU1BTkQgPT4gJkNPTU1BTkRfQ09QWX0sCisJJkNPTU1BTkRfQ09QWV9UTyA9PiB7JkNM QVNTID0+ICZDTEFTU19SRUFELCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09NTUFORCA9 PiAmQ09NTUFORF9DT1BZfSwKKwkmQ09NTUFORF9DUkVBVEVfQUdHUkVHQVRFID0+IHsmQ0xB U1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQ1JF QVRFX0NPTlZFUlNJT04gPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQ RV9OT05FfSwKKwkmQ09NTUFORF9DUkVBVEVfQ09MTEFUSU9OID0+IHsmQ0xBU1MgPT4gJkNM QVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQ1JFQVRFX0RBVEFC QVNFID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJ JkNPTU1BTkRfQ1JFQVRFX0lOREVYID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUg PT4gJlRZUEVfSU5ERVh9LAorCSZDT01NQU5EX0RFQUxMT0NBVEUgPT4geyZDTEFTUyA9PiAm Q0xBU1NfTUlTQywgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfREVDTEFSRV9D VVJTT1IgPT4geyZDTEFTUyA9PiAmQ0xBU1NfUkVBRCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0s CisJJkNPTU1BTkRfRE8gPT4geyZDTEFTUyA9PiAmQ0xBU1NfRlVOQ1RJT04sICZUWVBFID0+ ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0RJU0NBUkRfQUxMID0+IHsmQ0xBU1MgPT4gJkNM QVNTX01JU0MsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0NSRUFURV9GVU5D VElPTiA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX05PTkV9LAor CSZDT01NQU5EX0NSRUFURV9ST0xFID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUg PT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRfQ1JFQVRFX1NDSEVNQSA9PiB7JkNMQVNTID0+ ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0NSRUFURV9U QUJMRSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX1RBQkxFfSwK KwkmQ09NTUFORF9DUkVBVEVfVEFCTEVfQVMgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAm VFlQRSA9PiAmVFlQRV9UQUJMRX0sCisJJkNPTU1BTkRfRFJPUF9EQVRBQkFTRSA9PiB7JkNM QVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX05PTkV9LAorCSZDT01NQU5EX0RS T1BfU0NIRU1BID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfTk9O RX0sCisJJkNPTU1BTkRfRFJPUF9UQUJMRSA9PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZU WVBFID0+ICZUWVBFX1RBQkxFfSwKKwkmQ09NTUFORF9EUk9QX1RBQkxFX0lOREVYID0+IHsm Q0xBU1MgPT4gJkNMQVNTX0RETCwgJlRZUEUgPT4gJlRZUEVfSU5ERVgsCisJCSZDT01NQU5E ID0+ICZDT01NQU5EX0RST1BfVEFCTEV9LAorCSZDT01NQU5EX0RST1BfVEFCTEVfVFlQRSA9 PiB7JkNMQVNTID0+ICZDTEFTU19EREwsICZUWVBFID0+ICZUWVBFX1RZUEUsCisJCSZDT01N QU5EID0+ICZDT01NQU5EX0RST1BfVEFCTEV9LAorCSZDT01NQU5EX0VYRUNVVEVfUkVBRCA9 PiB7JkNMQVNTID0+ICZDTEFTU19SRUFELCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09N TUFORCA9PiAmQ09NTUFORF9FWEVDVVRFfSwKKwkmQ09NTUFORF9FWEVDVVRFX1dSSVRFID0+ IHsmQ0xBU1MgPT4gJkNMQVNTX1dSSVRFLCAmVFlQRSA9PiAmVFlQRV9OT05FLAorCQkmQ09N TUFORCA9PiAmQ09NTUFORF9FWEVDVVRFfSwKKwkmQ09NTUFORF9FWEVDVVRFX0ZVTkNUSU9O ID0+IHsmQ0xBU1MgPT4gJkNMQVNTX0ZVTkNUSU9OLAorCQkmVFlQRSA9PiAmVFlQRV9GVU5D VElPTiwgJkNPTU1BTkQgPT4gJkNPTU1BTkRfRVhFQ1VURX0sCisJJkNPTU1BTkRfRkVUQ0gg PT4geyZDTEFTUyA9PiAmQ0xBU1NfTUlTQywgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNP TU1BTkRfR1JBTlQgPT4geyZDTEFTUyA9PiAmQ0xBU1NfRERMLCAmVFlQRSA9PiAmVFlQRV9O T05FfSwKKwkmQ09NTUFORF9QUkVQQVJFX1JFQUQgPT4geyZDTEFTUyA9PiAmQ0xBU1NfUkVB RCwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJJkNPTU1BTkQgPT4gJkNPTU1BTkRfUFJFUEFS RX0sCisJJkNPTU1BTkRfUFJFUEFSRV9XUklURSA9PiB7JkNMQVNTID0+ICZDTEFTU19XUklU RSwgJlRZUEUgPT4gJlRZUEVfTk9ORSwKKwkJJkNPTU1BTkQgPT4gJkNPTU1BTkRfUFJFUEFS RX0sCisJJkNPTU1BTkRfSU5TRVJUID0+IHsmQ0xBU1MgPT4gJkNMQVNTX1dSSVRFLCAmVFlQ RSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9SRVZPS0UgPT4geyZDTEFTUyA9PiAmQ0xB U1NfRERMLCAmVFlQRSA9PiAmVFlQRV9OT05FfSwKKwkmQ09NTUFORF9TRUxFQ1QgPT4geyZD TEFTUyA9PiAmQ0xBU1NfUkVBRCwgJlRZUEUgPT4gJlRZUEVfTk9ORX0sCisJJkNPTU1BTkRf U0VUID0+IHsmQ0xBU1MgPT4gJkNMQVNTX01JU0MsICZUWVBFID0+ICZUWVBFX05PTkV9LAor CSZDT01NQU5EX1VQREFURSA9PiB7JkNMQVNTID0+ICZDTEFTU19XUklURSwgJlRZUEUgPT4g JlRZUEVfTk9ORX0KKyk7CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENvbW1h bmRFeGVjdXRlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIENvbW1hbmRFeGVj dXRlCit7CisJbXkgJHN0ckNvbW1hbmQgPSBzaGlmdDsKKwlteSAkYlN1cHByZXNzRXJyb3Ig PSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHQKKwkkYlN1cHByZXNzRXJyb3IgPSBkZWZpbmVk KCRiU3VwcHJlc3NFcnJvcikgPyAkYlN1cHByZXNzRXJyb3IgOiBmYWxzZTsKKworCSMgUnVu IHRoZSBjb21tYW5kCisJbXkgJGlSZXN1bHQgPSBzeXN0ZW0oJHN0ckNvbW1hbmQpOworCisJ aWYgKCRpUmVzdWx0ICE9IDAgJiYgISRiU3VwcHJlc3NFcnJvcikKKwl7CisJCWNvbmZlc3Mg ImNvbW1hbmQgJyR7c3RyQ29tbWFuZH0nIGZhaWxlZCB3aXRoIGVycm9yICR7aVJlc3VsdH0i OworCX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbG9nCisjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIGxvZworeworCW15ICRzdHJNZXNzYWdlID0gc2hp ZnQ7CisJbXkgJGJFcnJvciA9IHNoaWZ0OworCisJIyBTZXQgZGVmYXVsdAorCSRiRXJyb3Ig PSBkZWZpbmVkKCRiRXJyb3IpID8gJGJFcnJvciA6IGZhbHNlOworCisJaWYgKCEkYlF1aWV0 KQorCXsKKwkJcHJpbnQgIiR7c3RyTWVzc2FnZX1cbiI7CisJfQorCisJaWYgKCRiRXJyb3Ip CisJeworCQlleGl0IDE7CisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwor IyBBcnJheVRvU3RyaW5nCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIEFycmF5 VG9TdHJpbmcKK3sKKwlteSBAc3RyeUFycmF5ID0gQF87CisKKwlteSAkc3RyUmVzdWx0ID0g Jyc7CisKKwlmb3IgKG15ICRpSW5kZXggPSAwOyAkaUluZGV4IDwgQHN0cnlBcnJheTsgJGlJ bmRleCsrKQorCXsKKwkJaWYgKCRpSW5kZXggIT0gMCkKKwkJeworCQkJJHN0clJlc3VsdCAu PSAnLCAnOworCQl9CisKKwkJJHN0clJlc3VsdCAuPSAkc3RyeUFycmF5WyRpSW5kZXhdOwor CX0KKworCXJldHVybiAkc3RyUmVzdWx0OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIworIyBCdWlsZE1vZHVsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBC dWlsZE1vZHVsZQoreworCWNhcHR1cmUoJ2NkIC4uO21ha2UnKTsKKwlDb21tYW5kRXhlY3V0 ZSgiY3AgLi4vcGdfYXVkaXQuc28iIC4KKwkgICAgICAgICAgICAgICAiICR7c3RyUGdTcWxC aW59Ly4uL2xpYi9wb3N0Z3Jlc3FsIik7CisJQ29tbWFuZEV4ZWN1dGUoImNwIC4uL3BnX2F1 ZGl0LmNvbnRyb2wiIC4KKwkgICAgICAgICAgICAgICAiICR7c3RyUGdTcWxCaW59Ly4uL3No YXJlL3Bvc3RncmVzcWwvZXh0ZW5zaW9uIik7CisJQ29tbWFuZEV4ZWN1dGUoImNwIC4uL3Bn X2F1ZGl0LS0xLjAuMC5zcWwiIC4KKwkgICAgICAgICAgICAgICAiICR7c3RyUGdTcWxCaW59 Ly4uL3NoYXJlL3Bvc3RncmVzcWwvZXh0ZW5zaW9uIik7Cit9CisKKyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjCisjIFBnQ29ubmVjdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMK K3N1YiBQZ0Nvbm5lY3QKK3sKKwlteSAkaVBvcnQgPSBzaGlmdDsKKworCSMgU2V0IGRlZmF1 bHQKKwkkaVBvcnQgPSBkZWZpbmVkKCRpUG9ydCkgPyAkaVBvcnQgOiAkaURlZmF1bHRQb3J0 OworCisJIyBMb2cgQ29ubmVjdGlvbgorCSZsb2coIiAgIERCOiBjb25uZWN0IHVzZXIgJHtz dHJVc2VyfSwgZGF0YWJhc2UgJHtzdHJEYXRhYmFzZX0iKTsKKworCSMgRGlzY29ubmVjdCB1 c2VyIHNlc3Npb24KKwlQZ0Rpc2Nvbm5lY3QoKTsKKworCSMgQ29ubmVjdCB0byB0aGUgZGIK KwkkaERiID0gREJJLT5jb25uZWN0KCJkYmk6UGc6ZGJuYW1lPSR7c3RyRGF0YWJhc2V9O3Bv cnQ9JHtpUG9ydH07aG9zdD0vdG1wIiwKKwkJCQkJCSRzdHJVc2VyLCB1bmRlZiwKKwkJCQkJ CXtBdXRvQ29tbWl0ID0+IDEsIFJhaXNlRXJyb3IgPT4gMX0pOworfQorCisjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIworIyBQZ0Rpc2Nvbm5lY3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjCitzdWIgUGdEaXNjb25uZWN0Cit7CisJIyBDb25uZWN0IHRvIHRoZSBkYiAod2hl dGhlciBpdCBpcyBsb2NhbCBvciByZW1vdGUpCisJaWYgKGRlZmluZWQoJGhEYikpCisJewor CQkkaERiLT5kaXNjb25uZWN0OworCQl1bmRlZigkaERiKTsKKwl9Cit9CisKKyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjCisjIFBnRXhlY3V0ZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMKK3N1YiBQZ0V4ZWN1dGUKK3sKKwlteSAkc3RyU3FsID0gc2hpZnQ7CisKKwkjIExv ZyB0aGUgc3RhdGVtZW50CisJJmxvZygiICBTUUw6ICR7c3RyU3FsfSIpOworCisJIyBFeGVj dXRlIHRoZSBzdGF0ZW1lbnQKKwlteSAkaFN0YXRlbWVudCA9ICRoRGItPnByZXBhcmUoJHN0 clNxbCk7CisKKwkkaFN0YXRlbWVudC0+ZXhlY3V0ZSgpOworCSRoU3RhdGVtZW50LT5maW5p c2goKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdFeGVjdXRlT25s eQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBQZ0V4ZWN1dGVPbmx5Cit7CisJ bXkgJHN0clNxbCA9IHNoaWZ0OworCisJIyBMb2cgdGhlIHN0YXRlbWVudAorCSZsb2coIiAg U1FMOiAke3N0clNxbH0iKTsKKworCSMgRXhlY3V0ZSB0aGUgc3RhdGVtZW50CisJJGhEYi0+ ZG8oJHN0clNxbCk7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBnU2V0 RGF0YWJhc2UKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdTZXREYXRhYmFz ZQoreworCW15ICRzdHJEYXRhYmFzZVBhcmFtID0gc2hpZnQ7CisKKwkjIFN0b3AgYW5kIHN0 YXJ0IHRoZSBkYXRhYmFzZSB0byByZXNldCBwZ2NvbmYgZW50cmllcworCVBnU3RvcCgpOwor CVBnU3RhcnQoKTsKKworCSMgRXhlY3V0ZSB0aGUgc3RhdGVtZW50CisJJHN0ckRhdGFiYXNl ID0gJHN0ckRhdGFiYXNlUGFyYW07CisJUGdDb25uZWN0KCk7Cit9CisKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCisjIFBnU2V0VXNlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMKK3N1YiBQZ1NldFVzZXIKK3sKKwlteSAkc3RyVXNlclBhcmFtID0gc2hpZnQ7CisKKwkk c3RyVXNlciA9ICRzdHJVc2VyUGFyYW07CisKKwkjIFN0b3AgYW5kIHN0YXJ0IHRoZSBkYXRh YmFzZSB0byByZXNldCBwZ2NvbmYgZW50cmllcworCWlmICgoZGVmaW5lZCgkc3RyVGVtcG9y YXJ5QXVkaXRMb2cpICYmICFkZWZpbmVkKCRzdHJDdXJyZW50QXVkaXRMb2cpKSB8fAorCQko ZGVmaW5lZCgkc3RyQ3VycmVudEF1ZGl0TG9nKSAmJiAhZGVmaW5lZCgkc3RyVGVtcG9yYXJ5 QXVkaXRMb2cpKSB8fAorCQkkc3RyQ3VycmVudEF1ZGl0TG9nIG5lICRzdHJUZW1wb3JhcnlB dWRpdExvZykKKwl7CisJCSRzdHJDdXJyZW50QXVkaXRMb2cgPSAkc3RyVGVtcG9yYXJ5QXVk aXRMb2c7CisKKwkJUGdTdG9wKCk7CisJCVBnU3RhcnQoKTsKKwl9CisJZWxzZQorCXsKKwkJ IyBFeGVjdXRlIHRoZSBzdGF0ZW1lbnQKKwkJUGdDb25uZWN0KCk7CisJfQorfQorCisjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTYXZlU3RyaW5nCisjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIworc3ViIFNhdmVTdHJpbmcKK3sKKwlteSAkc3RyRmlsZSA9IHNoaWZ0Owor CW15ICRzdHJTdHJpbmcgPSBzaGlmdDsKKworCSMgT3BlbiB0aGUgZmlsZSBmb3Igd3JpdGlu ZworCW15ICRoRmlsZTsKKworCW9wZW4oJGhGaWxlLCAnPicsICRzdHJGaWxlKQorCQlvciBj b25mZXNzICJ1bmFibGUgdG8gb3BlbiAke3N0ckZpbGV9IjsKKworCWlmICgkc3RyU3RyaW5n IG5lICcnKQorCXsKKwkJc3lzd3JpdGUoJGhGaWxlLCAkc3RyU3RyaW5nKQorCQkJb3IgY29u ZmVzcyAidW5hYmxlIHRvIHdyaXRlIHRvICR7c3RyRmlsZX06ICQhIjsKKwl9CisKKwljbG9z ZSgkaEZpbGUpOworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ0xvZ0V4 ZWN1dGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdMb2dFeGVjdXRlCit7 CisJbXkgJHN0ckNvbW1hbmQgPSBzaGlmdDsKKwlteSAkc3RyU3FsID0gc2hpZnQ7CisJbXkg JG9EYXRhID0gc2hpZnQ7CisJbXkgJGJFeGVjdXRlID0gc2hpZnQ7CisJbXkgJGJXYWl0ID0g c2hpZnQ7CisJbXkgJGJMb2dTcWwgPSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHRzCisJJGJF eGVjdXRlID0gZGVmaW5lZCgkYkV4ZWN1dGUpID8gJGJFeGVjdXRlIDogdHJ1ZTsKKwkkYldh aXQgPSBkZWZpbmVkKCRiV2FpdCkgPyAkYldhaXQgOiB0cnVlOworCSRiTG9nU3FsID0gZGVm aW5lZCgkYkxvZ1NxbCkgPyAkYkxvZ1NxbCA6IHRydWU7CisKKwlpZiAoJGJFeGVjdXRlKQor CXsKKwkJUGdFeGVjdXRlT25seSgkc3RyU3FsKTsKKwl9CisKKwlQZ0xvZ0V4cGVjdCgkc3Ry Q29tbWFuZCwgJGJMb2dTcWwgPyAkc3RyU3FsIDogJycsICRvRGF0YSk7CisKKwlpZiAoJGJX YWl0KQorCXsKKwkJUGdMb2dXYWl0KCk7CisJfQorfQorCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworIyBQZ0xvZ0V4cGVjdAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1 YiBQZ0xvZ0V4cGVjdAoreworCW15ICRzdHJDb21tYW5kID0gc2hpZnQ7CisJbXkgJHN0clNx bCA9IHNoaWZ0OworCW15ICRvRGF0YSA9IHNoaWZ0OworCisJIyBJZiBvRGF0YSBpcyBmYWxz ZSB0aGVuIG5vIGxvZ2dpbmcKKwlpZiAoZGVmaW5lZCgkb0RhdGEpICYmIHJlZigkb0RhdGEp IGVxICcnICYmICEkb0RhdGEpCisJeworCQlyZXR1cm47CisJfQorCisJIyBMb2cgYmFzZWQg b24gc2Vzc2lvbgorCWlmIChQZ1Nob3VsZExvZygkc3RyQ29tbWFuZCkpCisJeworCQkjIE1h a2Ugc3VyZSBjbGFzcyBpcyBkZWZpbmVkCisJCW15ICRzdHJDbGFzcyA9ICRvQ29tbWFuZEhh c2h7JHN0ckNvbW1hbmR9eyZDTEFTU307CisKKwkJaWYgKCFkZWZpbmVkKCRzdHJDbGFzcykp CisJCXsKKwkJCWNvbmZlc3MgImNsYXNzIGlzIG5vdCBkZWZpbmVkIGZvciBjb21tYW5kICR7 c3RyQ29tbWFuZH0iOworCQl9CisKKwkJIyBNYWtlIHN1cmUgb2JqZWN0IHR5cGUgaXMgZGVm aW5lZAorCQlteSAkc3RyT2JqZWN0VHlwZSA9ICRvQ29tbWFuZEhhc2h7JHN0ckNvbW1hbmR9 eyZUWVBFfTsKKworCQlpZiAoIWRlZmluZWQoJHN0ck9iamVjdFR5cGUpKQorCQl7CisJCQlj b25mZXNzICJvYmplY3QgdHlwZSBpcyBub3QgZGVmaW5lZCBmb3IgY29tbWFuZCAke3N0ckNv bW1hbmR9IjsKKwkJfQorCisJCSMgQ2hlY2sgZm9yIGNvbW1hbmQgb3ZlcnJpZGUKKwkJbXkg JHN0ckNvbW1hbmRMb2cgPSAkc3RyQ29tbWFuZDsKKworCQlpZiAoJG9Db21tYW5kSGFzaHsk c3RyQ29tbWFuZH17JkNPTU1BTkR9KQorCQl7CisJCQkkc3RyQ29tbWFuZExvZyA9ICRvQ29t bWFuZEhhc2h7JHN0ckNvbW1hbmR9eyZDT01NQU5EfTsKKwkJfQorCisJCW15ICRzdHJPYmpl Y3ROYW1lID0gJyc7CisKKwkJaWYgKGRlZmluZWQoJG9EYXRhKSAmJiByZWYoJG9EYXRhKSBu ZSAnQVJSQVknKQorCQl7CisJCQkkc3RyT2JqZWN0TmFtZSA9ICRvRGF0YTsKKwkJfQorCisJ CW15ICRzdHJMb2cgLj0gIlNFU1NJT04sJHtzdHJDbGFzc30sJHtzdHJDb21tYW5kTG9nfSwi IC4KKwkJCQkJICAiJHtzdHJPYmplY3RUeXBlfSwke3N0ck9iamVjdE5hbWV9LCR7c3RyU3Fs fSI7CisJCSZsb2coIkFVRElUOiAke3N0ckxvZ30iKTsKKworCQkkc3RyTG9nRXhwZWN0ZWQg Lj0gIiR7c3RyTG9nfVxuIjsKKwl9CisKKwkjIExvZyBiYXNlZCBvbiBncmFudHMKKwlpZiAo cmVmKCRvRGF0YSkgZXEgJ0FSUkFZJyAmJiAoJHN0ckNvbW1hbmQgZXEgQ09NTUFORF9TRUxF Q1QgfHwKKwkJJG9Db21tYW5kSGFzaHskc3RyQ29tbWFuZH17JkNMQVNTfSBlcSBDTEFTU19X UklURSkpCisJeworCQlmb3JlYWNoIG15ICRvVGFibGVIYXNoIChAeyRvRGF0YX0pCisJCXsK KwkJCW15ICRzdHJPYmplY3ROYW1lID0gJHskb1RhYmxlSGFzaH17Jk5BTUV9OworCQkJbXkg JHN0ckNvbW1hbmRMb2cgPSAkeyRvVGFibGVIYXNofXsmQ09NTUFORH07CisKKwkJCWlmIChk ZWZpbmVkKCRvQXVkaXRHcmFudEhhc2h7JHN0ckF1ZGl0Um9sZX0KKwkJCQkJCQkJCQl7JHN0 ck9iamVjdE5hbWV9eyRzdHJDb21tYW5kTG9nfSkpCisJCQl7CisJCQkJbXkgJHN0ckNvbW1h bmRMb2cgPSBkZWZpbmVkKCR7JG9UYWJsZUhhc2h9eyZDT01NQU5EX0xPR30pID8KKwkJCQkJ JHskb1RhYmxlSGFzaH17JkNPTU1BTkRfTE9HfSA6ICRzdHJDb21tYW5kTG9nOworCQkJCW15 ICRzdHJDbGFzcyA9ICRvQ29tbWFuZEhhc2h7JHN0ckNvbW1hbmRMb2d9eyZDTEFTU307CisJ CQkJbXkgJHN0ck9iamVjdFR5cGUgPSAkeyRvVGFibGVIYXNofXsmVFlQRX07CisKKwkJCQlt eSAkc3RyTG9nIC49ICJPQkpFQ1QsJHtzdHJDbGFzc30sJHtzdHJDb21tYW5kTG9nfSwiIC4K KwkJCQkJCQkgICIke3N0ck9iamVjdFR5cGV9LCR7c3RyT2JqZWN0TmFtZX0sJHtzdHJTcWx9 IjsKKwkJCQkmbG9nKCJBVURJVDogJHtzdHJMb2d9Iik7CisKKwkJCQkkc3RyTG9nRXhwZWN0 ZWQgLj0gIiR7c3RyTG9nfVxuIjsKKwkJCX0KKwkJfQorCisJCSRvRGF0YSA9IHVuZGVmOwor CX0KK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdTaG91bGRMb2cKKyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitzdWIgUGdTaG91bGRMb2cKK3sKKwlteSAkc3Ry Q29tbWFuZCA9IHNoaWZ0OworCisJIyBNYWtlIHN1cmUgY2xhc3MgaXMgZGVmaW5lZAorCW15 ICRzdHJDbGFzcyA9ICRvQ29tbWFuZEhhc2h7JHN0ckNvbW1hbmR9eyZDTEFTU307CisKKwlp ZiAoIWRlZmluZWQoJHN0ckNsYXNzKSkKKwl7CisJCWNvbmZlc3MgImNsYXNzIGlzIG5vdCBk ZWZpbmVkIGZvciBjb21tYW5kICR7c3RyQ29tbWFuZH0iOworCX0KKworCSMgQ2hlY2sgbG9n Z2luZyBmb3IgdGhlIHJvbGUKKwlteSAkYkxvZyA9IHVuZGVmOworCisJaWYgKGRlZmluZWQo JG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfUk9MRX17JHN0clVzZXJ9KSkKKwl7CisJCSRiTG9n ID0gJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfUk9MRX17JHN0clVzZXJ9eyRzdHJDbGFzc307 CisJfQorCisJIyBFbHNlIGNoZWNrIGxvZ2dpbmcgZm9yIHRoZSBkYgorCWVsc2lmIChkZWZp bmVkKCRvQXVkaXRMb2dIYXNoeyZDT05URVhUX0RBVEFCQVNFfXskc3RyRGF0YWJhc2V9KSkK Kwl7CisJCSRiTG9nID0gJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfREFUQUJBU0V9eyRzdHJE YXRhYmFzZX17JHN0ckNsYXNzfTsKKwl9CisKKwkjIEVsc2UgY2hlY2sgbG9nZ2luZyBmb3Ig Z2xvYmFsCisJZWxzaWYgKGRlZmluZWQoJG9BdWRpdExvZ0hhc2h7JkNPTlRFWFRfR0xPQkFM fXsmQ09OVEVYVF9HTE9CQUx9KSkKKwl7CisJCSRiTG9nID0gJG9BdWRpdExvZ0hhc2h7JkNP TlRFWFRfR0xPQkFMfXsmQ09OVEVYVF9HTE9CQUx9eyRzdHJDbGFzc307CisJfQorCisJcmV0 dXJuIGRlZmluZWQoJGJMb2cpID8gdHJ1ZSA6IGZhbHNlOworfQorCisjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIworIyBQZ0xvZ1dhaXQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj CitzdWIgUGdMb2dXYWl0Cit7CisJbXkgJHN0ckxvZ0FjdHVhbDsKKworCSMgUnVuIGluIGFu IGV2YWwgYmxvY2sgc2luY2UgZ3JlcCByZXR1cm5zIDEgd2hlbiBub3RoaW5nIHdhcyBmb3Vu ZAorCWV2YWwKKwl7CisJCSRzdHJMb2dBY3R1YWwgPSBjYXB0dXJlKCJncmVwICdMT0c6ICBB VURJVDogJyIgLgorCQkJCQkJCQkiICR7c3RyVGVzdFBhdGh9L3Bvc3RncmVzcWwubG9nIik7 CisJfTsKKworCSMgSWYgYW4gZXJyb3Igd2FzIHJldHVybmVkLCBjb250aW51ZSBpZiBpdCB3 YXMgMSwgb3RoZXJ3aXNlIGNvbmZlc3MKKwlpZiAoJEApCisJeworCQlteSAkaUV4aXRTdGF0 dXMgPSAkPyA+PiA4OworCisJCWlmICgkaUV4aXRTdGF0dXMgIT0gMSkKKwkJeworCQkJY29u ZmVzcyAiZ3JlcCByZXR1cm5lZCAke2lFeGl0U3RhdHVzfSI7CisJCX0KKworCQkkc3RyTG9n QWN0dWFsID0gJyc7CisJfQorCisJIyBTdHJpcCB0aGUgQVVESVQgYW5kIHRpbWVzdGFtcCBm cm9tIHRoZSBhY3R1YWwgbG9nCisJJHN0ckxvZ0FjdHVhbCA9fiBzL3ByZWZpeCBMT0c6ICBB VURJVFw6IC8vZzsKKworCSMgU2F2ZSB0aGUgbG9ncworCVNhdmVTdHJpbmcoIiR7c3RyVGVz dFBhdGh9L2F1ZGl0LmFjdHVhbCIsICRzdHJMb2dBY3R1YWwpOworCVNhdmVTdHJpbmcoIiR7 c3RyVGVzdFBhdGh9L2F1ZGl0LmV4cGVjdGVkIiwgJHN0ckxvZ0V4cGVjdGVkKTsKKworCUNv bW1hbmRFeGVjdXRlKCJkaWZmICR7c3RyVGVzdFBhdGh9L2F1ZGl0LmV4cGVjdGVkIiAuCisJ CQkJICAgIiAke3N0clRlc3RQYXRofS9hdWRpdC5hY3R1YWwiKTsKK30KKworIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdEcm9wCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj Iworc3ViIFBnRHJvcAoreworCW15ICRzdHJQYXRoID0gc2hpZnQ7CisKKwkjIFNldCBkZWZh dWx0CisJJHN0clBhdGggPSBkZWZpbmVkKCRzdHJQYXRoKSA/ICRzdHJQYXRoIDogJHN0clRl c3RQYXRoOworCisJIyBTdG9wIHRoZSBjbHVzdGVyCisJUGdTdG9wKHRydWUsICRzdHJQYXRo KTsKKworCSMgUmVtb3ZlIHRoZSBkaXJlY3RvcnkKKwlDb21tYW5kRXhlY3V0ZSgicm0gLXJm ICR7c3RyVGVzdFBhdGh9Iik7Cit9CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisj IFBnQ3JlYXRlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIFBnQ3JlYXRlCit7 CisJbXkgJHN0clBhdGggPSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHQKKwkkc3RyUGF0aCA9 IGRlZmluZWQoJHN0clBhdGgpID8gJHN0clBhdGggOiAkc3RyVGVzdFBhdGg7CisKKwlDb21t YW5kRXhlY3V0ZSgiJHtzdHJQZ1NxbEJpbn0vaW5pdGRiIC1EICR7c3RyUGF0aH0gLVUgJHtz dHJVc2VyfSIgLgorCQkJCSAgICcgLUEgdHJ1c3QgPiAvZGV2L251bGwnKTsKK30KKworIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgUGdTdG9wCisjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIworc3ViIFBnU3RvcAoreworCW15ICRiSW1tZWRpYXRlID0gc2hpZnQ7CisJbXkg JHN0clBhdGggPSBzaGlmdDsKKworCSMgU2V0IGRlZmF1bHQKKwkkc3RyUGF0aCA9IGRlZmlu ZWQoJHN0clBhdGgpID8gJHN0clBhdGggOiAkc3RyVGVzdFBhdGg7CisJJGJJbW1lZGlhdGUg PSBkZWZpbmVkKCRiSW1tZWRpYXRlKSA/ICRiSW1tZWRpYXRlIDogZmFsc2U7CisKKwkjIERp c2Nvbm5lY3QgdXNlciBzZXNzaW9uCisJUGdEaXNjb25uZWN0KCk7CisKKwkjIElmIHBvc3Rt YXN0ZXIgcHJvY2VzcyBpcyBydW5uaW5nIHRoZW4gc3RvcCB0aGUgY2x1c3RlcgorCWlmICgt ZSAkc3RyUGF0aCAuICcvcG9zdG1hc3Rlci5waWQnKQorCXsKKwkJQ29tbWFuZEV4ZWN1dGUo IiR7c3RyUGdTcWxCaW59L3BnX2N0bCBzdG9wIC1EICR7c3RyUGF0aH0gLXcgLXMgLW0gIiAu CisJCQkJCSAgKCRiSW1tZWRpYXRlID8gJ2ltbWVkaWF0ZScgOiAnZmFzdCcpKTsKKwl9Cit9 CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBnU3RhcnQKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCitzdWIgUGdTdGFydAoreworCW15ICRpUG9ydCA9IHNoaWZ0Owor CW15ICRzdHJQYXRoID0gc2hpZnQ7CisKKwkjIFNldCBkZWZhdWx0CisJJGlQb3J0ID0gZGVm aW5lZCgkaVBvcnQpID8gJGlQb3J0IDogJGlEZWZhdWx0UG9ydDsKKwkkc3RyUGF0aCA9IGRl ZmluZWQoJHN0clBhdGgpID8gJHN0clBhdGggOiAkc3RyVGVzdFBhdGg7CisKKwkjIE1ha2Ug c3VyZSBwb3N0Z3JlcyBpcyBub3QgcnVubmluZworCWlmICgtZSAkc3RyUGF0aCAuICcvcG9z dG1hc3Rlci5waWQnKQorCXsKKwkJY29uZmVzcyAiJHtzdHJQYXRofS9wb3N0bWFzdGVyLnBp ZCBleGlzdHMsIGNhbm5vdCBzdGFydCI7CisJfQorCisJIyBTdGFydCB0aGUgY2x1c3Rlcgor CUNvbW1hbmRFeGVjdXRlKCIke3N0clBnU3FsQmlufS9wZ19jdGwgc3RhcnQgLW8gXCIiIC4K KwkJCQkgICAiLWMgcG9ydD0ke2lQb3J0fSIgLgorCQkJCSAgICIgLWMgdW5peF9zb2NrZXRf ZGlyZWN0b3JpZXM9Jy90bXAnIiAuCisJCQkJICAgIiAtYyBzaGFyZWRfcHJlbG9hZF9saWJy YXJpZXM9J3BnX2F1ZGl0JyIgLgorCQkJCSAgICIgLWMgbG9nX21pbl9tZXNzYWdlcz1kZWJ1 ZzEiIC4KKwkJCQkgICAiIC1jIGxvZ19saW5lX3ByZWZpeD0ncHJlZml4ICciIC4KKwkJCQkg ICAjICIgLWMgbG9nX2Rlc3RpbmF0aW9uPSdzdGRlcnIsY3N2bG9nJyIgLgorCQkJCSAgICMg IiAtYyBsb2dnaW5nX2NvbGxlY3Rvcj1vbiIgLgorCQkJCSAgIChkZWZpbmVkKCRzdHJDdXJy ZW50QXVkaXRMb2cpID8KKwkJCQkJICAgIiAtYyBwZ2F1ZGl0LmxvZz0nJHtzdHJDdXJyZW50 QXVkaXRMb2d9JyIgOiAnJykgLgorCQkJCSAgICIgLWMgcGdhdWRpdC5yb2xlPScke3N0ckF1 ZGl0Um9sZX0nIiAuCisJCQkJICAgIiAtYyBsb2dfY29ubmVjdGlvbnM9b24iIC4KKwkJCQkg ICAiXCIgLUQgJHtzdHJQYXRofSAtbCAke3N0clBhdGh9L3Bvc3RncmVzcWwubG9nIC13IC1z Iik7CisKKwkjIENvbm5lY3QgdXNlciBzZXNzaW9uCisJUGdDb25uZWN0KCk7Cit9CisKKyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBnQXVkaXRMb2dTZXQKKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjCitzdWIgUGdBdWRpdExvZ1NldAoreworCW15ICRzdHJDb250ZXh0 ID0gc2hpZnQ7CisJbXkgJHN0ck5hbWUgPSBzaGlmdDsKKwlteSBAc3RyeUNsYXNzID0gQF87 CisKKwkjIENyZWF0ZSBTUUwgdG8gc2V0IHRoZSBHVUMKKwlteSAkc3RyQ29tbWFuZDsKKwlt eSAkc3RyU3FsOworCisJaWYgKCRzdHJDb250ZXh0IGVxIENPTlRFWFRfR0xPQkFMKQorCXsK KwkJJHN0ckNvbW1hbmQgPSBDT01NQU5EX1NFVDsKKwkJJHN0clNxbCA9ICJzZXQgcGdhdWRp dC5sb2cgPSAnIiAuCisJCQkJICBBcnJheVRvU3RyaW5nKEBzdHJ5Q2xhc3MpIC4gIiciOwor CQkkc3RyVGVtcG9yYXJ5QXVkaXRMb2cgPSBBcnJheVRvU3RyaW5nKEBzdHJ5Q2xhc3MpOwor CX0KKwllbHNpZiAoJHN0ckNvbnRleHQgZXEgQ09OVEVYVF9ST0xFKQorCXsKKwkJJHN0ckNv bW1hbmQgPSBDT01NQU5EX0FMVEVSX1JPTEVfU0VUOworCQkkc3RyU3FsID0gImFsdGVyIHJv bGUgJHtzdHJOYW1lfSBzZXQgcGdhdWRpdC5sb2cgPSAnIiAuCisJCQkJICBBcnJheVRvU3Ry aW5nKEBzdHJ5Q2xhc3MpIC4gIiciOworCX0KKwllbHNlCisJeworCQljb25mZXNzICJ1bmFi bGUgdG8gc2V0IHBnYXVkaXQubG9nIGZvciBjb250ZXh0ICR7c3RyQ29udGV4dH0iOworCX0K KworCSMgUmVzZXQgdGhlIGF1ZGl0IGxvZworCWlmICgkc3RyQ29udGV4dCBlcSBDT05URVhU X0dMT0JBTCkKKwl7CisJCWRlbGV0ZSgkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH0pOwor CQkkc3RyTmFtZSA9IENPTlRFWFRfR0xPQkFMOworCX0KKwllbHNlCisJeworCQlkZWxldGUo JG9BdWRpdExvZ0hhc2h7JHN0ckNvbnRleHR9eyRzdHJOYW1lfSk7CisJfQorCisJIyBTdG9y ZSBhbGwgdGhlIGNsYXNzZXMgaW4gdGhlIGhhc2ggYW5kIGJ1aWxkIHRoZSBHVUMKKwlmb3Jl YWNoIG15ICRzdHJDbGFzcyAoQHN0cnlDbGFzcykKKwl7CisJCWlmICgkc3RyQ2xhc3MgZXEg Q0xBU1NfQUxMKQorCQl7CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5h bWV9eyZDTEFTU19EREx9ID0gdHJ1ZTsKKwkJCSRvQXVkaXRMb2dIYXNoeyRzdHJDb250ZXh0 fXskc3RyTmFtZX17JkNMQVNTX0ZVTkNUSU9OfSA9IHRydWU7CisJCQkkb0F1ZGl0TG9nSGFz aHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyZDTEFTU19NSVNDfSA9IHRydWU7CisJCQkkb0F1 ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyZDTEFTU19SRUFEfSA9IHRydWU7 CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5hbWV9eyZDTEFTU19XUklU RX0gPSB0cnVlOworCQl9CisKKwkJaWYgKGluZGV4KCRzdHJDbGFzcywgJy0nKSA9PSAwKQor CQl7CisJCQkkc3RyQ2xhc3MgPSBzdWJzdHIoJHN0ckNsYXNzLCAxKTsKKworCQkJZGVsZXRl KCRvQXVkaXRMb2dIYXNoeyRzdHJDb250ZXh0fXskc3RyTmFtZX17JHN0ckNsYXNzfSk7CisJ CX0KKwkJZWxzZQorCQl7CisJCQkkb0F1ZGl0TG9nSGFzaHskc3RyQ29udGV4dH17JHN0ck5h bWV9eyRzdHJDbGFzc30gPSB0cnVlOworCQl9CisJfQorCisJUGdMb2dFeGVjdXRlKCRzdHJD b21tYW5kLCAkc3RyU3FsKTsKK30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMg UGdBdWRpdEdyYW50U2V0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworc3ViIFBnQXVk aXRHcmFudFNldAoreworCW15ICRzdHJSb2xlID0gc2hpZnQ7CisJbXkgJHN0clByaXZpbGVn ZSA9IHNoaWZ0OworCW15ICRzdHJPYmplY3QgPSBzaGlmdDsKKwlteSAkc3RyQ29sdW1uID0g c2hpZnQ7CisKKwkjIENyZWF0ZSBTUUwgdG8gc2V0IHRoZSBncmFudAorCVBnTG9nRXhlY3V0 ZShDT01NQU5EX0dSQU5ULCAiZ3JhbnQgIiAuIGxjKCR7c3RyUHJpdmlsZWdlfSkgLgorCQkJ CQkJCQkoZGVmaW5lZCgkc3RyQ29sdW1uKSA/ICIgKCR7c3RyQ29sdW1ufSkiIDogJycpIC4K KwkJCQkJCQkJIiBvbiAke3N0ck9iamVjdH0gdG8gJHtzdHJSb2xlfSIpOworCisJJG9BdWRp dEdyYW50SGFzaHskc3RyUm9sZX17JHN0ck9iamVjdH17JHN0clByaXZpbGVnZX0gPSB0cnVl OworfQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQZ0F1ZGl0R3JhbnRSZXNl dAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK3N1YiBQZ0F1ZGl0R3JhbnRSZXNldAor eworCW15ICRzdHJSb2xlID0gc2hpZnQ7CisJbXkgJHN0clByaXZpbGVnZSA9IHNoaWZ0Owor CW15ICRzdHJPYmplY3QgPSBzaGlmdDsKKwlteSAkc3RyQ29sdW1uID0gc2hpZnQ7CisKKwkj IENyZWF0ZSBTUUwgdG8gc2V0IHRoZSBncmFudAorCVBnTG9nRXhlY3V0ZShDT01NQU5EX1JF Vk9LRSwgInJldm9rZSAiIC4gbGMoJHtzdHJQcml2aWxlZ2V9KSAuCisJCQkJIChkZWZpbmVk KCRzdHJDb2x1bW4pID8gIiAoJHtzdHJDb2x1bW59KSIgOiAnJykgLgorCQkJCSAiIG9uICR7 c3RyT2JqZWN0fSBmcm9tICR7c3RyUm9sZX0iKTsKKworCWRlbGV0ZSgkb0F1ZGl0R3JhbnRI YXNoeyRzdHJSb2xlfXskc3RyT2JqZWN0fXskc3RyUHJpdmlsZWdlfSk7Cit9CisKKyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1haW4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjCitteSBAb3lUYWJsZTsgIyBTdG9yZSB0YWJsZSBpbmZvIGZvciBzZWxlY3QsIGluc2Vy dCwgdXBkYXRlLCBkZWxldGUKKworIyBEcm9wIHRoZSBvbGQgY2x1c3RlciwgYnVpbGQgdGhl IGNvZGUsIGFuZCBjcmVhdGUgYSBuZXcgY2x1c3RlcgorUGdEcm9wKCk7CitCdWlsZE1vZHVs ZSgpOworUGdDcmVhdGUoKTsKK1BnU3RhcnQoKTsKKworUGdFeGVjdXRlKCJjcmVhdGUgZXh0 ZW5zaW9uIHBnX2F1ZGl0Iik7CisKKyMgQ3JlYXRlIHRlc3QgdXNlcnMgYW5kIHRoZSBhdWRp dCByb2xlCitQZ0V4ZWN1dGUoImNyZWF0ZSB1c2VyIHVzZXIxIik7CitQZ0V4ZWN1dGUoImNy ZWF0ZSB1c2VyIHVzZXIyIik7CitQZ0V4ZWN1dGUoImNyZWF0ZSByb2xlICR7c3RyQXVkaXRS b2xlfSIpOworCitQZ0F1ZGl0TG9nU2V0KENPTlRFWFRfR0xPQkFMLCB1bmRlZiwgKENMQVNT X0RETCkpOworCitQZ0F1ZGl0TG9nU2V0KENPTlRFWFRfUk9MRSwgJ3VzZXIyJywgKENMQVNT X1JFQUQsIENMQVNTX1dSSVRFKSk7CisKKyMgVXNlcjEgZm9sbG93cyB0aGUgZ2xvYmFsIGxv ZyBzZXR0aW5ncworUGdTZXRVc2VyKCd1c2VyMScpOworUGdMb2dFeGVjdXRlKENPTU1BTkRf Q1JFQVRFX1RBQkxFLCAnY3JlYXRlIHRhYmxlIHRlc3QgKGlkIGludCknLCAncHVibGljLnRl c3QnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCAqIGZyb20gdGVz dCcpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9EUk9QX1RBQkxFLCAnZHJvcCB0YWJsZSB0 ZXN0JywgJ3B1YmxpYy50ZXN0Jyk7CisKK1BnU2V0VXNlcigndXNlcjInKTsKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRSwKKyAgICAgICAgICAgICAnY3JlYXRlIHRhYmxl IHRlc3QyIChpZCBpbnQpJywgJ3B1YmxpYy50ZXN0MicpOworUGdBdWRpdEdyYW50U2V0KCRz dHJBdWRpdFJvbGUsICZDT01NQU5EX1NFTEVDVCwgJ3B1YmxpYy50ZXN0MicpOworUGdMb2dF eGVjdXRlKENPTU1BTkRfQ1JFQVRFX1RBQkxFLAorICAgICAgICAgICAgICdjcmVhdGUgdGFi bGUgdGVzdDMgKGlkIGludCknLCAncHVibGljLnRlc3QyJyk7CisKKyMgQ2F0YWxvZyBzZWxl Y3Qgc2hvdWxkIG5vdCBsb2cKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVj dCAqIGZyb20gcGdfY2xhc3MgbGltaXQgMScsCisJCQkJCQkJICAgZmFsc2UpOworCisjIE11 bHRpLXRhYmxlIHNlbGVjdAorQG95VGFibGUgPSAoeyZOQU1FID0+ICdwdWJsaWMudGVzdDMn LCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxF Q1R9LAorCQkJeyZOQU1FID0+ICdwdWJsaWMudGVzdDInLCAmVFlQRSA9PiAmVFlQRV9UQUJM RSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1R9KTsKK1BnTG9nRXhlY3V0ZShD T01NQU5EX1NFTEVDVCwgJ3NlbGVjdCAqIGZyb20gdGVzdDMsIHRlc3QyJywKKwkJCQkJCQkg ICBcQG95VGFibGUpOworCisjIFZhcmlvdXMgQ1RFIGNvbWJpbmF0aW9ucworUGdBdWRpdEdy YW50U2V0KCRzdHJBdWRpdFJvbGUsICZDT01NQU5EX0lOU0VSVCwgJ3B1YmxpYy50ZXN0Mycp OworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MycsICZUWVBFID0+ICZU WVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0sCisJCQl7Jk5B TUUgPT4gJ3B1YmxpYy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01N QU5EID0+ICZDT01NQU5EX1NFTEVDVH0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJU LAorCQkJICd3aXRoIGN0ZSBhcyAoc2VsZWN0IGlkIGZyb20gdGVzdDIpJyAuCisJCQkgJyBp bnNlcnQgaW50byB0ZXN0MyBzZWxlY3QgaWQgZnJvbSBjdGUnLAorCQkJIFxAb3lUYWJsZSk7 CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLnRlc3QyJywgJlRZUEUgPT4gJlRZ UEVfVEFCTEUsCisgICAgICAgICAgICAgJkNPTU1BTkQgPT4gJkNPTU1BTkRfSU5TRVJUfSwK KwkJCXsmTkFNRSA9PiAncHVibGljLnRlc3QzJywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJ CQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfSU5TRVJUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFO RF9JTlNFUlQsCisJCQkgJ3dpdGggY3RlIGFzIChpbnNlcnQgaW50byB0ZXN0MyB2YWx1ZXMg KDEpIHJldHVybmluZyBpZCknIC4KKwkJCSAnIGluc2VydCBpbnRvIHRlc3QyIHNlbGVjdCBp ZCBmcm9tIGN0ZScsCisJCQkgXEBveVRhYmxlKTsKKworUGdBdWRpdEdyYW50U2V0KCRzdHJB dWRpdFJvbGUsICZDT01NQU5EX1VQREFURSwgJ3B1YmxpYy50ZXN0MicpOworCitAb3lUYWJs ZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MycsICZUWVBFID0+ICZUWVBFX1RBQkxFLAor CQkJICZDT01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0sCisJCQl7Jk5BTUUgPT4gJ3B1Ymxp Yy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01N QU5EX1VQREFURX0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULAorICAgICAgICAg ICAgICd3aXRoIGN0ZSBhcyAodXBkYXRlIHRlc3QyIHNldCBpZCA9IDEgcmV0dXJuaW5nIGlk KScgLgorCQkJICcgaW5zZXJ0IGludG8gdGVzdDMgc2VsZWN0IGlkIGZyb20gY3RlJywKKwkJ CSBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0Mycs ICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX1VQREFU RX0sCisJCQl7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxF LAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX0lOU0VSVH0sCisJCQl7Jk5BTUUgPT4gJ3B1 YmxpYy50ZXN0MicsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZD T01NQU5EX1NFTEVDVCwgJkNPTU1BTkRfTE9HID0+ICZDT01NQU5EX0lOU0VSVH0pOworUGdM b2dFeGVjdXRlKENPTU1BTkRfVVBEQVRFLAorCQkJICd3aXRoIGN0ZSBhcyAoaW5zZXJ0IGlu dG8gdGVzdDIgdmFsdWVzICgxKSByZXR1cm5pbmcgaWQpJyAuCisJCQkgJyB1cGRhdGUgdGVz dDMgc2V0IGlkID0gY3RlLmlkJyAuCisJCQkgJyBmcm9tIGN0ZSB3aGVyZSB0ZXN0My5pZCA8 PiBjdGUuaWQnLAorCQkJIFxAb3lUYWJsZSk7CisKK1BnU2V0VXNlcigncG9zdGdyZXMnKTsK K1BnQXVkaXRMb2dTZXQoQ09OVEVYVF9ST0xFLCAndXNlcjInLCAoQ0xBU1NfTk9ORSkpOwor UGdTZXRVc2VyKCd1c2VyMicpOworCisjIENvbHVtbi1iYXNlZCBhdWRpdHMKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRhYmxlIHRlc3Q0IChp ZCBpbnQsIG5hbWUgdGV4dCknLCAncHVibGljLnRlc3Q0Jyk7CitQZ0F1ZGl0R3JhbnRTZXQo JHN0ckF1ZGl0Um9sZSwgQ09NTUFORF9TRUxFQ1QsICdwdWJsaWMudGVzdDQnLCAnbmFtZScp OworUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsIENPTU1BTkRfVVBEQVRFLCAncHVi bGljLnRlc3Q0JywgJ2lkJyk7CitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgQ09N TUFORF9JTlNFUlQsICdwdWJsaWMudGVzdDQnLCAnbmFtZScpOworCisjIFNlbGVjdAorQG95 VGFibGUgPSAoKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCBpZCBm cm9tIHB1YmxpYy50ZXN0NCcsCisJCQkJCQkJICBcQG95VGFibGUpOworCitAb3lUYWJsZSA9 ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0NCcsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJ ICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVH0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRf U0VMRUNULCAnc2VsZWN0IG5hbWUgZnJvbSBwdWJsaWMudGVzdDQnLAorCQkJCQkJCSAgXEBv eVRhYmxlKTsKKworIyBJbnNlcnQKK0BveVRhYmxlID0gKCk7CitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9JTlNFUlQsICdpbnNlcnQgaW50byBwdWJsaWMudGVzdDQgKGlkKSB2YWx1ZXMgKDEp JywKKwkJCQkJCQkgICBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1 YmxpYy50ZXN0NCcsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorCQkJICZDT01NQU5EID0+ICZD T01NQU5EX0lOU0VSVH0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULCAiaW5zZXJ0 IGludG8gcHVibGljLnRlc3Q0IChuYW1lKSB2YWx1ZXMgKCd0ZXN0JykiLAorCQkJCQkJCSAg XEBveVRhYmxlKTsKKworIyBVcGRhdGUKK0BveVRhYmxlID0gKCk7CitQZ0xvZ0V4ZWN1dGUo Q09NTUFORF9VUERBVEUsICJ1cGRhdGUgcHVibGljLnRlc3Q0IHNldCBuYW1lID0gJ2Zvbyci LAorCQkJCQkJCSAgIFxAb3lUYWJsZSk7CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVi bGljLnRlc3Q0JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNP TU1BTkRfVVBEQVRFfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9VUERBVEUsICJ1cGRhdGUg cHVibGljLnRlc3Q0IHNldCBpZCA9IDEiLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKworQG95 VGFibGUgPSAoeyZOQU1FID0+ICdwdWJsaWMudGVzdDQnLCAmVFlQRSA9PiAmVFlQRV9UQUJM RSwKKyAgICAgICAgICAgICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVCwgJkNPTU1BTkRf TE9HID0+ICZDT01NQU5EX1VQREFURX0pOworUGdMb2dFeGVjdXRlKENPTU1BTkRfVVBEQVRF LAorCQkJICJ1cGRhdGUgcHVibGljLnRlc3Q0IHNldCBuYW1lID0gJ2Zvbycgd2hlcmUgbmFt ZSA9ICdiYXInIiwKKwkJCSBcQG95VGFibGUpOworCisjIERyb3AgdGVzdCB0YWJsZXMKK1Bn TG9nRXhlY3V0ZShDT01NQU5EX0RST1BfVEFCTEUsICJkcm9wIHRhYmxlIHRlc3QyIiwgJ3B1 YmxpYy50ZXN0MicpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfRFJPUF9UQUJMRSwgImRyb3Ag dGFibGUgdGVzdDMiLCAncHVibGljLnRlc3QzJyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9E Uk9QX1RBQkxFLCAiZHJvcCB0YWJsZSB0ZXN0NCIsICdwdWJsaWMudGVzdDQnKTsKKworCisj IE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhdWRpdCBldmVudHMgcGVuZGluZyBpbiB0 aGUgcG9zdGdyZXMgbG9nCitQZ0xvZ1dhaXQoKTsKKworIyBOb3cgY3JlYXRlIHNvbWUgZW1h aWwgZnJpZW5kbHkgdGVzdHMuICBUaGVzZSBmaXJzdCB0ZXN0cyBhcmUgc2Vzc2lvbiBsb2dn aW5nCisjIG9ubHkuCitQZ1NldFVzZXIoJ3Bvc3RncmVzJyk7CisKKyZsb2coIlxuRXhhbXBs ZXM6Iik7CisKKyZsb2coIlxuU2Vzc2lvbiBBdWRpdDpcbiIpOworCitQZ0F1ZGl0TG9nU2V0 KENPTlRFWFRfR0xPQkFMLCB1bmRlZiwgKENMQVNTX0RETCwgQ0xBU1NfUkVBRCkpOworUGdT ZXRVc2VyKCd1c2VyMScpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfVEFCTEUs CisJCQkgJ2NyZWF0ZSB0YWJsZSBhY2NvdW50IChpZCBpbnQsIG5hbWUgdGV4dCwgcGFzc3dv cmQgdGV4dCwnIC4KKwkJCSAnIGRlc2NyaXB0aW9uIHRleHQpJywgJ3B1YmxpYy5hY2NvdW50 Jyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsCisJCQkgJ3NlbGVjdCAqIGZyb20g YWNjb3VudCcpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfSU5TRVJULAorCQkJICJpbnNlcnQg aW50byBhY2NvdW50IChpZCwgbmFtZSwgcGFzc3dvcmQsIGRlc2NyaXB0aW9uKSIgLgorCQkJ ICIgdmFsdWVzICgxLCAndXNlcjEnLCAnSEFTSDEnLCAnYmxhaCwgYmxhaCcpIik7CismbG9n KCJBVURJVDogPG5vdGhpbmcgbG9nZ2VkPiIpOworCisjIE5vdyB0ZXN0cyBmb3Igb2JqZWN0 IGxvZ2dpbmcKKyZsb2coIlxuT2JqZWN0IEF1ZGl0OlxuIik7CisKK1BnU2V0VXNlcigncG9z dGdyZXMnKTsKK1BnQXVkaXRMb2dTZXQoQ09OVEVYVF9HTE9CQUwsIHVuZGVmLCAoQ0xBU1Nf Tk9ORSkpOworUGdFeGVjdXRlKCJzZXQgcGdhdWRpdC5yb2xlID0gJ2F1ZGl0JyIpOworUGdT ZXRVc2VyKCd1c2VyMScpOworCitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgJkNP TU1BTkRfU0VMRUNULCAncHVibGljLmFjY291bnQnLCAncGFzc3dvcmQnKTsKKworQG95VGFi bGUgPSAoKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCBpZCwgbmFt ZSBmcm9tIGFjY291bnQnLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKyZsb2coIkFVRElUOiA8 bm90aGluZyBsb2dnZWQ+Iik7CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLmFj Y291bnQnLCAmVFlQRSA9PiAmVFlQRV9UQUJMRSwKKyAgICAgICAgICAgICAmQ09NTUFORCA9 PiAmQ09NTUFORF9TRUxFQ1R9KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3Nl bGVjdCBwYXNzd29yZCBmcm9tIGFjY291bnQnLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKwor UGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZDT01NQU5EX1VQREFURSwKKyAgICAg ICAgICAgICAgICAncHVibGljLmFjY291bnQnLCAnbmFtZSwgcGFzc3dvcmQnKTsKKworQG95 VGFibGUgPSAoKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1VQREFURSwgInVwZGF0ZSBhY2Nv dW50IHNldCBkZXNjcmlwdGlvbiA9ICd5YWRhLCB5YWRhJyIsCisJCQkJCQkJICBcQG95VGFi bGUpOworJmxvZygiQVVESVQ6IDxub3RoaW5nIGxvZ2dlZD4iKTsKKworQG95VGFibGUgPSAo eyZOQU1FID0+ICdwdWJsaWMuYWNjb3VudCcsICZUWVBFID0+ICZUWVBFX1RBQkxFLAorICAg ICAgICAgICAgICZDT01NQU5EID0+ICZDT01NQU5EX1VQREFURX0pOworUGdMb2dFeGVjdXRl KENPTU1BTkRfVVBEQVRFLCAidXBkYXRlIGFjY291bnQgc2V0IHBhc3N3b3JkID0gJ0hBU0gy JyIsCisJCQkJCQkJICBcQG95VGFibGUpOworCisjIE5vdyB0ZXN0cyBmb3Igc2Vzc2lvbi9v YmplY3QgbG9nZ2luZworJmxvZygiXG5TZXNzaW9uL09iamVjdCBBdWRpdDpcbiIpOworCitQ Z1NldFVzZXIoJ3Bvc3RncmVzJyk7CitQZ0F1ZGl0TG9nU2V0KENPTlRFWFRfUk9MRSwgJ3Vz ZXIxJywgKENMQVNTX1JFQUQsIENMQVNTX1dSSVRFKSk7CitQZ1NldFVzZXIoJ3VzZXIxJyk7 CisKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRh YmxlIGFjY291bnRfcm9sZV9tYXAgKGFjY291bnRfaWQgaW50LCByb2xlX2lkIGludCknLAor CQkJICdwdWJsaWMuYWNjb3VudF9yb2xlX21hcCcpOworUGdBdWRpdEdyYW50U2V0KCRzdHJB dWRpdFJvbGUsICZDT01NQU5EX1NFTEVDVCwgJ3B1YmxpYy5hY2NvdW50X3JvbGVfbWFwJyk7 CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLmFjY291bnQnLCAmVFlQRSA9PiAm VFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1R9LAorCQkJeyZO QU1FID0+ICdwdWJsaWMuYWNjb3VudF9yb2xlX21hcCcsICZUWVBFID0+ICZUWVBFX1RBQkxF LAorCQkJICZDT01NQU5EID0+ICZDT01NQU5EX1NFTEVDVH0pOworUGdMb2dFeGVjdXRlKENP TU1BTkRfU0VMRUNULAorCQkJICdzZWxlY3QgYWNjb3VudC5wYXNzd29yZCwgYWNjb3VudF9y b2xlX21hcC5yb2xlX2lkIGZyb20gYWNjb3VudCcgLgorCQkJICcgaW5uZXIgam9pbiBhY2Nv dW50X3JvbGVfbWFwJyAuCisJCQkgJyBvbiBhY2NvdW50LmlkID0gYWNjb3VudF9yb2xlX21h cC5hY2NvdW50X2lkJywKKwkJCSBcQG95VGFibGUpOworCitAb3lUYWJsZSA9ICh7Jk5BTUUg PT4gJ3B1YmxpYy5hY2NvdW50JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisgICAgICAgICAg ICAgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VMRUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFO RF9TRUxFQ1QsICdzZWxlY3QgcGFzc3dvcmQgZnJvbSBhY2NvdW50JywKKwkJCQkJCQkgIFxA b3lUYWJsZSk7CisKK0BveVRhYmxlID0gKCk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9VUERB VEUsICJ1cGRhdGUgYWNjb3VudCBzZXQgZGVzY3JpcHRpb24gPSAneWFkYSwgeWFkYSciLAor CQkJCQkJCSAgXEBveVRhYmxlKTsKKyZsb2coIkFVRElUOiA8bm90aGluZyBsb2dnZWQ+Iik7 CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLmFjY291bnQnLCAmVFlQRSA9PiAm VFlQRV9UQUJMRSwKKyAgICAgICAgICAgICAmQ09NTUFORCA9PiAmQ09NTUFORF9TRUxFQ1Qs ICZDT01NQU5EX0xPRyA9PiAmQ09NTUFORF9VUERBVEV9KTsKK1BnTG9nRXhlY3V0ZShDT01N QU5EX1VQREFURSwKKwkJCSAidXBkYXRlIGFjY291bnQgc2V0IGRlc2NyaXB0aW9uID0gJ3lh ZGEsIHlhZGEnIiAuCisJCQkgIiB3aGVyZSBwYXNzd29yZCA9ICdIQVNIMiciLAorCQkJIFxA b3lUYWJsZSk7CisKK0BveVRhYmxlID0gKHsmTkFNRSA9PiAncHVibGljLmFjY291bnQnLCAm VFlQRSA9PiAmVFlQRV9UQUJMRSwKKwkJCSAmQ09NTUFORCA9PiAmQ09NTUFORF9VUERBVEV9 KTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1VQREFURSwgInVwZGF0ZSBhY2NvdW50IHNldCBw YXNzd29yZCA9ICdIQVNIMiciLAorCQkJCQkJCSAgXEBveVRhYmxlKTsKKworIyBUZXN0IGFs bCBzcWwgY29tbWFuZHMKKyZsb2coIlxuRXhoYXVzdGl2ZSBDb21tYW5kIFRlc3RzOlxuIik7 CisKK1BnU2V0VXNlcigncG9zdGdyZXMnKTsKKworUGdBdWRpdExvZ1NldChDT05URVhUX0dM T0JBTCwgdW5kZWYsIChDTEFTU19BTEwpKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFVCwg InNldCBwZ2F1ZGl0LnJvbGUgPSAnYXVkaXQnIik7CisKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0RPLCAiZG8gXCRcJFwgYmVnaW4gcmFpc2Ugbm90aWNlICd0ZXN0JzsgZW5kOyBcJFwkOyIp OworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRFX1NDSEVNQSwgImNyZWF0ZSBzY2hlbWEg dGVzdCIpOworCisjIFRlc3QgQ09QWQorUGdMb2dFeGVjdXRlKENPTU1BTkRfQ09QWV9UTywK KwkJCSAiQ09QWSBwZ19jbGFzcyB0byAnIiAuIGFic19wYXRoKCRzdHJUZXN0UGF0aCkgLiAi L2NsYXNzLm91dCciKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRV9BUywK KwkJCSAiQ1JFQVRFIFRBQkxFIHRlc3QucGdfY2xhc3MgYXMgc2VsZWN0ICogZnJvbSBwZ19j bGFzcyIsCisJCQkgJ3Rlc3QucGdfY2xhc3MnLCB0cnVlLCBmYWxzZSk7CitQZ0xvZ0V4ZWN1 dGUoQ09NTUFORF9JTlNFUlQsCisJCQkgIkNSRUFURSBUQUJMRSB0ZXN0LnBnX2NsYXNzIGFz IHNlbGVjdCAqIGZyb20gcGdfY2xhc3MiLAorCQkJIHVuZGVmLCBmYWxzZSwgdHJ1ZSk7CitQ Z0xvZ0V4ZWN1dGUoQ09NTUFORF9JTlNFUlQsCisJCQkgIkNPUFkgdGVzdC5wZ19jbGFzcyBm cm9tICciIC4gYWJzX3BhdGgoJHN0clRlc3RQYXRoKSAuCisJCQkgIi9jbGFzcy5vdXQnIiwg dW5kZWYsIHRydWUsIGZhbHNlKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NPUFlfRlJPTSwK KwkJCSAiQ09QWSB0ZXN0LnBnX2NsYXNzIGZyb20gJyIgLiBhYnNfcGF0aCgkc3RyVGVzdFBh dGgpIC4KKwkJCSAiL2NsYXNzLm91dCciLCB1bmRlZiwgZmFsc2UsIHRydWUpOworCisjIFRl c3QgcHJlcGFyZWQgU0VMRUNUCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9QUkVQQVJFX1JFQUQs CisJCQkgJ1BSRVBBUkUgcGdjbGFzc3N0bXQgKG9pZCkgYXMgc2VsZWN0IConIC4KKwkJCSAn IGZyb20gcGdfY2xhc3Mgd2hlcmUgb2lkID0gJDEnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0VYRUNVVEVfUkVBRCwKKwkJCSAnRVhFQ1VURSBwZ2NsYXNzc3RtdCAoMSknKTsKK1BnTG9n RXhlY3V0ZShDT01NQU5EX0RFQUxMT0NBVEUsCisJCQkgJ0RFQUxMT0NBVEUgcGdjbGFzc3N0 bXQnKTsKKworIyBUZXN0IGN1cnNvcgorUGdMb2dFeGVjdXRlKENPTU1BTkRfQkVHSU4sCisJ CQkgJ0JFR0lOJyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9ERUNMQVJFX0NVUlNPUiwKKwkJ ICAgICAnREVDTEFSRSBjdGVzdCBTQ1JPTEwgQ1VSU09SIEZPUiBTRUxFQ1QgKiBGUk9NIHBn X2NsYXNzJyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9GRVRDSCwKKwkJCSAnRkVUQ0ggTkVY VCBGUk9NIGN0ZXN0Jyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DTE9TRSwKKwkJCSAnQ0xP U0UgY3Rlc3QnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NPTU1JVCwKKwkJCSAnQ09NTUlU Jyk7CisKKyMgVGVzdCBwcmVwYXJlZCBJTlNFUlQKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0NS RUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRhYmxlIHRlc3QudGVzdF9pbnNlcnQgKGlkIGlu dCknLCAndGVzdC50ZXN0X2luc2VydCcpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfUFJFUEFS RV9XUklURSwKKwkJCSAnUFJFUEFSRSBwZ2NsYXNzc3RtdCAob2lkKSBhcyBpbnNlcnQnIC4K KwkJCSAnIGludG8gdGVzdC50ZXN0X2luc2VydCAoaWQpIHZhbHVlcyAoJDEpJyk7CitQZ0xv Z0V4ZWN1dGUoQ09NTUFORF9JTlNFUlQsCisJCQkgJ0VYRUNVVEUgcGdjbGFzc3N0bXQgKDEp JywgdW5kZWYsIHRydWUsIGZhbHNlKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0VYRUNVVEVf V1JJVEUsCisJCQkgJ0VYRUNVVEUgcGdjbGFzc3N0bXQgKDEpJywgdW5kZWYsIGZhbHNlLCB0 cnVlKTsKKworIyBDcmVhdGUgYSB0YWJsZSB3aXRoIGEgcHJpbWFyeSBrZXkKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX0NSRUFURV9UQUJMRSwKKwkJCSAnY3JlYXRlIHRhYmxlIHRlc3QgKGlk IGludCBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0LCcgLgorCQkJICdkZXNjcmlwdGlvbiB0ZXh0 KScsCisJCQkgJ3B1YmxpYy50ZXN0JywgdHJ1ZSwgZmFsc2UpOworUGdMb2dFeGVjdXRlKENP TU1BTkRfQ1JFQVRFX0lOREVYLAorCQkJICdjcmVhdGUgdGFibGUgdGVzdCAoaWQgaW50IHBy aW1hcnkga2V5LCBuYW1lIHRleHQsJyAuCisJCQkgJ2Rlc2NyaXB0aW9uIHRleHQpJywKKwkJ CSAncHVibGljLnRlc3RfcGtleScsIGZhbHNlLCB0cnVlKTsKK1BnTG9nRXhlY3V0ZShDT01N QU5EX0FOQUxZWkUsICdhbmFseXplIHRlc3QnKTsKKworIyBHcmFudCBzZWxlY3QgdG8gcHVi bGljIC0gdGhpcyBzaG91bGQgaGF2ZSBubyBhZmZlY3Qgb24gYXVkaXRpbmcKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX0dSQU5ULCAnZ3JhbnQgc2VsZWN0IG9uIHB1YmxpYy50ZXN0IHRvIHB1 YmxpYycpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0ICogZnJvbSB0 ZXN0Jyk7CisKKyMgTm93IGdyYW50IHNlbGVjdCB0byBhdWRpdCBhbmQgaXQgc2hvdWxkIGJl IGxvZ2dlZAorUGdBdWRpdEdyYW50U2V0KCRzdHJBdWRpdFJvbGUsICZDT01NQU5EX1NFTEVD VCwgJ3B1YmxpYy50ZXN0Jyk7CitAb3lUYWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0 JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VM RUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgKiBmcm9tIHRl c3QnLCBcQG95VGFibGUpOworCisjIENoZWNrIGNvbHVtbnMgZ3JhbnRlZCB0byBwdWJsaWMg YW5kIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBsb2cKK1BnQXVkaXRHcmFudFJlc2V0KCRzdHJB dWRpdFJvbGUsICZDT01NQU5EX1NFTEVDVCwgJ3B1YmxpYy50ZXN0Jyk7CitQZ0xvZ0V4ZWN1 dGUoQ09NTUFORF9HUkFOVCwgJ2dyYW50IHNlbGVjdCAobmFtZSkgb24gcHVibGljLnRlc3Qg dG8gcHVibGljJyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1QsICdzZWxlY3QgKiBm cm9tIHRlc3QnKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX1NFTEVDVCwgJ3NlbGVjdCBmcm9t IHRlc3QnKTsKKworIyBOb3cgc2V0IGdyYW50IHRvIGEgc3BlY2lmaWMgY29sdW1uIHRvIGF1 ZGl0IGFuZCBtYWtlIHN1cmUgaXQgbG9ncworIyBNYWtlIHN1cmUgdGhlIHRoZSBjb252ZXJz ZSBpcyB0cnVlCitQZ0F1ZGl0R3JhbnRTZXQoJHN0ckF1ZGl0Um9sZSwgJkNPTU1BTkRfU0VM RUNULCAncHVibGljLnRlc3QnLAorCQkJCSduYW1lLCBkZXNjcmlwdGlvbicpOworUGdMb2dF eGVjdXRlKENPTU1BTkRfU0VMRUNULCAnc2VsZWN0IGlkIGZyb20gdGVzdCcpOworCitAb3lU YWJsZSA9ICh7Jk5BTUUgPT4gJ3B1YmxpYy50ZXN0JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUs CisJCQkgJkNPTU1BTkQgPT4gJkNPTU1BTkRfU0VMRUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09N TUFORF9TRUxFQ1QsICdzZWxlY3QgbmFtZSBmcm9tIHRlc3QnLCBcQG95VGFibGUpOworCitQ Z0xvZ0V4ZWN1dGUoQ09NTUFORF9BTFRFUl9UQUJMRSwKKwkJCSAnYWx0ZXIgdGFibGUgdGVz dCBkcm9wIGRlc2NyaXB0aW9uJywgJ3B1YmxpYy50ZXN0Jyk7CitAb3lUYWJsZSA9ICh7Jk5B TUUgPT4gJ3B1YmxpYy50ZXN0JywgJlRZUEUgPT4gJlRZUEVfVEFCTEUsCisJCQkgJkNPTU1B TkQgPT4gJkNPTU1BTkRfU0VMRUNUfSk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9TRUxFQ1Qs ICdzZWxlY3QgZnJvbSB0ZXN0JywgXEBveVRhYmxlKTsKKworUGdMb2dFeGVjdXRlKENPTU1B TkRfQUxURVJfVEFCTEUsCisJCQkgJ2FsdGVyIHRhYmxlIHRlc3QgcmVuYW1lIHRvIHRlc3Qy JywgJ3B1YmxpYy50ZXN0Jyk7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9BTFRFUl9UQUJMRSwK KwkJCSAnYWx0ZXIgdGFibGUgdGVzdDIgc2V0IHNjaGVtYSB0ZXN0JywgJ3B1YmxpYy50ZXN0 MicsIHRydWUsIGZhbHNlKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5EX0FMVEVSX1RBQkxFX0lO REVYLCAnYWx0ZXIgdGFibGUgdGVzdDIgc2V0IHNjaGVtYSB0ZXN0JywKKwkJCQkJCQkJCQkn cHVibGljLnRlc3RfcGtleScsIGZhbHNlLCB0cnVlKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0FMVEVSX1RBQkxFLCAnYWx0ZXIgdGFibGUgdGVzdC50ZXN0MiBhZGQgZGVzY3JpcHRpb24g dGV4dCcsCisJCQkJCQkJCSAgJ3Rlc3QudGVzdDInKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0FMVEVSX1RBQkxFLCAnYWx0ZXIgdGFibGUgdGVzdC50ZXN0MiBkcm9wIGRlc2NyaXB0aW9u JywKKwkJCQkJCQkJICAndGVzdC50ZXN0MicpOworUGdMb2dFeGVjdXRlKENPTU1BTkRfRFJP UF9UQUJMRV9JTkRFWCwgJ2Ryb3AgdGFibGUgdGVzdC50ZXN0MicsCisJCQkJCQkJCQkgICAn dGVzdC50ZXN0X3BrZXknLCBmYWxzZSwgZmFsc2UpOworUGdMb2dFeGVjdXRlKENPTU1BTkRf RFJPUF9UQUJMRSwgJ2Ryb3AgdGFibGUgdGVzdC50ZXN0MicsCisJCQkJCQkJCSAndGVzdC50 ZXN0MicsIHRydWUsIHRydWUpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfRlVO Q1RJT04sICdDUkVBVEUgRlVOQ1RJT04gaW50X2FkZChhIGludCwgYiBpbnQpJyAuCisJCQkJ CQkJCQkgICcgcmV0dXJucyBpbnQgYXMgJCQgYmVnaW4gcmV0dXJuIGEgKyBiOycgLgorCQkJ CQkJCQkJICAnIGVuZCAkJGxhbmd1YWdlIHBscGdzcWwnKTsKK1BnTG9nRXhlY3V0ZShDT01N QU5EX0VYRUNVVEVfRlVOQ1RJT04sICJzZWxlY3QgaW50X2FkZCgxLCAxKSIsCisJCQkJCQkJ CQkgICAncHVibGljLmludF9hZGQnKTsKKworUGdMb2dFeGVjdXRlKENPTU1BTkRfQ1JFQVRF X0FHR1JFR0FURSwgIkNSRUFURSBBR0dSRUdBVEUgc3VtX3Rlc3QgKGludCkiIC4KKwkJCQkJ CQkiIChzZnVuYyA9IGludF9hZGQsIHN0eXBlID0gaW50LCBpbml0Y29uZCA9IDApIik7CitQ Z0xvZ0V4ZWN1dGUoQ09NTUFORF9BTFRFUl9BR0dSRUdBVEUsCisJCQkgIkFMVEVSIEFHR1JF R0FURSBzdW1fdGVzdCAoaW50KSByZW5hbWUgdG8gc3VtX3Rlc3QyIik7CisKK1BnTG9nRXhl Y3V0ZShDT01NQU5EX0NSRUFURV9DT0xMQVRJT04sCisJCQkgIkNSRUFURSBDT0xMQVRJT04g Y29sbGF0aW9uX3Rlc3QgRlJPTSBcImRlX0RFXCIiKTsKK1BnTG9nRXhlY3V0ZShDT01NQU5E X0FMVEVSX0NPTExBVElPTiwKKwkJCSAiQUxURVIgQ09MTEFUSU9OIGNvbGxhdGlvbl90ZXN0 IHJlbmFtZSB0byBjb2xsYXRpb25fdGVzdDIiKTsKKworUGdMb2dFeGVjdXRlKENPTU1BTkRf Q1JFQVRFX0NPTlZFUlNJT04sCisJCQkgIkNSRUFURSBDT05WRVJTSU9OIGNvbnZlcnNpb25f dGVzdCBGT1IgJ1NRTF9BU0NJSScgVE8iLgorCQkJICIgJ01VTEVfSU5URVJOQUwnIEZST00g YXNjaWlfdG9fbWljIik7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9BTFRFUl9DT05WRVJTSU9O LAorCQkJICJBTFRFUiBDT05WRVJTSU9OIGNvbnZlcnNpb25fdGVzdCByZW5hbWUgdG8gY29u dmVyc2lvbl90ZXN0MiIpOworCitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9DUkVBVEVfREFUQUJB U0UsICJDUkVBVEUgREFUQUJBU0UgZGF0YWJhc2VfdGVzdCIpOworUGdMb2dFeGVjdXRlKENP TU1BTkRfQUxURVJfREFUQUJBU0UsCisJCQkgIkFMVEVSIERBVEFCQVNFIGRhdGFiYXNlX3Rl c3QgcmVuYW1lIHRvIGRhdGFiYXNlX3Rlc3QyIik7CitQZ0xvZ0V4ZWN1dGUoQ09NTUFORF9E Uk9QX0RBVEFCQVNFLCAiRFJPUCBEQVRBQkFTRSBkYXRhYmFzZV90ZXN0MiIpOworCisjIE1h a2Ugc3VyZSB0aGVyZSBhcmUgbm8gbW9yZSBhdWRpdCBldmVudHMgcGVuZGluZyBpbiB0aGUg cG9zdGdyZXMgbG9nCitQZ0xvZ1dhaXQoKTsKKworIyBTdG9wIHRoZSBkYXRhYmFzZQoraWYg KCEkYk5vQ2xlYW51cCkKK3sKKwlQZ0Ryb3AoKTsKK30KZGlmZiAtLWdpdCBhL2RvYy9zcmMv c2dtbC9jb250cmliLnNnbWwgYi9kb2Mvc3JjL3NnbWwvY29udHJpYi5zZ21sCmluZGV4IGE2 OThkMGYuLjViMjQ3YTkgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9jb250cmliLnNnbWwK KysrIGIvZG9jL3NyYy9zZ21sL2NvbnRyaWIuc2dtbApAQCAtMTI0LDYgKzEyNCw3IEBAIENS RUFURSBFWFRFTlNJT04gPHJlcGxhY2VhYmxlPm1vZHVsZV9uYW1lPC8+IEZST00gdW5wYWNr YWdlZDsKICAmbHRyZWU7CiAgJnBhZ2VpbnNwZWN0OwogICZwYXNzd29yZGNoZWNrOworICZw Z2F1ZGl0OwogICZwZ2J1ZmZlcmNhY2hlOwogICZwZ2NyeXB0bzsKICAmcGdmcmVlc3BhY2Vt YXA7CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvZmlsZWxpc3Quc2dtbCBiL2RvYy9zcmMv c2dtbC9maWxlbGlzdC5zZ21sCmluZGV4IGYwM2I3MmEuLmU0ZjBiZGMgMTAwNjQ0Ci0tLSBh L2RvYy9zcmMvc2dtbC9maWxlbGlzdC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC9maWxlbGlz dC5zZ21sCkBAIC0xMjQsNiArMTI0LDcgQEAKIDwhRU5USVRZIG9pZDJuYW1lICAgICAgICBT WVNURU0gIm9pZDJuYW1lLnNnbWwiPgogPCFFTlRJVFkgcGFnZWluc3BlY3QgICAgIFNZU1RF TSAicGFnZWluc3BlY3Quc2dtbCI+CiA8IUVOVElUWSBwYXNzd29yZGNoZWNrICAgU1lTVEVN ICJwYXNzd29yZGNoZWNrLnNnbWwiPgorPCFFTlRJVFkgcGdhdWRpdCAgICAgICAgIFNZU1RF TSAicGdhdWRpdC5zZ21sIj4KIDwhRU5USVRZIHBnYmVuY2ggICAgICAgICBTWVNURU0gInBn YmVuY2guc2dtbCI+CiA8IUVOVElUWSBwZ2FyY2hpdmVjbGVhbnVwIFNZU1RFTSAicGdhcmNo aXZlY2xlYW51cC5zZ21sIj4KIDwhRU5USVRZIHBnYnVmZmVyY2FjaGUgICBTWVNURU0gInBn YnVmZmVyY2FjaGUuc2dtbCI+CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcGdhdWRpdC5z Z21sIGIvZG9jL3NyYy9zZ21sL3BnYXVkaXQuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwLi5mM2Y0YWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NyYy9zZ21s L3BnYXVkaXQuc2dtbApAQCAtMCwwICsxLDMxNiBAQAorPCEtLSBkb2Mvc3JjL3NnbWwvcGdh dWRpdC5zZ21sIC0tPgorCis8c2VjdDEgaWQ9InBnYXVkaXQiIHhyZWZsYWJlbD0icGdhdWRp dCI+CisgIDx0aXRsZT5wZ19hdWRpdDwvdGl0bGU+CisKKyAgPGluZGV4dGVybSB6b25lPSJw Z2F1ZGl0Ij4KKyAgICA8cHJpbWFyeT5wZ19hdWRpdDwvcHJpbWFyeT4KKyAgPC9pbmRleHRl cm0+CisKKyAgPHBhcmE+CisgICAgVGhlIDxmaWxlbmFtZT5wZ19hdWRpdDwvZmlsZW5hbWU+ IG1vZHVsZSBwcm92aWRlcyBzZXNzaW9uIGFuZCBvYmplY3QKKyAgICBhdWRpdGluZyB2aWEg dGhlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxpdHkuICBTZXNzaW9uIGFuZCBvYmplY3QgYXVk aXRpbmcgYXJlCisgICAgY29tcGxldGVseSBpbmRlcGVuZGVudCBhbmQgY2FuIGJlIGNvbWJp bmVkLgorICA8L3BhcmE+CisKKyAgPHNlY3QyPgorICAgIDx0aXRsZT5TZXNzaW9uIEF1ZGl0 aW5nPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgU2Vzc2lvbiBhdWRpdGluZyBhbGxv d3MgdGhlIGxvZ2dpbmcgb2YgYWxsIGNvbW1hbmRzIHRoYXQgYXJlIGV4ZWN1dGVkIGJ5Cisg ICAgICBhIHVzZXIgaW4gdGhlIGJhY2tlbmQuICBFYWNoIGNvbW1hbmQgaXMgbG9nZ2VkIHdp dGggYSBzaW5nbGUgZW50cnkgYW5kCisgICAgICBpbmNsdWRlcyB0aGUgYXVkaXQgdHlwZSAo ZS5nLiA8bGl0ZXJhbD5TRVNTSU9OPC9saXRlcmFsPiksIGNvbW1hbmQgdHlwZQorICAgICAg KGUuZy4gPGxpdGVyYWw+Q1JFQVRFIFRBQkxFPC9saXRlcmFsPiwgPGxpdGVyYWw+U0VMRUNU PC9saXRlcmFsPikgYW5kCisgICAgICBzdGF0ZW1lbnQgKGUuZy4gPGxpdGVyYWw+InNlbGVj dCAqIGZyb20gdGVzdCI8L2xpdGVyYWw+KS4KKworICAgICAgRnVsbHktcXVhbGlmaWVkIG5h bWVzIGFuZCBvYmplY3QgdHlwZXMgd2lsbCBiZSBsb2dnZWQgZm9yCisgICAgICA8bGl0ZXJh bD5DUkVBVEU8L2xpdGVyYWw+LCA8bGl0ZXJhbD5VUERBVEU8L2xpdGVyYWw+LCBhbmQKKyAg ICAgIDxsaXRlcmFsPkRST1A8L2xpdGVyYWw+IGNvbW1hbmRzIG9uIDxsaXRlcmFsPlRBQkxF PC9saXRlcmFsPiwKKyAgICAgIDxsaXRlcmFsPk1BVFZJRVc8L2xpdGVyYWw+LCA8bGl0ZXJh bD5WSUVXPC9saXRlcmFsPiwKKyAgICAgIDxsaXRlcmFsPklOREVYPC9saXRlcmFsPiwgPGxp dGVyYWw+Rk9SRUlHTiBUQUJMRTwvbGl0ZXJhbD4sCisgICAgICA8bGl0ZXJhbD5DT01QT1NJ VEUgVFlQRTwvbGl0ZXJhbD4sIDxsaXRlcmFsPklOREVYPC9saXRlcmFsPiwgYW5kCisgICAg ICA8bGl0ZXJhbD5TRVFVRU5DRTwvbGl0ZXJhbD4gb2JqZWN0cyBhcyB3ZWxsIGFzIGZ1bmN0 aW9uIGNhbGxzLgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0Mz4KKyAgICAgIDx0aXRsZT5D b25maWd1cmF0aW9uPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNlc3Npb24g bG9nZ2luZyBpcyBjb250cm9sbGVkIGJ5IHRoZSA8bGl0ZXJhbD5wZ2F1ZGl0LmxvZzwvbGl0 ZXJhbD4gR1VDLgorICAgICAgICBUaGVyZSBhcmUgZml2ZSBjbGFzc2VzIG9mIGNvbW1hbmRz IHRoYXQgYXJlIHJlY29nbml6ZWQ6CisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAg ICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgPGxp dGVyYWw+UkVBRDwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5TRUxFQ1Q8L2xpdGVyYWw+IGFuZAor ICAgICAgICAgICAgICA8bGl0ZXJhbD5DT1BZPC9saXRlcmFsPiB3aGVuIHRoZSBzb3VyY2Ug aXMgYSB0YWJsZSBvciBxdWVyeS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICA8 L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgIDxwYXJhPgor ICAgICAgICAgICAgICA8bGl0ZXJhbD5XUklURTwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5JTlNF UlQ8L2xpdGVyYWw+LAorICAgICAgICAgICAgICA8bGl0ZXJhbD5VUERBVEU8L2xpdGVyYWw+ LCA8bGl0ZXJhbD5ERUxFVEU8L2xpdGVyYWw+LAorICAgICAgICAgICAgICA8bGl0ZXJhbD5U UlVOQ0FURTwvbGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD5DT1BZPC9saXRlcmFsPiB3aGVuIHRo ZQorICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBpcyBhIHRhYmxlLgorICAgICAgICAgICAg PC9wYXJhPgorICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgor ICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIDxsaXRlcmFsPkZVTkNUSU9OPC9s aXRlcmFsPiAtIEZ1bmN0aW9uIGNhbGxzIGFuZAorICAgICAgICAgICAgICA8bGl0ZXJhbD5E TzwvbGl0ZXJhbD4gYmxvY2tzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgIDwv bGlzdGl0ZW0+CisgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgPHBhcmE+Cisg ICAgICAgICAgICAgIDxsaXRlcmFsPkRETDwvbGl0ZXJhbD4gLSBEREwsIHBsdXMgPGxpdGVy YWw+VkFDVVVNPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgPGxpdGVyYWw+UkVJTkRFWDwv bGl0ZXJhbD4sIGFuZCA8bGl0ZXJhbD5BTkFMWVpFPC9saXRlcmFsPi4KKyAgICAgICAgICAg IDwvcGFyYT4KKyAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgIDxsaXN0aXRlbT4K KyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICA8bGl0ZXJhbD5NSVNDPC9saXRl cmFsPiAtIE1pc2NlbGxhbmVvdXMgY29tbWFuZHMsIGUuZy4KKyAgICAgICAgICAgICAgPGxp dGVyYWw+RElTQ0FSRDwvbGl0ZXJhbD4sIDxsaXRlcmFsPkZFVENIPC9saXRlcmFsPiwKKyAg ICAgICAgICAgICAgPGxpdGVyYWw+Q0hFQ0tQT0lOVDwvbGl0ZXJhbD4uCisgICAgICAgICAg ICA8L3BhcmE+CisgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxp c3Q+CisgICAgICA8L3BhcmE+CisKKyAgICAgIDxwYXJhPgorICAgICAgICBFbmFibGUgc2Vz c2lvbiBsb2dnaW5nIGZvciBhbGwgd3JpdGVzIGFuZCBEREw6CisgICAgICAgICAgPHByb2dy YW1saXN0aW5nPgorcGdhdWRpdC5sb2cgPSAnd3JpdGUsIGRkbCcKKyAgICAgICAgICA8L3By b2dyYW1saXN0aW5nPgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAgICAgICAg RW5hYmxlIHNlc3Npb24gbG9nZ2luZyBmb3IgYWxsIGNvbW1hbmRzIGV4Y2VwdCBtaXNjZWxs YW5lb3VzOgorICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz4KK3BnYXVkaXQubG9nID0gJ2Fs bCwgLW1pc2MnCisgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgIDwvcGFyYT4K KyAgICA8L3NlY3QzPgorCisgICAgPHNlY3QzPgorICAgICAgPHRpdGxlPkV4YW1wbGVzPC90 aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNldCA8bGl0ZXJhbD5wZ2F1ZGl0Lmxv ZyA9ICdyZWFkLCBkZGwnPC9saXRlcmFsPiBpbgorICAgICAgICA8bGl0ZXJhbD5wb3N0Z3Jl c3FsLmNvbmY8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4KKyAg ICAgICAgU1FMOgorICAgICAgPC9wYXJhPgorCisgICAgICA8cHJvZ3JhbWxpc3Rpbmc+Citj cmVhdGUgdGFibGUgYWNjb3VudAorKAorICAgIGlkIGludCwKKyAgICBuYW1lIHRleHQsCisg ICAgcGFzc3dvcmQgdGV4dCwKKyAgICBkZXNjcmlwdGlvbiB0ZXh0CispOworCitzZWxlY3Qg KgorICAgIGZyb20gYWNjb3VudDsKKworaW5zZXJ0IGludG8gYWNjb3VudCAoaWQsIG5hbWUs IHBhc3N3b3JkLCBkZXNjcmlwdGlvbikKKyAgICAgICAgICAgICB2YWx1ZXMgKDEsICd1c2Vy MScsICdIQVNIMScsICdibGFoLCBibGFoJyk7CisgICAgICA8L3Byb2dyYW1saXN0aW5nPgor CisgICAgICA8cGFyYT4KKyAgICAgICAgTG9nIE91dHB1dDoKKyAgICAgIDwvcGFyYT4KKwor ICAgICAgPHByb2dyYW1saXN0aW5nPgorQVVESVQ6IFNFU1NJT04sRERMLENSRUFURSBUQUJM RSxUQUJMRSxwdWJsaWMuYWNjb3VudCxjcmVhdGUgdGFibGUgYWNjb3VudAorKAorICAgIGlk IGludCwKKyAgICBuYW1lIHRleHQsCisgICAgcGFzc3dvcmQgdGV4dCwKKyAgICBkZXNjcmlw dGlvbiB0ZXh0CispOworQVVESVQ6IFNFU1NJT04sUkVBRCxTRUxFQ1QsLCxzZWxlY3QgKgor ICAgIGZyb20gYWNjb3VudAorICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L3NlY3Qz PgorICA8L3NlY3QyPgorCisgIDxzZWN0Mj4KKyAgICA8dGl0bGU+T2JqZWN0IEF1ZGl0aW5n PC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgT2JqZWN0IGF1ZGl0aW5nIGxvZ3MgY29t bWFuZHMgdGhhdCBhZmZlY3QgYSBwYXJ0aWN1bGFyIG9iamVjdC4gIE9ubHkKKyAgICAgIDxs aXRlcmFsPlNFTEVDVDwvbGl0ZXJhbD4sIDxsaXRlcmFsPklOU0VSVDwvbGl0ZXJhbD4sCisg ICAgICA8bGl0ZXJhbD5VUERBVEU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5ERUxFVEU8L2xp dGVyYWw+IGNvbW1hbmRzIGFyZQorICAgICAgc3VwcG9ydGVkLgorICAgIDwvcGFyYT4KKwor ICAgIDxzZWN0Mz4KKyAgICAgIDx0aXRsZT5Db25maWd1cmF0aW9uPC90aXRsZT4KKworICAg ICAgPHBhcmE+CisgICAgICAgIE9iamVjdC1sZXZlbCBhdWRpdGluZyBpcyBpbXBsZW1lbnRl ZCB2aWEgdGhlIHJvbGVzIHN5c3RlbS4gIFRoZQorICAgICAgICA8bGl0ZXJhbD5wZ2F1ZGl0 LnJvbGU8L2xpdGVyYWw+IEdVQyBkZWZpbmVzIHRoZSByb2xlIHRoYXQgd2lsbCBiZSB1c2Vk CisgICAgICAgIGZvciBhdWRpdGluZy4gIEFuIG9iamVjdCB3aWxsIGJlIGF1ZGl0ZWQgd2hl biB0aGUgYXVkaXQgcm9sZSBoYXMKKyAgICAgICAgcGVybWlzc2lvbnMgZm9yIHRoZSBjb21t YW5kIGV4ZWN1dGVkIG9yIGluaGVyaXRzIHRoZSBwZXJtaXNzaW9ucyBmcm9tCisgICAgICAg IGFub3RoZXIgcm9sZS4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHByb2dyYW1saXN0aW5n PgorcG9zdHJlc3FsLmNvbmY6IHBnYXVkaXQucm9sZSA9ICdhdWRpdCcKKworZ3JhbnQgc2Vs ZWN0LCBkZWxldGUKKyAgIG9uIHB1YmxpYy5hY2NvdW50OworICAgICAgPC9wcm9ncmFtbGlz dGluZz4KKyAgICA8L3NlY3QzPgorCisgICAgPHNlY3QzPgorICAgICAgPHRpdGxlPkV4YW1w bGVzPC90aXRsZT4KKworICAgICAgPHBhcmE+CisgICAgICAgIFNldCA8bGl0ZXJhbD5wZ2F1 ZGl0LnJvbGUgPSAnYXVkaXQnPC9saXRlcmFsPiBpbgorICAgICAgICA8bGl0ZXJhbD5wb3N0 Z3Jlc3FsLmNvbmY8L2xpdGVyYWw+LgorICAgICAgPC9wYXJhPgorCisgICAgICA8cGFyYT4K KyAgICAgICAgU1FMOgorICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwcm9ncmFtbGlzdGlu Zz4KK2NyZWF0ZSB0YWJsZSBhY2NvdW50CisoCisgICAgaWQgaW50LAorICAgIG5hbWUgdGV4 dCwKKyAgICBwYXNzd29yZCB0ZXh0LAorICAgIGRlc2NyaXB0aW9uIHRleHQKKyk7CisKK2dy YW50IHNlbGVjdCAocGFzc3dvcmQpCisgICBvbiBwdWJsaWMuYWNjb3VudAorICAgdG8gYXVk aXQ7CisKK3NlbGVjdCBpZCwgbmFtZQorICBmcm9tIGFjY291bnQ7CisKK3NlbGVjdCBwYXNz d29yZAorICBmcm9tIGFjY291bnQ7CisKK2dyYW50IHVwZGF0ZSAobmFtZSwgcGFzc3dvcmQp CisgICBvbiBwdWJsaWMuYWNjb3VudAorICAgdG8gYXVkaXQ7CisKK3VwZGF0ZSBhY2NvdW50 CisgICBzZXQgZGVzY3JpcHRpb24gPSAneWFkYSwgeWFkYSc7CisKK3VwZGF0ZSBhY2NvdW50 CisgICBzZXQgcGFzc3dvcmQgPSAnSEFTSDInOworCitjcmVhdGUgdGFibGUgYWNjb3VudF9y b2xlX21hcAorKAorICAgIGFjY291bnRfaWQgaW50LAorICAgIHJvbGVfaWQgaW50CispOwor CitncmFudCBzZWxlY3QKKyAgIG9uIHB1YmxpYy5hY2NvdW50X3JvbGVfbWFwCisgICB0byBh dWRpdDsKKworc2VsZWN0IGFjY291bnQucGFzc3dvcmQsCisgICAgICAgYWNjb3VudF9yb2xl X21hcC5yb2xlX2lkCisgIGZyb20gYWNjb3VudAorICAgICAgIGlubmVyIGpvaW4gYWNjb3Vu dF9yb2xlX21hcAorICAgICAgICAgICAgb24gYWNjb3VudC5pZCA9IGFjY291bnRfcm9sZV9t YXAuYWNjb3VudF9pZAorICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICA8cGFy YT4KKyAgICAgICAgTG9nIE91dHB1dDoKKyAgICAgIDwvcGFyYT4KKworICAgICAgPHByb2dy YW1saXN0aW5nPgorQVVESVQ6IE9CSkVDVCxSRUFELFNFTEVDVCxUQUJMRSxwdWJsaWMuYWNj b3VudCxzZWxlY3QgcGFzc3dvcmQKKyAgZnJvbSBhY2NvdW50CitBVURJVDogT0JKRUNULFdS SVRFLFVQREFURSxUQUJMRSxwdWJsaWMuYWNjb3VudCx1cGRhdGUgYWNjb3VudAorICAgc2V0 IHBhc3N3b3JkID0gJ0hBU0gyJworQVVESVQ6IE9CSkVDVCxSRUFELFNFTEVDVCxUQUJMRSxw dWJsaWMuYWNjb3VudCxzZWxlY3QgYWNjb3VudC5wYXNzd29yZCwKKyAgICAgICBhY2NvdW50 X3JvbGVfbWFwLnJvbGVfaWQKKyAgZnJvbSBhY2NvdW50CisgICAgICAgaW5uZXIgam9pbiBh Y2NvdW50X3JvbGVfbWFwCisgICAgICAgICAgICBvbiBhY2NvdW50LmlkID0gYWNjb3VudF9y b2xlX21hcC5hY2NvdW50X2lkCitBVURJVDogT0JKRUNULFJFQUQsU0VMRUNULFRBQkxFLHB1 YmxpYy5hY2NvdW50X3JvbGVfbWFwLHNlbGVjdCBhY2NvdW50LnBhc3N3b3JkLAorICAgICAg IGFjY291bnRfcm9sZV9tYXAucm9sZV9pZAorICBmcm9tIGFjY291bnQKKyAgICAgICBpbm5l ciBqb2luIGFjY291bnRfcm9sZV9tYXAKKyAgICAgICAgICAgIG9uIGFjY291bnQuaWQgPSBh Y2NvdW50X3JvbGVfbWFwLmFjY291bnRfaWQKKyAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+Cisg ICAgPC9zZWN0Mz4KKyAgPC9zZWN0Mj4KKworICA8c2VjdDI+CisgICAgPHRpdGxlPkZvcm1h dDwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgIEF1ZGl0IGVudHJpZXMgYXJlIHdyaXR0 ZW4gdG8gdGhlIHN0YW5kYXJkIGxvZ2dpbmcgZmFjaWxpdHkgYW5kIGNvbnRhaW4KKyAgICAg IHRoZSBmb2xsb3dpbmcgY29sdW1ucyBpbiBjb21tYS1zZXBhcmF0ZWQgZm9ybWF0OgorCisg ICAgICA8bm90ZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgT3V0cHV0IGlzIG5vdCBp biBjb21wbGlhbnQgQ1NWIGZvcm1hdC4gIElmIG1hY2hpbmUtcmVhZGFiaWxpdHkgaXMKKyAg ICAgICAgICByZXF1aXJlZCB0aGVuIGNvbnNpZGVyIHNldHRpbmcKKyAgICAgICAgICA8bGl0 ZXJhbD5sb2dfZGVzdGluYXRpb24gPSAnY3N2bG9nJzwvbGl0ZXJhbD4uCisgICAgICAgIDwv cGFyYT4KKyAgICAgIDwvbm90ZT4KKworICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAg PGxpc3RpdGVtPgorICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGxpdGVyYWw+QVVE SVRfVFlQRTwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5TRVNTSU9OPC9saXRlcmFsPiBvcgorICAg ICAgICAgICAgPGxpdGVyYWw+T0JKRUNUPC9saXRlcmFsPi4KKyAgICAgICAgICA8L3BhcmE+ CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICA8 cGFyYT4KKyAgICAgICAgICAgIDxsaXRlcmFsPkNMQVNTPC9saXRlcmFsPiAtIDxsaXRlcmFs PlJFQUQ8L2xpdGVyYWw+LAorICAgICAgICAgICAgPGxpdGVyYWw+V1JJVEU8L2xpdGVyYWw+ LCA8bGl0ZXJhbD5GVU5DVElPTjwvbGl0ZXJhbD4sCisgICAgICAgICAgICA8bGl0ZXJhbD5E REw8L2xpdGVyYWw+LCBvciA8bGl0ZXJhbD5NSVNDPC9saXRlcmFsPi4KKyAgICAgICAgICA8 L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAg ICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxsaXRlcmFsPkNPTU1BTkQ8L2xpdGVyYWw+IC0g PGxpdGVyYWw+QUxURVIgVEFCTEU8L2xpdGVyYWw+LAorICAgICAgICAgICAgPGxpdGVyYWw+ U0VMRUNUPC9saXRlcmFsPiwgPGxpdGVyYWw+Q1JFQVRFIElOREVYPC9saXRlcmFsPiwKKyAg ICAgICAgICAgIDxsaXRlcmFsPlVQREFURTwvbGl0ZXJhbD4sIGV0Yy4KKyAgICAgICAgICA8 L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAg ICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxsaXRlcmFsPk9CSkVDVF9UWVBFPC9saXRlcmFs PiAtIDxsaXRlcmFsPlRBQkxFPC9saXRlcmFsPiwKKyAgICAgICAgICAgIDxsaXRlcmFsPklO REVYPC9saXRlcmFsPiwgPGxpdGVyYWw+VklFVzwvbGl0ZXJhbD4sIGV0Yy4gIE9ubHkKKyAg ICAgICAgICAgIGF2YWlsYWJsZSBmb3IgRE1MIGFuZCBjZXJ0YWluIERETCBjb21tYW5kcy4K KyAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0 aXRlbT4KKyAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxsaXRlcmFsPk9CSkVDVF9O QU1FPC9saXRlcmFsPiAtIFRoZSBmdWxseS1xdWFsaWZpZWQgb2JqZWN0IG5hbWUKKyAgICAg ICAgICAgIChlLmcuIHB1YmxpYy5hY2NvdW50KS4gIE9ubHkgYXZhaWxhYmxlIGZvciBETUwg YW5kIGNlcnRhaW4gRERMCisgICAgICAgICAgICBjb21tYW5kcy4KKyAgICAgICAgICA8L3Bh cmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAg ICA8cGFyYT4KKyAgICAgICAgICAgIDxsaXRlcmFsPlNUQVRFTUVOVDwvbGl0ZXJhbD4gLSBT dGF0ZW1lbnQgZXhlY3V0ZSBvbiB0aGUgYmFja2VuZC4KKyAgICAgICAgICA8L3BhcmE+Cisg ICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3BhcmE+ CisgIDwvc2VjdDI+CisKKyAgPHNlY3QyPgorICAgIDx0aXRsZT5BdXRob3I8L3RpdGxlPgor CisgICAgPHBhcmE+CisgICAgICBEYXZpZCBTdGVlbGUgPGVtYWlsPmRhdmlkQHBnbWFzdGVy cy5uZXQ8L2VtYWlsPgorICAgIDwvcGFyYT4KKyAgPC9zZWN0Mj4KKzwvc2VjdDE+Cg== --------------020605060204080802000702-- --1adMNuBcwfArGS0kNeoa5pjIR0ScR47th Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQIcBAEBCAAGBQJU4AXNAAoJEIA2uIJQ5SFAcDoP/RfgNDtMuDDH9MQlGdURsrBK ZOlnmz5bpTjmaz8lBgWQzxK3QZZsuBcMpgMIj/oa9aYz1mZDLtMHL9/uR9LOl1m+ 748f1iST+vCHKKyT3H4Zs742uZGXsC+q8lYDNx6ovBJmdsh/IoGuoRDZaAKK2ejm OCHM9hw23eELIOzdVcjcT+dsNC8fcvjYOCeCo7qbp9vspiQmdjXmafkTBf8s9Rx9 7xDp9e8DoaFdDxmR5bIrL4dA5hRAdgQzVcEZvTjsliFX2K56YTradJQVg8/EIqkq TVrIu7CT9aCdDTL54j8SfF/9sRyNqjr7IpJOKl+QwgEf7ssU2gdIdqvyTWxQkieL cmwJNuVTHQqI0yJHg84RDBhTrCTBh6gmmWIhuJoTyaaMq4nDtxaTMllt7hm6t/hs n7h0e6dMGdyHCUemI1/yGKj2ptibGK84N8yJdkSb7L3H7Oy8sX114lrQ5wBOIvXa g//jDcrW/Cl7gm9bPKtoUa73WfYm+xIBuMHHywXzuNlt6rDhB8ONiP5aVNsPIYLk ifYQ9hy3qQzVSzQGYlQDtU3j/sVt4F7w5aieXllL2YN8L+VaUC/eUOzyCXHvk8gQ zyWrVeW+2L7W/6VpVKcqclwhHIJPirryD/8YruyOykMzJD0SeJGIdxvZWbk19oUm QbnBl/WC+jJVIKAL4Ej5 =9dS2 -----END PGP SIGNATURE----- --1adMNuBcwfArGS0kNeoa5pjIR0ScR47th--