Received: from magus.postgresql.org (magus.postgresql.org [87.238.57.229]) by mail.postgresql.org (Postfix) with ESMTP id B009D4248 for ; Thu, 22 Mar 2012 18:42:47 -0300 (ADT) Received: from 30.55.colo.spiretech.net ([69.168.55.30] helo=lists.commandprompt.com) by magus.postgresql.org with esmtp (Exim 4.72) (envelope-from ) id 1SApmO-0001rW-M0 for pgsql-hackers@postgresql.org; Thu, 22 Mar 2012 21:42:46 +0000 Received: from clam (spinlock.commandprompt.com [69.168.55.30]) by lists.commandprompt.com (Postfix) with ESMTPA id EAEDD251; Thu, 22 Mar 2012 14:43:19 -0700 (PDT) Received: from clam ([195.88.15.88] helo=clam) by assp.commandprompt.com with ESMTPS(AES128-SHA) (2.1.1); 22 Mar 2012 14:43:17 -0700 From: Alex To: Marko Kreen Cc: Daniel Farina , pgsql-hackers Subject: Re: Another review of URI for libpq, v7 submission References: <87d38eaq3f.fsf@commandprompt.com> <87k42lsgck.fsf@commandprompt.com> <20120317145110.GA25172@gmail.com> <8762dyuda3.fsf@commandprompt.com> Date: Thu, 22 Mar 2012 23:42:24 +0200 In-Reply-To: <8762dyuda3.fsf@commandprompt.com> (Alex's message of "Wed, 21 Mar 2012 00:18:44 +0200") Message-ID: <87k42cb9dr.fsf@commandprompt.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Assp-Version: 2.1.1(11364) on assp.commandprompt.com X-Assp-Client-TLS: yes X-Assp-ID: assp.commandprompt.com m1-52599-10641 X-Assp-Envelope-From: ash@commandprompt.com X-Assp-Intended-For: pgsql-hackers@postgresql.org X-Assp-Original-Subject: Re: [HACKERS] Another review of URI for libpq, v7 submission X-Pg-Spam-Score: -1.1 (-) X-Archive-Number: 201203/1427 X-Sequence-Number: 205309 --=-=-= Alex writes: > Marko Kreen writes: > >> On Thu, Mar 15, 2012 at 11:29:31PM +0200, Alex wrote: >>> https://github.com/a1exsh/postgres/commits/uri >> >> The point of the patch is to have one string with all connection options, >> in standard format, yes? So why does not this work: >> >> db = PQconnectdb("postgres://localhost"); >> >> ? > > Good catch. > > I've figured out that we'll need a bit more intrusive change than simply > overriding the expand_dbname check in conninfo_array_parse (like the > current version does) to support URIs in all PQconnect* variants. Okay, at last here's v9, rebased against current master branch. What's new in this version is parse_connection_string function to be called instead of conninfo_parse. It will check for possible URI in the connection string and dispatch to conninfo_uri_parse if URI was found, otherwise it will fall back to conninfo_parse. In two places in code we don't want to parse the string unless it is deemed a real connection string and not plain dbname. The new function recognized_connection_string is added to check this. Thanks Marko for spotting the problem and thanks Tom for committing the refactoring patch! -- Alex --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment Content-Transfer-Encoding: base64 Content-Description: libpq-uri-v9.patch KioqIGEvc3JjL2ludGVyZmFjZXMvbGlicHEvTWFrZWZpbGUKLS0tIGIvc3JjL2ludGVyZmFjZXMv bGlicHEvTWFrZWZpbGUKKioqKioqKioqKioqKioqCioqKiAxMjEsMTI2ICoqKiogaW5zdGFsbDog YWxsIGluc3RhbGxkaXJzIGluc3RhbGwtbGliCi0tLSAxMjEsMTI5IC0tLS0KICAJJChJTlNUQUxM X0RBVEEpICQoc3JjZGlyKS9wcWV4cGJ1ZmZlci5oICckKERFU1RESVIpJChpbmNsdWRlZGlyX2lu dGVybmFsKScKICAJJChJTlNUQUxMX0RBVEEpICQoc3JjZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2Ft cGxlICckKERFU1RESVIpJChkYXRhZGlyKS9wZ19zZXJ2aWNlLmNvbmYuc2FtcGxlJwogIAorIGNo ZWNrIGluc3RhbGxjaGVjazoKKyAJJChNQUtFKSAtQyB0ZXN0ICRACisgCiAgaW5zdGFsbGRpcnM6 IGluc3RhbGxkaXJzLWxpYgogIAkkKE1LRElSX1ApICckKERFU1RESVIpJChpbmNsdWRlZGlyKScg JyQoREVTVERJUikkKGluY2x1ZGVkaXJfaW50ZXJuYWwpJwogIAoqKioqKioqKioqKioqKioKKioq IDEzMiwxMzcgKioqKiB1bmluc3RhbGw6IHVuaW5zdGFsbC1saWIKLS0tIDEzNSwxNDEgLS0tLQog IAlybSAtZiAnJChERVNURElSKSQoZGF0YWRpcikvcGdfc2VydmljZS5jb25mLnNhbXBsZScKICAK ICBjbGVhbiBkaXN0Y2xlYW46IGNsZWFuLWxpYgorIAkkKE1BS0UpIC1DIHRlc3QgJEAKICAJcm0g LWYgJChPQkpTKSBwdGhyZWFkLmggbGlicHEucmMKICAjIE1pZ2h0IGJlIGxlZnQgb3ZlciBmcm9t IGEgV2luMzIgY2xpZW50LW9ubHkgYnVpbGQKICAJcm0gLWYgcGdfY29uZmlnX3BhdGhzLmgKKioq KioqKioqKioqKioqCioqKiAxNDIsMTQ1ICoqKiogY2xlYW4gZGlzdGNsZWFuOiBjbGVhbi1saWIK LS0tIDE0NiwxNTAgLS0tLQogIAlybSAtZiBlbmNuYW1lcy5jIHdjaGFyLmMKICAKICBtYWludGFp bmVyLWNsZWFuOiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbi1saWIKKyAJJChNQUtFKSAtQyB0 ZXN0ICRACiAgCXJtIC1mIGxpYnBxLWRpc3QucmMKKioqIGEvc3JjL2ludGVyZmFjZXMvbGlicHEv ZmUtY29ubmVjdC5jCi0tLSBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL2ZlLWNvbm5lY3QuYwoqKioq KioqKioqKioqKioKKioqIDI4MiwyODcgKioqKiBzdGF0aWMgY29uc3QgUFFFbnZpcm9ubWVudE9w dGlvbiBFbnZpcm9ubWVudE9wdGlvbnNbXSA9Ci0tLSAyODIsMjkwIC0tLS0KICAJfQogIH07CiAg CisgLyogVGhlIGNvbm5lY3Rpb24gVVJJIG11c3Qgc3RhcnQgd2l0aCBlaXRoZXIgb2YgdGhlIGZv bGxvd2luZyBkZXNpZ25hdG9yczogKi8KKyBzdGF0aWMgY29uc3QgY2hhciB1cmlfZGVzaWduYXRv cltdID0gInBvc3RncmVzcWw6Ly8iOworIHN0YXRpYyBjb25zdCBjaGFyIHNob3J0X3VyaV9kZXNp Z25hdG9yW10gPSAicG9zdGdyZXM6Ly8iOwogIAogIHN0YXRpYyBib29sIGNvbm5lY3RPcHRpb25z MShQR2Nvbm4gKmNvbm4sIGNvbnN0IGNoYXIgKmNvbm5pbmZvKTsKICBzdGF0aWMgYm9vbCBjb25u ZWN0T3B0aW9uczIoUEdjb25uICpjb25uKTsKKioqKioqKioqKioqKioqCioqKiAyOTMsMjk4ICoq Kiogc3RhdGljIHZvaWQgZmlsbFBHY29ubihQR2Nvbm4gKmNvbm4sIFBRY29ubmluZm9PcHRpb24g KmNvbm5PcHRpb25zKTsKLS0tIDI5NiwzMDUgLS0tLQogIHN0YXRpYyB2b2lkIGZyZWVQR2Nvbm4o UEdjb25uICpjb25uKTsKICBzdGF0aWMgdm9pZCBjbG9zZVBHY29ubihQR2Nvbm4gKmNvbm4pOwog IHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICpjb25uaW5mb19pbml0KFBRRXhwQnVmZmVyIGVycm9y TWVzc2FnZSk7Cisgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKnBhcnNlX2Nvbm5lY3Rpb25fc3Ry aW5nKGNvbnN0IGNoYXIgKmNvbm5pbmZvLAorIAkJCSAgIFBRRXhwQnVmZmVyIGVycm9yTWVzc2Fn ZSwgYm9vbCB1c2VfZGVmYXVsdHMpOworIHN0YXRpYyBpbnQgdXJpX3ByZWZpeF9sZW5ndGgoY29u c3QgY2hhciAqY29ubnN0cik7Cisgc3RhdGljIGJvb2wgcmVjb2duaXplZF9jb25uZWN0aW9uX3N0 cmluZyhjb25zdCBjaGFyICpjb25uc3RyKTsKICBzdGF0aWMgUFFjb25uaW5mb09wdGlvbiAqY29u bmluZm9fcGFyc2UoY29uc3QgY2hhciAqY29ubmluZm8sCiAgCQkJICAgUFFFeHBCdWZmZXIgZXJy b3JNZXNzYWdlLCBib29sIHVzZV9kZWZhdWx0cyk7CiAgc3RhdGljIFBRY29ubmluZm9PcHRpb24g KmNvbm5pbmZvX2FycmF5X3BhcnNlKGNvbnN0IGNoYXIgKmNvbnN0ICoga2V5d29yZHMsCioqKioq KioqKioqKioqKgoqKiogMzAwLDMwNiAqKioqIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICpjb25u aW5mb19hcnJheV9wYXJzZShjb25zdCBjaGFyICpjb25zdCAqIGtleXdvcmRzLAogIAkJCQkJIGJv b2wgdXNlX2RlZmF1bHRzLCBpbnQgZXhwYW5kX2RibmFtZSk7CiAgc3RhdGljIGJvb2wgY29ubmlu Zm9fYWRkX2RlZmF1bHRzKFBRY29ubmluZm9PcHRpb24gKm9wdGlvbnMsCiAgCQkJCQkgIFBRRXhw QnVmZmVyIGVycm9yTWVzc2FnZSk7CiEgc3RhdGljIGNoYXIgKmNvbm5pbmZvX2dldHZhbChQUWNv bm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucywKICAJCQkJY29uc3QgY2hhciAqa2V5d29yZCk7CiAg c3RhdGljIHZvaWQgZGVmYXVsdE5vdGljZVJlY2VpdmVyKHZvaWQgKmFyZywgY29uc3QgUEdyZXN1 bHQgKnJlcyk7CiAgc3RhdGljIHZvaWQgZGVmYXVsdE5vdGljZVByb2Nlc3Nvcih2b2lkICphcmcs IGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwotLS0gMzA3LDMzMiAtLS0tCiAgCQkJCQkgYm9vbCB1c2Vf ZGVmYXVsdHMsIGludCBleHBhbmRfZGJuYW1lKTsKICBzdGF0aWMgYm9vbCBjb25uaW5mb19hZGRf ZGVmYXVsdHMoUFFjb25uaW5mb09wdGlvbiAqb3B0aW9ucywKICAJCQkJCSAgUFFFeHBCdWZmZXIg ZXJyb3JNZXNzYWdlKTsKISBzdGF0aWMgUFFjb25uaW5mb09wdGlvbiAqY29ubmluZm9fdXJpX3Bh cnNlKGNvbnN0IGNoYXIgKnVyaSwKISAJCQkJCSAgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlLCBi b29sIHVzZV9kZWZhdWx0cyk7CiEgc3RhdGljIGJvb2wgY29ubmluZm9fdXJpX3BhcnNlX29wdGlv bnMoUFFjb25uaW5mb09wdGlvbiAqb3B0aW9ucywKISAJCQkJY29uc3QgY2hhciAqdXJpLCBjaGFy ICpidWYsCiEgCQkJCVBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSk7CiEgc3RhdGljIGJvb2wgY29u bmluZm9fdXJpX3BhcnNlX3BhcmFtcyhjaGFyICpwYXJhbXMsCiEgCQkJCVBRY29ubmluZm9PcHRp b24gKmNvbm5PcHRpb25zLAohIAkJCQlQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UpOwohIHN0YXRp YyBjaGFyICpjb25uaW5mb191cmlfZGVjb2RlKGNvbnN0IGNoYXIgKnN0ciwgUFFFeHBCdWZmZXIg ZXJyb3JNZXNzYWdlKTsKISBzdGF0aWMgYm9vbCBnZXRfaGV4ZGlnaXQoY2hhciBkaWdpdCwgaW50 ICp2YWx1ZSk7CiEgc3RhdGljIGNvbnN0IGNoYXIgKmNvbm5pbmZvX2dldHZhbChQUWNvbm5pbmZv T3B0aW9uICpjb25uT3B0aW9ucywKISAJCQkJY29uc3QgY2hhciAqa2V5d29yZCk7CiEgc3RhdGlj IFBRY29ubmluZm9PcHRpb24gKmNvbm5pbmZvX3N0b3JldmFsKFBRY29ubmluZm9PcHRpb24gKmNv bm5PcHRpb25zLAohIAkJCQljb25zdCBjaGFyICprZXl3b3JkLCBjb25zdCBjaGFyICp2YWx1ZSwK ISAJCQkJUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlLCBib29sIGlnbm9yZU1pc3NpbmcpOwohIHN0 YXRpYyBQUWNvbm5pbmZvT3B0aW9uICpjb25uaW5mb19zdG9yZV91cmlfZW5jb2RlZF92YWx1ZSgK ISAJCQkJUFFjb25uaW5mb09wdGlvbiAqY29ubk9wdGlvbnMsCiEgCQkJCWNvbnN0IGNoYXIgKmtl eXdvcmQsIGNvbnN0IGNoYXIgKmVuY29kZWRfdmFsdWUsCiEgCQkJCVBRRXhwQnVmZmVyIGVycm9y TWVzc2FnZSwgYm9vbCBpZ25vcmVNaXNzaW5nKTsKISBzdGF0aWMgUFFjb25uaW5mb09wdGlvbiAq Y29ubmluZm9fZmluZChQUWNvbm5pbmZvT3B0aW9uICpjb25uT3B0aW9ucywKICAJCQkJY29uc3Qg Y2hhciAqa2V5d29yZCk7CiAgc3RhdGljIHZvaWQgZGVmYXVsdE5vdGljZVJlY2VpdmVyKHZvaWQg KmFyZywgY29uc3QgUEdyZXN1bHQgKnJlcyk7CiAgc3RhdGljIHZvaWQgZGVmYXVsdE5vdGljZVBy b2Nlc3Nvcih2b2lkICphcmcsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpOwoqKioqKioqKioqKioqKioK KioqIDU4Myw1ODkgKioqKiBQUWNvbm5lY3RTdGFydChjb25zdCBjaGFyICpjb25uaW5mbykKICBz dGF0aWMgdm9pZAogIGZpbGxQR2Nvbm4oUEdjb25uICpjb25uLCBQUWNvbm5pbmZvT3B0aW9uICpj b25uT3B0aW9ucykKICB7CiEgCWNoYXIJICAgKnRtcDsKICAKICAJLyoKICAJICogTW92ZSBvcHRp b24gdmFsdWVzIGludG8gY29ubiBzdHJ1Y3R1cmUKLS0tIDYwOSw2MTUgLS0tLQogIHN0YXRpYyB2 b2lkCiAgZmlsbFBHY29ubihQR2Nvbm4gKmNvbm4sIFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRp b25zKQogIHsKISAJY29uc3QgY2hhcgkgICAqdG1wOwogIAogIAkvKgogIAkgKiBNb3ZlIG9wdGlv biB2YWx1ZXMgaW50byBjb25uIHN0cnVjdHVyZQoqKioqKioqKioqKioqKioKKioqIDY4MCw2ODYg KioqKiBjb25uZWN0T3B0aW9uczEoUEdjb25uICpjb25uLCBjb25zdCBjaGFyICpjb25uaW5mbykK ICAJLyoKICAJICogUGFyc2UgdGhlIGNvbm5pbmZvIHN0cmluZwogIAkgKi8KISAJY29ubk9wdGlv bnMgPSBjb25uaW5mb19wYXJzZShjb25uaW5mbywgJmNvbm4tPmVycm9yTWVzc2FnZSwgdHJ1ZSk7 CiAgCWlmIChjb25uT3B0aW9ucyA9PSBOVUxMKQogIAl7CiAgCQljb25uLT5zdGF0dXMgPSBDT05O RUNUSU9OX0JBRDsKLS0tIDcwNiw3MTIgLS0tLQogIAkvKgogIAkgKiBQYXJzZSB0aGUgY29ubmlu Zm8gc3RyaW5nCiAgCSAqLwohIAljb25uT3B0aW9ucyA9IHBhcnNlX2Nvbm5lY3Rpb25fc3RyaW5n KGNvbm5pbmZvLCAmY29ubi0+ZXJyb3JNZXNzYWdlLCB0cnVlKTsKICAJaWYgKGNvbm5PcHRpb25z ID09IE5VTEwpCiAgCXsKICAJCWNvbm4tPnN0YXR1cyA9IENPTk5FQ1RJT05fQkFEOwoqKioqKioq KioqKioqKioKKioqIDg4MSw4ODkgKioqKiBQUXNldGRiTG9naW4oY29uc3QgY2hhciAqcGdob3N0 LCBjb25zdCBjaGFyICpwZ3BvcnQsIGNvbnN0IGNoYXIgKnBnb3B0aW9ucywKICAJCXJldHVybiBO VUxMOwogIAogIAkvKgohIAkgKiBJZiB0aGUgZGJOYW1lIHBhcmFtZXRlciBjb250YWlucyAnPScs IGFzc3VtZSBpdCdzIGEgY29ubmluZm8gc3RyaW5nLgogIAkgKi8KISAJaWYgKGRiTmFtZSAmJiBz dHJjaHIoZGJOYW1lLCAnPScpKQogIAl7CiAgCQlpZiAoIWNvbm5lY3RPcHRpb25zMShjb25uLCBk Yk5hbWUpKQogIAkJCXJldHVybiBjb25uOwotLS0gOTA3LDkxNiAtLS0tCiAgCQlyZXR1cm4gTlVM TDsKICAKICAJLyoKISAJICogSWYgdGhlIGRiTmFtZSBwYXJhbWV0ZXIgY29udGFpbnMgYSBjb25u ZWN0aW9uIHN0cmluZywgcGFyc2UgaXQgaW50byBjb25uCiEgCSAqIHN0cnVjdCB1c2luZyBjb25u ZWN0T3B0aW9uczEuCiAgCSAqLwohIAlpZiAoZGJOYW1lICYmIHJlY29nbml6ZWRfY29ubmVjdGlv bl9zdHJpbmcoZGJOYW1lKSkKICAJewogIAkJaWYgKCFjb25uZWN0T3B0aW9uczEoY29ubiwgZGJO YW1lKSkKICAJCQlyZXR1cm4gY29ubjsKKioqKioqKioqKioqKioqCioqKiAzNzU2LDM3NjIgKioq KiBsZGFwU2VydmljZUxvb2t1cChjb25zdCBjaGFyICpwdXJsLCBQUWNvbm5pbmZvT3B0aW9uICpv cHRpb25zLAogIHN0YXRpYyBpbnQKICBwYXJzZVNlcnZpY2VJbmZvKFBRY29ubmluZm9PcHRpb24g Km9wdGlvbnMsIFBRRXhwQnVmZmVyIGVycm9yTWVzc2FnZSkKICB7CiEgCWNoYXIJICAgKnNlcnZp Y2UgPSBjb25uaW5mb19nZXR2YWwob3B0aW9ucywgInNlcnZpY2UiKTsKICAJY2hhcgkJc2Vydmlj ZUZpbGVbTUFYUEdQQVRIXTsKICAJY2hhcgkgICAqZW52OwogIAlib29sCQlncm91cF9mb3VuZCA9 IGZhbHNlOwotLS0gMzc4MywzNzg5IC0tLS0KICBzdGF0aWMgaW50CiAgcGFyc2VTZXJ2aWNlSW5m byhQUWNvbm5pbmZvT3B0aW9uICpvcHRpb25zLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UpCiAg ewohIAljb25zdCBjaGFyICpzZXJ2aWNlID0gY29ubmluZm9fZ2V0dmFsKG9wdGlvbnMsICJzZXJ2 aWNlIik7CiAgCWNoYXIJCXNlcnZpY2VGaWxlW01BWFBHUEFUSF07CiAgCWNoYXIJICAgKmVudjsK ICAJYm9vbAkJZ3JvdXBfZm91bmQgPSBmYWxzZTsKKioqKioqKioqKioqKioqCioqKiAzOTkxLDM5 OTcgKioqKiBQUWNvbm5pbmZvUGFyc2UoY29uc3QgY2hhciAqY29ubmluZm8sIGNoYXIgKiplcnJt c2cpCiAgCWluaXRQUUV4cEJ1ZmZlcigmZXJyb3JCdWYpOwogIAlpZiAoUFFFeHBCdWZmZXJEYXRh QnJva2VuKGVycm9yQnVmKSkKICAJCXJldHVybiBOVUxMOwkJCS8qIG91dCBvZiBtZW1vcnkgYWxy ZWFkeSA6LSggKi8KISAJY29ubk9wdGlvbnMgPSBjb25uaW5mb19wYXJzZShjb25uaW5mbywgJmVy cm9yQnVmLCBmYWxzZSk7CiAgCWlmIChjb25uT3B0aW9ucyA9PSBOVUxMICYmIGVycm1zZykKICAJ CSplcnJtc2cgPSBlcnJvckJ1Zi5kYXRhOwogIAllbHNlCi0tLSA0MDE4LDQwMjQgLS0tLQogIAlp bml0UFFFeHBCdWZmZXIoJmVycm9yQnVmKTsKICAJaWYgKFBRRXhwQnVmZmVyRGF0YUJyb2tlbihl cnJvckJ1ZikpCiAgCQlyZXR1cm4gTlVMTDsJCQkvKiBvdXQgb2YgbWVtb3J5IGFscmVhZHkgOi0o ICovCiEgCWNvbm5PcHRpb25zID0gcGFyc2VfY29ubmVjdGlvbl9zdHJpbmcoY29ubmluZm8sICZl cnJvckJ1ZiwgZmFsc2UpOwogIAlpZiAoY29ubk9wdGlvbnMgPT0gTlVMTCAmJiBlcnJtc2cpCiAg CQkqZXJybXNnID0gZXJyb3JCdWYuZGF0YTsKICAJZWxzZQoqKioqKioqKioqKioqKioKKioqIDQw MTksNDAyNCAqKioqIGNvbm5pbmZvX2luaXQoUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKQotLS0g NDA0Niw0MDk3IC0tLS0KICB9CiAgCiAgLyoKKyAgKiBDb25uZWN0aW9uIHN0cmluZyBwYXJzZXIg ZGlzcGF0Y2hlcgorICAqLworIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICoKKyBwYXJzZV9jb25u ZWN0aW9uX3N0cmluZyhjb25zdCBjaGFyICpjb25uc3RyLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3Nh Z2UsCisgCQkJCQkJYm9vbCB1c2VfZGVmYXVsdHMpCisgeworIAkvKiBQYXJzZSBhcyBVUkkgaWYg Y29ubmVjdGlvbiBzdHJpbmcgbWF0Y2hlcyBVUkkgcHJlZml4ICovCisgCWlmICh1cmlfcHJlZml4 X2xlbmd0aChjb25uc3RyKSAhPSAwKQorIAkJcmV0dXJuIGNvbm5pbmZvX3VyaV9wYXJzZShjb25u c3RyLCBlcnJvck1lc3NhZ2UsIHVzZV9kZWZhdWx0cyk7CisgCisgCS8qIFBhcnNlIGFzIGRlZmF1 bHQgb3RoZXJ3aXNlICovCisgCXJldHVybiBjb25uaW5mb19wYXJzZShjb25uc3RyLCBlcnJvck1l c3NhZ2UsIHVzZV9kZWZhdWx0cyk7CisgfQorIAorIC8qCisgICogQ2hlY2tzIGlmIGNvbm5lY3Rp b24gc3RyaW5nIHN0YXJ0cyB3aXRoIGVpdGhlciBvZiB0aGUgdmFsaWQgVVJJIHByZWZpeAorICAq IGRlc2lnbmF0b3JzLgorICAqCisgICogUmV0dXJucyB0aGUgVVJJIHByZWZpeCBsZW5ndGgsIDAg aWYgdGhlIHN0cmluZyBkb2Vzbid0IGNvbnRhaW4gYSBVUkkgcHJlZml4LgorICAqLworIHN0YXRp YyBpbnQKKyB1cmlfcHJlZml4X2xlbmd0aChjb25zdCBjaGFyICpjb25uc3RyKQorIHsKKyAJaWYg KHN0cm5jbXAoY29ubnN0ciwgdXJpX2Rlc2lnbmF0b3IsCisgCQkJCXNpemVvZih1cmlfZGVzaWdu YXRvcikgLSAxKSA9PSAwKQorIAkJcmV0dXJuIHNpemVvZih1cmlfZGVzaWduYXRvcikgLSAxOwor IAorIAlpZiAoc3RybmNtcChjb25uc3RyLCBzaG9ydF91cmlfZGVzaWduYXRvciwKKyAJCQkJc2l6 ZW9mKHNob3J0X3VyaV9kZXNpZ25hdG9yKSAtIDEpID09IDApCisgCQlyZXR1cm4gc2l6ZW9mKHNo b3J0X3VyaV9kZXNpZ25hdG9yKSAtIDE7CisgCisgCXJldHVybiAwOworIH0KKyAKKyAvKgorICAq IFJlY29nbml6ZWQgY29ubmVjdGlvbiBzdHJpbmcgZWl0aGVyIHN0YXJ0cyB3aXRoIGEgdmFsaWQg VVJJIHByZWZpeCBvcgorICAqIGNvbnRhaW5zIGEgIj0iIGluIGl0LgorICAqLworIHN0YXRpYyBi b29sCisgcmVjb2duaXplZF9jb25uZWN0aW9uX3N0cmluZyhjb25zdCBjaGFyICpjb25uc3RyKQor IHsKKyAJcmV0dXJuIHVyaV9wcmVmaXhfbGVuZ3RoKGNvbm5zdHIpICE9IDAgfHwKKyAJCXN0cmNo cihjb25uc3RyLCAnPScpICE9IE5VTEw7CisgfQorIAorIC8qCiAgICogQ29ubmluZm8gcGFyc2Vy IHJvdXRpbmUKICAgKgogICAqIElmIHN1Y2Nlc3NmdWwsIGEgbWFsbG9jJ2QgUFFjb25uaW5mb09w dGlvbiBhcnJheSBpcyByZXR1cm5lZC4KKioqKioqKioqKioqKioqCioqKiA0MTU5LDQxOTEgKioq KiBjb25uaW5mb19wYXJzZShjb25zdCBjaGFyICpjb25uaW5mbywgUFFFeHBCdWZmZXIgZXJyb3JN ZXNzYWdlLAogIAkJfQogIAogIAkJLyoKISAJCSAqIE5vdyB3ZSBoYXZlIHRoZSBuYW1lIGFuZCB0 aGUgdmFsdWUuIFNlYXJjaCBmb3IgdGhlIHBhcmFtIHJlY29yZC4KICAJCSAqLwohIAkJZm9yIChv cHRpb24gPSBvcHRpb25zOyBvcHRpb24tPmtleXdvcmQgIT0gTlVMTDsgb3B0aW9uKyspCiAgCQl7 Ci0gCQkJaWYgKHN0cmNtcChvcHRpb24tPmtleXdvcmQsIHBuYW1lKSA9PSAwKQotIAkJCQlicmVh azsKLSAJCX0KLSAJCWlmIChvcHRpb24tPmtleXdvcmQgPT0gTlVMTCkKLSAJCXsKLSAJCQlwcmlu dGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCi0gCQkJCQkJIGxpYnBxX2dldHRleHQoImludmFs aWQgY29ubmVjdGlvbiBvcHRpb24gXCIlc1wiXG4iKSwKLSAJCQkJCQkJICBwbmFtZSk7Ci0gCQkJ UFFjb25uaW5mb0ZyZWUob3B0aW9ucyk7Ci0gCQkJZnJlZShidWYpOwotIAkJCXJldHVybiBOVUxM OwotIAkJfQotIAotIAkJLyoKLSAJCSAqIFN0b3JlIHRoZSB2YWx1ZQotIAkJICovCi0gCQlpZiAo b3B0aW9uLT52YWwpCi0gCQkJZnJlZShvcHRpb24tPnZhbCk7Ci0gCQlvcHRpb24tPnZhbCA9IHN0 cmR1cChwdmFsKTsKLSAJCWlmICghb3B0aW9uLT52YWwpCi0gCQl7Ci0gCQkJcHJpbnRmUFFFeHBC dWZmZXIoZXJyb3JNZXNzYWdlLAotIAkJCQkJCQkgIGxpYnBxX2dldHRleHQoIm91dCBvZiBtZW1v cnlcbiIpKTsKICAJCQlQUWNvbm5pbmZvRnJlZShvcHRpb25zKTsKICAJCQlmcmVlKGJ1Zik7CiAg CQkJcmV0dXJuIE5VTEw7Ci0tLSA0MjMyLDQyNDEgLS0tLQogIAkJfQogIAogIAkJLyoKISAJCSAq IE5vdyB0aGF0IHdlIGhhdmUgdGhlIG5hbWUgYW5kIHRoZSB2YWx1ZSwgc3RvcmUgdGhlIHJlY29y ZC4KICAJCSAqLwohIAkJaWYgKCFjb25uaW5mb19zdG9yZXZhbChvcHRpb25zLCBwbmFtZSwgcHZh bCwgZXJyb3JNZXNzYWdlLCBmYWxzZSkpCiAgCQl7CiAgCQkJUFFjb25uaW5mb0ZyZWUob3B0aW9u cyk7CiAgCQkJZnJlZShidWYpOwogIAkJCXJldHVybiBOVUxMOwoqKioqKioqKioqKioqKioKKioq IDQyNDQsNDI2MCAqKioqIGNvbm5pbmZvX2FycmF5X3BhcnNlKGNvbnN0IGNoYXIgKmNvbnN0ICog a2V5d29yZHMsIGNvbnN0IGNoYXIgKmNvbnN0ICogdmFsdWVzLAogIAkJY29uc3QgY2hhciAqcHZh bHVlID0gdmFsdWVzW2ldOwogIAogIAkJLyogZmlyc3QgZmluZCAiZGJuYW1lIiBpZiBhbnkgKi8K ISAJCWlmIChzdHJjbXAocG5hbWUsICJkYm5hbWUiKSA9PSAwKQogIAkJewohIAkJCS8qIG5leHQg bG9vayBmb3IgIj0iIGluIHRoZSB2YWx1ZSAqLwohIAkJCWlmIChwdmFsdWUgJiYgc3RyY2hyKHB2 YWx1ZSwgJz0nKSkKICAJCQl7CiEgCQkJCS8qCiEgCQkJCSAqIE11c3QgYmUgYSBjb25uaW5mbyBz dHJpbmcsIHNvIHBhcnNlIGl0LCBidXQgZG8gbm90IHVzZQohIAkJCQkgKiBkZWZhdWx0cyBoZXJl IC0tIHRob3NlIGdldCBwaWNrZWQgdXAgbGF0ZXIuIFdlIG9ubHkgd2FudCB0bwohIAkJCQkgKiBv dmVycmlkZSBmb3IgdGhvc2UgcGFyYW1ldGVycyBhY3R1YWxseSBwYXNzZWQuCiEgCQkJCSAqLwoh IAkJCQlzdHJfb3B0aW9ucyA9IGNvbm5pbmZvX3BhcnNlKHB2YWx1ZSwgZXJyb3JNZXNzYWdlLCBm YWxzZSk7CiAgCQkJCWlmIChzdHJfb3B0aW9ucyA9PSBOVUxMKQogIAkJCQkJcmV0dXJuIE5VTEw7 CiAgCQkJfQotLS0gNDI5NCw0MzA5IC0tLS0KICAJCWNvbnN0IGNoYXIgKnB2YWx1ZSA9IHZhbHVl c1tpXTsKICAKICAJCS8qIGZpcnN0IGZpbmQgImRibmFtZSIgaWYgYW55ICovCiEgCQlpZiAoc3Ry Y21wKHBuYW1lLCAiZGJuYW1lIikgPT0gMCAmJiBwdmFsdWUpCiAgCQl7CiEgCQkJLyoKISAJCQkg KiBJZiB2YWx1ZSBpcyBhIGNvbm5lY3Rpb24gc3RyaW5nLCBwYXJzZSBpdCwgYnV0IGRvIG5vdCB1 c2UgZGVmYXVsdHMKISAJCQkgKiBoZXJlIC0tIHRob3NlIGdldCBwaWNrZWQgdXAgbGF0ZXIuIFdl IG9ubHkgd2FudCB0byBvdmVycmlkZSBmb3IKISAJCQkgKiB0aG9zZSBwYXJhbWV0ZXJzIGFjdHVh bGx5IHBhc3NlZC4KISAJCQkgKi8KISAJCQlpZiAocmVjb2duaXplZF9jb25uZWN0aW9uX3N0cmlu ZyhwdmFsdWUpKQogIAkJCXsKISAJCQkJc3RyX29wdGlvbnMgPSBwYXJzZV9jb25uZWN0aW9uX3N0 cmluZyhwdmFsdWUsIGVycm9yTWVzc2FnZSwgZmFsc2UpOwogIAkJCQlpZiAoc3RyX29wdGlvbnMg PT0gTlVMTCkKICAJCQkJCXJldHVybiBOVUxMOwogIAkJCX0KKioqKioqKioqKioqKioqCioqKiA0 NDQyLDQ0NTcgKioqKiBjb25uaW5mb19hZGRfZGVmYXVsdHMoUFFjb25uaW5mb09wdGlvbiAqb3B0 aW9ucywgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKQogIAlyZXR1cm4gdHJ1ZTsKICB9CiAgCiAg c3RhdGljIGNoYXIgKgogIGNvbm5pbmZvX2dldHZhbChQUWNvbm5pbmZvT3B0aW9uICpjb25uT3B0 aW9ucywKICAJCQkJY29uc3QgY2hhciAqa2V5d29yZCkKICB7CiAgCVBRY29ubmluZm9PcHRpb24g Km9wdGlvbjsKICAKICAJZm9yIChvcHRpb24gPSBjb25uT3B0aW9uczsgb3B0aW9uLT5rZXl3b3Jk ICE9IE5VTEw7IG9wdGlvbisrKQogIAl7CiAgCQlpZiAoc3RyY21wKG9wdGlvbi0+a2V5d29yZCwg a2V5d29yZCkgPT0gMCkKISAJCQlyZXR1cm4gb3B0aW9uLT52YWw7CiAgCX0KICAKICAJcmV0dXJu IE5VTEw7Ci0tLSA0NDkxLDUwNzMgLS0tLQogIAlyZXR1cm4gdHJ1ZTsKICB9CiAgCisgLyoKKyAg KiBDb25uZWN0aW9uIFVSSSBwYXJzZXIgcm91dGluZQorICAqCisgICogSWYgc3VjY2Vzc2Z1bCwg YSBtYWxsb2MnZCBQUWNvbm5pbmZvT3B0aW9uIGFycmF5IGlzIHJldHVybmVkLgorICAqIElmIG5v dCBzdWNjZXNzZnVsLCBOVUxMIGlzIHJldHVybmVkIGFuZCBhbiBlcnJvciBtZXNzYWdlIGlzCisg ICogbGVmdCBpbiBlcnJvck1lc3NhZ2UuCisgICoKKyAgKiBEZWZhdWx0cyBhcmUgc3VwcGxpZWQg KGZyb20gYSBzZXJ2aWNlIGZpbGUsIGVudmlyb25tZW50IHZhcmlhYmxlcywgZXRjKQorICAqIGZv ciB1bnNwZWNpZmllZCBvcHRpb25zLCBidXQgb25seSBpZiB1c2VfZGVmYXVsdHMgaXMgVFJVRS4K KyAgKgorICAqIFRoaXMgaXMgb25seSBhIHdyYXBwZXIgZm9yIGNvbm5pbmZvX3VyaV9wYXJzZV9v cHRpb25zLCB3aGljaCBkb2VzIGFsbCBvZiB0aGUKKyAgKiBoZWF2eSBsaWZ0aW5nLCB3aGlsZSB0 aGlzIGZ1bmN0aW9uIGhhbmRsZXMgcHJvcGVyIChkZS0pYWxsb2NhdGlvbiBvZiBtZW1vcnkKKyAg KiBidWZmZXJzLgorICAqLworIHN0YXRpYyBQUWNvbm5pbmZvT3B0aW9uICoKKyBjb25uaW5mb191 cmlfcGFyc2UoY29uc3QgY2hhciAqdXJpLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UsCisgCQkJ CSAgIGJvb2wgdXNlX2RlZmF1bHRzKQorIHsKKyAJUFFjb25uaW5mb09wdGlvbiAqb3B0aW9uczsK KyAJY2hhciAqYnVmOworIAorIAlyZXNldFBRRXhwQnVmZmVyKGVycm9yTWVzc2FnZSk7CisgCisg CS8qIE1ha2UgYSB3b3JraW5nIGNvcHkgb2YgUFFjb25uaW5mb09wdGlvbnMgKi8KKyAJb3B0aW9u cyA9IGNvbm5pbmZvX2luaXQoZXJyb3JNZXNzYWdlKTsKKyAJaWYgKG9wdGlvbnMgPT0gTlVMTCkK KyAJCXJldHVybiBOVUxMOworIAorIAkvKiBNYWtlIGEgd3JpdGFibGUgY29weSBvZiB0aGUgVVJJ IGJ1ZmZlciAqLworIAlidWYgPSBzdHJkdXAodXJpKTsKKyAJaWYgKGJ1ZiA9PSBOVUxMKQorIAl7 CisgCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsIGxpYnBxX2dldHRleHQoIm91dCBv ZiBtZW1vcnlcbiIpKTsKKyAJCVBRY29ubmluZm9GcmVlKG9wdGlvbnMpOworIAkJcmV0dXJuIE5V TEw7CisgCX0KKyAKKyAJaWYgKCFjb25uaW5mb191cmlfcGFyc2Vfb3B0aW9ucyhvcHRpb25zLCB1 cmksIGJ1ZiwgZXJyb3JNZXNzYWdlKSkKKyAJeworIAkJZnJlZShidWYpOworIAkJUFFjb25uaW5m b0ZyZWUob3B0aW9ucyk7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAlmcmVlKGJ1Zik7CisgCisg CS8qCisgCSAqIEFkZCBpbiBkZWZhdWx0cyBpZiB0aGUgY2FsbGVyIHdhbnRzIHRoYXQuCisgCSAq LworIAlpZiAodXNlX2RlZmF1bHRzKQorIAl7CisgCQlpZiAoIWNvbm5pbmZvX2FkZF9kZWZhdWx0 cyhvcHRpb25zLCBlcnJvck1lc3NhZ2UpKQorIAkJeworIAkJCVBRY29ubmluZm9GcmVlKG9wdGlv bnMpOworIAkJCXJldHVybiBOVUxMOworIAkJfQorIAl9CisgCisgCXJldHVybiBvcHRpb25zOwor IH0KKyAKKyAvKgorICAqIENvbm5lY3Rpb24gVVJJIHBhcnNlcjogYWN0dWFsIHBhcnNlciByb3V0 aW5lCisgICoKKyAgKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRydWUgd2hpbGUgdGhlIG9wdGlv bnMgYXJyYXkgaXMgZmlsbGVkIHdpdGggcGFyc2VkCisgICogb3B0aW9ucyBmcm9tIHRoZSBwYXNz ZWQgVVJJCisgICogSWYgbm90IHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2UgYW5kIGZpbGxzIGVy cm9yTWVzc2FnZSBhY2NvcmRpbmdseS4KKyAgKgorICAqIFBhcnNlcyB0aGUgY29ubmVjdGlvbiBV Ukkgc3RyaW5nIGluICdidWYnICh3aGlsZSBkZXN0cnVjdGl2ZWx5IG1vZGlmeWluZworICAqIGl0 LCkgYWNjb3JkaW5nIHRvIHRoZSBVUkkgc3ludGF4IGJlbG93LiAgVGhlICd1cmknIHBhcmFtZXRl ciBpcyBvbmx5IHVzZWQKKyAgKiBmb3IgZXJyb3IgcmVwb3J0aW5nIGFuZCAnYnVmJyBzaG91bGQg aW5pdGlhbGx5IGNvbnRhaW4gYSB3cml0YWJsZSBjb3B5IG9mCisgICogJ3VyaScuCisgICoKKyAg KiBUaGUgZ2VuZXJhbCBmb3JtIGZvciBjb25uZWN0aW9uIFVSSSBpcyB0aGUgZm9sbG93aW5nOgor ICAqCisgICogICBwb3N0Z3Jlc3FsOi8vdXNlcjpwd0Bob3N0OnBvcnQvZGF0YWJhc2UKKyAgKgor ICAqIFRvIHNwZWNpZnkgYSBJUHY2IGhvc3QgYWRkcmVzcywgZW5jbG9zZSB0aGUgYWRkcmVzcyBp biBzcXVhcmUgYnJhY2tldHM6CisgICoKKyAgKiAgIHBvc3RncmVzcWw6Ly9bOjoxXS9kYXRhYmFz ZQorICAqCisgICogQ29ubmVjdGlvbiBwYXJhbWV0ZXJzIG1heSBmb2xsb3cgdGhlIGJhc2UgVVJJ IHVzaW5nIHRoaXMgc3ludGF4OgorICAqCisgICogICBwb3N0Z3Jlc3FsOi8vaG9zdC9kYXRhYmFz ZT9wYXJhbTE9dmFsdWUxJnBhcmFtMj12YWx1ZTImLi4uCisgICovCisgc3RhdGljIGJvb2wKKyBj b25uaW5mb191cmlfcGFyc2Vfb3B0aW9ucyhQUWNvbm5pbmZvT3B0aW9uICpvcHRpb25zLCBjb25z dCBjaGFyICp1cmksCisgCQkJCQkJICAgY2hhciAqYnVmLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3Nh Z2UpCisgeworIAlpbnQgcHJlZml4X2xlbjsKKyAJY2hhciAqcDsKKyAJY2hhciAqc3RhcnQgPSBi dWY7CisgCWNoYXIgbGFzdGMgPSAnXDAnOworIAljaGFyICp1c2VyID0gTlVMTDsKKyAKKyAJLyog U2tpcCB0aGUgVVJJIHByZWZpeCAqLworIAlwcmVmaXhfbGVuID0gdXJpX3ByZWZpeF9sZW5ndGgo dXJpKTsKKyAJaWYgKHByZWZpeF9sZW4gPT0gMCkKKyAJeworIAkJLyogU2hvdWxkIG5ldmVyIGhh cHBlbiAqLworIAkJcHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCSAgbGli cHFfZ2V0dGV4dCgiaW52YWxpZCBVUkkgXCIlc1wiIHByb3BhZ2F0ZWQgdG8gaW50ZXJuYWwgcGFy c2VyIHJvdXRpbmUiKSwKKyAJCQkJCQkgIHVyaSk7CisgCQlyZXR1cm4gZmFsc2U7CisgCX0KKyAJ c3RhcnQgKz0gcHJlZml4X2xlbjsKKyAJcCA9IHN0YXJ0OworIAorIAkvKiBDaGVjayBmb3IgbG9j YWwgdW5peCBzb2NrZXQgZGlyIGF0IHN0YXJ0IG9mIFVSSSAqLworIAlpZiAoKnAgPT0gJy8nKQor IAl7CisgCQkvKiBMb29rIGZvciBwb3NzaWJsZSBxdWVyeSBwYXJhbWV0ZXJzICovCisgCQl3aGls ZSAoKnAgJiYgKnAgIT0gJz8nKQorIAkJCSsrcDsKKyAJCWxhc3RjID0gKnA7CisgCQkqcCA9ICdc MCc7CisgCisgCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVlKG9wdGlvbnMs ICJob3N0Iiwgc3RhcnQsCisgCQkJCQkJCQkJCQkgIGVycm9yTWVzc2FnZSwgZmFsc2UpKQorIAkJ CXJldHVybiBmYWxzZTsKKyAJfQorIAllbHNlCisgCXsKKyAJCS8qIE5vdCBhIHVuaXggc29ja2V0 IGRpcjogcGFyc2UgYXMgaG9zdCBuYW1lL2FkZHJlc3MgKi8KKyAJCWNvbnN0IGNoYXIgKmhvc3Q7 CisgCisgCQkvKiBMb29rIGFoZWFkIGZvciBwb3NzaWJsZSB1c2VyIGNyZWRlbnRpYWxzIGRlc2ln bmF0b3IgKi8KKyAJCXdoaWxlICgqcCAmJiAqcCAhPSAnQCcgJiYgKnAgIT0gJy8nKQorIAkJCSsr cDsKKyAJCWlmICgqcCA9PSAnQCcpCisgCQl7CisgCQkJLyoKKyAJCQkgKiBGb3VuZCB1c2VybmFt ZS9wYXNzd29yZCBkZXNpZ25hdG9yLCBzbyBVUkkgc2hvdWxkIGJlIG9mIHRoZSBmb3JtCisgCQkJ ICogInNjaGVtZTovL3VzZXJAbmV0bG9jIiBvciAic2NoZW1lOi8vdXNlcjpwYXNzd29yZEBuZXRs b2MiLgorIAkJCSAqLworIAkJCXVzZXIgPSBzdGFydDsKKyAKKyAJCQlwID0gdXNlcjsKKyAJCQl3 aGlsZSAoKnAgIT0gJzonICYmICpwICE9ICdAJykKKyAJCQkJKytwOworIAorIAkJCS8qIFNhdmUg bGFzdCBjaGFyIGFuZCBjdXQgb2ZmIGF0IGVuZCBvZiB1c2VyIG5hbWUgKi8KKyAJCQlsYXN0YyA9 ICpwOworIAkJCSpwID0gJ1wwJzsKKyAKKyAJCQlpZiAoISp1c2VyKQorIAkJCXsKKyAJCQkJcHJp bnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJt aXNzaW5nIHVzZXJuYW1lIHNwZWNpZmllciBpbiBVUkk6ICVzXG4iKSwKKyAJCQkJCQkJCSAgdXJp KTsKKyAJCQkJcmV0dXJuIGZhbHNlOworIAkJCX0KKyAJCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3Vy aV9lbmNvZGVkX3ZhbHVlKG9wdGlvbnMsICJ1c2VyIiwgdXNlciwKKyAJCQkJCQkJCQkJCQkgIGVy cm9yTWVzc2FnZSwgZmFsc2UpKQorIAkJCQlyZXR1cm4gZmFsc2U7CisgCisgCQkJaWYgKGxhc3Rj ID09ICc6JykKKyAJCQl7CisgCQkJCWNvbnN0IGNoYXIgKnBhc3N3b3JkID0gcCArIDE7CisgCisg CQkJCXdoaWxlICgqcCAhPSAnQCcpCisgCQkJCQkrK3A7CisgCQkJCSpwID0gJ1wwJzsKKyAKKyAJ CQkJaWYgKCEqcGFzc3dvcmQpCisgCQkJCXsKKyAJCQkJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9y TWVzc2FnZSwKKyAJCQkJCQkJCQkgIGxpYnBxX2dldHRleHQoIm1pc3NpbmcgcGFzc3dvcmQgc3Bl Y2lmaWVyIGluIFVSSTogJXNcbiIpLAorIAkJCQkJCQkJCSAgdXJpKTsKKyAJCQkJCXJldHVybiBm YWxzZTsKKyAJCQkJfQorIAkJCQlpZiAoIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVl KG9wdGlvbnMsICJwYXNzd29yZCIsCisgCQkJCQkJCQkJCQkJCSAgcGFzc3dvcmQsCisgCQkJCQkJ CQkJCQkJCSAgZXJyb3JNZXNzYWdlLCBmYWxzZSkpCisgCQkJCQlyZXR1cm4gZmFsc2U7CisgCQkJ fQorIAorIAkJCS8qIEFkdmFuY2UgcGFzdCBlbmQgb2YgcGFyc2VkIHVzZXIgbmFtZSBvciBwYXNz d29yZCB0b2tlbiAqLworIAkJCSsrcDsKKyAJCX0KKyAJCWVsc2UKKyAJCXsKKyAJCQkvKgorIAkJ CSAqIE5vIHVzZXJuYW1lL3Bhc3N3b3JkIGRlc2lnbmF0b3IgZm91bmQuCisgCQkJICoKKyAJCQkg KiBSZXNldCB0byBzdGFydCBvZiBVUkkgYW5kIHBhcnNlIGFzICJzY2hlbWU6Ly9uZXRsb2MvLi4u IgorIAkJCSAqIGluc3RlYWQuCisgCQkJICovCisgCQkJcCA9IHN0YXJ0OworIAkJfQorIAorIAkJ LyoKKyAJCSAqICJwIiBoYXMgYmVlbiBpbmNyZW1lbnRlZCBwYXN0IG9wdGlvbmFsIFVSSSBjcmVk ZW50aWFsIGluZm9ybWF0aW9uIGF0CisgCQkgKiB0aGlzIHBvaW50IGFuZCBub3cgcG9pbnRzIGF0 IHRoZSAibmV0bG9jIiBwYXJ0IG9mIHRoZSBVUkkuCisgCQkgKgorIAkJICogTG9vayBmb3IgSVB2 NiBhZGRyZXNzIAorIAkJICovCisgCQlpZiAoKnAgPT0gJ1snKQorIAkJeworIAkJCWhvc3QgPSAr K3A7CisgCQkJd2hpbGUgKCpwICYmICpwICE9ICddJykKKyAJCQkJKytwOworIAkJCWlmICghKnAp CisgCQkJeworIAkJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCisgCQkJCQkJCQkg IGxpYnBxX2dldHRleHQoImVuZCBvZiBzdHJpbmcgcmVhY2hlZCB3aGVuIGxvb2tpbmcgZm9yIG1h dGNoaW5nICddJyBpbiBJUHY2IGhvc3QgYWRkcmVzcyBpbiBVUkk6ICVzXG4iKSwKKyAJCQkJCQkJ CSAgdXJpKTsKKyAJCQkJcmV0dXJuIGZhbHNlOworIAkJCX0KKyAJCQlpZiAocCA9PSBob3N0KQor IAkJCXsKKyAJCQkJcHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLAorIAkJCQkJCQkJICBs aWJwcV9nZXR0ZXh0KCJJUHY2IGhvc3QgYWRkcmVzcyBtYXkgbm90IGJlIGVtcHR5IGluIFVSSTog JXNcbiIpLAorIAkJCQkJCQkJICB1cmkpOworIAkJCQlyZXR1cm4gZmFsc2U7CisgCQkJfQorIAor IAkJCS8qIEN1dCBvZmYgdGhlIGJyYWNrZXQgYW5kIGFkdmFuY2UgKi8KKyAJCQkqKHArKykgPSAn XDAnOworIAorIAkJCS8qIAorIAkJCSAqIFRoZSBhZGRyZXNzIG11c3QgYmUgZm9sbG93ZWQgYnkg YSBwb3J0IHNwZWNpZmllciBvciBhIHNsYXNoIG9yIGEKKyAJCQkgKiBxdWVyeS4KKyAJCQkgKi8K KyAJCQlpZiAoKnAgJiYgKnAgIT0gJzonICYmICpwICE9ICcvJyAmJiAqcCAhPSAnPycpCisgCQkJ eworIAkJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCisgCQkJCQkJCQkgIGxpYnBx X2dldHRleHQoInVuZXhwZWN0ZWQgJyVjJyBhdCBwb3NpdGlvbiAldGQgaW4gVVJJIChleHBlY3Rp bmcgJzonIG9yICcvJyk6ICVzXG4iKSwKKyAJCQkJCQkJCSAgKnAsIHAgLSBidWYgKyAxLCB1cmkp OworIAkJCQlyZXR1cm4gZmFsc2U7CisgCQkJfQorIAkJfQorIAkJZWxzZQorIAkJeworIAkJCS8q IG5vdCBhbiBJUHY2IGFkZHJlc3M6IEROUy1uYW1lZCBvciBJUHY0IG5ldGxvYyAqLworIAkJCWhv c3QgPSBwOworIAorIAkJCS8qCisgCQkJICogTG9vayBmb3IgcG9ydCBzcGVjaWZpZXIgKGNvbG9u KSBvciBlbmQgb2YgaG9zdCBzcGVjaWZpZXIKKyAJCQkgKiAoc2xhc2gpLCBvciBxdWVyeSAocXVl c3Rpb24gbWFyaykuCisgCQkJICovCisgCQkJd2hpbGUgKCpwICYmICpwICE9ICc6JyAmJiAqcCAh PSAnLycgJiYgKnAgIT0gJz8nKQorIAkJCQkrK3A7CisgCQl9CisgCisgCQkvKiBTYXZlIHRoZSBo b3N0bmFtZSB0ZXJtaW5hdG9yIGJlZm9yZSB3ZSBudWxsIGl0ICovCisgCQlsYXN0YyA9ICpwOwor IAkJKnAgPSAnXDAnOworIAorIAkJaWYgKHVzZXIgJiYgISpob3N0KQorIAkJeworIAkJCXByaW50 ZlBRRXhwQnVmZmVyKGVycm9yTWVzc2FnZSwKKyAJCQkJCQkJICBsaWJwcV9nZXR0ZXh0KCJtdXN0 IHNwZWNpZnkgaG9zdCB3aGVuIHVzaW5nIHVzZXJuYW1lIHNwZWNpZmllciBpbiBVUkk6ICVzXG4i KSwKKyAJCQkJCQkJICB1cmkpOworIAkJCXJldHVybiBmYWxzZTsKKyAJCX0KKyAJCWlmICghY29u bmluZm9fc3RvcmVfdXJpX2VuY29kZWRfdmFsdWUob3B0aW9ucywgImhvc3QiLCBob3N0LAorIAkJ CQkJCQkJCQkJICBlcnJvck1lc3NhZ2UsIGZhbHNlKSkKKyAJCQlyZXR1cm4gZmFsc2U7CisgCisg CQlpZiAobGFzdGMgPT0gJzonKQorIAkJeworIAkJCWNvbnN0IGNoYXIgKnBvcnQgPSArK3A7IC8q IGFkdmFuY2UgcGFzdCBob3N0IHRlcm1pbmF0b3IgKi8KKyAKKyAJCQl3aGlsZSAoKnAgJiYgKnAg IT0gJy8nICYmICpwICE9ICc/JykKKyAJCQkJKytwOworIAorIAkJCWxhc3RjID0gKnA7CisgCQkJ KnAgPSAnXDAnOworIAorIAkJCWlmICghKnBvcnQpCisgCQkJeworIAkJCQlwcmludGZQUUV4cEJ1 ZmZlcihlcnJvck1lc3NhZ2UsCisgCQkJCQkJCQkgIGxpYnBxX2dldHRleHQoIm1pc3NpbmcgcG9y dCBzcGVjaWZpZXIgaW4gVVJJOiAlc1xuIiksCisgCQkJCQkJCQkgIHVyaSk7CisgCQkJCXJldHVy biBmYWxzZTsKKyAJCQl9CisgCQkJaWYgKCFjb25uaW5mb19zdG9yZV91cmlfZW5jb2RlZF92YWx1 ZShvcHRpb25zLCAicG9ydCIsIHBvcnQsCisgCQkJCQkJCQkJCQkJICBlcnJvck1lc3NhZ2UsIGZh bHNlKSkKKyAJCQkJcmV0dXJuIGZhbHNlOworIAkJfQorIAl9CisgCisgCWlmIChsYXN0YyAmJiBs YXN0YyAhPSAnPycpCisgCXsKKyAJCWNvbnN0IGNoYXIgKmRibmFtZSA9ICsrcDsgLyogYWR2YW5j ZSBwYXN0IGhvc3QgdGVybWluYXRvciAqLworIAorIAkJLyogTG9vayBmb3IgcXVlcnkgcGFyYW1l dGVycyAqLworIAkJd2hpbGUgKCpwICYmICpwICE9ICc/JykKKyAJCQkrK3A7CisgCisgCQlsYXN0 YyA9ICpwOworIAkJKnAgPSAnXDAnOworIAorIAkJLyoKKyAJCSAqIEF2b2lkIHNldHRpbmcgZGJu YW1lIHRvIGFuIGVtcHR5IHN0cmluZywgYXMgaXQgZm9yY2VzIHRoZSBkZWZhdWx0CisgCQkgKiB2 YWx1ZSAodXNlcm5hbWUpIGFuZCBpZ25vcmVzICRQR0RBVEFCQVNFLCBhcyBvcHBvc2VkIHRvIG5v dCBzZXR0aW5nCisgCQkgKiBpdCBhdCBhbGwuCisgCQkgKi8KKyAJCWlmICgqZGJuYW1lICYmCisg CQkJIWNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVlKG9wdGlvbnMsICJkYm5hbWUiLCBk Ym5hbWUsCisgCQkJCQkJCQkJCQkgIGVycm9yTWVzc2FnZSwgZmFsc2UpKQorIAkJCXJldHVybiBm YWxzZTsKKyAJfQorIAorIAlpZiAobGFzdGMpCisgCXsKKyAJCSsrcDsgLyogYWR2YW5jZSBwYXN0 IHRlcm1pbmF0b3IgKi8KKyAKKyAJCWlmICghY29ubmluZm9fdXJpX3BhcnNlX3BhcmFtcyhwLCBv cHRpb25zLCBlcnJvck1lc3NhZ2UpKQorIAkJCXJldHVybiBmYWxzZTsKKyAJfQorIAorIAlyZXR1 cm4gdHJ1ZTsKKyB9CisgCisgLyoKKyAgKiBDb25uZWN0aW9uIFVSSSBwYXJhbWV0ZXJzIHBhcnNl ciByb3V0aW5lCisgICoKKyAgKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRydWUgd2hpbGUgY29u bk9wdGlvbnMgaXMgZmlsbGVkIHdpdGggcGFyc2VkCisgICogcGFyYW1ldGVycy4KKyAgKiBJZiBu b3Qgc3VjY2Vzc2Z1bCwgcmV0dXJucyBmYWxzZSBhbmQgZmlsbHMgZXJyb3JNZXNzYWdlIGFjY29y ZGluZ2x5LgorICAqCisgICogRGVzdHJ1Y3RpdmVseSBtb2RpZmllcyAncGFyYW1zJyBidWZmZXIu CisgICovCisgc3RhdGljIGJvb2wKKyBjb25uaW5mb191cmlfcGFyc2VfcGFyYW1zKGNoYXIgKnBh cmFtcywKKyAJCQkJCQkgIFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAorIAkJCQkJCSAg UFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdlKQorIHsKKyAJY2hhciAqdG9rZW47CisgCWNoYXIgKnNh dmVwOworIAorIAl3aGlsZSAoKHRva2VuID0gc3RydG9rX3IocGFyYW1zLCAiJiIsICZzYXZlcCkp KQorIAl7CisgCQljb25zdCBjaGFyICprZXl3b3JkOworIAkJY29uc3QgY2hhciAqdmFsdWU7Cisg CQljaGFyICpwID0gc3RyY2hyKHRva2VuLCAnPScpOworIAorIAkJaWYgKHAgPT0gTlVMTCkKKyAJ CXsKKyAJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsCisgCQkJCQkJCSAgbGlicHFf Z2V0dGV4dCgibWlzc2luZyBrZXkvdmFsdWUgc2VwYXJhdG9yICc9JyBpbiBVUkkgcXVlcnkgcGFy YW1ldGVyOiAlc1xuIiksCisgCQkJCQkJCSAgdG9rZW4pOworIAkJCXJldHVybiBmYWxzZTsKKyAJ CX0KKyAKKyAJCS8qIEN1dCBvZmYga2V5d29yZCBhbmQgYWR2YW5jZSB0byB2YWx1ZSAqLworIAkJ KihwKyspID0gJ1wwJzsKKyAKKyAJCWtleXdvcmQgPSB0b2tlbjsKKyAJCXZhbHVlID0gcDsKKyAK KyAJCS8qIFNwZWNpYWwga2V5d29yZCBoYW5kbGluZyBmb3IgaW1wcm92ZWQgSkRCQyBjb21wYXRp YmlsaXR5ICovCisgCQlpZiAoc3RyY21wKGtleXdvcmQsICJzc2wiKSA9PSAwICYmCisgCQkJc3Ry Y21wKHZhbHVlLCAidHJ1ZSIpID09IDApCisgCQl7CisgCQkJa2V5d29yZCA9ICJzc2xtb2RlIjsK KyAJCQl2YWx1ZSA9ICJyZXF1aXJlIjsKKyAJCX0KKyAKKyAJCS8qCisgCQkgKiBTdG9yZSB0aGUg dmFsdWUgaWYgY29ycmVzcG9uZGluZyBvcHRpb24gd2FzIGZvdW5kIC0tIGlnbm9yZQorIAkJICog b3RoZXJ3aXNlLgorIAkJICoKKyAJCSAqIEluIHRoZW9yeSwgdGhlIGtleXdvcmQgbWlnaHQgYmUg YWxzbyBwZXJjZW50LWVuY29kZWQsIGJ1dCBoYXJkbHkKKyAJCSAqIHRoYXQncyBldmVyIG5lZWRl ZCBieSBhbnlvbmUuCisgCQkgKi8KKyAJCWlmICghY29ubmluZm9fc3RvcmVfdXJpX2VuY29kZWRf dmFsdWUoY29ubk9wdGlvbnMsIGtleXdvcmQsIHZhbHVlLAorIAkJCQkJCQkJCQkJICBlcnJvck1l c3NhZ2UsIHRydWUpKQorIAkJeworIAkJCWZwcmludGYoc3RkZXJyLAorIAkJCQkJbGlicHFfZ2V0 dGV4dCgiV0FSTklORzogaWdub3JpbmcgdW5yZWNvZ25pemVkIFVSSSBxdWVyeSBwYXJhbWV0ZXI6 ICVzXG4iKSwKKyAJCQkJCWtleXdvcmQpOworIAkJfQorIAorIAkJcGFyYW1zID0gTlVMTDsgLyog cHJvY2VlZCB0byB0aGUgbmV4dCB0b2tlbiB3aXRoIHN0cnRva19yICovCisgCX0KKyAKKyAJcmV0 dXJuIHRydWU7CisgfQorIAorIC8qCisgICogQ29ubmVjdGlvbiBVUkkgZGVjb2RlciByb3V0aW5l CisgICoKKyAgKiBJZiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBtYWxsb2MnZCBkZWNvZGVkIHN0 cmluZy4KKyAgKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIGFuZCBmaWxscyBlcnJv ck1lc3NhZ2UgYWNjb3JkaW5nbHkuCisgICoKKyAgKiBUaGUgc3RyaW5nIGlzIGRlY29kZWQgYnkg cmVwbGFjaW5nIGFueSBwZXJjZW50LWVuY29kZWQgdG9rZW5zIHdpdGgKKyAgKiBjb3JyZXNwb25k aW5nIGNoYXJhY3RlcnMsIHdoaWxlIHByZXNlcnZpbmcgYW55IG5vbi1lbmNvZGVkIGNoYXJhY3Rl cnMuICBBCisgICogcGVyY2VudC1lbmNvZGVkIHRva2VuIGlzIGEgY2hhcmFjdGVyIHRyaXBsZXQ6 IGEgcGVyY2VudCBzaWduLCBmb2xsb3dlZCBieSBhCisgICogcGFpciBvZiBoZXhhZGVjaW1hbCBk aWdpdHMgKDAtOUEtRiksIHdoZXJlIGxvd2VyLSBhbmQgdXBwZXItY2FzZSBsZXR0ZXJzIGFyZQor ICAqIHRyZWF0ZWQgaWRlbnRpY2FsbHkuCisgICovCiAgc3RhdGljIGNoYXIgKgorIGNvbm5pbmZv X3VyaV9kZWNvZGUoY29uc3QgY2hhciAqc3RyLCBQUUV4cEJ1ZmZlciBlcnJvck1lc3NhZ2UpCisg eworIAljaGFyICpidWYgPSBtYWxsb2Moc3RybGVuKHN0cikgKyAxKTsKKyAJY2hhciAqcCA9IGJ1 ZjsKKyAJY29uc3QgY2hhciAqcSA9IHN0cjsKKyAKKyAJaWYgKGJ1ZiA9PSBOVUxMKQorIAl7Cisg CQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3NhZ2UsIGxpYnBxX2dldHRleHQoIm91dCBvZiBt ZW1vcnlcbiIpKTsKKyAJCXJldHVybiBOVUxMOworIAl9CisgCisgCWZvciAoOzspCisgCXsKKyAJ CWlmICgqcSAhPSAnJScpCisgCQl7CisgCQkJLyogY29weSBhbmQgY2hlY2sgZm9yIE5VTCB0ZXJt aW5hdG9yICovCisgCQkJaWYgKCEoKihwKyspID0gKihxKyspKSkKKyAJCQkJYnJlYWs7CisgCQl9 CisgCQllbHNlCisgCQl7CisgCQkJaW50IGhpOworIAkJCWludCBsbzsKKyAKKyAJCQkrK3E7IC8q IHNraXAgdGhlIHBlcmNlbnQgc2lnbiBpdHNlbGYgKi8KKyAKKyAJCQkvKgorIAkJCSAqIFBvc3Np YmxlIEVPTCB3aWxsIGJlIGNhdWdodCBieSB0aGUgZmlyc3QgY2FsbCB0byBnZXRfaGV4ZGlnaXQo KSwKKyAJCQkgKiBzbyB3ZSBuZXZlciBkZXJlZmVyZW5jZSBhbiBpbnZhbGlkIHEgcG9pbnRlci4K KyAJCQkgKi8KKyAJCQlpZiAoIShnZXRfaGV4ZGlnaXQoKnErKywgJmhpKSAmJiBnZXRfaGV4ZGln aXQoKnErKywgJmxvKSkpCisgCQkJeworIAkJCQlwcmludGZQUUV4cEJ1ZmZlcihlcnJvck1lc3Nh Z2UsCisgCQkJCQkJCQkgIGxpYnBxX2dldHRleHQoImludmFsaWQgcGVyY2VudC1lbmNvZGVkIHRv a2VuIChhIHBhaXIgb2YgaGV4YWRlY2ltYWwgZGlnaXRzIGV4cGVjdGVkIGFmdGVyIGV2ZXJ5ICcl JScgc3ltYm9sLCB1c2UgJyUlMjUnIHRvIGVuY29kZSBwZXJjZW50IHN5bWJvbCBpdHNlbGYpOiAl c1xuIiksCisgCQkJCQkJCQkgIHN0cik7CisgCQkJCWZyZWUoYnVmKTsKKyAJCQkJcmV0dXJuIE5V TEw7CisgCQkJfQorIAorIAkJCSoocCsrKSA9IChoaSA8PCA0KSB8IGxvOworIAkJfQorIAl9Cisg CisgCXJldHVybiBidWY7CisgfQorIAorIC8qCisgICogQ29udmVydCBoZXhhZGVjaW1hbCBkaWdp dCBjaGFyYWN0ZXIgdG8gaXQncyBpbnRlZ2VyIHZhbHVlLgorICAqCisgICogSWYgc3VjY2Vzc2Z1 bCwgcmV0dXJucyB0cnVlIGFuZCB2YWx1ZSBpcyBmaWxsZWQgd2l0aCBkaWdpdCdzIGJhc2UgMTYg dmFsdWUuCisgICogSWYgbm90IHN1Y2Nlc3NmdWwsIHJldHVybnMgZmFsc2UuCisgICoKKyAgKiBM b3dlci0gYW5kIHVwcGVyLWNhc2UgbGV0dGVycyBpbiB0aGUgcmFuZ2UgQS1GIGFyZSB0cmVhdGVk IGlkZW50aWNhbGx5LgorICAqLworIHN0YXRpYyBib29sCisgZ2V0X2hleGRpZ2l0KGNoYXIgZGln aXQsIGludCAqdmFsdWUpCisgeworIAlpZiAoJzAnIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9ICc5JykK KyAJeworIAkJKnZhbHVlID0gZGlnaXQgLSAnMCc7CisgCX0KKyAJZWxzZSBpZiAoJ0EnIDw9IGRp Z2l0ICYmIGRpZ2l0IDw9ICdGJykKKyAJeworIAkJKnZhbHVlID0gZGlnaXQgLSAnQScgKyAxMDsK KyAJfQorIAllbHNlIGlmICgnYScgPD0gZGlnaXQgJiYgZGlnaXQgPD0gJ2YnKQorIAl7CisgCQkq dmFsdWUgPSBkaWdpdCAtICdhJyArIDEwOworIAl9CisgCWVsc2UKKyAJeworIAkJcmV0dXJuIGZh bHNlOworIAl9CisgCisgCXJldHVybiB0cnVlOworIH0KKyAKKyAvKgorICAqIEZpbmQgYW4gb3B0 aW9uIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGtleXdvcmQgaW4gdGhlIGNvbm5PcHRpb25z IGFycmF5LgorICAqCisgICogSWYgc3VjY2Vzc2Z1bCwgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhl IGNvcnJlc3BvbmRpbmcgb3B0aW9uJ3MgdmFsdWUuCisgICogSWYgbm90IHN1Y2Nlc3NmdWwsIHJl dHVybnMgTlVMTC4KKyAgKi8KKyBzdGF0aWMgY29uc3QgY2hhciAqCiAgY29ubmluZm9fZ2V0dmFs KFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAogIAkJCQljb25zdCBjaGFyICprZXl3b3Jk KQogIHsKKyAJUFFjb25uaW5mb09wdGlvbiAqb3B0aW9uID0gY29ubmluZm9fZmluZChjb25uT3B0 aW9ucywga2V5d29yZCk7CisgCisgCXJldHVybiBvcHRpb24gPyBvcHRpb24tPnZhbCA6IE5VTEw7 CisgfQorIAorIC8qCisgICogU3RvcmUgYSAobmV3KSB2YWx1ZSBmb3IgYW4gb3B0aW9uIGNvcnJl c3BvbmRpbmcgdG8gdGhlIGtleXdvcmQgaW4KKyAgKiBjb25uT3B0aW9ucyBhcnJheS4KKyAgKgor ICAqIElmIHN1Y2Nlc3NmdWwsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5n IFBRY29ubmluZm9PcHRpb24sCisgICogd2hpY2ggdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBhIHN0 cmR1cCdkIGNvcHkgb2YgdGhlIHBhc3NlZCB2YWx1ZSBzdHJpbmcuCisgICogVGhlIGV4aXN0aW5n IHZhbHVlIGZvciB0aGUgb3B0aW9uIGlzIGZyZWUnZCBiZWZvcmUgcmVwbGFjaW5nLCBpZiBhbnku CisgICoKKyAgKiBJZiBub3Qgc3VjY2Vzc2Z1bCwgcmV0dXJucyBOVUxMIGFuZCBmaWxscyBlcnJv ck1lc3NhZ2UgYWNjb3JkaW5nbHkuCisgICovCisgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKgor IGNvbm5pbmZvX3N0b3JldmFsKFBRY29ubmluZm9PcHRpb24gKmNvbm5PcHRpb25zLAorIAkJCQkg IGNvbnN0IGNoYXIgKmtleXdvcmQsIGNvbnN0IGNoYXIgKnZhbHVlLAorIAkJCQkgIFBRRXhwQnVm ZmVyIGVycm9yTWVzc2FnZSwgYm9vbCBpZ25vcmVNaXNzaW5nKQorIHsKKyAJUFFjb25uaW5mb09w dGlvbiAqb3B0aW9uID0gY29ubmluZm9fZmluZChjb25uT3B0aW9ucywga2V5d29yZCk7CisgCWNo YXIgKnZhbHVlX2NvcHk7CisgCisgCWlmIChvcHRpb24gPT0gTlVMTCkKKyAJeworIAkJaWYgKCFp Z25vcmVNaXNzaW5nKQorIAkJCXByaW50ZlBRRXhwQnVmZmVyKGVycm9yTWVzc2FnZSwKKyAJCQkJ CQkJICBsaWJwcV9nZXR0ZXh0KCJpbnZhbGlkIGNvbm5lY3Rpb24gb3B0aW9uIFwiJXNcIlxuIiks CisgCQkJCQkJCSAga2V5d29yZCk7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAorIAl2YWx1ZV9j b3B5ID0gc3RyZHVwKHZhbHVlKTsKKyAJaWYgKHZhbHVlX2NvcHkgPT0gTlVMTCkKKyAJeworIAkJ cHJpbnRmUFFFeHBCdWZmZXIoZXJyb3JNZXNzYWdlLCBsaWJwcV9nZXR0ZXh0KCJvdXQgb2YgbWVt b3J5XG4iKSk7CisgCQlyZXR1cm4gTlVMTDsKKyAJfQorIAorIAlpZiAob3B0aW9uLT52YWwpCisg CQlmcmVlKG9wdGlvbi0+dmFsKTsKKyAJb3B0aW9uLT52YWwgPSB2YWx1ZV9jb3B5OworIAorIAly ZXR1cm4gb3B0aW9uOworIH0KKyAKKyAvKgorICAqIFN0b3JlIGEgKG5ldykgcG9zc2libHkgVVJJ LWVuY29kZWQgdmFsdWUgZm9yIGFuIG9wdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAqIGtl eXdvcmQgaW4gY29ubk9wdGlvbnMgYXJyYXkuCisgICoKKyAgKiBJZiBzdWNjZXNzZnVsLCByZXR1 cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBQUWNvbm5pbmZvT3B0aW9uLAorICAq IHdoaWNoIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggYSBVUkktZGVjb2RlZCBjb3B5IG9mIHRoZSBw YXNzZWQgdmFsdWUgc3RyaW5nLgorICAqIFRoZSBleGlzdGluZyB2YWx1ZSBmb3IgdGhlIG9wdGlv biBpcyBmcmVlJ2QgYmVmb3JlIHJlcGxhY2luZywgaWYgYW55LgorICAqCisgICogSWYgbm90IHN1 Y2Nlc3NmdWwsIHJldHVybnMgTlVMTCBhbmQgZmlsbHMgZXJyb3JNZXNzYWdlIGFjY29yZGluZ2x5 LiAgSWYgdGhlCisgICogY29ycmVzcG9uZGluZyBvcHRpb24gd2FzIG5vdCBmb3VuZCwgYnV0IGln bm9yZU1pc3NpbmcgaXMgdHJ1ZTogZG9lc24ndCBmaWxsCisgICogZXJyb3JNZXNzYWdlLgorICAq CisgICogU2VlIGFsc28gY29ubmluZm9fc3RvcmV2YWwuCisgICovCisgc3RhdGljIFBRY29ubmlu Zm9PcHRpb24gKgorIGNvbm5pbmZvX3N0b3JlX3VyaV9lbmNvZGVkX3ZhbHVlKFBRY29ubmluZm9P cHRpb24gKmNvbm5PcHRpb25zLAorIAkJCQkJCQkJIGNvbnN0IGNoYXIgKmtleXdvcmQsIGNvbnN0 IGNoYXIgKmVuY29kZWRfdmFsdWUsCisgCQkJCQkJCQkgUFFFeHBCdWZmZXIgZXJyb3JNZXNzYWdl LCBib29sIGlnbm9yZU1pc3NpbmcpCisgeworIAlQUWNvbm5pbmZvT3B0aW9uICpvcHRpb247Cisg CWNoYXIgKmRlY29kZWRfdmFsdWUgPSBjb25uaW5mb191cmlfZGVjb2RlKGVuY29kZWRfdmFsdWUs IGVycm9yTWVzc2FnZSk7CisgCisgCWlmIChkZWNvZGVkX3ZhbHVlID09IE5VTEwpCisgCQlyZXR1 cm4gTlVMTDsKKyAKKyAJb3B0aW9uID0gY29ubmluZm9fc3RvcmV2YWwoY29ubk9wdGlvbnMsIGtl eXdvcmQsIGRlY29kZWRfdmFsdWUsCisgCQkJCQkJCSAgIGVycm9yTWVzc2FnZSwgaWdub3JlTWlz c2luZyk7CisgCWZyZWUoZGVjb2RlZF92YWx1ZSk7CisgCisgCXJldHVybiBvcHRpb247CisgfQor IAorIC8qCisgICogRmluZCBhIFBRY29ubmluZm9PcHRpb24gb3B0aW9uIGNvcnJlc3BvbmRpbmcg dG8gdGhlIGtleXdvcmQgaW4gdGhlCisgICogY29ubk9wdGlvbnMgYXJyYXkuCisgICoKKyAgKiBJ ZiBzdWNjZXNzZnVsLCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBQUWNv bm5pbmZvT3B0aW9uCisgICogc3RydWN0dXJlLgorICAqIElmIG5vdCBzdWNjZXNzZnVsLCByZXR1 cm5zIE5VTEwuCisgICovCisgc3RhdGljIFBRY29ubmluZm9PcHRpb24gKgorIGNvbm5pbmZvX2Zp bmQoUFFjb25uaW5mb09wdGlvbiAqY29ubk9wdGlvbnMsIGNvbnN0IGNoYXIgKmtleXdvcmQpCisg ewogIAlQUWNvbm5pbmZvT3B0aW9uICpvcHRpb247CiAgCiAgCWZvciAob3B0aW9uID0gY29ubk9w dGlvbnM7IG9wdGlvbi0+a2V5d29yZCAhPSBOVUxMOyBvcHRpb24rKykKICAJewogIAkJaWYgKHN0 cmNtcChvcHRpb24tPmtleXdvcmQsIGtleXdvcmQpID09IDApCiEgCQkJcmV0dXJuIG9wdGlvbjsK ICAJfQogIAogIAlyZXR1cm4gTlVMTDsKKioqIC9kZXYvbnVsbAotLS0gYi9zcmMvaW50ZXJmYWNl cy9saWJwcS90ZXN0L01ha2VmaWxlCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDEx IC0tLS0KKyBzdWJkaXIgPSBzcmMvaW50ZXJmYWNlcy9saWJwcS90ZXN0CisgdG9wX2J1aWxkZGly ID0gLi4vLi4vLi4vLi4KKyBpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xv YmFsCisgCisgYWxsOiBpbnN0YWxsY2hlY2sKKyAKKyBpbnN0YWxsY2hlY2s6CisgCUJJTkRJUj0n JChiaW5kaXIpJyBTVUJESVI9JyQoc3ViZGlyKScgJChTSEVMTCkgLi9yZWdyZXNzLnNoCisgCisg Y2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW46CisgCXJtIC1mIHJlZ3Jlc3Mub3V0IHJl Z3Jlc3MuZGlmZgoqKiogL2Rldi9udWxsCi0tLSBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3Qv UkVBRE1FCioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDIwIC0tLS0KKyBUaGlzIGlz IGEgdGVzdHN1aXRlIGZvciB0ZXN0aW5nIGxpYnBxIFVSSSBjb25uZWN0aW9uIHN0cmluZyBzeW50 YXguCisgCisgVG8gcnVuIHRoZSBzdWl0ZSwgdXNlICdtYWtlIGluc3RhbGxjaGVjaycgY29tbWFu ZC4gIEl0IHdvcmtzIGJ5CisgcnVubmluZyByZWdyZXNzLnNoIGZyb20gdGhpcyBkaXJlY3Rvcnkg d2l0aCBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudAorIHNldCB1cC4KKyAKKyBUaGUgdGVzdCBpdHNl bGYgd29ya3MgYnkgcnVubmluZyB0aGUgcHNxbCBjb21tYW5kIGluc3RhbGxlZCBieSAnbWFrZQor IGluc3RhbGwnIHdpdGggZGlmZmVyZW50IC1kIG9wdGlvbiBhcmd1bWVudHMgYW5kIGNvbGxlY3Rp bmcgdGhlIG91dHB1dCwKKyB0aGVuIGNvbXBhcmluZyB0aGF0IHRvIHRoZSBleHBlY3RlZCAnY29y cmVjdCcgb3V0cHV0LgorIAorIFRoZSB0ZXN0IHNjcmlwdCBhc3N1bWVzIHRoYXQgdGhlIHNlcnZl ciBpcyBydW5uaW5nIG9uIGxvY2FsaG9zdCBhbmQKKyBhY2NlcHRpbmcgbG9jYWwgYW5kIElQdjQs NiBjb25uZWN0aW9ucyBvbiBwb3J0ICRQR1BPUlQuICBBdHRlbXB0cyB0bworIGNvbm5lY3QgYXJl IG1hZGUgZnJvbSB1c2VyICRQR1VTRVIgKHdoaWNoIGRlZmF1bHRzIHRvICRVU0VSLCkgdG8gdGhl CisgZGF0YWJhc2Ugc3BlY2lmaWVkIGluICRQR0RBVEFCQVNFICh3aGljaCBkZWZhdWx0cyB0byAi cmVncmVzc2lvbiIuKQorIFRoZSBkYXRhYmFzZSBpcyBjcmVhdGVkIGJ5IHRoZSBzY3JpcHQgcHJp b3IgdG8gcnVubmluZyB0aGUgYWN0dWFsCisgdGVzdHMuCisgCisgVGhlIGNvbm5lY3Rpb24gVVJJ IGxpbmVzIHRvIHRlc3QgYXJlIHJlYWQgZnJvbSB0aGUgZmlsZSAncmVncmVzcy5pbicsCisgYW5k IGFyZSBldmFsLWQgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byBwc3FsIChsaWtlIGBldmFsIGVjaG8g JGxpbmVgLCkKKyB0aHVzICR7dmFyaWFibGV9IHN1YnN0aXR1dGlvbnMgYXJlIGNhcnJpZWQgb3V0 LgoqKiogL2Rldi9udWxsCi0tLSBiL3NyYy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvZXhwZWN0ZWQu b3V0CioqKioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDM3IC0tLS0KKyBwb3N0Z3Jlc3Fs Oi8vJHtQR1VTRVJ9QGxvY2FsaG9zdDoke1BHUE9SVH0vJHtQR0RBVEFCQVNFfQorIHBvc3RncmVz cWw6Ly8ke1BHVVNFUn1AbG9jYWxob3N0LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vbG9j YWxob3N0OiR7UEdQT1JUfS8ke1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdC8k e1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovLyR7UEdVU0VSfUBsb2NhbGhvc3Q6JHtQR1BPUlR9 LworIHBvc3RncmVzcWw6Ly8ke1BHVVNFUn1AbG9jYWxob3N0LworIHBvc3RncmVzcWw6Ly9sb2Nh bGhvc3Q6JHtQR1BPUlR9LworIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3Q6JHtQR1BPUlR9CisgcG9z dGdyZXNxbDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9z dC8KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0CisgcG9zdGdyZXNxbDovLworIHBvc3RncmVzcWw6 Ly8lNkNvY2FsaG9zdC8KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0LyR7UEdEQVRBQkFTRX0/dXNl cj0ke1BHVVNFUn0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0LyR7UEdEQVRBQkFTRX0/dXNlcj0k e1BHVVNFUn0mcG9ydD0ke1BHUE9SVH0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0LyR7UEdEQVRB QkFTRX0/dXNlcj0ke1BHVVNFUn0mcG9ydD0ke1BHUE9SVH0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxo b3N0OiR7UEdQT1JUfT91c2VyPSR7UEdVU0VSfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3Q/dXNl cj0ke1BHVVNFUn0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0PworIHBvc3RncmVzcWw6Ly9bOjox XToke1BHUE9SVH0vJHtQR0RBVEFCQVNFfQorIHBvc3RncmVzcWw6Ly9bOjoxXS8ke1BHREFUQUJB U0V9CisgcG9zdGdyZXNxbDovL1s6OjFdLworIHBvc3RncmVzcWw6Ly9bOjoxXQorIHBvc3RncmVz Oi8vCisgcG9zdGdyZXM6Ly8vdG1wCisgV0FSTklORzogaWdub3JpbmcgdW5yZWNvZ25pemVkIFVS SSBxdWVyeSBwYXJhbWV0ZXI6IHV6ZXIKKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0P3V6ZXI9Cisg cHNxbDogRkFUQUw6ICBkYXRhYmFzZSAicG9zdGdyZTovLyIgZG9lcyBub3QgZXhpc3QKKyBwc3Fs OiBlbmQgb2Ygc3RyaW5nIHJlYWNoZWQgd2hlbiBsb29raW5nIGZvciBtYXRjaGluZyAnXScgaW4g SVB2NiBob3N0IGFkZHJlc3MgaW4gVVJJOiBwb3N0Z3JlczovL1s6OjEKKyBwc3FsOiBJUHY2IGhv c3QgYWRkcmVzcyBtYXkgbm90IGJlIGVtcHR5IGluIFVSSTogcG9zdGdyZXM6Ly9bXQorIHBzcWw6 IHVuZXhwZWN0ZWQgJ3onIGF0IHBvc2l0aW9uIDE3IGluIFVSSSAoZXhwZWN0aW5nICc6JyBvciAn LycpOiBwb3N0Z3JlczovL1s6OjFdegorIHBzcWw6IG1pc3Npbmcga2V5L3ZhbHVlIHNlcGFyYXRv ciAnPScgaW4gVVJJIHF1ZXJ5IHBhcmFtZXRlcjogenp6CisgcHNxbDogaW52YWxpZCBwZXJjZW50 LWVuY29kZWQgdG9rZW4gKGEgcGFpciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMgZXhwZWN0ZWQgYWZ0 ZXIgZXZlcnkgJyUnIHN5bWJvbCwgdXNlICclMjUnIHRvIGVuY29kZSBwZXJjZW50IHN5bWJvbCBp dHNlbGYpOiAlenoKKyBwc3FsOiBpbnZhbGlkIHBlcmNlbnQtZW5jb2RlZCB0b2tlbiAoYSBwYWly IG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBleHBlY3RlZCBhZnRlciBldmVyeSAnJScgc3ltYm9sLCB1 c2UgJyUyNScgdG8gZW5jb2RlIHBlcmNlbnQgc3ltYm9sIGl0c2VsZik6ICUxCisgcHNxbDogaW52 YWxpZCBwZXJjZW50LWVuY29kZWQgdG9rZW4gKGEgcGFpciBvZiBoZXhhZGVjaW1hbCBkaWdpdHMg ZXhwZWN0ZWQgYWZ0ZXIgZXZlcnkgJyUnIHN5bWJvbCwgdXNlICclMjUnIHRvIGVuY29kZSBwZXJj ZW50IHN5bWJvbCBpdHNlbGYpOiAlCisgcHNxbDogbWlzc2luZyB1c2VybmFtZSBzcGVjaWZpZXIg aW4gVVJJOiBwb3N0Z3JlczovL0Bsb2NhbGhvc3QKKyBwc3FsOiBtaXNzaW5nIHBvcnQgc3BlY2lm aWVyIGluIFVSSTogcG9zdGdyZXM6Ly9sb2NhbGhvc3Q6LwoqKiogL2Rldi9udWxsCi0tLSBiL3Ny Yy9pbnRlcmZhY2VzL2xpYnBxL3Rlc3QvcmVncmVzcy5pbgoqKioqKioqKioqKioqKioKKioqIDAg KioqKgotLS0gMSwzNiAtLS0tCisgcG9zdGdyZXNxbDovLyR7UEdVU0VSfUBsb2NhbGhvc3Q6JHtQ R1BPUlR9LyR7UEdEQVRBQkFTRX0KKyBwb3N0Z3Jlc3FsOi8vJHtQR1VTRVJ9QGxvY2FsaG9zdC8k e1BHREFUQUJBU0V9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdDoke1BHUE9SVH0vJHtQR0RBVEFC QVNFfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQR0RBVEFCQVNFfQorIHBvc3RncmVzcWw6 Ly8ke1BHVVNFUn1AbG9jYWxob3N0OiR7UEdQT1JUfS8KKyBwb3N0Z3Jlc3FsOi8vJHtQR1VTRVJ9 QGxvY2FsaG9zdC8KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0OiR7UEdQT1JUfS8KKyBwb3N0Z3Jl c3FsOi8vbG9jYWxob3N0OiR7UEdQT1JUfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvJHtQR0RB VEFCQVNFfQorIHBvc3RncmVzcWw6Ly9sb2NhbGhvc3QvCisgcG9zdGdyZXNxbDovL2xvY2FsaG9z dAorIHBvc3RncmVzcWw6Ly8KKyBwb3N0Z3Jlc3FsOi8vJTZDb2NhbGhvc3QvCisgcG9zdGdyZXNx bDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9CisgcG9zdGdyZXNxbDov L2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9JnBvcnQ9JHtQR1BPUlR9Cisg cG9zdGdyZXNxbDovL2xvY2FsaG9zdC8ke1BHREFUQUJBU0V9P3VzZXI9JHtQR1VTRVJ9JnBvcnQ9 JHtQR1BPUlR9CisgcG9zdGdyZXNxbDovL2xvY2FsaG9zdDoke1BHUE9SVH0/dXNlcj0ke1BHVVNF Un0KKyBwb3N0Z3Jlc3FsOi8vbG9jYWxob3N0P3VzZXI9JHtQR1VTRVJ9CisgcG9zdGdyZXNxbDov L2xvY2FsaG9zdD8KKyBwb3N0Z3Jlc3FsOi8vWzo6MV06JHtQR1BPUlR9LyR7UEdEQVRBQkFTRX0K KyBwb3N0Z3Jlc3FsOi8vWzo6MV0vJHtQR0RBVEFCQVNFfQorIHBvc3RncmVzcWw6Ly9bOjoxXS8K KyBwb3N0Z3Jlc3FsOi8vWzo6MV0KKyBwb3N0Z3JlczovLworIHBvc3RncmVzOi8vL3RtcAorIHBv c3RncmVzcWw6Ly9sb2NhbGhvc3Q/dXplcj0KKyBwb3N0Z3JlOi8vCisgcG9zdGdyZXM6Ly9bOjox CisgcG9zdGdyZXM6Ly9bXQorIHBvc3RncmVzOi8vWzo6MV16CisgcG9zdGdyZXNxbDovL2xvY2Fs aG9zdD96enoKKyBwb3N0Z3Jlc3FsOi8vJXp6CisgcG9zdGdyZXNxbDovLyUxCisgcG9zdGdyZXNx bDovLyUKKyBwb3N0Z3JlczovL0Bsb2NhbGhvc3QKKyBwb3N0Z3JlczovL2xvY2FsaG9zdDovCioq KiAvZGV2L251bGwKLS0tIGIvc3JjL2ludGVyZmFjZXMvbGlicHEvdGVzdC9yZWdyZXNzLnNoCioq KioqKioqKioqKioqKgoqKiogMCAqKioqCi0tLSAxLDM4IC0tLS0KKyAjIS9iaW4vc2gKKyBpZiBb IC16ICIkUEdVU0VSIiBdOyB0aGVuCisgUEdVU0VSPSRVU0VSCisgZmkKKyBpZiBbIC16ICIkUEdQ T1JUIiBdOyB0aGVuCisgUEdQT1JUPTU0MzIKKyBmaQorIGlmIFsgLXogIiRQR0RBVEFCQVNFIiBd OyB0aGVuCisgUEdEQVRBQkFTRT1yZWdyZXNzaW9uCisgZmkKKyBleHBvcnQgUEdVU0VSIFBHUE9S VCBQR0RBVEFCQVNFCisgCisgIiR7QklORElSfS9jcmVhdGVkYiIgIiR7UEdEQVRBQkFTRX0iCisg CisgZWNobyAiUnVubmluZyBsaWJwcSBVUkkgc3VwcG9ydCB0ZXN0Li4uIgorIAorIHdoaWxlIHJl YWQgbGluZQorIGRvCisgICAgICMgRnJpc3QsIGV4cGFuZCB2YXJpYWJsZXMgaW4gdGhlIHRlc3Qg VVJJIGxpbmUuCisgICAgIHVyaT0kKGV2YWwgZWNobyAiJGxpbmUiKQorIAorICAgICAjIEJ1dCBT RUxFQ1QgdGhlIG9yaWdpbmFsIGxpbmUsIHNvIHRlc3QgcmVzdWx0IGRvZXNuJ3QgZGVwZW5kIG9u CisgICAgICMgdGhlIHN1YnN0aXR1dGVkIHZhbHVlcy4KKyAgICAgIiR7QklORElSfS9wc3FsIiAt ZCAiJHVyaSIgLUF0IC1jICJTRUxFQ1QgJyRsaW5lJyIKKyBkb25lIDxyZWdyZXNzLmluID5yZWdy ZXNzLm91dCAyPiYxCisgCisgaWYgZGlmZiAtYyBleHBlY3RlZC5vdXQgcmVncmVzcy5vdXQgPnJl Z3Jlc3MuZGlmZjsgdGhlbgorICAgICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09IgorICAgICBlY2hvICJBbGwgdGVzdHMgcGFzc2VkIgorICAgICBleGl0IDAK KyBlbHNlCisgICAgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0iCisgICAgIGVjaG8gIkZBSUxFRDogdGhlIHRlc3QgcmVzdWx0IGRpZmZlcnMgZnJvbSB0aGUg ZXhwZWN0ZWQgb3V0cHV0IgorICAgICBlY2hvCisgICAgIGVjaG8gIlJldmlldyB0aGUgZGlmZmVy ZW5jZSBpbiAke1NVQkRJUn0vcmVncmVzcy5kaWZmIgorICAgICBlY2hvICI9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICAgICBleGl0IDEKKyBmaQo= --=-=-=--