From mboxrd@z Thu Jan 1 00:00:00 1970 From: Federico Beffa Subject: hackage importer Date: Fri, 13 Mar 2015 18:59:24 +0100 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=089e013c6bccc68b0e05112f427e Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:35338) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YWTrw-0004Ua-CR for guix-devel@gnu.org; Fri, 13 Mar 2015 13:59:37 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YWTrr-0003N5-QH for guix-devel@gnu.org; Fri, 13 Mar 2015 13:59:32 -0400 Received: from mail-la0-x229.google.com ([2a00:1450:4010:c03::229]:40068) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YWTrq-0003Mg-U5 for guix-devel@gnu.org; Fri, 13 Mar 2015 13:59:27 -0400 Received: by labge10 with SMTP id ge10so24221564lab.7 for ; Fri, 13 Mar 2015 10:59:25 -0700 (PDT) List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org Sender: guix-devel-bounces+gcggd-guix-devel=m.gmane.org@gnu.org To: Guix-devel --089e013c6bccc68b0e05112f427e Content-Type: text/plain; charset=UTF-8 Hi, please find attached an initial version of an importer for packages from Hackage: http://hackage.haskell.org/ Here a couple of features and limitations: * The information about packages is retrieved from .cabal files. Similarly to Haskell code these files support "layout" style grouping and grouping with braces {}. Currently the importer only supports the former which appears to be the most popular form. * The code handles dependencies with conditionals and tries to comply with the description at https://www.haskell.org/cabal/users-guide/developing-packages.html#configurations However, information about library versions is discarded. * It implies the existence of a haskell-build-system which currently doesn't exist. That's for another free week-end, or somebody interested :-) * Cabal files include dependencies to libraries included with the complier (at least with GHC). For the moment I just filter those out assuming the packages are going to be compiled with GHC. * The generated package name is prefixed with "haskell-" in a similar way to Perl and Python packages. However, the cabal file includes checks for the compiler implementation and the importer handles that and keep the test in the generated package (see eval-impl in the code and the description in the above link). If in the future there is interest in supporting other Haskell compilers, then maybe we should better prefix the packages according to the used compiler ("ghc-" ...). * The argument to the importer may include a version suffix (GUIX style). If no version is included, then it retrieves the latest version. I've tested it with a hadful of packages among which "mtl", "cabal-install" and "HTTP" and appears to be working. Obviously the tests in part 5 were used along the way and will be removed. Before doing that and squashing my local commits I thought I would see the comments here :-) The attached patch is squashed with "git diff master". Regards, Fede --089e013c6bccc68b0e05112f427e Content-Type: text/x-diff; charset=UTF-8; name="0001-import-hackage.patch" Content-Disposition: attachment; filename="0001-import-hackage.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_i77uhhhy0 ZGlmZiAtLWdpdCBhL2d1aXgvaW1wb3J0L2hhY2thZ2Uuc2NtIGIvZ3VpeC9pbXBvcnQvaGFja2Fn ZS5zY20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhZjAzZAotLS0gL2Rl di9udWxsCisrKyBiL2d1aXgvaW1wb3J0L2hhY2thZ2Uuc2NtCkBAIC0wLDAgKzEsMTAyMSBAQAor Ozs7IEdOVSBHdWl4IC0tLSBGdW5jdGlvbmFsIHBhY2thZ2UgbWFuYWdlbWVudCBmb3IgR05VCis7 OzsgQ29weXJpZ2h0IMKpIDIwMTUgRmVkZXJpY28gQmVmZmEgPGJlZmZhQGZiZW5naW5lZXJpbmcu Y2g+Cis7OzsKKzs7OyBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgR3VpeC4KKzs7OworOzs7IEdO VSBHdWl4IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBt b2RpZnkgaXQKKzs7OyB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorOzs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247 IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAorOzs7IHlvdXIgb3B0aW9u KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKzs7OworOzs7IEdOVSBHdWl4IGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorOzs7IFdJVEhPVVQgQU5ZIFdB UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKzs7OyBNRVJDSEFO VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7 OzsgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKzs7OworOzs7 IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlCis7OzsgYWxvbmcgd2l0aCBHTlUgR3VpeC4gIElmIG5vdCwgc2VlIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworKGRlZmluZS1tb2R1bGUgKGd1aXggaW1wb3J0IGhh Y2thZ2UpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgbWF0Y2gpCisgICM6dXNlLW1vZHVsZSAoaWNl LTkgcmVnZXgpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgcmRlbGltKQorICAjOnVzZS1tb2R1bGUg KGljZS05IHJlY2VpdmUpCisgICM6dXNlLW1vZHVsZSAoaWNlLTkgcHJldHR5LXByaW50KQorICAj OnVzZS1tb2R1bGUgKHNyZmkgc3JmaS0yNikKKyAgIzp1c2UtbW9kdWxlIChzcmZpIHNyZmktMTEp CisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTEpCisgICM6dXNlLW1vZHVsZSAoKGd1aXggZG93 bmxvYWQpICM6c2VsZWN0IChkb3dubG9hZC10by1zdG9yZSkpCisgICM6dXNlLW1vZHVsZSAoKGd1 aXggdXRpbHMpICM6c2VsZWN0IChwYWNrYWdlLW5hbWUtPm5hbWUrdmVyc2lvbikpCisgICM6dXNl LW1vZHVsZSAoZ3VpeCBpbXBvcnQgdXRpbHMpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBzdG9yZSkK KyAgIzp1c2UtbW9kdWxlIChndWl4IGhhc2gpCisgICM6dXNlLW1vZHVsZSAoZ3VpeCBiYXNlMzIp CisgICM6dXNlLW1vZHVsZSAoKGd1aXggdXRpbHMpICM6c2VsZWN0IChjYWxsLXdpdGgtdGVtcG9y YXJ5LW91dHB1dC1maWxlKSkKKyAgIzpleHBvcnQgKGhhY2thZ2UtPmd1aXgtcGFja2FnZSkpCisK Kzs7IFBhcnQgMToKKzs7Cis7OyBGdW5jdGlvbnMgdXNlZCB0byByZWFkIGEgY2FiYWwgZmlsZSBh bmQgZG8gc29tZSBwcmUtcHJvY2Vzc2luZzogZGlzY2FyZGluZworOzsgY29tbWVudHMgYW5kIGVt cHR5IGxpbmVzLgorCis7OyBMaXN0IG9mIGxpYnJhcmllcyBkaXN0cmlidXRlZCB3aXRoIGdoYyAo Ny44LjQpLgorKGRlZmluZSBnaGMtc3RhbmRhcmQtbGlicmFyaWVzCisgICcoImhhc2tlbGw5OCIg ICAgICAgIDsgMi4wLjAuMworICAgICJob29wbCIgICAgICAgICAgICA7IDMuMTAuMC4xCisgICAg ImJhc2UiCisgICAgInRyYW5zZm9ybWVycyIgICAgIDsgMC4zLjAuMAorICAgICJkZWVwc2VxIiAg ICAgICAgICA7IDEuMy4wLjIKKyAgICAiYXJyYXkiICAgICAgICAgICAgOyAwLjUuMC4wCisgICAg ImJpbmFyeSIgICAgICAgICAgIDsgMC43LjEuMAorICAgICJieXRlc3RyaW5nIiAgICAgICA7IDAu MTAuNC4wCisgICAgImNvbnRhaW5lcnMiICAgICAgIDsgMC41LjUuMQorICAgICJ0aW1lIiAgICAg ICAgICAgICA7IDEuNC4yCisgICAgIkNhYmFsIiAgICAgICAgICAgIDsgMS4xOC4xLjUgKGJ1dCBu b3QgImNhYmFsLWluc3RhbGwiKQorICAgICJiaW4tcGFja2FnZS1kYiIgICA7IDAuMC4wLjAKKyAg ICAiZ2hjLXByaW0iCisgICAgImludGVnZXItZ21wIgorICAgICJXaW4zMiIgICAgICAgICAgICA7 IDIuMy4wLjIKKyAgICAidGVtcGxhdGUtaGFza2VsbCIKKyAgICAicHJvY2VzcyIgICAgICAgICAg OyAxLjIuMC4wCisgICAgImhhc2tlbGluZSIgICAgICAgIDsgMC43LjEuMgorICAgICJ0ZXJtaW5m byIgICAgICAgICA7IDAuNC4wLjAKKyAgICAiZGlyZWN0b3J5IiAgICAgICAgOyAxLjIuMS4wCisg ICAgImZpbGVwYXRoIiAgICAgICAgIDsgMS4zLjAuMgorICAgICJvbGQtbG9jYWxlIiAgICAgICA7 IDEuMC4wLjYKKyAgICAidW5peCIgICAgICAgICAgICAgOyAyLjcuMC4xCisgICAgIm9sZC10aW1l IiAgICAgICAgIDsgMS4xLjAuMgorICAgICJwcmV0dHkiICAgICAgICAgICA7IDEuMS4xLjEKKyAg ICAieGh0bWwiICAgICAgICAgICAgOyAzMDAwLjIuMQorICAgICJocGMiKSkgICAgICAgICAgICA7 IDAuNi4wLjEKKworOzsgTGlicmFyaWVzIHByZXNlbnQgaW4gdGhlICJIYXNrZWxsIFBsYXRmb3Jt IiAyMDE0LjIuMCBhbmQgbm90IGluY2x1ZGVkIGluCis7OyB0aGUgR0hDIHN0YW5kYXJkIGxpYnJh cmllczoKKzs7Cis7OyAiemxpYiIgICAgICAgICAgICAgICAgIDsgMC41LjQuMQorOzsgImFzeW5j IiAgICAgICAgICAgICAgICA7IDIuMC4xLjUKKzs7ICJzdG0iICAgICAgICAgICAgICAgICAgOyAy LjQuMgorOzsgIm10bCIgICAgICAgICAgICAgICAgICA7IDIuMS4zLjEKKzs7ICJwcmltaXRpdmUi ICAgICAgICAgICAgOyAwLjUuMi4xCis7OyAicGFyYWxsZWwiICAgICAgICAgICAgIDsgMy4yLjAu NAorOzsgImF0dG9wYXJzZWMiICAgICAgICAgICA7IDAuMTAuNC4wCis7OyAiY2FzZS1pbnNlbnNp dGl2ZSIgICAgIDsgMS4xLjAuMworOzsgInN5YiIgICAgICAgICAgICAgICAgICA7IDAuNC4xCis7 OyAiY29udGFpbmVycyIgICAgICAgICAgIDsgMC41LjUuMQorOzsgImZnbCIgICAgICAgICAgICAg ICAgICA7IDUuNS4wLjEKKzs7ICJ1bm9yZGVyZWQtY29udGFpbmVycyIgOyAwLjIuMy4zCis7OyAi aGFzaGFibGUiICAgICAgICAgICAgIDsgMS4yLjEuMAorOzsgInNwbGl0IiAgICAgICAgICAgICAg ICA7IDAuMi4yCis7OyAidGV4dCIgICAgICAgICAgICAgICAgIDsgMS4xLjAuMAorOzsgInZlY3Rv ciIgICAgICAgICAgICAgICA7IDAuMTAuOS4xCis7OyAiR0xVUmF3IiAgICAgICAgICAgICAgIDsg MS40LjAuMQorOzsgIk9wZW5HTCIgICAgICAgICAgICAgICA7IDIuOS4yLjAKKzs7ICJPcGVuR0xS YXciICAgICAgICAgICAgOyAxLjUuMC4wCis7OyAiR0xVVCIgICAgICAgICAgICAgICAgIDsgMi41 LjEuMQorOzsgImhhc2tlbGwtc3JjIiAgICAgICAgICA7IDEuMC4xLjYKKzs7ICJuZXR3b3JrIiAg ICAgICAgICAgICAgOyAyLjQuMi4yCis7OyAiSFRUUCIgICAgICAgICAgICAgICAgIDsgNDAwMC4y LjEwCis7OyAicmFuZG9tIiAgICAgICAgICAgICAgIDsgMS4wLjEuMQorOzsgIkhVbml0IiAgICAg ICAgICAgICAgICA7IDEuMi41LjIKKzs7ICJRdWlja0NoZWNrIiAgICAgICAgICAgOyAyLjYKKzs7 ICJodG1sIiAgICAgICAgICAgICAgICAgOyAxLjAuMS4yCis7OyAicGFyc2VjIiAgICAgICAgICAg ICAgIDsgMy4xLjUKKzs7ICJyZWdleC1jb21wYXQiICAgICAgICAgOyAwLjk1LjEKKzs7ICJyZWdl eC1iYXNlIiAgICAgICAgICAgOyAwLjkzLjIKKzs7ICJyZWdleC1wb3NpeCIgICAgICAgICAgOyAw Ljk1LjIKKworKGRlZmluZSBndWl4LW5hbWUtcHJlZml4ICJoYXNrZWxsLSIpCisKKzs7IFJlZ3Vs YXIgZXhwcmVzc2lvbiBtYXRjaGluZyAia2V5OiB2YWx1ZSIKKyhkZWZpbmUga2V5LXZhbHVlLXJ4 CisgICIoW2EtekEtWjAtOS1dKyk6ICooXFx3Py4qKSQiKQorCis7OyBSZWd1bGFyIGV4cHJlc3Np b24gbWF0Y2hpbmcgYSBzZWN0aW9uICJoZWFkIHN1Yi1oZWFkIC4uLiIKKyhkZWZpbmUgc2VjdGlv bnMtcngKKyAgIihbYS16QS1aMC05XFwoXFwpLV0rKSIpCisKKzs7IENhYmFsIGNvbW1lbnQuCiso ZGVmaW5lIGNvbW1lbnQtcngKKyAgIl4gKi0tIikKKworOzsgQ2hlY2sgaWYgdGhlIGN1cnJlbnQg bGluZSBpbmNsdWRlcyBhIGtleQorKGRlZmluZSAoaGFzLWtleT8gbGluZSkKKyAgKHN0cmluZy1t YXRjaCBrZXktdmFsdWUtcnggbGluZSkpCisKKyhkZWZpbmUgKGNvbW1lbnQtbGluZT8gbGluZSkK KyAgKHN0cmluZy1tYXRjaCBjb21tZW50LXJ4IGxpbmUpKQorCis7OyByZXR1cm5zIHRoZSBudW1i ZXIgb2YgaW5kZW50YXRpb24gc3BhY2VzIGFuZCB0aGUgcmVzdCBvZiB0aGUgbGluZS4KKyhkZWZp bmUgKGxpbmUtaW5kZW50YXRpb24rcmVzdCBsaW5lKQorICAobGV0IGxvb3AgKChsaW5lLWxzdCAo c3RyaW5nLT5saXN0IGxpbmUpKQorICAgICAgICAgICAgIChjb3VudCAwKSkKKyAgICAoaWYgKG9y IChudWxsPyBsaW5lLWxzdCkgKG5vdCAoZXF2PyAoZmlyc3QgbGluZS1sc3QpICNcc3BhY2UpKSkK KyAgICAgICAgKHZhbHVlcyBjb3VudCAobGlzdC0+c3RyaW5nIGxpbmUtbHN0KSkKKyAgICAgICAg KGxvb3AgKGNkciBsaW5lLWxzdCkgKCsgY291bnQgMSkpKSkpCisKKzs7IFBhcnQgMSBtYWluIGZ1 bmN0aW9uOiByZWFkIGEgY2FiYWwgZmlsYSBhbmQgZmlsdGVyIGVtcHR5IGxpbmVzIGFuZCBjb21t ZW50cy4KKzs7IFJldHVybnMgYSBsaXN0IGNvbXBvc2VkIGJ5IHRoZSBwcmUtcHJvY2Vzc2VkIGxp bmVzIG9mIHRoZSBmaWxlLgorKGRlZmluZSAocmVhZC1jYWJhbCBwb3J0KQorICAobGV0IGxvb3Ag KChsaW5lIChyZWFkLWxpbmUgcG9ydCkpCisgICAgICAgICAgICAgKHJlc3VsdCAnKCkpKQorICAg IChjb25kCisgICAgICgoZW9mLW9iamVjdD8gbGluZSkKKyAgICAgIChyZXZlcnNlIHJlc3VsdCkp CisgICAgICgob3IgKHN0cmluZy1udWxsPyBsaW5lKSAoY29tbWVudC1saW5lPyBsaW5lKSkKKyAg ICAgIChsb29wIChyZWFkLWxpbmUgcG9ydCkgcmVzdWx0KSkKKyAgICAgKGVsc2UKKyAgICAgIChs b29wIChyZWFkLWxpbmUgcG9ydCkgKGNvbnMgbGluZSByZXN1bHQpKSkpKSkKKworOzsgUGFydCAy OgorOzsKKzs7IFRha2UgdGhlIHJlc3VsdCBvZiBwYXJ0IDEgYW5kIGNvbnZlcnQgdGhlIGNvbnRl bnQgb2YgdGhlIGZpbGUgaW4gYSBsaXN0IG9mCis7OyBsaXN0IHBhaXJzLCB3aGVyZSB0aGUgZmly c3QgbGlzdCBvZiB0aGUgcGFpciBpbmNsdWRlcyBrZXlzIHdoaWxlIHRoZSBzZWNvbmQKKzs7IGlz IGEgbGlzdCBvZiB2YWx1ZXMuCisKKzs7IEZ1bmN0aW9uIHRvIHJlYWQgYSB2YWx1ZSBzcGxpdCBh Y3Jvc3MgbXVsdGlwbGUgbGluZXMuIExJTkVTIGFyZSB0aGUKKzs7IHJlbWFpbmluZyBpbnB1dCBs aW5lcyB0byBiZSByZWFkLiBTRUVEIGlzIHRoZSB2YWx1ZSByZWFkIG9uIHRoZSBzYW1lIGxpbmUK Kzs7IGFzIHRoZSBrZXkuIFJldHVybnMgdHdvIHZhbHVlczogKFZBTFVFUyB2YWx1ZXMtbHN0IHJl bWFpbmluZy1saW5lcykKKyhkZWZpbmUgKG11bHRpLWxpbmUtdmFsdWUgbGluZXMgc2VlZCkKKyAg KGlmIChudWxsPyBsaW5lcykKKyAgICAgICh2YWx1ZXMgJygpICcoKSkKKyAgICAgIChsZXQtdmFs dWVzICgoKGN1cnJlbnQtaW5kZW50IHZhbHVlKSAobGluZS1pbmRlbnRhdGlvbityZXN0IChmaXJz dCBsaW5lcykpKQorICAgICAgICAgICAgICAgICAgICgobmV4dC1saW5lLWluZGVudCBuZXh0LWxp bmUtdmFsdWUpCisgICAgICAgICAgICAgICAgICAgIChpZiAobnVsbD8gKGNkciBsaW5lcykpCisg ICAgICAgICAgICAgICAgICAgICAgICAodmFsdWVzICNmICIiKQorICAgICAgICAgICAgICAgICAg ICAgICAgKGxpbmUtaW5kZW50YXRpb24rcmVzdCAoc2Vjb25kIGxpbmVzKSkpKSkKKyAgICAgICAg KGlmIChvciAobm90IG5leHQtbGluZS1pbmRlbnQpICg8IG5leHQtbGluZS1pbmRlbnQgY3VycmVu dC1pbmRlbnQpCisgICAgICAgICAgICAgICAgKHJlZ2V4cC1leGVjIGNvbmRpdGlvbi1yeCBuZXh0 LWxpbmUtdmFsdWUpKQorICAgICAgICAgICAgKHZhbHVlcyAocmV2ZXJzZSAoY29ucyB2YWx1ZSBz ZWVkKSkgKGNkciBsaW5lcykpCisgICAgICAgICAgICAobXVsdGktbGluZS12YWx1ZSAoY2RyIGxp bmVzKSAoY29ucyB2YWx1ZSBzZWVkKSkpKSkpCisKKzs7IFBhcnNlcyBhIGNhYmFsIGZpbGUgaW4g dGhlIGZvcm0gb2YgYSBsaXN0IG9mIGxpbmVzIGFzIHByb2R1Y2VkIGJ5Cis7OyBSRUFELUNBQkFM IGFuZCByZXR1cm5zIGl0cyBjb250ZW50IGluIHRoZSBmb2xsb3dpbmcgZm9ybToKKzs7Cis7OyAo KChoZWFkMSBzdWItaGVhZDEgLi4uIGtleTEpICh2YWx1ZSkpCis7OyAgKChoZWFkMiBzdWItaGVh ZDIgLi4uIGtleTIpICh2YWx1ZTIpKQorOzsgIC4uLikuCis7OworOzsgd2hlcmUgYWxsIGVsZW1l bnRzIGFyZSBzdHJpbmdzLgorOzsKKzs7IFdlIHRyeSBkbyBkZWR1Y2UgdGhlIGZvcm1hdCBmcm9t IHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQ6Cis7OyBodHRwczovL3d3dy5oYXNrZWxsLm9yZy9jYWJh bC91c2Vycy1ndWlkZS9kZXZlbG9waW5nLXBhY2thZ2VzLmh0bWwKKzs7Cis7OyBLZXkgdmFsdWVz IGFyZSBjYXNlLWluc2Vuc2l0aXZlLiBXZSB0aGVyZWZvcmUgbG93ZXJjYXNlIHRoZW0uIFZhbHVl cyBhcmUKKzs7IGNhc2Utc2Vuc2l0aXZlLgorOzsKKzs7IEN1cnJlbnRseSBvbmx5IG9ubHkgbGF5 b3V0IHN0cnVjdHVyZWQgZmlsZXMgYXJlIHBhcnNlZC4gIEJyYWNlcyB7fQorOzsgc3RydWN0dXJl ZCBmaWxlcyBhcmUgbm90IGhhbmRsZWQuCisoZGVmaW5lIChjYWJhbC0+a2V5LXZhbHVlcyBsaW5l cykKKyAgKGxldCBsb29wCisgICAgICAoKGxpbmVzIGxpbmVzKQorICAgICAgIChpbmRlbnRzICAn KCkpIDsgb25seSBpbmNsdWRlcyBpbmRlbnRzIGF0IHN0YXJ0IG9mIHNlY3Rpb24gaGVhZHMuCisg ICAgICAgKHNlY3Rpb25zICcoKSkKKyAgICAgICAocmVzdWx0ICcoKSkpCisgICAgKGxldC12YWx1 ZXMKKyAgICAgICAgKCgoY3VycmVudC1pbmRlbnQgbGluZSkKKyAgICAgICAgICAoaWYgKG51bGw/ IGxpbmVzKQorICAgICAgICAgICAgICAodmFsdWVzIDAgIiIpCisgICAgICAgICAgICAgIChsaW5l LWluZGVudGF0aW9uK3Jlc3QgKGZpcnN0IGxpbmVzKSkpKQorICAgICAgICAgKChuZXh0LWxpbmUt aW5kZW50IG5leHQtbGluZSkKKyAgICAgICAgICAoaWYgKG9yIChudWxsPyBsaW5lcykgKG51bGw/ IChjZHIgbGluZXMpKSkKKyAgICAgICAgICAgICAgKHZhbHVlcyAwICIiKQorICAgICAgICAgICAg ICAobGluZS1pbmRlbnRhdGlvbityZXN0IChzZWNvbmQgbGluZXMpKSkpKQorICAgICAgKGlmIChu dWxsPyBsaW5lcykKKyAgICAgICAgICAocmV2ZXJzZSByZXN1bHQpCisgICAgICAgICAgKGxldCAo KHJ4LXJlc3VsdCAoaGFzLWtleT8gbGluZSkpKQorICAgICAgICAgICAgKGNvbmQKKyAgICAgICAg ICAgICAocngtcmVzdWx0CisgICAgICAgICAgICAgIChsZXQgKChrZXkgKHN0cmluZy1kb3duY2Fz ZSAobWF0Y2g6c3Vic3RyaW5nIHJ4LXJlc3VsdCAxKSkpCisgICAgICAgICAgICAgICAgICAgICh2 YWx1ZSAobWF0Y2g6c3Vic3RyaW5nIHJ4LXJlc3VsdCAyKSkpCisgICAgICAgICAgICAgICAgKGNv bmQKKyAgICAgICAgICAgICAgICAgOzsgU2ltcGxlIHNpbmdsZSBsaW5lICJrZXk6IHZhbHVlIi4K KyAgICAgICAgICAgICAgICAgKCg9IG5leHQtbGluZS1pbmRlbnQgY3VycmVudC1pbmRlbnQpCisg ICAgICAgICAgICAgICAgICAobG9vcCAoY2RyIGxpbmVzKSBpbmRlbnRzIHNlY3Rpb25zCisgICAg ICAgICAgICAgICAgICAgICAgICAoY29ucworICAgICAgICAgICAgICAgICAgICAgICAgIChsaXN0 IChyZXZlcnNlIChjb25zIGtleSBzZWN0aW9ucykpIChsaXN0IHZhbHVlKSkKKyAgICAgICAgICAg ICAgICAgICAgICAgICByZXN1bHQpKSkKKyAgICAgICAgICAgICAgICAgOzsgTXVsdGkgbGluZSAi a2V5OiB2YWx1ZVxuIHZhbHVlIGNvbnQuLi4iLgorICAgICAgICAgICAgICAgICAoKD4gbmV4dC1s aW5lLWluZGVudCBjdXJyZW50LWluZGVudCkKKyAgICAgICAgICAgICAgICAgIChsZXQqLXZhbHVl cyAoKCh2YWx1ZS1sc3QgbGluZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo bXVsdGktbGluZS12YWx1ZSAoY2RyIGxpbmVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzdHJpbmctbnVsbD8gdmFsdWUpCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJygpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCgsdmFs dWUpKSkpKQorICAgICAgICAgICAgICAgICAgICA7OyBtdWx0aS1saW5lLXZhbHVlIHJldHVybnMg dG8gdGhlIGZpcnN0IGxpbmUgYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgIDs7IG11bHRp LXZhbHVlLgorICAgICAgICAgICAgICAgICAgICAobG9vcCBsaW5lcyBpbmRlbnRzIHNlY3Rpb25z CisgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAobGlzdCAocmV2ZXJzZSAoY29ucyBrZXkgc2VjdGlvbnMpKSB2YWx1ZS1sc3QpCisgICAg ICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpKSkpCisgICAgICAgICAgICAgICAgIDs7IFNl Y3Rpb24gZW5kZWQuCisgICAgICAgICAgICAgICAgIChlbHNlCisgICAgICAgICAgICAgICAgICA7 OyBJbmRlbnRhdGlvbiBpcyByZWR1Y2VkLiBDaGVjayBieSBob3cgbWFueSBsZXZlbHMuCisgICAg ICAgICAgICAgICAgICAobGV0Ki12YWx1ZXMgKCgoaWR4KSAoKyAobGlzdC1pbmRleAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYW1iZGEgKHgpICg9IG5leHQt bGluZS1pbmRlbnQgeCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaW5kZW50cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChp ZiAoaGFzLWtleT8gbmV4dC1saW5lKSAxIDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKChfIHNlYykgKHNwbGl0LWF0IHNlY3Rpb25zIGlkeCkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICgoXyBpbmQpIChzcGxpdC1hdCBpbmRlbnRzIGlkeCkpKQorICAgICAg ICAgICAgICAgICAgICAobG9vcCAoY2RyIGxpbmVzKSBpbmQgc2VjCisgICAgICAgICAgICAgICAg ICAgICAgICAgIChjb25zIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKHJldmVy c2UgKGNvbnMga2V5IHNlY3Rpb25zKSkgKGxpc3QgdmFsdWUpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmVzdWx0KSkpKSkpKQorICAgICAgICAgICAgIDs7IFN0YXJ0IG9mIGEgbmV3IHNl Y3Rpb24uCisgICAgICAgICAgICAgKChvciAobnVsbD8gaW5kZW50cykKKyAgICAgICAgICAgICAg ICAgICg+IGN1cnJlbnQtaW5kZW50IChmaXJzdCBpbmRlbnRzKSkpCisgICAgICAgICAgICAgIChs b29wIChjZHIgbGluZXMpIChjb25zIGN1cnJlbnQtaW5kZW50IGluZGVudHMpCisgICAgICAgICAg ICAgICAgICAgIChjb25zIChzdHJpbmctZG93bmNhc2UgbGluZSkgc2VjdGlvbnMpIHJlc3VsdCkp CisgICAgICAgICAgICAgKGVsc2UKKyAgICAgICAgICAgICAgKGxvb3AgKGNkciBsaW5lcykgaW5k ZW50cworICAgICAgICAgICAgICAgICAgICAoY29ucyAoc3RyaW5nLWRvd25jYXNlIGxpbmUpIChj ZHIgc2VjdGlvbnMpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQpKSkpKSkpKQorCis7OyBG aW5kIGlmIGEgc3RyaW5nIHJlcHJlc2VudCBhIGNvbmRpdGlvbmFsCisoZGVmaW5lIGNvbmRpdGlv bi1yeAorICAobWFrZS1yZWdleHAgIl5pZiArKC4qKSQiKSkKKworOzsgU3BsaXQgc2VjdGlvbnMg aW4gaW5kaXZpZHVhbCB3b3JkcyB3aXRoIGV4Y2VwdGlvbiBmb3IgdGhlIHByZWRpY2F0ZSBvZiBh bgorOzsgJ2lmJyBjb25kaXRpb25hbC4KKyhkZWZpbmUgKHNwbGl0LXNlY3Rpb24gc2VjdGlvbikK KyAgKGxldCAoKHJ4LXJlc3VsdCAocmVnZXhwLWV4ZWMgY29uZGl0aW9uLXJ4IHNlY3Rpb24pKSkK KyAgICAoaWYgcngtcmVzdWx0CisgICAgICAgIGAoImlmIiAsKG1hdGNoOnN1YnN0cmluZyByeC1y ZXN1bHQgMSkpCisgICAgICAgIChtYXAgbWF0Y2g6c3Vic3RyaW5nIChsaXN0LW1hdGNoZXMgc2Vj dGlvbnMtcnggc2VjdGlvbikpKSkpCisKKyhkZWZpbmUgKGpvaW4tc2VjdGlvbnMgc2VjMSBzZWMy KQorICAoZm9sZC1yaWdodCBjb25zIHNlYzIgc2VjMSkpCisKKyhkZWZpbmUgKHByZS1wcm9jZXNz LWtleXMga2V5KQorICAobWF0Y2gga2V5CisgICAgKCgpICcoKSkKKyAgICAoKHNlYzEgcmVzdCAu Li4pCisgICAgIChqb2luLXNlY3Rpb25zIChzcGxpdC1zZWN0aW9uIHNlYzEpIChwcmUtcHJvY2Vz cy1rZXlzIHJlc3QpKSkpKQorCisoZGVmaW5lIChwcmUtcHJvY2Vzcy1lbnRyeS1rZXlzIGVudHJ5 KQorICAobWF0Y2ggZW50cnkKKyAgICAoKGtleSB2YWx1ZSkKKyAgICAgKGxpc3QgKHByZS1wcm9j ZXNzLWtleXMga2V5KSB2YWx1ZSkpCisgICAgKCgpICcoKSkpKQorCis7OyBTcGxpdCBhbGwgc3Ry aW5ncyBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBrZXlzIGludG8gaW5kaXZpZHVhbCB3b3Jkcywg d2l0aAorOzsgZXhjZXB0aW9uIGZvciAnaWYnIHByZWRpY2F0ZXMuIFJldHVybnMgYW4gZW50cnkg d2l0aCB0aGUga2V5IGxpc3QgY29tcG9zZWQKKzs7IGJ5IHNpbmdsZSB3b3Jkcy4gVGhpcyBpcyB1 c2VkIHRvIHJlYWQgZmxhZ3MuCisoZGVmaW5lIChwcmUtcHJvY2Vzcy1lbnRyaWVzLWtleXMgZW50 cmllcykKKyAgKG1hdGNoIGVudHJpZXMKKyAgICAoKGVudHJ5IHJlc3QgLi4uKQorICAgICAoY29u cyAocHJlLXByb2Nlc3MtZW50cnkta2V5cyBlbnRyeSkKKyAgICAgICAgICAgKHByZS1wcm9jZXNz LWVudHJpZXMta2V5cyByZXN0KSkpCisgICAgKCgpCisgICAgICcoKSkpKQorCis7OyBSZWFkIGZs YWdzIGFuZCByZXR1cm5zIGFuIGFsaXN0IHdoZXJlIGVhY2ggcGFpciBpcyBjb21wb3NlZCBieSB0 aGUgbmFtZSBvZgorOzsgYSBmbGFnIGFuZCBpdHMgdmFsdWU6ICJUcnVlIiBvciAiRmFsc2UiLgor KGRlZmluZSAoZ2V0LWZsYWdzIHByZS1wcm9jZXNzZWQtZW50cmllcykKKyAgKG1hdGNoIHByZS1w cm9jZXNzZWQtZW50cmllcworICAgICgoKSAnKCkpCisgICAgKCgoKCJmbGFnIiBmbGFnLW5hbWUg ImRlZmF1bHQiKSAoZmxhZy12YWwpKSByZXN0IC4uLikKKyAgICAgKGNvbnMgKGNvbnMgZmxhZy1u YW1lICBmbGFnLXZhbCkKKyAgICAgICAgICAgKGdldC1mbGFncyByZXN0KSkpCisgICAgKChlbnRy eSByZXN0IC4uLiApCisgICAgIChnZXQtZmxhZ3MgcmVzdCkpCisgICAgKF8gI2YpKSkKKworOzsg UGFydCAzOgorOzsKKzs7IFNvIGZhciB3ZSBkaWQgcmVhZCB0aGUgY2FiYWwgZmlsZSBhbmQgZXh0 cmFjdGVkIGZsYWdzIGluZm9ybWF0aW9uLiBOb3cgd2UKKzs7IG5lZWQgdG8gZXZhbHVhdGUgdGhl IGNvbmRpdGlvbnMgYW5kIHByb2Nlc3MgdGhlIGVudHJpZXMgYWNjb3JkaW5nbHkuCisKKzs7IENh YmFsIHRlc3Qga2V5d29yZHMKKyhkZWZpbmUgdGVzdHMtcngKKyAgKG1ha2UtcmVnZXhwICIob3N8 YXJjaHxmbGFnfGltcGwpXFwoKFthLXpBLVowLTlfLV0rKVxcKSIpKQorCis7OyBQYXJlbnRoZXNl cyB3aXRoaW4gY29uZGl0aW9ucworKGRlZmluZSBwYXJlbnMtcngKKyAgKG1ha2UtcmVnZXhwICJc XCgoLispXFwpIikpCisKKzs7IE9SIG9wZXJhdG9yIGluIGNvbmRpdGlvbnMKKyhkZWZpbmUgb3It cngKKyAgKG1ha2UtcmVnZXhwICIgK1xcfFxcfCArIikpCisKKzs7IEFORCBvcGVyYXRvciBpbiBj b25kaXRpb25zCisoZGVmaW5lIGFuZC1yeAorICAobWFrZS1yZWdleHAgIiArJiYgKyIpKQorCis7 OyBOT1Qgb3BlcmF0b3IgaW4gY29uZGl0aW9ucworKGRlZmluZSBub3QtcngKKyAgKG1ha2UtcmVn ZXhwICJeIS4rIikpCisKKzs7IFJldHVybnMgYSBsaXN0IHdpdGggdGhlIGFyZ3VtZW50cyBvZiAo bG9naWMpIGJpYW5yeSBvcGVyYXRvcnMuICBNQVRDSC1MU1QKKzs7IGlzIHRoZSByZXN1bHQgb2Yg Imxpc3QtbWF0Y2giIGFnYWluc3QgYSBiaW5hcnkgb3BlcmF0b3IgcmVnZXhwLgorKGRlZmluZSAo Ymktb3AtYXJncyBzdHIgbWF0Y2gtbHN0KQorICAobGV0ICgob3BlcmF0b3JzIChsZW5ndGggbWF0 Y2gtbHN0KSkpCisgICAgKG1hcCAobGFtYmRhIChmcm9tIHRvKQorICAgICAgICAgICAoc3Vic3Ry aW5nIHN0ciBmcm9tIHRvKSkKKyAgICAgICAgIChjb25zIDAgKG1hcCBtYXRjaDplbmQgbWF0Y2gt bHN0KSkKKyAgICAgICAgIChhcHBlbmQgKG1hcCBtYXRjaDpzdGFydCBtYXRjaC1sc3QpIChsaXN0 IChzdHJpbmctbGVuZ3RoIHN0cikpKSkpKQorCis7OyBJZiB0aGVyZSBpcyBhIHNpbmdsZSBhcmd1 bWVudCB0aGVyZSBpcyBubyBiaW5hcnkgb3BlcmF0aW9uIHRvIHBlcmZvcm0uIFdlCis7OyBqdXN0 IHJldHVybiB0aGUgYXJndW1lbnQuIFRha2VzIGEgbGlzdCBhcyBwcm9kdWNlZCBieQorOzsgImJp LW9wLWFyZ3NmIi4gUmV0dXJucyBhIHN0cmluZy4KKyhkZWZpbmUgKGJpLW9wLT5zZXhwLWxpa2Ug Ymktb3AgYXJncykKKyAgKGlmICg9IChsZW5ndGggYXJncykgMSkKKyAgICAgIChmaXJzdCBhcmdz KQorICAgICAgKHN0cmluZy1hcHBlbmQgIigiIGJpLW9wCisgICAgICAgICAgICAgICAgICAgICAo Zm9sZCAobGFtYmRhIChhcmcgc2VlZCkgKHN0cmluZy1hcHBlbmQgc2VlZCAiICIgYXJnKSkKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICIiIGFyZ3MpICIpIikpKQorCis7OyBUYWtlcyBhIHN0 cmluZyBhbmQgY2hlY2tzIGZvciBuZWdhdGlvbiBzeW1ib2wuCisoZGVmaW5lIChub3QtPnNleHAt bGlrZSBhcmcpCisgIChpZiAocmVnZXhwLWV4ZWMgbm90LXJ4IGFyZykKKyAgICAgIChzdHJpbmct YXBwZW5kICIobm90ICIKKyAgICAgICAgICAgICAgICAgICAgIChzdWJzdHJpbmcgYXJnIDEgKHN0 cmluZy1sZW5ndGggYXJnKSkKKyAgICAgICAgICAgICAgICAgICAgICIpIikKKyAgICAgIGFyZykp CisKKzs7IENvbnZlcnQgYSBDQUJBTCBjb25kaXRpb25hbCBzdHJpbmcgaW50byBhIHN0cmluZyB3 aXRoIGVxdWl2YWxlbnQgU0NIRU1FCis7OyBzeW50YXguICBUaGlzIHByb2NlZHVyZSBhY2NlcHRz IG9ubHkgc2ltcGxlIGNvbmRpdGlvbmFscyB3aXRob3V0Cis7OyBwYXJlbnRoZXNlcy4KKyhkZWZp bmUgKHBhcmVucy1sZXNzLWNvbmQtPnNleHAtbGlrZSBjb25kaXRpb25hbCkKKyAgOzsgVGhlIG91 dGhlciBvcGVyYXRpb24gaXMgdGhlIG9uZSB3aXRoIHRoZSBsb3dlc3QgcHJpb3JpdHk6IE9SCisg IChiaS1vcC0+c2V4cC1saWtlCisgICAib3IiCisgICA7OyBlYWNoIE9SIGFyZ3VtZW50IG1heSBi ZSBhbiBBTkQgb3BlcmF0aW9uCisgICAobWFwIChsYW1iZGEgKG9yLWFyZykKKyAgICAgICAgICAo bGV0ICgobS1sc3QgKGxpc3QtbWF0Y2hlcyBhbmQtcnggb3ItYXJnKSkpCisgICAgICAgICAgICA7 OyBpcyB0aGVyZSBhbiBBTkQgb3BlcmF0aW9uPworICAgICAgICAgICAgKGlmICg+IChsZW5ndGgg bS1sc3QpIDApCisgICAgICAgICAgICAgICAgKGJpLW9wLT5zZXhwLWxpa2UKKyAgICAgICAgICAg ICAgICAgImFuZCIKKyAgICAgICAgICAgICAgICAgOzsgZXhwYW5kIE5PVCBvcGVyYXRvcnMgd2hl biB0aGVyZSBhcmUgQU5EcworICAgICAgICAgICAgICAgICAobWFwIG5vdC0+c2V4cC1saWtlIChi aS1vcC1hcmdzIG9yLWFyZyBtLWxzdCkpKQorICAgICAgICAgICAgICAgIDs7IC4uLiBhbmQgd2hl biB0aGVyZSBhcmVuJ3QuCisgICAgICAgICAgICAgICAgKG5vdC0+c2V4cC1saWtlIG9yLWFyZykp KSkKKyAgICAgICAgOzsgbGlzdCBvZiBPUiBhcmd1bWVudHMKKyAgICAgICAgKGJpLW9wLWFyZ3Mg Y29uZGl0aW9uYWwgKGxpc3QtbWF0Y2hlcyBvci1yeCBjb25kaXRpb25hbCkpKSkpCisKKyhkZWZp bmUgdGVzdC1rZXl3b3JkLW9ybmFtZW50ICLCp8KnIikKKworOzsgQ29udmVydCBhIENBQkFMIGNv bmRpdGlvbmFsIHN0cmluZyBpbnRvIGEgc3RyaW5nIHdpdGggZXF1aXZhbGVudCBTQ0hFTUUKKzs7 IHN5bnRheC4KKyhkZWZpbmUgKGNvbmRpdGlvbmFsLT5zZXhwLWxpa2UgY29uZGl0aW9uYWwpCisg IDs7IEZpcnN0IHdlIHN1YnN0aXR1dGUgVEVTVC1LRVlXT1JELU9STkFNRU5UIGZvciBwYXJlbnRo ZXNlcyBhcm91bmQgdGVzdHMKKyAgOzsga2V5d29yZHMgc28gdGhhdCBwYXJlbnRoZXNlcyBhcmUg b25seSB1c2VkIHRvIHNldCBwcmVjZWRlbmNlcy4gVGhpcworICA7OyBzdWJzdGFudGlhbGx5IHNp bXBsaWZ5IHBhcnNpbmcuCisgIChsZXQgKChjb25kaXRpb25hbAorICAgICAgICAgKHJlZ2V4cC1z dWJzdGl0dXRlL2dsb2JhbCAjZiB0ZXN0cy1yeCBjb25kaXRpb25hbAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAncHJlIDEgdGVzdC1rZXl3b3JkLW9ybmFtZW50IDIKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC1rZXl3b3JkLW9ybmFtZW50ICdwb3N0 KSkpCisgICAgKGxldCBsb29wICgoc3ViLWNvbmQgY29uZGl0aW9uYWwpKQorICAgICAgKGxldCAo KHJ4LXJlc3VsdCAocmVnZXhwLWV4ZWMgcGFyZW5zLXJ4IHN1Yi1jb25kKSkpCisgICAgICAgIChj b25kCisgICAgICAgICAocngtcmVzdWx0CisgICAgICAgICAgKHBhcmVucy1sZXNzLWNvbmQtPnNl eHAtbGlrZQorICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAorICAgICAgICAgICAgKG1hdGNoOnBy ZWZpeCByeC1yZXN1bHQpCisgICAgICAgICAgICAobG9vcCAobWF0Y2g6c3Vic3RyaW5nIHJ4LXJl c3VsdCAxKSkKKyAgICAgICAgICAgIChtYXRjaDpzdWZmaXggcngtcmVzdWx0KSkpKQorICAgICAg ICAgKGVsc2UKKyAgICAgICAgICAocGFyZW5zLWxlc3MtY29uZC0+c2V4cC1saWtlIHN1Yi1jb25k KSkpKSkpKQorCis7OyBTdWJzdGl0dXRlIFNDSEVNRSAjdCBvciAjZiBhY2NvcmRpbmcgdG8gdGhl IHZhbHVlIG9mIGZsYWdzLiAoRGVmYXVsdCB0bworOzsgIlRydWUiKQorKGRlZmluZSAoZXZhbC1m bGFncyBzZXhwLWxpa2UtY29uZCBmbGFncykKKyAgKGZvbGQtcmlnaHQKKyAgIChsYW1iZGEgKGZs YWcgc2V4cCkKKyAgICAgKG1hdGNoIGZsYWcKKyAgICAgICAoKG5hbWUgLiB2YWx1ZSkKKyAgICAg ICAgKGxldCAoKHJ4IChtYWtlLXJlZ2V4cAorICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBw ZW5kICJmbGFnIiB0ZXN0LWtleXdvcmQtb3JuYW1lbnQgbmFtZQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHRlc3Qta2V5d29yZC1vcm5hbWVudCkpKSkKKyAgICAgICAgICAocmVn ZXhwLXN1YnN0aXR1dGUvZ2xvYmFsCisgICAgICAgICAgICNmIHJ4IHNleHAKKyAgICAgICAgICAg J3ByZSAoaWYgKHN0cmluZy1jaT0gdmFsdWUgIkZhbHNlIikgIiNmIiAiI3QiKSAncG9zdCkpKQor ICAgICAgIChfIHNleHApKSkKKyAgIHNleHAtbGlrZS1jb25kCisgICAoY29ucyAnKCJbYS16QS1a MC05Xy1dKyIgLiAiVHJ1ZSIpIGZsYWdzKSkpCisKKzs7IFdlIG5lZWQgdG8gc3Vic3RpdHV0ZSB0 ZXN0IGtleXdvcmRzICJvcyguLi4pIiBhbmQgImFyY2goLi4uKSIgd2l0aAorOzsgUy1leHByZXNz aW9uIGZ1bmN0aW9ucyB0aGF0IHBlcmZvcm0gdGhlIGNoZWNrIHdoZW4gd2Ugd2FudCB0byBidWls ZCB0aGUKKzs7IHBhY2thZ2UuCis7OworOzsgKCVjdXJyZW50LXN5c3RlbSkgcmV0dXJucywgZS5n LiwgIng4Nl82NC1saW51eCIgb3IgImk2ODYtbGludXgiLgorKGRlZmluZSAoZXZhbC10ZXN0cyBz ZXhwLWxpa2UtY29uZCkKKyAgKHdpdGgtaW5wdXQtZnJvbS1zdHJpbmcgCisgICAgICAoZm9sZC1y aWdodAorICAgICAgIChsYW1iZGEgKHRlc3Qgc2V4cCkKKyAgICAgICAgIChtYXRjaCB0ZXN0Cisg ICAgICAgICAgICgodHlwZSBwcmUtbWF0Y2ggcG9zdC1tYXRjaCkKKyAgICAgICAgICAgIChsZXQg KChyeCAobWFrZS1yZWdleHAKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZy1hcHBlbmQg dHlwZSB0ZXN0LWtleXdvcmQtb3JuYW1lbnQgIihcXHcrKSIKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdGVzdC1rZXl3b3JkLW9ybmFtZW50KSkpKQorICAgICAgICAgICAg ICAocmVnZXhwLXN1YnN0aXR1dGUvZ2xvYmFsCisgICAgICAgICAgICAgICAjZiByeCBzZXhwCisg ICAgICAgICAgICAgICAncHJlIHByZS1tYXRjaCAyIHBvc3QtbWF0Y2ggJ3Bvc3QpKSkKKyAgICAg ICAgICAgKF8gc2V4cCkpKQorICAgICAgIHNleHAtbGlrZS1jb25kCisgICAgICAgJygoIihvc3xh cmNoKSIgIihzdHJpbmctbWF0Y2ggXCIiICJcIiAoJWN1cnJlbnQtc3lzdGVtKSkiKSkpCisgICAg cmVhZCkpCisKKzs7IFdlIGNoZWNrIGZvciB0aGUgY2FiYWwgdGVzdCAiaW1wbCguLi4pIi4gIEFz c3VtZSB0aGUgbW9kdWxlIGRlY2xhcmluZyB0aGUKKzs7IGdlbmVyYXRlZCBwYWNrYWdlIGluY2x1 ZGVzIGEgbG9jYWwgdmFyaWFibGUgY2FsbGVkICJoYXNrZWxsLWltcGxlbWVudGF0aW9uIgorOzsg d2l0aCBhIHZhbHVlIG9mIHRoZSBmb3JtIE5BTUUtVkVSU0lPTiBhZ2FpbnN0IHdoaWNoIHdlIGNv bXBhcmUuCisoZGVmaW5lIChldmFsLWltcGwgc2V4cC1saWtlLWNvbmQpCisgICh3aXRoLW91dHB1 dC10by1zdHJpbmcKKyAgICAobGFtYmRhICgpCisgICAgICAod3JpdGUKKyAgICAgICAod2l0aC1p bnB1dC1mcm9tLXN0cmluZyAKKyAgICAgICAgICAgKGZvbGQtcmlnaHQKKyAgICAgICAgICAgIChs YW1iZGEgKHRlc3Qgc2V4cCkKKyAgICAgICAgICAgICAgKG1hdGNoIHRlc3QKKyAgICAgICAgICAg ICAgICAoKHByZS1tYXRjaCBwb3N0LW1hdGNoKQorICAgICAgICAgICAgICAgICAobGV0ICgocngt d2l0aC12ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAobWFrZS1yZWdleHAKKyAgICAg ICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZAorICAgICAgICAgICAgICAgICAgICAg ICAgICAiaW1wbCIgdGVzdC1rZXl3b3JkLW9ybmFtZW50CisgICAgICAgICAgICAgICAgICAgICAg ICAgICIoW2EtekEtWjAtOV8tXSspICooWzw+PV0rKSAqKFswLTkuXSspICoiCisgICAgICAgICAg ICAgICAgICAgICAgICAgIHRlc3Qta2V5d29yZC1vcm5hbWVudCkpKQorICAgICAgICAgICAgICAg ICAgICAgICAocngtd2l0aG91dC12ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAobWFr ZS1yZWdleHAKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nLWFwcGVuZCAiaW1wbCIg dGVzdC1rZXl3b3JkLW9ybmFtZW50ICIoXFx3KykiCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdGVzdC1rZXl3b3JkLW9ybmFtZW50KSkpKQorICAgICAgICAgICAgICAg ICAgIChpZiAocmVnZXhwLWV4ZWMgcngtd2l0aC12ZXJzaW9uIHNleHApCisgICAgICAgICAgICAg ICAgICAgICAgIChyZWdleHAtc3Vic3RpdHV0ZS9nbG9iYWwKKyAgICAgICAgICAgICAgICAgICAg ICAgICNmIHJ4LXdpdGgtdmVyc2lvbiBzZXhwCisgICAgICAgICAgICAgICAgICAgICAgICAncHJl IHByZS1tYXRjaCAyICIgXCIiIDEgIi0iIDMgIlwiICIgcG9zdC1tYXRjaCAncG9zdCkKKyAgICAg ICAgICAgICAgICAgICAgICAgKHJlZ2V4cC1zdWJzdGl0dXRlL2dsb2JhbAorICAgICAgICAgICAg ICAgICAgICAgICAgI2Ygcngtd2l0aG91dC12ZXJzaW9uIHNleHAKKyAgICAgICAgICAgICAgICAg ICAgICAgICdwcmUgcHJlLW1hdGNoICItbWF0Y2ggXCIiIDEgIlwiICIgcG9zdC1tYXRjaCAncG9z dCkpKSkKKyAgICAgICAgICAgICAgICAoXyBzZXhwKSkpCisgICAgICAgICAgICBzZXhwLWxpa2Ut Y29uZAorICAgICAgICAgICAgJygoIihzdHJpbmciICJoYXNrZWxsLWltcGxlbWVudGF0aW9uKSIp KSkKKyAgICAgICAgIHJlYWQpKSkpKQorCis7OyBNRVRBIGlzIHRoZSByZXN1bHQgb2YgImNhYmFs LT5rZXktdmFsdWVzIi4gUmV0dXJucyB0aGUgbGlzdCBhc3NvY2lhdGVkIHdpdGgKKzs7IGEgc3Bl Y2lmaWMgS0VZLiAgU2luY2UgdGhlIHZhbHVlIGNhbiBiZSBhIGxpc3QgKGFzIGZvciAiZGVzY3Jp cHRpb24iKSwgd2UKKzs7IGFsd2F5cyByZXR1cm4gYSBsaXN0LgorKGRlZmluZSAoa2V5LT52YWx1 ZXMgbWV0YSBrZXkpCisgIChtYXRjaCBtZXRhCisgICAgKCgpICcoKSkKKyAgICAoKCgoKD8gKGxh bWJkYSh4KSAoZXF1YWw/IHgga2V5KSkpKSB2KSByIC4uLikKKyAgICAgdikKKyAgICAoKChrIHYp IHIgLi4uKQorICAgICAoa2V5LT52YWx1ZXMgKGNkciBtZXRhKSBrZXkpKQorICAgIChfICJrZXkg Tm90IGZvdW50IikpKQorCis7OyBSZXR1cm5zIGFsbCBlbnRyaWVzIHdpdGggYSBrZXkgc3RhcnRp bmcgd2l0aCBrZXktc3RhcnQgYW5kIGVuZGluZyB3aXRoCis7OyBrZXktZW5kIGFzIGluIChrZXkt c3RhcnQgLi4uIGtleS1lbmQpLgorKGRlZmluZSAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyBtZXRh IGtleS1zdGFydCBrZXktZW5kKQorICAobGV0ICgocHJlZAorICAgICAgICAgKGxhbWJkYSAoeCkK KyAgICAgICAgICAgKGVxdWFsPyAobGlzdCBrZXktc3RhcnQga2V5LWVuZCkgKGxpc3QgKGZpcnN0 IHgpIChsYXN0IHgpKSkpKSkKKyAgICAobWF0Y2ggbWV0YQorICAgICAgKCgpICcoKSkKKyAgICAg ICgoKCg/IHByZWQgaykgdikgciAuLi4pCisgICAgICAgKGNvbnMgYCgsayAsdikgKGtleS1zdGFy dC1lbmQtPmVudHJpZXMgKGNkciBtZXRhKSBrZXktc3RhcnQga2V5LWVuZCkpKQorICAgICAgKCgo ayB2KSByIC4uLikKKyAgICAgICAoa2V5LXN0YXJ0LWVuZC0+ZW50cmllcyAoY2RyIG1ldGEpIGtl eS1zdGFydCBrZXktZW5kKSkKKyAgICAgIChfICJrZXkgTm90IGZvdW50IikpKSkKKworKGRlZmlu ZSBlbHNlLXJ4CisgIChtYWtlLXJlZ2V4cCAiXmVsc2UkIikpCisKKyhkZWZpbmUgKGNvdW50LWlm LWVsc2UgcngtcmVzdWx0LWxzKQorICAoYXBwbHkgKyAobWFwIChsYW1iZGEgKG0pIChpZiBtIDEg MCkpIHJ4LXJlc3VsdC1scykpKQorCisoZGVmaW5lIChhbmFseXplLWVudHJ5LWNvbmQgZW50cnkp CisgIChsZXQqICgoa2V5cyAoZmlyc3QgZW50cnkpKQorICAgICAgICAgKHZhbHMgKHNlY29uZCBl bnRyeSkpCisgICAgICAgICAocngtY29uZC1yZXN1bHQKKyAgICAgICAgICAobWFwIChjdXQgcmVn ZXhwLWV4ZWMgY29uZGl0aW9uLXJ4IDw+KSBrZXlzKSkKKyAgICAgICAgIChyeC1lbHNlLXJlc3Vs dAorICAgICAgICAgIChtYXAgKGN1dCByZWdleHAtZXhlYyBlbHNlLXJ4IDw+KSBrZXlzKSkKKyAg ICAgICAgIChjb25kLW5vIChjb3VudC1pZi1lbHNlIHJ4LWNvbmQtcmVzdWx0KSkKKyAgICAgICAg IChlbHNlLW5vIChjb3VudC1pZi1lbHNlIHJ4LWVsc2UtcmVzdWx0KSkKKyAgICAgICAgIChjb25k LWlkeCAobGlzdC1pbmRleCAobGFtYmRhIChyeCkgKGlmIHJ4ICN0ICNmKSkgcngtY29uZC1yZXN1 bHQpKQorICAgICAgICAgKGVsc2UtaWR4IChsaXN0LWluZGV4IChsYW1iZGEgKHJ4KSAoaWYgcngg I3QgI2YpKSByeC1lbHNlLXJlc3VsdCkpCisgICAgICAgICAoa2V5LWNvbmQKKyAgICAgICAgICAg ICAgKGNvbmQKKyAgICAgICAgICAgICAgICgob3IgKGFuZCBjb25kLWlkeCBlbHNlLWlkeCAoPCBj b25kLWlkeCBlbHNlLWlkeCkpCisgICAgICAgICAgICAgICAgICAgIChhbmQgY29uZC1pZHggKG5v dCBlbHNlLWlkeCkpKQorICAgICAgICAgICAgICAgIChtYXRjaDpzdWJzdHJpbmcKKyAgICAgICAg ICAgICAgICAgKHJlY2VpdmUgKGhlYWQgdGFpbCkKKyAgICAgICAgICAgICAgICAgICAgIChzcGxp dC1hdCByeC1jb25kLXJlc3VsdCBjb25kLWlkeCkgKGZpcnN0IHRhaWwpKSkpCisgICAgICAgICAg ICAgICAoKG9yIChhbmQgY29uZC1pZHggZWxzZS1pZHggKD4gY29uZC1pZHggZWxzZS1pZHgpKQor ICAgICAgICAgICAgICAgICAgICAoYW5kIChub3QgY29uZC1pZHgpIGVsc2UtaWR4KSkKKyAgICAg ICAgICAgICAgICAobWF0Y2g6c3Vic3RyaW5nCisgICAgICAgICAgICAgICAgIChyZWNlaXZlICho ZWFkIHRhaWwpCisgICAgICAgICAgICAgICAgICAgICAoc3BsaXQtYXQgcngtZWxzZS1yZXN1bHQg ZWxzZS1pZHgpIChmaXJzdCB0YWlsKSkpKQorICAgICAgICAgICAgICAgKGVsc2UKKyAgICAgICAg ICAgICAgICAiIikpKSkKKyAgICAodmFsdWVzIGtleXMgdmFscyByeC1jb25kLXJlc3VsdAorICAg ICAgICAgICAgcngtZWxzZS1yZXN1bHQgY29uZC1ubyBlbHNlLW5vIGtleS1jb25kKSkpCisKKyhk ZWZpbmUgKHJlbW92ZS1jb25kIGVudHJ5IGNvbmQpCisgIChtYXRjaCBlbnRyeQorICAgICgoayB2 KQorICAgICAobGlzdCAoY2RyIChtZW1iZXIgY29uZCBrKSkgdikpKSkKKworKGRlZmluZSAoZ3Jv dXAtYW5kLXJlZHVjZS1sZXZlbCBlbnRyaWVzIGdyb3VwIGdyb3VwLWNvbmQpCisgIChsZXQgbG9v cAorICAgICAgKCh0cnVlLWdyb3VwIGdyb3VwKQorICAgICAgIChmYWxzZS1ncm91cCAnKCkpCisg ICAgICAgKGVudHJpZXMgZW50cmllcykpCisgICAgKGlmIChudWxsPyBlbnRyaWVzKQorICAgICAg ICAodmFsdWVzIChyZXZlcnNlIHRydWUtZ3JvdXApIChyZXZlcnNlIGZhbHNlLWdyb3VwKSBlbnRy aWVzKQorICAgICAgICAobGV0Ki12YWx1ZXMgKCgoZW50cnkpIChmaXJzdCBlbnRyaWVzKSkKKyAg ICAgICAgICAgICAgICAgICAgICAoKGtleXMgdmFscyByeC1jb25kLXJlc3VsdCByeC1lbHNlLXJl c3VsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kLW5vIGVsc2Utbm8ga2V5LWNv bmQpCisgICAgICAgICAgICAgICAgICAgICAgIChhbmFseXplLWVudHJ5LWNvbmQgZW50cnkpKSkK KyAgICAgICAgICAoY29uZAorICAgICAgICAgICAoKGFuZCAoPj0gKCsgY29uZC1ubyBlbHNlLW5v KSAxKSAoc3RyaW5nPSBncm91cC1jb25kIGtleS1jb25kKSkKKyAgICAgICAgICAgIChsb29wIChj b25zIChyZW1vdmUtY29uZCBlbnRyeSBncm91cC1jb25kKSB0cnVlLWdyb3VwKSBmYWxzZS1ncm91 cAorICAgICAgICAgICAgICAgICAgKGNkciBlbnRyaWVzKSkpCisgICAgICAgICAgICgoYW5kICg+ PSAoKyBjb25kLW5vIGVsc2Utbm8pIDEpIChzdHJpbmc9IGtleS1jb25kICJlbHNlIikpCisgICAg ICAgICAgICAobG9vcCB0cnVlLWdyb3VwIChjb25zIChyZW1vdmUtY29uZCBlbnRyeSAiZWxzZSIp IGZhbHNlLWdyb3VwKQorICAgICAgICAgICAgICAgICAgKGNkciBlbnRyaWVzKSkpCisgICAgICAg ICAgIChlbHNlCisgICAgICAgICAgICAodmFsdWVzIChyZXZlcnNlIHRydWUtZ3JvdXApIChyZXZl cnNlIGZhbHNlLWdyb3VwKSBlbnRyaWVzKSkpKSkpKQorCisoZGVmaW5lIGRlcGVuZGVuY2llcy1y eAorICAobWFrZS1yZWdleHAgIihbYS16QS1aMC05Xy1dKykgKlteLF0qLD8iKSkKKworKGRlZmlu ZSAoZ3VpeC1uYW1lIG5hbWUpCisgIChpZiAoc3RyaW5nLXByZWZpeD8gZ3VpeC1uYW1lLXByZWZp eCBuYW1lKQorICAgICAgKHN0cmluZy1kb3duY2FzZSBuYW1lKQorICAgICAgKHN0cmluZy1hcHBl bmQgZ3VpeC1uYW1lLXByZWZpeCAoc3RyaW5nLWRvd25jYXNlIG5hbWUpKSkpCisKKzs7IFNwbGl0 IHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkZXBlbmRlbmNpZXMgY29taW5nIGZyb20gdGhl IGNhYmFsIGZpbGUKKzs7IGFuZCByZXR1cm4gYSBsaXN0IHdpdGggaW5wdXRzIHN1aXRhYmxlIGZv ciB0aGUgR1VJWCBwYWNrYWdlLiAgQ3VycmVudGx5IHRoZQorOzsgdmVyc2lvbiBpbmZvcm1hdGlv biBpcyBkaXNjYXJkZWQuCisoZGVmaW5lIChzcGxpdC1kZXBlbmRlbmNpZXMgbHMpCisgIChkZWZp bmUgKHNwbGl0LWF0LWNvbW1hIGQpCisgICAgKG1hcAorICAgICAobGFtYmRhIChtKQorICAgICAg IChsZXQgKChuYW1lIChndWl4LW5hbWUgKG1hdGNoOnN1YnN0cmluZyBtIDEpKSkpCisgICAgICAg ICAobGlzdCBuYW1lIChsaXN0ICd1bnF1b3RlIChzdHJpbmctPnN5bWJvbCBuYW1lKSkpKSkKKyAg ICAgKGxpc3QtbWF0Y2hlcyBkZXBlbmRlbmNpZXMtcnggZCkpKQorICAgIAorICAoZm9sZCAobGFt YmRhIChkIHApIChhcHBlbmQgKHNwbGl0LWF0LWNvbW1hIGQpIHApKSAnKCkgIGxzKSkKKworOzsg R2VucmF0ZSBhbiBTLWV4cHJlc3Npb24gY29udGFpbmluZyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNp ZXMuICBUaGUgZ2VuZXJhdGVkCis7OyBTLWV4cHJlc3Npb25zIG1heSBpbmNsdWRlIGNvbmRpdGlv bmFscyBhcyBkZWZpbmVkIGluIHRoZSBjYWJhbCBmaWxlLgorOzsgRHVyaW5nIHRoaXMgcHJvY2Vz cyB3ZSBkaXNjYXJkIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIG9mIHRoZSBwYWNrYWdlcy4KKyhk ZWZpbmUgKGRlcGVuZGVuY2llcy1jb25kLT5zZXhwIG1ldGEpCisKKyAgKGRlZmluZSAodGFrZS1k ZXBlbmRlbmNpZXMgbWV0YSkKKyAgICAobGV0ICgoa2V5LXN0YXJ0LWV4ZSAiZXhlY3V0YWJsZSBj YWJhbCIpCisgICAgICAgICAgKGtleS1zdGFydC1saWIgImxpYnJhcnkiKQorICAgICAgICAgIChr ZXktZW5kICJidWlsZC1kZXBlbmRzIikpCisgICAgICAoYXBwZW5kCisgICAgICAgKGtleS1zdGFy dC1lbmQtPmVudHJpZXMgbWV0YSBrZXktc3RhcnQtZXhlIGtleS1lbmQpCisgICAgICAgKGtleS1z dGFydC1lbmQtPmVudHJpZXMgbWV0YSBrZXktc3RhcnQtbGliIGtleS1lbmQpKSkpCisKKyAgKGxl dCAoKGZsYWdzIChnZXQtZmxhZ3MgKHByZS1wcm9jZXNzLWVudHJpZXMta2V5cyBtZXRhKSkpKQor ICAgIChkZWxldGUtZHVwbGljYXRlcworICAgICAobGV0IGxvb3AgKChlbnRyaWVzICh0YWtlLWRl cGVuZGVuY2llcyBtZXRhKSkKKyAgICAgICAgICAgICAgICAocmVzdWx0ICcoKSkpCisgICAgICAg KGlmIChudWxsPyBlbnRyaWVzKQorICAgICAgICAgICByZXN1bHQKKyAgICAgICAgICAgKGxldCot dmFsdWVzICgoKGVudHJ5KSAoZmlyc3QgZW50cmllcykpCisgICAgICAgICAgICAgICAgICAgICAg ICAgKChrZXlzIHZhbHMgcngtY29uZC1yZXN1bHQgcngtZWxzZS1yZXN1bHQKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgY29uZC1ubyBlbHNlLW5vIGtleS1jb25kKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAoYW5hbHl6ZS1lbnRyeS1jb25kIGVudHJ5KSkpCisgICAgICAgICAg ICAgKGNvbmQKKyAgICAgICAgICAgICAgKCg9ICgrIGNvbmQtbm8gZWxzZS1ubykgMCkKKyAgICAg ICAgICAgICAgIChsb29wIChjZHIgZW50cmllcykgKGFwcGVuZCAoc3BsaXQtZGVwZW5kZW5jaWVz IHZhbHMpIHJlc3VsdCkpKQorICAgICAgICAgICAgICAoZWxzZQorICAgICAgICAgICAgICAgKGxl dC12YWx1ZXMgKCgodHJ1ZS1ncm91cCBmYWxzZS1ncm91cCBlbnRyaWVzKQorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAoZ3JvdXAtYW5kLXJlZHVjZS1sZXZlbCBlbnRyaWVzICcoKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXktY29u ZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb25kLWZpbmFsKSAoZXZhbC10ZXN0 cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsLWltcGwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2YWwtZmxhZ3MK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25kaXRpb25h bC0+c2V4cC1saWtlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKGxhc3QgKHNwbGl0LXNlY3Rpb24ga2V5LWNvbmQpKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKSkpKSkKKyAgICAgICAgICAgICAgICAgKGxv b3AgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAoY29uZAorICAgICAgICAgICAgICAg ICAgICAgICAgKChvciAoZXE/IGNvbmQtZmluYWwgI3QpIChlcXVhbD8gY29uZC1maW5hbCAnKG5v dCAjZikpKQorICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBlbmQgKGxvb3AgdHJ1ZS1ncm91 cCAnKCkpIHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAoKG9yIChlcT8gY29uZC1m aW5hbCAjZikgKGVxdWFsPyBjb25kLWZpbmFsICcobm90ICN0KSkpCisgICAgICAgICAgICAgICAg ICAgICAgICAgKGFwcGVuZCAobG9vcCBmYWxzZS1ncm91cCAnKCkpIHJlc3VsdCkpCisgICAgICAg ICAgICAgICAgICAgICAgICAoZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zIGAo dW5xdW90ZS1zcGxpY2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmICxj b25kLWZpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLChsb29wIHRy dWUtZ3JvdXAgJygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwobG9v cCBmYWxzZS1ncm91cCAnKCkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1 bHQpKSkpKSkpKSkpKSkpCisKKzs7IEZpbHRlciB0aGUgbGlicmFyaWVzIGFscmVhZHkgaW5jbHVk ZWQgaW4gdGhlIEhhc2tlbGwgY29tcGlsZXIgc3RhbmRhcmQKKzs7IGxpYnJhcmllcy4gQ3VycmVu dGx5IHdlIGltcGx5IHRoZSB1c2Ugb2YgR0hDLgorKGRlZmluZSAoZmlsdGVyLXN0YW5kYXJkLWxp YnJhcmllcyBscykKKyAgKGxldCAoKHJlYWwtbmFtZS1yeCAobWFrZS1yZWdleHAKKyAgICAgICAg ICAgICAgICAgICAgICAgKHN0cmluZy1hcHBlbmQgZ3VpeC1uYW1lLXByZWZpeCAiKFxcdyspIikp KSkKKyAgICAoZm9sZCAobGFtYmRhIChlbGVtIHNlZWQpCisgICAgICAgICAgICAoaWYgKGVxPyAo Zmlyc3QgZWxlbSkgJ3VucXVvdGUtc3BsaWNpbmcpCisgICAgICAgICAgICAgICAgKGxldCotdmFs dWVzICgoKGdyb3VwLWNvbmQgdHJ1ZS1ncm91cCBmYWxzZS1ncm91cCkKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAobWF0Y2ggKHNlY29uZCBlbGVtKQorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgKChpZiBjIHQgZiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKHZhbHVlcyBjIHQgZikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAo XyAodmFsdWVzIGMgJygpICcoKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgo ZmlsdGVyZWQtdHJ1ZS1ncm91cCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmls dGVyLXN0YW5kYXJkLWxpYnJhcmllcyB0cnVlLWdyb3VwKSkKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICgoZmlsdGVyZWQtZmFsc2UtZ3JvdXApCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKGZpbHRlci1zdGFuZGFyZC1saWJyYXJpZXMgZmFsc2UtZ3JvdXApKSkKKyAgICAg ICAgICAgICAgICAgIChjb25kCisgICAgICAgICAgICAgICAgICAgKChhbmQgKG51bGw/IGZpbHRl cmVkLWZhbHNlLWdyb3VwKQorICAgICAgICAgICAgICAgICAgICAgICAgIChudWxsPyBmaWx0ZXJl ZC10cnVlLWdyb3VwKSkKKyAgICAgICAgICAgICAgICAgICAgc2VlZCkKKyAgICAgICAgICAgICAg ICAgICAoKG51bGw/IGZpbHRlcmVkLWZhbHNlLWdyb3VwKQorICAgICAgICAgICAgICAgICAgICAo Y29ucyAobGlzdCAndW5xdW90ZS1zcGxpY2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAobGlzdCAnaWYgZ3JvdXAtY29uZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmlsdGVyZWQtdHJ1ZS1ncm91cCkpCisgICAgICAgICAgICAgICAgICAgICAgICAg IHNlZWQpKQorICAgICAgICAgICAgICAgICAgIChlbHNlCisgICAgICAgICAgICAgICAgICAgIChj b25zIChsaXN0ICd1bnF1b3RlLXNwbGljaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChsaXN0ICdpZiBncm91cC1jb25kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGZpbHRlcmVkLXRydWUtZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgZmlsdGVyZWQtZmFsc2UtZ3JvdXApKQorICAgICAgICAgICAgICAgICAgICAgICAg ICBzZWVkKSkpKQorICAgICAgICAgICAgICAgIChsZXQgKChyeC1yZXN1bHQgKHJlZ2V4cC1leGVj IHJlYWwtbmFtZS1yeCAoZmlyc3QgZWxlbSkpKSkKKyAgICAgICAgICAgICAgICAgIChtYXRjaCAo bWF0Y2g6c3Vic3RyaW5nIHJ4LXJlc3VsdCAxKQorICAgICAgICAgICAgICAgICAgICAoKD8gKGN1 dCBtZW1iZXIgPD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgR1VJWCBuYW1lcyBh cmUgYWxsIGxvd2VyLWNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgKGN1 dCBzdHJpbmctZG93bmNhc2UgPD4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Z2hjLXN0YW5kYXJkLWxpYnJhcmllcykpKQorICAgICAgICAgICAgICAgICAgICAgc2VlZCkKKyAg ICAgICAgICAgICAgICAgICAgKF8KKyAgICAgICAgICAgICAgICAgICAgIChjb25zIGVsZW0gc2Vl ZCkpKSkpKQorICAgICAgICAgICcoKSBscykpKQorCis7OyBQYXJ0IDQ6Cis7OworOzsgUmV0cml2 ZSB0aGUgZGVzaXJlZCBwYWNrYWdlIGFuZCBpdHMgY2FiYWwgZmlsZSBmcm9tCis7OyBodHRwOi8v aGFja2FnZS5oYXNrZWxsLm9yZyBhbmQgY29uc3RydWN0IHRoZSBHVUlYIHBhY2thZ2UgUy1leHBy ZXNzaW9uLgorCisoZGVmaW5lIChoYWNrYWdlLWZldGNoIG5hbWUtdmVyc2lvbikKKyAgIlJldHVy biB0aGUgY2FiYWwgZmlsZSBmb3IgdGhlIHBhY2thZ2UgTkFNRS1WRVJTSU9OLCBvciAjZiBvbiBm YWlsdXJlLiAgSWYKK3RoZSB2ZXJzaW9uIHBhcnQgaXMgb21pdHRlZCBmcm9tIHRoZSBwYWNrYWdl IG5hbWUsIHRoZW4gcmV0dXJuIHRoZSBsYXRlc3QKK3ZlcnNpb24uIgorICAobGV0Ki12YWx1ZXMg KCgobmFtZSB2ZXJzaW9uKSAocGFja2FnZS1uYW1lLT5uYW1lK3ZlcnNpb24gbmFtZS12ZXJzaW9u KSkKKyAgICAgICAgICAgICAgICAoKHVybCkKKyAgICAgICAgICAgICAgICAgKGlmIHZlcnNpb24K KyAgICAgICAgICAgICAgICAgICAgIChzdHJpbmctYXBwZW5kICJodHRwOi8vaGFja2FnZS5oYXNr ZWxsLm9yZy9wYWNrYWdlLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5h bWUgIi0iIHZlcnNpb24gIi8iIG5hbWUgIi5jYWJhbCIpCisgICAgICAgICAgICAgICAgICAgICAo c3RyaW5nLWFwcGVuZCAiaHR0cDovL2hhY2thZ2UuaGFza2VsbC5vcmcvcGFja2FnZS8iCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lICIvIiBuYW1lICIuY2FiYWwiKSkp CisgICAgICAgICAgICAgICAgKChjYWJhbCkgCisgICAgICAgICAgICAgICAgIChjYWxsLXdpdGgt dGVtcG9yYXJ5LW91dHB1dC1maWxlCisgICAgICAgICAgICAgICAgICAobGFtYmRhICh0ZW1wIHBv cnQpCisgICAgICAgICAgICAgICAgICAgIChhbmQgKHVybC1mZXRjaCB1cmwgdGVtcCkKKyAgICAg ICAgICAgICAgICAgICAgICAgICAoY2FsbC13aXRoLWlucHV0LWZpbGUgdGVtcCByZWFkLWNhYmFs KSkpKSkpCisgICAgKGFuZD0+IGNhYmFsIGNhYmFsLT5rZXktdmFsdWVzKSkpCisKKzs7IExpc3Qg b2YgdmFsaWQgdmFsdWVzIGZyb20KKzs7IGh0dHBzOi8vd3d3Lmhhc2tlbGwub3JnCis7OyAvY2Fi YWwvcmVsZWFzZS9jYWJhbC1sYXRlc3QvZG9jL0FQSS9DYWJhbC9EaXN0cmlidXRpb24tTGljZW5z ZS5odG1sLgorKGRlZmluZSBzdHJpbmctPmxpY2Vuc2UKKyAgKG1hdGNoLWxhbWJkYQorICAgKCJH UEwtMiIgJ2dwbDIpCisgICAoIkdQTC0zIiAnZ3BsMykKKyAgICgiR1BMIiAiJ2dwbD8/IikKKyAg ICgiQUdQTC0zIiAnYWdwbDMpCisgICAoIkFHUEwiICInYWdwbD8/IikKKyAgICgiTEdQTC0yLjEi ICdsZ3BsMi4xKQorICAgKCJMR1BMLTMiICdsZ3BsMykKKyAgICgiTEdQTCIgIidsZ3BsPz8iKQor ICAgKCJCU0QyIiAnYnNkLTIpCisgICAoIkJTRDMiICdic2QtMykKKyAgICgiTUlUIiAnZXhwYXQp CisgICAoIklTQyIgJ2lzYykKKyAgICgiTVBMIiAnbXBsMi4wKQorICAgKCJBcGFjaGUtMi4wIiAn YXNsMi4wKQorICAgKCh4KSAoc3RyaW5nLT5saWNlbnNlIHgpKQorICAgKChsc3QgLi4uKSBgKGxp c3QgLEAobWFwIHN0cmluZy0+bGljZW5zZSBsc3QpKSkKKyAgIChfICNmKSkpCisKKyhkZWZpbmUg KGhhY2thZ2UtbW9kdWxlLT5zZXhwIG1ldGEpCisgICJSZXR1cm4gdGhlIGBwYWNrYWdlJyBzLWV4 cHJlc3Npb24gZm9yIGEgY2FiYWwgcGFja2FnZSBmcm9tIHRoZSBtZXRhZGF0YSBpbgorTUVUQS4i CisKKyAgKGRlZmluZSBuYW1lCisgICAgKGZpcnN0IChrZXktPnZhbHVlcyBtZXRhICJuYW1lIikp KQorCisgIChkZWZpbmUgdmVyc2lvbgorICAgIChmaXJzdCAoa2V5LT52YWx1ZXMgbWV0YSAidmVy c2lvbiIpKSkKKyAgCisgIChkZWZpbmUgZGVzY3JpcHRpb24KKyAgICAobGV0Ki12YWx1ZXMgKCgo ZGVzY3JpcHRpb24pIChrZXktPnZhbHVlcyBtZXRhICJkZXNjcmlwdGlvbiIpKQorICAgICAgICAg ICAgICAgICAgKChsaW5lcyBsYXN0KQorICAgICAgICAgICAgICAgICAgIChzcGxpdC1hdCBkZXNj cmlwdGlvbiAoLSAobGVuZ3RoIGRlc2NyaXB0aW9uKSAxKSkpKQorICAgICAgKGZvbGQtcmlnaHQg KGxhbWJkYSAobGluZSBzZWVkKSAoc3RyaW5nLWFwcGVuZCBsaW5lICJcbiIgc2VlZCkpCisgICAg ICAgICAgICAgICAgICAoZmlyc3QgbGFzdCkgbGluZXMpKSkKKyAgCisgIChkZWZpbmUgc291cmNl LXVybAorICAgIChzdHJpbmctYXBwZW5kICJodHRwOi8vaGFja2FnZS5oYXNrZWxsLm9yZy9wYWNr YWdlLyIgbmFtZQorICAgICAgICAgICAgICAgICAgICIvIiBuYW1lICItIiB2ZXJzaW9uICIudGFy Lmd6IikpCisKKyAgKGRlZmluZSAobWF5YmUtaW5wdXRzIGd1aXgtbmFtZSBpbnB1dHMpCisgICAg KG1hdGNoIChmaWx0ZXItc3RhbmRhcmQtbGlicmFyaWVzIGlucHV0cykKKyAgICAgICgoKQorICAg ICAgICcoKSkKKyAgICAgICgoaW5wdXRzIC4uLikKKyAgICAgICAobGlzdCAobGlzdCBndWl4LW5h bWUKKyAgICAgICAgICAgICAgICAgICAobGlzdCAncXVhc2lxdW90ZSBpbnB1dHMpKSkpKSkKKyAg CisgIChsZXQgKCh0YXJiYWxsICh3aXRoLXN0b3JlIHN0b3JlCisgICAgICAgICAgICAgICAgICAg KGRvd25sb2FkLXRvLXN0b3JlIHN0b3JlIHNvdXJjZS11cmwpKSkpCisgICAgYChwYWNrYWdlCisg ICAgICAgKG5hbWUgLChndWl4LW5hbWUgbmFtZSkpCisgICAgICAgKHZlcnNpb24gLHZlcnNpb24p CisgICAgICAgKHNvdXJjZSAob3JpZ2luCisgICAgICAgICAgICAgICAgIChtZXRob2QgdXJsLWZl dGNoKQorICAgICAgICAgICAgICAgICAodXJpIChzdHJpbmctYXBwZW5kICxAKGZhY3Rvcml6ZS11 cmkgc291cmNlLXVybCB2ZXJzaW9uKSkpCisgICAgICAgICAgICAgICAgIChzaGEyNTYKKyAgICAg ICAgICAgICAgICAgIChiYXNlMzIKKyAgICAgICAgICAgICAgICAgICAsKGJ5dGV2ZWN0b3ItPm5p eC1iYXNlMzItc3RyaW5nIChmaWxlLXNoYTI1NiB0YXJiYWxsKSkpKSkpCisgICAgICAgKGJ1aWxk LXN5c3RlbSBoYXNrZWxsLWJ1aWxkLXN5c3RlbSkKKyAgICAgICAsQChtYXliZS1pbnB1dHMgJ2lu cHV0cyAoZGVwZW5kZW5jaWVzLWNvbmQtPnNleHAgbWV0YSkpCisgICAgICAgKGhvbWUtcGFnZSAs QChrZXktPnZhbHVlcyBtZXRhICJob21lcGFnZSIpKQorICAgICAgIChzeW5vcHNpcyAsQChrZXkt PnZhbHVlcyBtZXRhICJzeW5vcHNpcyIpKQorICAgICAgIChkZXNjcmlwdGlvbiAsZGVzY3JpcHRp b24pCisgICAgICAgKGxpY2Vuc2UgLChzdHJpbmctPmxpY2Vuc2UgKGtleS0+dmFsdWVzIG1ldGEg ImxpY2Vuc2UiKSkpKSkpCisKKyhkZWZpbmUgKGhhY2thZ2UtPmd1aXgtcGFja2FnZSBtb2R1bGUt bmFtZSkKKyAgIkZldGNoIHRoZSBjYWJhbCBmaWxlIGZvciBQQUNLQUdFLU5BTUUgZnJvbSBoYWNr YWdlLmhhc2tlbGwub3JnLCBhbmQgcmV0dXJuCit0aGUgYHBhY2thZ2UnIHMtZXhwcmVzc2lvbiBj b3JyZXNwb25kaW5nIHRvIHRoYXQgcGFja2FnZSwgb3IgI2Ygb24gZmFpbHVyZS4iCisgIChsZXQg KChtb2R1bGUtbWV0YSAoaGFja2FnZS1mZXRjaCBtb2R1bGUtbmFtZSkpKQorICAgIChhbmQ9PiBt b2R1bGUtbWV0YSBoYWNrYWdlLW1vZHVsZS0+c2V4cCkpKQorCis7OyBQYXJ0IDU6Cis7OworOzsg U29tZSB2YXJpYWJsZXMgdXNlZCB0byB0ZXN0IHRoZSB2YXJpc291cyBmdW5jdGlvbnMuCisKKyhk ZWZpbmUgdGVzdC0xCisgICcoImhlYWQgMSIKKyAgICAiICBraDE6IHZoMSIKKyAgICAiICBraDI6 IHZoMiIKKyAgICAibmFtZTogbXRsIikpCisKKyhkZWZpbmUgdGVzdC0yCisgICcoImhlYWQgMSIK KyAgICAiICBzdWJoIDEiCisgICAgIiAgIGtoMTogdmgxIgorICAgICIgICBraDI6IHZoMiIKKyAg ICAibmFtZTogbXRsIikpCisKKyhkZWZpbmUgdGVzdC0zCisgICcoImhlYWQgMSIKKyAgICAiICBz dWJoIDEiCisgICAgIiAgIGtoMTogdmgxIgorICAgICIgIHN1YmggMiIKKyAgICAiICAga2gyOiB2 aDIiCisgICAgIiAgIGtoMzogdmgzIgorICAgICJuYW1lOiBtdGwiKSkKKworKGRlZmluZSB0ZXN0 LTQKKyAgJygiTGlicmFyeSIKKyAgICAiICBCdWlsZC1EZXBlbmRzOiAgIGJhc2VlIgorICAgICIg IEV4cG9zZWQtTW9kdWxlczogVGVzdGluZy5UZXN0MSIKKyAgICAiICBFeHRlbnNpb25zOiAgICAg IENQUCIKKyAgICAiICBpZiBmbGFnKGRlYnVnKSIKKyAgICAiICAgIEdIQy1PcHRpb25zOiAtRERF QlVHIgorICAgICIgICAgaWYgIW9zKHdpbmRvd3MpIgorICAgICIgICAgICBDQy1PcHRpb25zOiBc Ii1EREVCVUdcIiIKKyAgICAiICAgIGVsc2UiCisgICAgIiAgICAgIENDLU9wdGlvbnM6IFwiLURO REVCVUcgZWxzZVwiIgorICAgICIgIGlmIGZsYWcod2ViZnJvbnRlbmQpIgorICAgICIgICAgQnVp bGQtRGVwZW5kczogY2dpID4gMC40MiIKKyAgICAiICAgIE90aGVyLU1vZHVsZXM6IFRlc3Rpbmcu V2ViU3R1ZmYiKSkKKworKGRlZmluZSB0ZXN0LTUKKyAgJygiRmxhZyBEZWJ1ZyIKKyAgICAiICBE ZXNjcmlwdGlvbjogRW5hYmxlIGRlYnVnIHN1cHBvcnQiCisgICAgIiAgRGVmYXVsdDogICAgIEZh bHNlIgorICAgICJMaWJyYXJ5IgorICAgICIgIEJ1aWxkLURlcGVuZHM6ICAgYmFzZSIKKyAgICAi ICBpZiBmbGFnKGRlYnVnKSIKKyAgICAiICAgIEdIQy1PcHRpb25zOiAtRERFQlVHIgorICAgICIg ICAgaWYgIW9zKHdpbmRvd3MpIgorICAgICIgICAgICBDQy1PcHRpb25zOiBcIi1EREVCVUdcIiIK KyAgICAiICAgIGVsc2UiCisgICAgIiAgICAgIENDLU9wdGlvbnM6IFwiLUROREVCVUdcIiIpKQor CisoZGVmaW5lIHRlc3QtNgorICAnKCJGbGFnIERlYnVnIgorICAgICIgIERlc2NyaXB0aW9uOiBF bmFibGUgZGVidWcgc3VwcG9ydCIKKyAgICAiICBEZWZhdWx0OiAgICAgRmFsc2UiCisgICAgIkZs YWcgQ2lwcyIKKyAgICAiICBEZXNjcmlwdGlvbjogICBUaGlzIGlzIGEgam91cm5leSBpbnRvIHRo ZSBzb3VuZC4uLiIKKyAgICAiICBEZWZhdWx0OiAgICAgVHJ1ZSIKKyAgICAiaWYgZmxhZyhkZWJ1 ZykiCisgICAgIiAgR0hDLU9wdGlvbnM6IC1EREVCVUciCisgICAgIiAgaWYgIW9zKHdpbmRvd3Mp IgorICAgICIgICAgQ0MtT3B0aW9uczogXCItRERFQlVHXCIiCisgICAgIiAgZWxzZSIKKyAgICAi ICAgIENDLU9wdGlvbnM6IFwiLUROREVCVUdcIiIpKQorCisoZGVmaW5lIHRlc3QtNworICAnKCJl eGVjdXRhYmxlIGNhYmFsIgorICAgICIgIG1haW4taXM6ICAgICAgICBNYWluLmhzIgorICAgICIg IGJ1aWxkLWRlcGVuZHM6IgorICAgICIgICAgYXJyYXkgICAgICA+PSAwLjEgICAgICAmJiA8IDAu NiwiCisgICAgIiAgICBiYXNlICAgICAgID49IDQuMyAgICAgICYmIDwgNSIKKyAgICAiICAgIGlm IGZsYWcob2xkLWRpcmVjdG9yeSkiCisgICAgIiAgICAgIGJ1aWxkLWRlcGVuZHM6IGRpcmVjdG9y eSA+PSAxICYmIDwgMS4yLCBvbGQtdGltZSA+PSAxICYmIDwgMS4yLCIKKyAgICAiICAgICAgICAg ICAgICAgICAgICAgcHJvY2VzcyAgID49IDEuMC4xLjEgICYmIDwgMS4xLjAuMiIKKyAgICAiICAg IGVsc2UiCisgICAgIiAgICAgIGJ1aWxkLWRlcGVuZHM6IGRpcmVjdG9yeSA+PSAxLjIgJiYgPCAx LjMsIgorICAgICIgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzICAgPj0gMS4xLjAuMiAgJiYg PCAxLjMiCisgICAgIiAgICBpZiBmbGFnKG5ldHdvcmstdXJpKSIKKyAgICAiICAgICAgYnVpbGQt ZGVwZW5kczogbmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNiIKKyAgICAiICAgIGVs c2UiCisgICAgIiAgICAgIGJ1aWxkLWRlcGVuZHM6IG5ldHdvcmsgICAgID49IDIuNCAmJiA8IDIu NiIKKyAgICAiICAgIGlmIG9zKHdpbmRvd3MpIgorICAgICIgICAgICBidWlsZC1kZXBlbmRzOiBX aW4zMiA+PSAyICYmIDwgMyIKKyAgICAiICAgICAgY3BwLW9wdGlvbnM6IC1EV0lOMzIiCisgICAg IiAgICBlbHNlIgorICAgICIgICAgICBidWlsZC1kZXBlbmRzOiB1bml4ID49IDIuMCAmJiA8IDIu OCIpKQorCisoZGVmaW5lIHRlc3QtZGVwLTEKKyAgJygoKCJleGVjdXRhYmxlIGNhYmFsIiAiYnVp bGQtZGVwZW5kcyIpCisgICAgICgiYXJyYXkgICAgICA+PSAwLjEiKSkKKyAgICAoKCJleGVjdXRh YmxlIGNhYmFsIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgiZmJlICAgICAgPj0gMC4yIikpKSkK KworKGRlZmluZSB0ZXN0LWRlcC0yCisgICcoKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWco Y2lwcykiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJmYmUgICAgICA+PSAwLjIiKSkpKQorCiso ZGVmaW5lIHRlc3QtZGVwLTMKKyAgJygoKCJleGVjdXRhYmxlIGNhYmFsIiAiaWYgZmxhZyhjaXBz KSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImZiZSAgICAgID49IDAuMiIpKQorICAgICgoImV4 ZWN1dGFibGUgY2FiYWwiICJlbHNlIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgiZmJlZWUgICAg ICA+PSAwLjMiKSkKKyAgICApKQorCisoZGVmaW5lIHRlc3QtZGVwLTQKKyAgJygoKCJleGVjdXRh YmxlIGNhYmFsIiAiaWYgZmxhZyhhKSIgImlmIGZsYWcoYikiICJidWlsZC1kZXBlbmRzIikKKyAg ICAgKCJuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42IikpCisgICAgKCgiZXhlY3V0 YWJsZSBjYWJhbCIgImlmIGZsYWcoYSkiICJlbHNlIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgi ZmJlZWVlZSAgICAgID49IDAuMyIpKQorICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJidWlsZC1k ZXBlbmRzIikKKyAgICAgKCJuZXR3b3JrICAgICAgPj0gMC4xIikpCisgICAgKSkKKworKGRlZmlu ZSB0ZXN0LWRlcC01CisgICcoKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWcoYSkiICJpZiBm bGFnKGIpIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgiZmJlICAgICAgPj0gMC4yIikpCisgICAg KCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWcoYSkiICJlbHNlIiAiYnVpbGQtZGVwZW5kcyIp CisgICAgICgiZmJlICAgICAgPj0gMC4zIikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImVs c2UiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJmYmUgICAgICA+PSAwLjQiKSkKKyAgICApKQor CisoZGVmaW5lIHRlc3QtZGVwLTYKKyAgJygoKCJleGVjdXRhYmxlIGNhYmFsIiAiaWYgZmxhZyhh KSIgImlmIGZsYWcoYikiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJmYmUgICAgICA+PSAwLjIi KSkKKyAgICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiaWYgZmxhZyhhKSIgImVsc2UiICJidWlsZC1k ZXBlbmRzIikKKyAgICAgKCJmYmUgICAgICA+PSAwLjMiKSkKKyAgICAoKCJleGVjdXRhYmxlIGNh YmFsIiAiZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImZiZSAgICAgID49IDAuNCIpKQor ICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJhcnJheSAg ICAgID49IDAuMSIpKQorICAgICAgICApKQorCisoZGVmaW5lIHRlc3QtZGVwLTEwCisgICcoKCgi ZXhlY3V0YWJsZSBjYWJhbCIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImFycmF5ICAgICAgPj0g MC4xICAgICAgJiYgPCAwLjYsIiAiYmFzZSAgICAgICA+PSA0LjMgICAgICAmJiA8IDUiKSkKKyAg ICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiaWYgZmxhZyhvbGQtZGlyZWN0b3J5KSIgImJ1aWxkLWRl cGVuZHMiKQorICAgICAoImRpcmVjdG9yeSA+PSAxICYmIDwgMS4yLCIgInByb2Nlc3MgICA+PSAx LjAuMS4xICAmJiA8IDEuMS4wLjIiKSkKKyAgICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiZWxzZSIg ImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImRpcmVjdG9yeSA+PSAxLjIgJiYgPCAxLjMsIiAicHJv Y2VzcyAgID49IDEuMS4wLjIgICYmIDwgMS4zIikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIg ImlmIGZsYWcobmV0d29yay11cmkpIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgibmV0d29yay11 cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNiIpKQorICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJl bHNlIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgibmV0d29yayAgICAgPj0gMi40ICYmIDwgMi42 IikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIG9zKHdpbmRvd3MpIiAiYnVpbGQtZGVw ZW5kcyIpCisgICAgICgiV2luMzIgPj0gMiAmJiA8IDMiKSkKKyAgICAoKCJleGVjdXRhYmxlIGNh YmFsIiAiZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoInVuaXggPj0gMi4wICYmIDwgMi44 IikpKSkKKworKGRlZmluZSB0ZXN0LWRlcC0xMGEKKyAgJygoKCJleGVjdXRhYmxlIGNhYmFsIiAi YnVpbGQtZGVwZW5kcyIpCisgICAgICgiYXJyYXkgICAgICA+PSAwLjEgICAgICAmJiA8IDAuNiwi ICJiYXNlICAgICAgID49IDQuMyAgICAgICYmIDwgNSIpKQorICAgICgoImV4ZWN1dGFibGUgY2Fi YWwiICJpZiBmbGFnKG9sZC1kaXJlY3RvcnkpIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgiZGly ZWN0b3J5ID49IDEgJiYgPCAxLjIsIG9sZC10aW1lID49IDEgJiYgPCAxLjIiKSkKKyAgICAoKCJl eGVjdXRhYmxlIGNhYmFsIiAiZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImRpcmVjdG9y eSA+PSAxLjIgJiYgPCAxLjMsIiAicHJvY2VzcyAgID49IDEuMS4wLjIgICYmIDwgMS4zIikpCisg ICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWcobmV0d29yay11cmkpIiAiYnVpbGQtZGVw ZW5kcyIpCisgICAgICgibmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNiIpKQorICAg ICgoImV4ZWN1dGFibGUgY2FiYWwiICJlbHNlIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgibmV0 d29yayAgICAgPj0gMi40ICYmIDwgMi42IikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlm IG9zKHdpbmRvd3MpIiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgiV2luMzIgPj0gMiAmJiA8IDMi KSkKKyAgICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAg ICAoInVuaXggPj0gMi4wICYmIDwgMi44IikpKSkKKworKGRlZmluZSB0ZXN0LWRlcC0xMQorICAn KCgoImV4ZWN1dGFibGUgY2FiYWwiICJpZiBmbGFnKG9sZC1kaXJlY3RvcnkpIiAiaWYgZmxhZyhu ZXR3b3JrLXVyaSkiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJuZXR3b3JrLXVyaSA+PSAyLjYs IG5ldHdvcmsgPj0gMi42IikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWcob2xk LWRpcmVjdG9yeSkiICJpZiBmbGFnKG5ldHdvcmstdXJpKSIgImlmIGZsYWcoY2lwcykiICJidWls ZC1kZXBlbmRzIikKKyAgICAgKCJuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsgPj0gMi42Iikp CisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIGZsYWcob2xkLWRpcmVjdG9yeSkiICJlbHNl IiAiYnVpbGQtZGVwZW5kcyIpCisgICAgICgibmV0d29yayAgICAgPj0gMi40ICYmIDwgMi42Iikp CisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImVsc2UiICJidWlsZC1kZXBlbmRzIikKKyAgICAg KCJkaXJlY3RvcnkgPj0gMS4yICYmIDwgMS4zLCIgInByb2Nlc3MgICA+PSAxLjEuMC4yICAmJiA8 IDEuMyIpKQorICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJlbHNlIiAiaWYgZmxhZyhjaXBzKSIg ImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImNpcCA+PSAxLjIiKSkpKQorCisoZGVmaW5lIHRlc3Qt ZGVwLTEyCisgICcoKCgiZXhlY3V0YWJsZSBjYWJhbCIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAo ImFycmF5ICAgICAgPj0gMC4xICAgICAgJiYgPCAwLjYsIiAiYmFzZSAgICAgICA+PSA0LjMgICAg ICAmJiA8IDUiKSkKKyAgICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiaWYgZmxhZyhvbGQtZGlyZWN0 b3J5KSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoImRpcmVjdG9yeSA+PSAxICYmIDwgMS4yLCIg InByb2Nlc3MgICA+PSAxLjAuMS4xICAmJiA8IDEuMS4wLjIiKSkKKyAgICAoKCJleGVjdXRhYmxl IGNhYmFsIiAiaWYgZmxhZyhvbGQtZGlyZWN0b3J5KSIgImlmIGZsYWcobmV0d29yay11cmkpIiAi YnVpbGQtZGVwZW5kcyIpCisgICAgICgibmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIu NiIpKQorICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJpZiBmbGFnKG9sZC1kaXJlY3RvcnkpIiAi ZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAoIm5ldHdvcmsgICAgID49IDIuNCAmJiA8IDIu NiIpKQorICAgICgoImV4ZWN1dGFibGUgY2FiYWwiICJlbHNlIiAiYnVpbGQtZGVwZW5kcyIpCisg ICAgICgiZGlyZWN0b3J5ID49IDEuMiAmJiA8IDEuMywiICJwcm9jZXNzICAgPj0gMS4xLjAuMiAg JiYgPCAxLjMiKSkpKQorCisoZGVmaW5lIHRlc3QtZGVwLTEzCisgICcoKCgiZXhlY3V0YWJsZSBj YWJhbCIgImlmIG9zKGxpbnV4KSIgImlmIGZsYWcoZGVidWcpIiAiYnVpbGQtZGVwZW5kcyIpCisg ICAgICgibmV0d29yay11cmkgPj0gMi42LCBuZXR3b3JrID49IDIuNiIpKQorICAgICgoImV4ZWN1 dGFibGUgY2FiYWwiICJpZiBvcyhsaW51eCkiICJpZiBmbGFnKGRlYnVnKSIgImlmIGZsYWcoY2lw cykiICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJuZXR3b3JrLXVyaSA+PSAyLjYsIG5ldHdvcmsg Pj0gMi42IikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImlmIG9zKGxpbnV4KSIgImVsc2Ui ICJidWlsZC1kZXBlbmRzIikKKyAgICAgKCJuZXR3b3JrICAgICA+PSAyLjQgJiYgPCAyLjYiKSkK KyAgICAoKCJleGVjdXRhYmxlIGNhYmFsIiAiZWxzZSIgImJ1aWxkLWRlcGVuZHMiKQorICAgICAo ImRpcmVjdG9yeSA+PSAxLjIgJiYgPCAxLjMsIiAicHJvY2VzcyAgID49IDEuMS4wLjIgICYmIDwg MS4zIikpCisgICAgKCgiZXhlY3V0YWJsZSBjYWJhbCIgImVsc2UiICJpZiBmbGFnKGNpcHMpIiAi YnVpbGQtZGVwZW5kcyIpCisgICAgICgiY2lwID49IDEuMiIpKSkpCisKKyhkZWZpbmUgdGVzdC1j b25kLTEKKyAgIihvcyhkYXJ3aW4pICYmICEoYXJjaChpMzg2KSkpIHx8IG9zKGZyZWVic2QpIikK KworKGRlZmluZSB0ZXN0LWNvbmQtMgorICAiKG9zKGRhcndpbikgfHwgIShhcmNoKGkzODYpKSkg JiYgb3MoZnJlZWJzZCkiKQorCisoZGVmaW5lIHRlc3QtY29uZC0zCisgICJvcyhkYXJ3aW4pICYm IGFyY2goaTM4NikgfHwgb3MoZnJlZWJzZCkiKQorCisoZGVmaW5lIHRlc3QtY29uZC00CisgICJv cyhkYXJ3aW4pICYmICFhcmNoKGkzODYpIHx8ICFvcyhmcmVlYnNkKSIpCisKKyhkZWZpbmUgdGVz dC1jb25kLTUKKyAgIm9zKGRhcndpbikgJiYgIWFyY2goaTM4NikgJiYgIW9zKGZyZWVic2QpIikK KworKGRlZmluZSB0ZXN0LWNvbmQtNgorICAiKG9zKGRhcndpbikgfHwgIShmbGFnKGRlYnVnKSkp ICYmIGZsYWcoY2lwcykiKQorCisoZGVmaW5lIHRlc3QtY29uZC03CisgICIob3MoZGFyd2luKSB8 fCAhKGZsYWcoZGVidWcpKSkgJiYgZmxhZyhjaXBzKSAmJiBmbGFnKGZiZSkiKQorCisoZGVmaW5l IHRlc3QtY29uZC04CisgICJvcyhsaW51eCkgJiYgaW1wbChnaGMpIikKKworKGRlZmluZSB0ZXN0 LWNvbmQtOQorICAib3MobGludXgpICYmIGltcGwoZ2hjIDw9IDYuMS4wKSIpCisKKzs7IFJ1biBz b21lIHRlc3RzCisKKzs7IChkaXNwbGF5IChjYWJhbC0+a2V5LXZhbHVlcworOzsgICAgICAgICAg IChjYWxsLXdpdGgtaW5wdXQtZmlsZSAibXRsLmNhYmFsIiByZWFkLWNhYmFsKSkpCis7OyAoZGlz cGxheSAoY2FiYWwtPmtleS12YWx1ZXMKKzs7ICAgICAgICAgICAoY2FsbC13aXRoLWlucHV0LWZp bGUgIi9ob21lL2JlZmZhL3RtcC9jYWJhbC1pbnN0YWxsLmNhYmFsIiByZWFkLWNhYmFsKSkpCis7 OyAoZGlzcGxheSAoZ2V0LWZsYWdzIChwcmUtcHJvY2Vzcy1lbnRyaWVzLWtleXMgKGNhYmFsLT5r ZXktdmFsdWVzIHRlc3QtNSkpKSkKKzs7IChuZXdsaW5lKQorOzsgKGRpc3BsYXkgKGNvbmRpdGlv bmFsLT5zZXhwLWxpa2UgdGVzdC1jb25kLTIpKQorOzsgKG5ld2xpbmUpCis7OyAoZGlzcGxheQor OzsgIChldmFsLWZsYWdzIChjb25kaXRpb25hbC0+c2V4cC1saWtlIHRlc3QtY29uZC02KQorOzsg ICAgICAgICAgICAgIChnZXQtZmxhZ3MgKHByZS1wcm9jZXNzLWVudHJpZXMta2V5cyAoY2FiYWwt PmtleS12YWx1ZXMgdGVzdC02KSkpKSkKKzs7IChuZXdsaW5lKQorOzsgKGtleS0+dmFsdWVzIChj YWJhbC0+a2V5LXZhbHVlcyB0ZXN0LTEpICJuYW1lIikKKzs7IChuZXdsaW5lKQorOzsgKGtleS1z dGFydC1lbmQtPmVudHJpZXMgKGNhYmFsLT5rZXktdmFsdWVzIHRlc3QtNCkgIkxpYnJhcnkiICJD Qy1PcHRpb25zIikKKzs7IChuZXdsaW5lKQorOzsgKGV2YWwtdGVzdHMgKGNvbmRpdGlvbmFsLT5z ZXhwLWxpa2UgdGVzdC1jb25kLTYpKQorOzsKKzs7OyBjYWJhbC5zY20gZW5kcyBoZXJlCmRpZmYg LS1naXQgYS9ndWl4L3NjcmlwdHMvaW1wb3J0LnNjbSBiL2d1aXgvc2NyaXB0cy9pbXBvcnQuc2Nt CmluZGV4IDdlNzVjMTAuLjA2YjRjMTcgMTAwNjQ0Ci0tLSBhL2d1aXgvc2NyaXB0cy9pbXBvcnQu c2NtCisrKyBiL2d1aXgvc2NyaXB0cy9pbXBvcnQuc2NtCkBAIC03Myw3ICs3Myw3IEBAIHJhdGhl ciB0aGFuIFxcbi4iCiA7OzsgRW50cnkgcG9pbnQuCiA7OzsKIAotKGRlZmluZSBpbXBvcnRlcnMg JygiZ251IiAibml4IiAicHlwaSIgImNwYW4iKSkKKyhkZWZpbmUgaW1wb3J0ZXJzICcoImdudSIg Im5peCIgInB5cGkiICJjcGFuIiAiaGFja2FnZSIpKQogCiAoZGVmaW5lIChyZXNvbHZlLWltcG9y dGVyIG5hbWUpCiAgIChsZXQgKChtb2R1bGUgKHJlc29sdmUtaW50ZXJmYWNlCmRpZmYgLS1naXQg YS9ndWl4L3NjcmlwdHMvaW1wb3J0L2hhY2thZ2Uuc2NtIGIvZ3VpeC9zY3JpcHRzL2ltcG9ydC9o YWNrYWdlLnNjbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmE5ODg4Ci0t LSAvZGV2L251bGwKKysrIGIvZ3VpeC9zY3JpcHRzL2ltcG9ydC9oYWNrYWdlLnNjbQpAQCAtMCww ICsxLDk2IEBACis7OzsgR05VIEd1aXggLS0tIEZ1bmN0aW9uYWwgcGFja2FnZSBtYW5hZ2VtZW50 IGZvciBHTlUKKzs7OyBDb3B5cmlnaHQgwqkgMjAxNSBGZWRlcmljbyBCZWZmYSA8YmVmZmFAZmJl bmdpbmVlcmluZy5jaD4KKzs7OworOzs7IFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBHdWl4Lgor Ozs7Cis7OzsgR05VIEd1aXggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg aXQgYW5kL29yIG1vZGlmeSBpdAorOzs7IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cis7OzsgdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0Cis7Ozsg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorOzs7Cis7OzsgR05VIEd1aXggaXMgZGlz dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Cis7OzsgV0lU SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor Ozs7IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g IFNlZSB0aGUKKzs7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorOzs7Cis7OzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdl bmVyYWwgUHVibGljIExpY2Vuc2UKKzs7OyBhbG9uZyB3aXRoIEdOVSBHdWl4LiAgSWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisoZGVmaW5lLW1vZHVsZSAoZ3Vp eCBzY3JpcHRzIGltcG9ydCBoYWNrYWdlKQorICAjOnVzZS1tb2R1bGUgKGd1aXggdWkpCisgICM6 dXNlLW1vZHVsZSAoZ3VpeCB1dGlscykKKyAgIzp1c2UtbW9kdWxlIChndWl4IGltcG9ydCBoYWNr YWdlKQorICAjOnVzZS1tb2R1bGUgKGd1aXggc2NyaXB0cyBpbXBvcnQpCisgICM6dXNlLW1vZHVs ZSAoc3JmaSBzcmZpLTEpCisgICM6dXNlLW1vZHVsZSAoc3JmaSBzcmZpLTExKQorICAjOnVzZS1t b2R1bGUgKHNyZmkgc3JmaS0zNykKKyAgIzp1c2UtbW9kdWxlIChpY2UtOSBtYXRjaCkKKyAgIzp1 c2UtbW9kdWxlIChpY2UtOSBmb3JtYXQpCisgICM6ZXhwb3J0IChndWl4LWltcG9ydC1oYWNrYWdl KSkKKworDAorOzs7Cis7OzsgQ29tbWFuZC1saW5lIG9wdGlvbnMuCis7OzsKKworKGRlZmluZSAl ZGVmYXVsdC1vcHRpb25zCisgICcoKSkKKworKGRlZmluZSAoc2hvdy1oZWxwKQorICAoZGlzcGxh eSAoXyAiVXNhZ2U6IGd1aXggaW1wb3J0IGhhY2thZ2UgUEFDS0FHRS1OQU1FCitJbXBvcnQgYW5k IGNvbnZlcnQgdGhlIEhhY2thZ2UgcGFja2FnZSBmb3IgUEFDS0FHRS1OQU1FLiAgSWYgUEFDS0FH RS1OQU1FCitpbmNsdWRlcyBhIHN1ZmZpeCBjb25zdGl0dXRlZCBieSBhIGRhc2ggZm9sbG93ZWQg YnkgYSBudW1lcmljYWwgdmVyc2lvbiAoYXMKK3VzZWQgd2l0aCBHVUlYIHBhY2thZ2VzKSwgdGhl biBhIGRlZmluaXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBvZiB0aGUKK3BhY2thZ2Ug d2lsbCBiZSBnZW5lcmF0ZWQuICBJZiBubyB2ZXJzaW9uIHN1ZmZpeCBpcyBwZWNpZmllZCwgdGhl biB0aGUKK2dlbmVyYXRlZCBwYWNrYWdlIGRlZmluaXRpb24gd2lsbCBjb3JyZXNwb25kIHRvIHRo ZSBsYXRlc3QgYXZhaWxhYmxlCit2ZXJzaW9uLlxuIikpCisgIChkaXNwbGF5IChfICIKKyAgLWgs IC0taGVscCAgICAgICAgICAgICBkaXNwbGF5IHRoaXMgaGVscCBhbmQgZXhpdCIpKQorICAoZGlz cGxheSAoXyAiCisgIC1WLCAtLXZlcnNpb24gICAgICAgICAgZGlzcGxheSB2ZXJzaW9uIGluZm9y bWF0aW9uIGFuZCBleGl0IikpCisgIChuZXdsaW5lKQorICAoc2hvdy1idWctcmVwb3J0LWluZm9y bWF0aW9uKSkKKworKGRlZmluZSAlb3B0aW9ucworICA7OyBTcGVjaWZpY2F0aW9uIG9mIHRoZSBj b21tYW5kLWxpbmUgb3B0aW9ucy4KKyAgKGNvbnMqIChvcHRpb24gJygjXGggImhlbHAiKSAjZiAj ZgorICAgICAgICAgICAgICAgICAobGFtYmRhIGFyZ3MKKyAgICAgICAgICAgICAgICAgICAoc2hv dy1oZWxwKQorICAgICAgICAgICAgICAgICAgIChleGl0IDApKSkKKyAgICAgICAgIChvcHRpb24g JygjXFYgInZlcnNpb24iKSAjZiAjZgorICAgICAgICAgICAgICAgICAobGFtYmRhIGFyZ3MKKyAg ICAgICAgICAgICAgICAgICAoc2hvdy12ZXJzaW9uLWFuZC1leGl0ICJndWl4IGltcG9ydCBoYWNr YWdlIikpKQorICAgICAgICAgJXN0YW5kYXJkLWltcG9ydC1vcHRpb25zKSkKKworDAorOzs7Cis7 OzsgRW50cnkgcG9pbnQuCis7OzsKKworKGRlZmluZSAoZ3VpeC1pbXBvcnQtaGFja2FnZSAuIGFy Z3MpCisgIChkZWZpbmUgKHBhcnNlLW9wdGlvbnMpCisgICAgOzsgUmV0dXJuIHRoZSBhbGlzdCBv ZiBvcHRpb24gdmFsdWVzLgorICAgIChhcmdzLWZvbGQqIGFyZ3MgJW9wdGlvbnMKKyAgICAgICAg ICAgICAgICAobGFtYmRhIChvcHQgbmFtZSBhcmcgcmVzdWx0KQorICAgICAgICAgICAgICAgICAg KGxlYXZlIChfICJ+QTogdW5yZWNvZ25pemVkIG9wdGlvbn4lIikgbmFtZSkpCisgICAgICAgICAg ICAgICAgKGxhbWJkYSAoYXJnIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgIChhbGlzdC1jb25z ICdhcmd1bWVudCBhcmcgcmVzdWx0KSkKKyAgICAgICAgICAgICAgICAlZGVmYXVsdC1vcHRpb25z KSkKKworICAobGV0KiAoKG9wdHMgKHBhcnNlLW9wdGlvbnMpKQorICAgICAgICAgKGFyZ3MgKGZp bHRlci1tYXAgKG1hdGNoLWxhbWJkYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoJ2Fy Z3VtZW50IC4gdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorICAg ICAgICAgICAgICAgICAgICAgICAgICAgIChfICNmKSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgIChyZXZlcnNlIG9wdHMpKSkpCisgICAgKG1hdGNoIGFyZ3MKKyAgICAgICgocGFja2FnZS1u YW1lKQorICAgICAgIChsZXQgKChzZXhwIChoYWNrYWdlLT5ndWl4LXBhY2thZ2UgcGFja2FnZS1u YW1lKSkpCisgICAgICAgICAodW5sZXNzIHNleHAKKyAgICAgICAgICAgKGxlYXZlIChfICJmYWls ZWQgdG8gZG93bmxvYWQgY2FiYWwgZmlsZSBmb3IgcGFja2FnZSAnfmEnfiUiKQorICAgICAgICAg ICAgICAgICAgcGFja2FnZS1uYW1lKSkKKyAgICAgICAgIHNleHApKQorICAgICAgKCgpCisgICAg ICAgKGxlYXZlIChfICJ0b28gZmV3IGFyZ3VtZW50c34lIikpKQorICAgICAgKChtYW55IC4uLikK KyAgICAgICAobGVhdmUgKF8gInRvbyBtYW55IGFyZ3VtZW50c34lIikpKSkpKQo= --089e013c6bccc68b0e05112f427e--