From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 From: Frank Crawford To: git-commits@fedoraproject.org Subject: [rpms/hash-slinger] rawhide: Added tlsa-v3.4 for old versions Date: Fri, 31 Jul 2026 04:05:43 GMT Message-ID: <178547074361.1.17899885138688260496.rpms-hash-slinger-a62225d98145@fedoraproject.org> List-ID: X-Git-Repo: rpms/hash-slinger X-Git-Branch: rawhide X-Git-Rev: a62225d98145d6c5fec8417416927303742e7d57 QSBuZXcgY29tbWl0IGhhcyBiZWVuIHB1c2hlZC4KClJlcG8gICA6IHJwbXMvaGFzaC1zbGluZ2Vy CkJyYW5jaCA6IHJhd2hpZGUKQ29tbWl0IDogYTYyMjI1ZDk4MTQ1ZDZjNWZlYzg0MTc0MTY5Mjcz MDM3NDJlN2Q1NwpBdXRob3IgOiBGcmFuayBDcmF3Zm9yZCA8ZnJhbmtAY3Jhd2ZvcmQuZW11Lmlk LmF1PgpEYXRlICAgOiAyMDI2LTA3LTMxVDE0OjA1OjI5KzEwOjAwClN0YXRzICA6ICs5MDIvLTAg aW4gMSBmaWxlKHMpClVSTCAgICA6IGh0dHBzOi8vc3JjLmZlZG9yYXByb2plY3Qub3JnL3JwbXMv aGFzaC1zbGluZ2VyL2MvYTYyMjI1ZDk4MTQ1ZDZjNWZlYzg0MTc0MTY5MjczMDM3NDJlN2Q1Nz9i cmFuY2g9cmF3aGlkZQoKTG9nOgpBZGRlZCB0bHNhLXYzLjQgZm9yIG9sZCB2ZXJzaW9ucwoKLS0t CmRpZmYgLS1naXQgYS90bHNhLXYzLjQgYi90bHNhLXYzLjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uMThiZjQyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rsc2EtdjMuNApAQCAt MCwwICsxLDkwMiBAQAorIyEvdXNyL2Jpbi9weXRob24zCisKKyMgdGxzYSAtIEEgdG9vbCB0byBj cmVhdGUgREFORS9UTFNBIHJlY29yZHMuIChjYWxsZWQgJ3N3ZWRlJyBiZWZvcmUpCisjCisjIFRo aXMgdG9vbCBpcyBsb29zbHkgYmFzZWQgb24gdGhlICdkYW5lJyBwcm9ncmFtIGluIHRoZSBzc2hm cCBwYWNrYWdlIGJ5IFBhdWwKKyMgV291dGVycyBhbmQgQ2hyaXN0b3BoZXIgT2xhaAorIworIyBD b3B5cmlnaHQgMjAxMiBQaWV0ZXIgTGV4aXMgPHBpZXRlci5sZXhpc0BvczMubmw+CisjIENvcHly aWdodCAyMDE0IFBhdWwgV291dGVycyA8cHdvdXRlcnNAcmVkaGF0LmNvbT4KKyMgQ29weXJpZ2h0 IDIwMTUtMjAxOSBEaXJrIFN0b2Vja2VyIDxoYXNoc2xpbmdlckBkc3RvZWNrZXIuZGU+CisjCisj IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBp biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FS UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91 bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGFsb25nCisjIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisjIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv b3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKK1ZFUlNJT049IjMuNCIKKworaW1wb3J0 IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdW5ib3VuZAoraW1wb3J0IHN1 YnByb2Nlc3MKK2ltcG9ydCByZQorZnJvbSBNMkNyeXB0byBpbXBvcnQgWDUwOSwgU1NMLCBCSU8s IG0yCitmcm9tIGJpbmFzY2lpIGltcG9ydCBiMmFfaGV4Citmcm9tIGhhc2hsaWIgaW1wb3J0IHNo YTI1Niwgc2hhNTEyCitmcm9tIGlwYWRkcmVzcyBpbXBvcnQgSVB2NEFkZHJlc3MsIElQdjZBZGRy ZXNzCisKK1JPT1RLRVk9Im5vbmUiCitjYXVsZHJvbiA9ICggIi92YXIvbGliL3VuYm91bmQvcm9v dC5hbmNob3IiLCAiL3Zhci9saWIvdW5ib3VuZC9yb290LmtleSIsICIvZXRjL3VuYm91bmQvcm9v dC5rZXkiLCAiL3Vzci9zaGFyZS9kbnMvcm9vdC5rZXkiICkKK2ZvciByb290IGluIGNhdWxkcm9u OgorCWlmIG9zLnBhdGguaXNmaWxlKHJvb3QpOgorCQlST09US0VZPXJvb3QKKwkJYnJlYWsKKwor ZGVmIGdlblRMU0EoaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0LCBjZXJ0aWZpY2F0ZSwgb3V0cHV0 PSdyZmMnLCB1c2FnZT0xLCBzZWxlY3Rvcj0wLCBtdHlwZT0xKToKKwkiIiJUaGlzIGZ1bmN0aW9u IGdlbmVyYXRlcyBhIFRMU0FSZWNvcmQgb2JqZWN0IHVzaW5nIHRoZSBkYXRhIHBhc3NlZCBpbiB0 aGUgcGFyYW1ldGVycywKKwlpdCB0aGVuIHZhbGlkYXRlcyB0aGUgcmVjb3JkIGFuZCByZXR1cm5z IHRoZSBSUiBhcyBhIHN0cmluZy4KKwkiIiIKKwkjIGNoZWNrIGlmIHZhbGlkIHZhcnMgd2VyZSBw YXNzZWQKKwlpZiBob3N0bmFtZVstMV0gIT0gJy4nOgorCQlob3N0bmFtZSArPSAnLicKKworCSMg Q3JlYXRlIHRoZSByZWNvcmQgd2l0aG91dCBhIGNlcnRpZmljYXRlCisJaWYgcG9ydCA9PSAnKic6 CisJCXJlY29yZCA9IFRMU0FSZWNvcmQobmFtZT0nJXMuXyVzLiVzJyUocG9ydCxwcm90b2NvbCxo b3N0bmFtZSksIHVzYWdlPXVzYWdlLCBzZWxlY3Rvcj1zZWxlY3RvciwgbXR5cGU9bXR5cGUsIGNl cnQgPScnKQorCWVsc2U6CisJCXJlY29yZCA9IFRMU0FSZWNvcmQobmFtZT0nXyVzLl8lcy4lcycl KHBvcnQscHJvdG9jb2wsaG9zdG5hbWUpLCB1c2FnZT11c2FnZSwgc2VsZWN0b3I9c2VsZWN0b3Is IG10eXBlPW10eXBlLCBjZXJ0ID0nJykKKwkjIENoZWNrIGlmIHRoZSByZWNvcmQgaXMgdmFsaWQK KwlpZiByZWNvcmQuaXNWYWxpZDoKKwkJaWYgcmVjb3JkLnNlbGVjdG9yID09IDA6CisJCQkjIEhh c2ggdGhlIEZ1bGwgY2VydGlmaWNhdGUKKwkJCXJlY29yZC5jZXJ0ID0gZ2V0SGFzaChjZXJ0aWZp Y2F0ZSwgcmVjb3JkLm10eXBlKQorCQllbHNlOgorCQkJIyBIYXNoIG9ubHkgdGhlIFN1YmplY3RQ dWJsaWNLZXlJbmZvCisJCQlyZWNvcmQuY2VydCA9IGdldEhhc2goY2VydGlmaWNhdGUuZ2V0X3B1 YmtleSgpLCByZWNvcmQubXR5cGUpCisKKwlyZWNvcmQuaXNWYWxpZChyYWlzZUV4Y2VwdGlvbj1U cnVlKQorCisJaWYgb3V0cHV0ID09ICdnZW5lcmljJzoKKwkJcmV0dXJuIHJlY29yZC5nZXRSZWNv cmQoZ2VuZXJpYz1UcnVlKQorCXJldHVybiByZWNvcmQuZ2V0UmVjb3JkKCkKKworZGVmIGdlblJl Y29yZHMoaG9zdG5hbWUsIGFkZHJlc3MsIHByb3RvY29sLCBwb3J0LCBjaGFpbiwgb3V0cHV0PSdy ZmMnLCB1c2FnZT0xLCBzZWxlY3Rvcj0wLCBtdHlwZT0xKToKKwljZXJ0ID0gTm9uZQorCWNoYWlu ZWQgPSBjaGVja0NoYWluTGluayhjaGFpbilbMF0KKwlpZiBub3QgY2hhaW5lZDoKKwkJcHJpbnQo IldBUk46IENlcnRpZmljYXRlcyBkb24ndCBjaGFpbiIpCisJY2VydHNsZWZ0ID0gbGVuKGNoYWlu KQorCWZvciBjaGFpbmNlcnQgaW4gY2hhaW46CisJCWNlcnRzbGVmdCAtPSAxCisJCWlmIHVzYWdl ID09IDEgb3IgdXNhZ2UgPT0gMzoKKwkJCSMgVGhlIGZpcnN0IGNlcnQgaXMgdGhlIGVuZC1lbnRp dHkgY2VydAorCQkJcHJpbnQoJ0dvdCBhIGNlcnRpZmljYXRlIGZvciAlcyB3aXRoIFN1YmplY3Q6 ICVzJyAlIChhZGRyZXNzLCBjaGFpbmNlcnQuZ2V0X3N1YmplY3QoKSkpCisJCQljZXJ0ID0gY2hh aW5jZXJ0CisJCQlicmVhaworCQllbHNlOgorCQkJaWYgKHVzYWdlID09IDAgYW5kIGNoYWluY2Vy dC5jaGVja19jYSgpKSBvciB1c2FnZSA9PSAyOgorCQkJCWlmIGNlcnRzbGVmdDogIyBkb24ndCBh c2sgZm9yIHRoZSBsYXN0IG9uZQorCQkJCQlzeXMuc3Rkb3V0LndyaXRlKCdHb3QgYSBjZXJ0aWZp Y2F0ZSB3aXRoIHRoZSBmb2xsb3dpbmcgU3ViamVjdDpcblx0JXNcblVzZSB0aGlzIGFzIGNlcnRp ZmljYXRlIHRvIG1hdGNoPyBbeS9OXSAnICUgY2hhaW5jZXJ0LmdldF9zdWJqZWN0KCkpCisJCQkJ CWlucHV0X29rID0gRmFsc2UKKwkJCQkJd2hpbGUgbm90IGlucHV0X29rOgorCQkJCQkJdXNlcl9p bnB1dCA9IGlucHV0KCkKKwkJCQkJCWlmIHVzZXJfaW5wdXQgaW4gWycnLCduJywnTiddOgorCQkJ CQkJCWlucHV0X29rPVRydWUKKwkJCQkJCWVsaWYgdXNlcl9pbnB1dCBpbiBbJ3knLCAnWSddOgor CQkJCQkJCWlucHV0X29rID0gVHJ1ZQorCQkJCQkJCWNlcnQgPSBjaGFpbmNlcnQKKwkJCQkJCWVs c2U6CisJCQkJCQkJc3lzLnN0ZG91dC53cml0ZSgnUGxlYXNlIGFuc3dlciBZIG9yIE4nKQorCQkJ CWVsc2U6CisJCQkJCXByaW50KCdVc2luZyBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSBmb2xsb3dpbmcg U3ViamVjdDpcblx0JXNcbicgJSBjaGFpbmNlcnQuZ2V0X3N1YmplY3QoKSkKKwkJCQkJY2VydCA9 IGNoYWluY2VydAorCQkJaWYgY2VydDoKKwkJCQlicmVhaworCisJaWYgY2VydDogIyBQcmludCB0 aGUgcmVxdWVzdGVkIHJlY29yZHMgYmFzZWQgb24gdGhlIHJldHJpZXZlZCBjZXJ0aWZpY2F0ZXMK KwkJaWYgb3V0cHV0ID09ICdib3RoJzoKKwkJCXByaW50KGdlblRMU0EoaG9zdG5hbWUsIHByb3Rv Y29sLCBwb3J0LCBjZXJ0LCAnZHJhZnQnLCB1c2FnZSwgc2VsZWN0b3IsIG10eXBlKSkKKwkJCXBy aW50KGdlblRMU0EoaG9zdG5hbWUsIHByb3RvY29sLCBwb3J0LCBjZXJ0LCAncmZjJywgdXNhZ2Us IHNlbGVjdG9yLCBtdHlwZSkpCisJCWVsc2U6CisJCQlwcmludChnZW5UTFNBKGhvc3RuYW1lLCBw cm90b2NvbCwgcG9ydCwgY2VydCwgb3V0cHV0LCB1c2FnZSwgc2VsZWN0b3IsIG10eXBlKSkKKwor CSMgQ2xlYXIgdGhlIGNlcnQgZnJvbSBtZW1vcnkgKHRvIHN0b3AgTTJDcnlwdG8gZnJvbSBzZWdm YXVsdGluZykKKwljZXJ0PU5vbmUKKworZGVmIGdldEEoaG9zdG5hbWUsIHNlY3VyZT1UcnVlKToK KwkiIiJHZXRzIGEgbGlzdCBvZiBBIHJlY29yZHMgZm9yIGhvc3RuYW1lLCByZXR1cm5zIGEgbGlz dCBvZiBBUmVjb3JkcyIiIgorCXJlY29yZHMgPSBbXQorCXRyeToKKwkJcmVjb3JkcyA9IGdldFJl Y29yZHMoaG9zdG5hbWUsIHJydHlwZT0nQScsIHNlY3VyZT1zZWN1cmUpCisJZXhjZXB0IEluc2Vj dXJlTG9va3VwRXhjZXB0aW9uIGFzIGU6CisJCXByaW50KHN0cihlKSkKKwlleGNlcHQgRE5TTG9v a3VwRXJyb3IgYXMgZToKKwkJcHJpbnQoJ1VuYWJsZSB0byByZXNvbHZlICVzOiAlcycgJSAoaG9z dG5hbWUsIHN0cihlKSkpCisJcmV0ID0gW10KKwlmb3IgcmVjb3JkIGluIHJlY29yZHM6CisJCXJl dC5hcHBlbmQoQVJlY29yZChob3N0bmFtZSwgc3RyKElQdjRBZGRyZXNzKGludChiMmFfaGV4KHJl Y29yZCksMTYpKSkpKQorCXJldHVybiByZXQKKworZGVmIGdldEFBQUEoaG9zdG5hbWUsIHNlY3Vy ZT1UcnVlKToKKwkiIiJHZXRzIGEgbGlzdCBvZiBBQUFBIHJlY29yZHMgZm9yIGhvc3RuYW1lLCBy ZXR1cm5zIGEgbGlzdCBvZiBBQUFBUmVjb3JkcyIiIgorCXJlY29yZHMgPSBbXQorCXRyeToKKwkJ cmVjb3JkcyA9IGdldFJlY29yZHMoaG9zdG5hbWUsIHJydHlwZT0nQUFBQScsIHNlY3VyZT1zZWN1 cmUpCisJZXhjZXB0IEluc2VjdXJlTG9va3VwRXhjZXB0aW9uIGFzIGU6CisJCXByaW50KHN0cihl KSkKKwlleGNlcHQgRE5TTG9va3VwRXJyb3IgYXMgZToKKwkJcHJpbnQoJ1VuYWJsZSB0byByZXNv bHZlICVzOiAlcycgJSAoaG9zdG5hbWUsIHN0cihlKSkpCisJcmV0ID0gW10KKwlmb3IgcmVjb3Jk IGluIHJlY29yZHM6CisJCXJldC5hcHBlbmQoQUFBQVJlY29yZChob3N0bmFtZSwgc3RyKElQdjZB ZGRyZXNzKGludChiMmFfaGV4KHJlY29yZCksMTYpKSkpKQorCXJldHVybiByZXQKKworZGVmIGdl dFZlcmlmaWNhdGlvbkVycm9yUmVhc29uKG51bSk6CisJIiIiVGhpcyBmdW5jdGlvbiByZXR1cm5z IHRoZSBuYW1lIG9mIHRoZSBYNTA5IEVycm9yIGJhc2VkIG9uIGludChudW0pCisJIiIiCisJIyBU aGVzZSB3ZXJlIHRha2VuIGZyb20gdGhlIE0yQ3J5cHRvLm0yIGNvZGUKKwlyZXR1cm4geworNTA6 ICJYNTA5X1ZfRVJSX0FQUExJQ0FUSU9OX1ZFUklGSUNBVElPTiIsCisyMjogIlg1MDlfVl9FUlJf Q0VSVF9DSEFJTl9UT09fTE9ORyIsCisxMDogIlg1MDlfVl9FUlJfQ0VSVF9IQVNfRVhQSVJFRCIs Cis5OiAgIlg1MDlfVl9FUlJfQ0VSVF9OT1RfWUVUX1ZBTElEIiwKKzI4OiAiWDUwOV9WX0VSUl9D RVJUX1JFSkVDVEVEIiwKKzIzOiAiWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQiLAorNzogICJYNTA5 X1ZfRVJSX0NFUlRfU0lHTkFUVVJFX0ZBSUxVUkUiLAorMjc6ICJYNTA5X1ZfRVJSX0NFUlRfVU5U UlVTVEVEIiwKKzEyOiAiWDUwOV9WX0VSUl9DUkxfSEFTX0VYUElSRUQiLAorMTE6ICJYNTA5X1Zf RVJSX0NSTF9OT1RfWUVUX1ZBTElEIiwKKzg6ICAiWDUwOV9WX0VSUl9DUkxfU0lHTkFUVVJFX0ZB SUxVUkUiLAorMTg6ICJYNTA5X1ZfRVJSX0RFUFRIX1pFUk9fU0VMRl9TSUdORURfQ0VSVCIsCisx NDogIlg1MDlfVl9FUlJfRVJST1JfSU5fQ0VSVF9OT1RfQUZURVJfRklFTEQiLAorMTM6ICJYNTA5 X1ZfRVJSX0VSUk9SX0lOX0NFUlRfTk9UX0JFRk9SRV9GSUVMRCIsCisxNTogIlg1MDlfVl9FUlJf RVJST1JfSU5fQ1JMX0xBU1RfVVBEQVRFX0ZJRUxEIiwKKzE2OiAiWDUwOV9WX0VSUl9FUlJPUl9J Tl9DUkxfTkVYVF9VUERBVEVfRklFTEQiLAorMjQ6ICJYNTA5X1ZfRVJSX0lOVkFMSURfQ0EiLAor MjY6ICJYNTA5X1ZfRVJSX0lOVkFMSURfUFVSUE9TRSIsCisxNzogIlg1MDlfVl9FUlJfT1VUX09G X01FTSIsCisyNTogIlg1MDlfVl9FUlJfUEFUSF9MRU5HVEhfRVhDRUVERUQiLAorMTk6ICJYNTA5 X1ZfRVJSX1NFTEZfU0lHTkVEX0NFUlRfSU5fQ0hBSU4iLAorNjogICJYNTA5X1ZfRVJSX1VOQUJM RV9UT19ERUNPREVfSVNTVUVSX1BVQkxJQ19LRVkiLAorNDogICJYNTA5X1ZfRVJSX1VOQUJMRV9U T19ERUNSWVBUX0NFUlRfU0lHTkFUVVJFIiwKKzU6ICAiWDUwOV9WX0VSUl9VTkFCTEVfVE9fREVD UllQVF9DUkxfU0lHTkFUVVJFIiwKKzM6ICAiWDUwOV9WX0VSUl9VTkFCTEVfVE9fR0VUX0NSTCIs CisyOiAgIlg1MDlfVl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVCIsCisyMDogIlg1MDlf Vl9FUlJfVU5BQkxFX1RPX0dFVF9JU1NVRVJfQ0VSVF9MT0NBTExZIiwKKzIxOiAiWDUwOV9WX0VS Ul9VTkFCTEVfVE9fVkVSSUZZX0xFQUZfU0lHTkFUVVJFIiwKKzA6ICAiWDUwOV9WX09LIn1baW50 KG51bSldCisKK2RlZiBnZXRSZWNvcmRzKGhvc3RuYW1lLCBycnR5cGU9J0EnLCBzZWN1cmU9VHJ1 ZSwgbm9yZXNvbHZlcj1GYWxzZSk6CisJIiIiRG8gYSBsb29rdXAgb2YgYSBuYW1lIGFuZCBhIHJy dHlwZSwgcmV0dXJucyBhIGxpc3Qgb2YgYmluYXJ5IGNvZGVkIHN0cmluZ3MuIE9ubHkgcXVlcmll cyBmb3IgcnJfY2xhc3MgSU4uIiIiCisJZ2xvYmFsIHJlc29sdmNvbmYKKwljdHggPSB1bmJvdW5k LnViX2N0eCgpCisJaWYgb3MucGF0aC5pc2ZpbGUoUk9PVEtFWSk6CisJCSMgZmlsZSBmb3JtYXQg Z3Vlc3NpbmcgLSB1bmJvdW5kIHNob3VsZCBkZWFsIHdpdGggdGhpcyA6KAorCQl0cnk6CisJCQlj dHguYWRkX3RhX2ZpbGUoUk9PVEtFWSkKKwkJZXhjZXB0OgorCQkJdW5ib3VuZC51Yl9jdHhfdHJ1 c3RlZGtleXMoY3R4LFJPT1RLRVkpCisJIyBVc2UgdGhlIGxvY2FsIGNhY2hlIGFuZCBlbXVsYXRl IC9ldGMvaG9zdHMKKwljdHguaG9zdHMoIi9ldGMvaG9zdHMiKQorCWlmIHJlc29sdmNvbmYgYW5k IG5vdCBub3Jlc29sdmVyOgorCQljdHgucmVzb2x2Y29uZihyZXNvbHZjb25mKQorCisJaWYgcnJ0 eXBlID09IDUyOgorCQlycnR5cGVzdHIgPSAiVExTQSIKKwllbHNlOgorCQlycnR5cGVzdHIgPSBy cnR5cGUKKwlpZiB0eXBlKHJydHlwZSkgPT0gc3RyOgorCQlpZiAnUlJfVFlQRV8nICsgcnJ0eXBl IGluIGRpcih1bmJvdW5kKToKKwkJCXJydHlwZSA9IGdldGF0dHIodW5ib3VuZCwgJ1JSX1RZUEVf JyArIHJydHlwZSkKKwkJZWxzZToKKwkJCXJhaXNlIEV4Y2VwdGlvbignRXJyb3I6IHVua25vd24g UlIgVFlQRTogJXMuJyAlIHJydHlwZSkKKwllbGlmIHR5cGUocnJ0eXBlKSAhPSBpbnQ6CisJCXJh aXNlIEV4Y2VwdGlvbignRXJyb3I6IHJydHlwZSBpbiB3cm9uZyBmb3JtYXQsIG5laXRoZXIgaW50 IG5vciBzdHIuJykKKworCXN0YXR1cywgcmVzdWx0ID0gY3R4LnJlc29sdmUoaG9zdG5hbWUsIHJy dHlwZT1ycnR5cGUpCisJaWYgc3RhdHVzID09IDAgYW5kIHJlc3VsdC5oYXZlZGF0YToKKwkJaWYg bm90IHJlc3VsdC5zZWN1cmU6CisJCQlpZiBzZWN1cmU6CisJCQkJaWYgbm90IG5vcmVzb2x2ZXIg YW5kIHJlc29sdmNvbmY6CisJCQkJCXJldHZhbCA9IGdldFJlY29yZHMoaG9zdG5hbWUsIHJydHlw ZSwgc2VjdXJlLCBUcnVlKQorCQkJCQlwcmludCgnV2FybmluZzogaW5pdGlhbCBxdWVyeSB1c2lu ZyByZXNvbHZlciBjb25maWcgZmlsZSB3YXMgbm90IHNlY3VyZSAodHJ5IG9wdGlvbiAtLXJlc29s dmNvbmY9IiIpLicsIGZpbGU9c3lzLnN0ZGVycikKKwkJCQkJcmVzb2x2Y29uZiA9IE5vbmUKKwkJ CQkJcmV0dXJuIHJldHZhbAorCQkJCSMgVGhlIGRhdGEgaXMgaW5zZWN1cmUgYW5kIGEgc2VjdXJl IGxvb2t1cCB3YXMgcmVxdWVzdGVkCisJCQkJcmFpc2UgSW5zZWN1cmVMb29rdXBFeGNlcHRpb24o J0Vycm9yOiBBbnN3ZXIgd2FzIG5vdCBETlNTRUMtc2VjdXJlJykKKwkJCWVsc2U6CisJCQkJcHJp bnQoJ1dhcm5pbmc6IHF1ZXJ5IGRhdGEgaXMgbm90IHNlY3VyZS4nLCBmaWxlPXN5cy5zdGRlcnIp CisJCSMgSWYgd2UgYXJlIGhlcmUgdGhlIGRhdGEgd2FzIGVpdGhlciBzZWN1cmUgb3IgaW5zZWN1 cmUgZGF0YSBpcyBhY2NlcHRlZAorCQlyZXR1cm4gcmVzdWx0LmRhdGEucmF3CisJZWxzZToKKwkJ cmFpc2UgRE5TTG9va3VwRXJyb3IoJ1Vuc3VjY2Vzc2Z1bCBETlMgbG9va3VwIG9yIG5vIGRhdGEg cmV0dXJuZWQgZm9yIHJydHlwZSAlcyAoJXMpLicgJSAocnJ0eXBlc3RyLCBycnR5cGUpKQorCisj IGlkZW50aWNhbCB0byBDb25uZWN0aW9uLmNvbm5lY3QoKSBleGNlcHQgZm9yIHRoZSBsYXN0IHBh cmFtZXRlcgorZGVmIHNzbFN0YXJ0VExTQ29ubmVjdChjb25uZWN0aW9uLCBhZGRyLCBzdGFydHRs cz1Ob25lKToKKyAgICAgICAgY29ubmVjdGlvbi5zb2NrZXQuY29ubmVjdChhZGRyKQorICAgICAg ICBjb25uZWN0aW9uLmFkZHIgPSBhZGRyCisgICAgICAgIGlmIHN0YXJ0dGxzOgorICAgICAgICAg ICAgIyBwcmltaXRpdmUgbWV0aG9kLCBubyBlcnJvciBjaGVja3MgeWV0CisgICAgICAgICAgICBp ZiBzdGFydHRscyA9PSAic210cCI6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNvbm5lY3Rpb24u c29ja2V0LnJlY3YoNTAwKQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc29ja2V0LnNlbmQo IkVITE8gTTJDcnlwdG9cclxuIi5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICAgICAgZGF0 YSA9IGNvbm5lY3Rpb24uc29ja2V0LnJlY3YoNTAwKQorICAgICAgICAgICAgICAgIGNvbm5lY3Rp b24uc29ja2V0LnNlbmQoIlNUQVJUVExTXHJcbiIuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAg ICAgICAgIGRhdGEgPSBjb25uZWN0aW9uLnNvY2tldC5yZWN2KDUwMCkKKyAgICAgICAgICAgIGVs aWYgc3RhcnR0bHMgPT0gImltYXAiOgorICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uZWN0aW9u LnNvY2tldC5yZWN2KDUwMCkKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNvY2tldC5zZW5k KCIuIFNUQVJUVExTXHJcbiIuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIGRhdGEg PSBjb25uZWN0aW9uLnNvY2tldC5yZWN2KDUwMCkKKyAgICAgICAgICAgIGVsaWYgc3RhcnR0bHMg PT0gImZ0cCI6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNvbm5lY3Rpb24uc29ja2V0LnJlY3Yo NTAwKQorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc29ja2V0LnNlbmQoIkFVVEggVExTXHJc biIuZW5jb2RlKCdhc2NpaScpKQorICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uZWN0aW9uLnNv Y2tldC5yZWN2KDUwMCkKKyAgICAgICAgICAgIGVsaWYgc3RhcnR0bHMgPT0gInBvcDMiOgorICAg ICAgICAgICAgICAgIGRhdGEgPSBjb25uZWN0aW9uLnNvY2tldC5yZWN2KDUwMCkKKyAgICAgICAg ICAgICAgICBjb25uZWN0aW9uLnNvY2tldC5zZW5kKCJTVExTXHJcbiIuZW5jb2RlKCdhc2NpaScp KQorICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uZWN0aW9uLnNvY2tldC5yZWN2KDUwMCkKKyAg ICAgICAgY29ubmVjdGlvbi5zZXR1cF9zc2woKQorICAgICAgICBjb25uZWN0aW9uLnNldF9jb25u ZWN0X3N0YXRlKCkKKyAgICAgICAgcmV0ID0gY29ubmVjdGlvbi5jb25uZWN0X3NzbCgpCisgICAg ICAgIGNoZWNrID0gZ2V0YXR0cihjb25uZWN0aW9uLCAncG9zdENvbm5lY3Rpb25DaGVjaycsIGNv bm5lY3Rpb24uY2xpZW50UG9zdENvbm5lY3Rpb25DaGVjaykKKyAgICAgICAgaWYgY2hlY2sgaXMg bm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgY2hlY2soY29ubmVjdGlvbi5nZXRfcGVlcl9j ZXJ0KCksIGNvbm5lY3Rpb24uYWRkclswXSk6CisgICAgICAgICAgICAgICAgcmFpc2UgQ2hlY2tl ci5TU0xWZXJpZmljYXRpb25FcnJvcigncG9zdCBjb25uZWN0aW9uIGNoZWNrIGZhaWxlZCcpCisg ICAgICAgIHJldHVybiByZXQKKworZGVmIGdldEhhc2goY2VydGlmaWNhdGUsIG10eXBlKToKKwki IiJIYXNoZXMgdGhlIGNlcnRpZmljYXRlIGJhc2VkIG9uIHRoZSBtdHlwZS4KKwlUaGUgY2VydGlm aWNhdGUgc2hvdWxkIGJlIGFuIE0yQ3J5cHRvLlg1MDkuWDUwOSBvYmplY3QgKG9yIHRoZSByZXN1 bHQgb2YgdGhlIGdldF9wdWJrZXkoKSBmdW5jdGlvbiBvbiBzYWlkIG9iamVjdCkKKwkiIiIKKwlj ZXJ0aWZpY2F0ZSA9IGNlcnRpZmljYXRlLmFzX2RlcigpCisJaWYgbXR5cGUgPT0gMDoKKwkJcmV0 dXJuIGNlcnRpZmljYXRlLmhleCgpCisJZWxpZiBtdHlwZSA9PSAxOgorCQlyZXR1cm4gc2hhMjU2 KGNlcnRpZmljYXRlKS5oZXhkaWdlc3QoKQorCWVsaWYgbXR5cGUgPT0gMjoKKwkJcmV0dXJuIHNo YTUxMihjZXJ0aWZpY2F0ZSkuaGV4ZGlnZXN0KCkKKwllbHNlOgorCQlyYWlzZSBFeGNlcHRpb24o J210eXBlIHNob3VsZCBiZSAwLDEsMicpCisKK2RlZiBnZXRUTFNBKGhvc3RuYW1lLCBwb3J0PTQ0 MywgcHJvdG9jb2w9J3RjcCcsIHNlY3VyZT1UcnVlKToKKwkiIiIKKwlUaGlzIGZ1bmN0aW9uIHRy aWVzIHRvIGRvIGEgc2VjdXJlIGxvb2t1cCBvZiB0aGUgVExTQSByZWNvcmQuCisJQXQgdGhlIG1v bWVudCBpdCByZXF1ZXN0cyB0aGUgVFlQRTUyIHJlY29yZCBhbmQgcGFyc2VzIGl0IGludG8gYSAn dmFsaWQnIFRMU0EgcmVjb3JkCisJSXQgcmV0dXJucyBhIGxpc3Qgb2YgVExTQVJlY29yZCBvYmpl Y3RzCisJIiIiCisJaWYgaG9zdG5hbWVbLTFdICE9ICcuJzoKKwkJaG9zdG5hbWUgKz0gJy4nCisK KwlpZiBub3QgcHJvdG9jb2wubG93ZXIoKSBpbiBbJ3RjcCcsICd1ZHAnLCAnc2N0cCddOgorCQly YWlzZSBFeGNlcHRpb24oJ0Vycm9yOiB1bmtub3duIHByb3RvY29sOiAlcy4gU2hvdWxkIGJlIG9u ZSBvZiB0Y3AsIHVkcCBvciBzY3RwJyAlIHByb3RvY29sKQorCXRyeToKKwkJaWYgcG9ydCA9PSAn Kic6CisJCQlyZWNvcmRzID0gZ2V0UmVjb3JkcygnKi5fJXMuJXMnICUgKHByb3RvY29sLmxvd2Vy KCksIGhvc3RuYW1lKSwgcnJ0eXBlPTUyLCBzZWN1cmU9c2VjdXJlKQorCQllbHNlOgorCQkJcmVj b3JkcyA9IGdldFJlY29yZHMoJ18lcy5fJXMuJXMnICUgKHBvcnQsIHByb3RvY29sLmxvd2VyKCks IGhvc3RuYW1lKSwgcnJ0eXBlPTUyLCBzZWN1cmU9c2VjdXJlKQorCWV4Y2VwdCBJbnNlY3VyZUxv b2t1cEV4Y2VwdGlvbiBhcyBlOgorCQlwcmludChzdHIoZSkpCisJCXN5cy5leGl0KDEpCisJZXhj ZXB0IEROU0xvb2t1cEVycm9yIGFzIGU6CisJCXByaW50KCdVbmFibGUgdG8gcmVzb2x2ZSAlczog JXMnICUgKGhvc3RuYW1lLCBzdHIoZSkpKQorCQlzeXMuZXhpdCgxKQorCXJldCA9IFtdCisJZm9y IHJlY29yZCBpbiByZWNvcmRzOgorCQloZXhkYXRhID0gYjJhX2hleChyZWNvcmQpCisJCWlmIHBv cnQgPT0gJyonOgorCQkJcmV0LmFwcGVuZChUTFNBUmVjb3JkKCcqLl8lcy4lcycgJSAocHJvdG9j b2wubG93ZXIoKSwgaG9zdG5hbWUpLCBpbnQoaGV4ZGF0YVswOjJdLDE2KSwgaW50KGhleGRhdGFb Mjo0XSwxNiksIGludChoZXhkYXRhWzQ6Nl0sMTYpLCBoZXhkYXRhWzY6XS5kZWNvZGUoJ2FzY2lp JykpKQorCQllbHNlOgorCQkJcmV0LmFwcGVuZChUTFNBUmVjb3JkKCdfJXMuXyVzLiVzJyAlIChw b3J0LCBwcm90b2NvbC5sb3dlcigpLCBob3N0bmFtZSksIGludChoZXhkYXRhWzA6Ml0sMTYpLCBp bnQoaGV4ZGF0YVsyOjRdLDE2KSwgaW50KGhleGRhdGFbNDo2XSwxNiksIGhleGRhdGFbNjpdLmRl Y29kZSgnYXNjaWknKSkpCisJcmV0dXJuIHJldAorCitkZWYgdmVyaWZ5Q2VydE1hdGNoKHJlY29y ZCwgY2VydCk6CisJIiIiCisJVmVyaWZ5IHRoZSBjZXJ0aWZpY2F0ZSB3aXRoIHRoZSByZWNvcmQu CisJcmVjb3JkIHNob3VsZCBiZSBhIFRMU0FSZWNvcmQgYW5kIGNlcnQgc2hvdWxkIGJlIGEgTTJD cnlwdG8uWDUwOS5YNTA5CisJIiIiCisJaWYgbm90IGlzaW5zdGFuY2UoY2VydCwgWDUwOS5YNTA5 KToKKwkJcmV0dXJuCisJaWYgbm90IGlzaW5zdGFuY2UocmVjb3JkLCBUTFNBUmVjb3JkKToKKwkJ cmV0dXJuCisKKwlpZiByZWNvcmQuc2VsZWN0b3IgPT0gMToKKwkJY2VydGhhc2ggPSBnZXRIYXNo KGNlcnQuZ2V0X3B1YmtleSgpLCByZWNvcmQubXR5cGUpCisJZWxzZToKKwkJY2VydGhhc2ggPSBn ZXRIYXNoKGNlcnQsIHJlY29yZC5tdHlwZSkKKworCWlmIG5vdCBjZXJ0aGFzaDoKKwkJcmV0dXJu CisKKwlpZiBjZXJ0aGFzaCA9PSByZWNvcmQuY2VydDoKKwkJcmV0dXJuIFRydWUKKwllbHNlOgor CQlyZXR1cm4gRmFsc2UKKworZGVmIHZlcmlmeUNlcnROYW1lV2l0aEhvc3ROYW1lKGNlcnQsIGhv c3RuYW1lLCB3aXRoX21zZz1GYWxzZSk6CisJIiIiVmVyaWZ5IHRoZSBuYW1lIG9uIHRoZSBjZXJ0 aWZpY2F0ZSB3aXRoIGEgaG9zdG5hbWUsIHdlIG5lZWQgdGhpcyBiZWNhdXNlIHdlIGdldCB0aGUg Y2VydCBiYXNlZCBvbiBJUCBhZGRyZXNzIGFuZCB0aHVzbHkgY2Fubm90IHJlbHkgb24gTTJDcnlw dG8gdG8gdmVyaWZ5IHRoaXMiIiIKKwlpZiBub3QgaXNpbnN0YW5jZShjZXJ0LCBYNTA5Llg1MDkp OgorCQlyZXR1cm4KKwlpZiBub3QgaXNpbnN0YW5jZShob3N0bmFtZSwgc3RyKToKKwkJcmV0dXJu CisKKwlpZiBob3N0bmFtZVstMV0gPT0gJy4nOgorCQlob3N0bmFtZSA9IGhvc3RuYW1lWzA6LTFd CisJaG9zdG5hbWUgPSBob3N0bmFtZS5sb3dlcigpCisKKwljZXJ0bmFtZXMgPSBbXQorCWZvciBl bnRyeSBpbiBzdHIoY2VydC5nZXRfc3ViamVjdCgpKS5sb3dlcigpLnNwbGl0KCIvIik6CisJCWlm IGVudHJ5LnN0YXJ0c3dpdGgoImNuPSIpOgorCQkJY2VydG5hbWVzLmFwcGVuZChlbnRyeVszOl0p CisJdHJ5OgorCQlmb3IgdmFsdWUgaW4gcmUuc3BsaXQoIiwgPyIsIGNlcnQuZ2V0X2V4dCgnc3Vi amVjdEFsdE5hbWUnKS5nZXRfdmFsdWUoKS5sb3dlcigpKToKKwkJCWlmIHZhbHVlLnN0YXJ0c3dp dGgoImRuczoiKToKKwkJCQljZXJ0bmFtZXMuYXBwZW5kKHZhbHVlWzQ6XSkKKwlleGNlcHQ6CisJ CXBhc3MKKwlpZiBob3N0bmFtZSBpbiBjZXJ0bmFtZXM6CisJCXJldHVybiBUcnVlCisJZm9yIGNl cnRuYW1lIGluIGNlcnRuYW1lczoKKwkJaWYgY2VydG5hbWVbMF0gPT0gJyonIGFuZCBob3N0bmFt ZS5lbmRzd2l0aChjZXJ0bmFtZVsxOl0pOgorCQkJcmV0dXJuIFRydWUKKworCWlmIHdpdGhfbXNn OgorCQlwcmludCgnV0FSTklORzogTmFtZSBvbiB0aGUgY2VydGlmaWNhdGUgKFN1YmplY3Q6ICVz LCBTdWJqZWN0QWx0TmFtZTogJXMpIGRvZXNuXCd0IG1hdGNoIHJlcXVlc3RlZCBob3N0bmFtZSAo JXMpLicgJSAoc3RyKGNlcnQuZ2V0X3N1YmplY3QoKSksIGNlcnQuZ2V0X2V4dCgnc3ViamVjdEFs dE5hbWUnKS5nZXRfdmFsdWUoKSwgaG9zdG5hbWUpKQorCXJldHVybiBGYWxzZQorCitkZWYgY2hl Y2tDaGFpbkxpbmsoY2hhaW4sIHJlY29yZD1Ob25lKToKKwlwcmV2aW91c19pc3N1ZXIgPSBOb25l CisJY2hhaW5lZCA9IFRydWUKKwltYXRjaGVkID0gTm9uZQorCWZvciBjZXJ0IGluIGNoYWluOgor CQlpZiBwcmV2aW91c19pc3N1ZXI6CisJCQlpZiBub3Qgc3RyKHByZXZpb3VzX2lzc3VlcikgPT0g c3RyKGNlcnQuZ2V0X3N1YmplY3QoKSk6ICMgVGhlIGNoYWluIGNhbm5vdCBiZSB2YWxpZAorCQkJ CWNoYWluZWQgPSBGYWxzZQorCQkJCWJyZWFrCisJCXByZXZpb3VzX2lzc3VlciA9IGNlcnQuZ2V0 X2lzc3VlcigpCisJCWlmIHJlY29yZCBhbmQgdmVyaWZ5Q2VydE1hdGNoKHJlY29yZCwgY2VydCk6 CisJCQltYXRjaGVkID0gY2VydAorCXJldHVybiBjaGFpbmVkLCBtYXRjaGVkCisKK2RlZiBnZXRM b2NhbENoYWluKGZpbGVuYW1lLCBkZWJ1Zyk6CisJIiIiUmV0dXJucyBsaXN0IG9mIE0yQ3J5cHRv Llg1MDkuWDUwOSBvYmplY3RzIGFuZCB2ZXJpZmljYXRpb24gcmVzdWx0IiIiCisJY2hhaW4gPSBb XQorCWJpbyA9IEJJTy5vcGVuZmlsZShmaWxlbmFtZSkKKwlFcnIgPSBOb25lCisJd2hpbGUgVHJ1 ZToKKwkJdHJ5OgorCQkJY3B0ciA9IG0yLng1MDlfcmVhZF9wZW0oYmlvLl9wdHIoKSkKKwkJZXhj ZXB0IEV4Y2VwdGlvbiBhcyBlOgorCQkJRXJyID0gZQorCQkJYnJlYWs7CisJCWlmIG5vdCBjcHRy OgorCQkJYnJlYWsKKwkJY2hhaW4uYXBwZW5kKFg1MDkuWDUwOShjcHRyLCBfcHlmcmVlPTEpKQor CWlmIG5vdCBjaGFpbjoKKwkJaWYgRXJyOgorCQkJcmFpc2UKKwkJZWxzZToKKwkJCXJhaXNlIEV4 Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgJXMiICUgZmlsZW5hbWUpCisJIyBGSVhNRSAtIGlzIHRo aXMgcG9zc2libGUgdXNpbmcgdGhlIGxpYnJhcnkgKHdpdGhvdXQgYSBjYWxsIHRvIG9wZW5zc2wg dG9vbCk/CisJY21kID0gWyJvcGVuc3NsIiwgInZlcmlmeSIsIGZpbGVuYW1lXQorCXByb2Nlc3Mg PSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1 YnByb2Nlc3MuUElQRSkKKwkoc3Rkb3V0LCBzdGRlcnIpID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgp CisJaWYgZGVidWc6CisJCXByaW50KHN0ZGVyciwgZmlsZT1zeXMuc3RkZXJyKQorCWlmIHN0ZG91 dC5lbmRzd2l0aChiIk9LXG4iKToKKwkJdmVyaWZ5X3Jlc3VsdCA9IDAKKwllbHNlOgorCQl2ZXJp ZnlfcmVzdWx0ID0gIiVzJXMiICUgKHN0ZG91dCwgc3RkZXJyKQorCXJldHVybiBjaGFpbiwgdmVy aWZ5X3Jlc3VsdAorCitkZWYgdXNhZ2VUZXh0KHVzYWdlKToKKwluYW1lcyA9IFsiUEtJWC1DQSIs ICJQS0lYLUVFIiwgIkRBTkUtVEEiLCAiREFORS1FRSJdCisJcmV0dXJuICJVc2FnZSAlZCBbJXNd IiAlICh1c2FnZSwgbmFtZXNbdXNhZ2VdKQorCitkZWYgdmVyaWZ5Q2hhaW4ocmVjb3JkLCBjaGFp biwgdmVyaWZ5X3Jlc3VsdCwgcHJlX2V4aXQsIGxvY2FsLCBzb3VyY2UpOgorCXNvdXJjZSA9ICIl cyBmb3IgJXMiICUgKHJlY29yZC5nZXRTaG9ydFRleHQoKSwgc291cmNlKQorCWlmIGxvY2FsOgor CQl0ZXh0X2NlcnQgPSAiTG9jYWwgY2VydGlmaWNhdGUiCisJCXRleHRfY2hhaW4gPSAiY2VydGlm aWNhdGUgaW4gdGhlIGxvY2FsIGNlcnRpZmljYXRlIGNoYWluIgorCWVsc2U6CisJCXRleHRfY2Vy dCA9ICJDZXJ0aWZpY2F0ZSBvZmZlcmVkIGJ5IHRoZSBzZXJ2ZXIiCisJCXRleHRfY2hhaW4gPSAi Y2VydGlmaWNhdGUgaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluIG9mZmVyZWQgYnkgdGhlIHNlcnZl ciIKKworCWlmIG5vdCB2ZXJpZnlDZXJ0TmFtZVdpdGhIb3N0TmFtZShjZXJ0PWNoYWluWzBdLCBo b3N0bmFtZT1zdHIoYXJncy5ob3N0KSwgd2l0aF9tc2c9VHJ1ZSk6CisJCSMgVGhlIG5hbWUgb24g dGhlIGNlcnQgZG9lc24ndCBtYXRjaCB0aGUgaG9zdG5hbWUuLi4gd2UgZG9uJ3QgdmVyaWZ5IHRo ZSBUTFNBIHJlY29yZAorCQlwcmludCgnQ2F1dGlvbjogJXMgZG9lcyBub3QgbWF0Y2ggaG9zdG5h bWUgKCVzKScgJSAodGV4dF9jZXJ0LCBzb3VyY2UpKQorCXV0ID0gdXNhZ2VUZXh0KHJlY29yZC51 c2FnZSkKKwlpZiByZWNvcmQudXNhZ2UgPT0gMTogIyBFbmQtaG9zdCBjZXJ0CisJCWNoYWluZWQs IG1hdGNoZWQgPSBjaGVja0NoYWluTGluaygoY2hhaW5bMF0sKSwgcmVjb3JkKQorCQlpZiBub3Qg Y2hhaW5lZDoKKwkJCXByaW50KCJXQVJOOiBDZXJ0aWZpY2F0ZXMgZG9uJ3QgY2hhaW4iKQorCQlp ZiBtYXRjaGVkOgorCQkJaWYgdmVyaWZ5X3Jlc3VsdCA9PSAwOiAjIFRoZSBjZXJ0IGNoYWlucyB0 byBhIHZhbGlkIENBIGNlcnQgYWNjb3JkaW5nIHRvIHRoZSBzeXN0ZW0tY2VydGlmaWNhdGVzCisJ CQkJcHJpbnQoJ1NVQ0NFU1MgKCVzKTogJXMgbWF0Y2hlcyB0aGUgb25lIG1lbnRpb25lZCBpbiB0 aGUgVExTQSByZWNvcmQgYW5kIGNoYWlucyB0byBhIHZhbGlkIENBIGNlcnRpZmljYXRlICglcykn ICUgKHV0LCB0ZXh0X2NlcnQsIHNvdXJjZSkpCisJCQllbHNlOgorCQkJCWlmIGxvY2FsOgorCQkJ CQlyZWFzb24gPSB2ZXJpZnlfcmVzdWx0CisJCQkJZWxzZToKKwkJCQkJcmVhc29uID0gZ2V0VmVy aWZpY2F0aW9uRXJyb3JSZWFzb24odmVyaWZ5X3Jlc3VsdCkKKwkJCQlwcmludCgnRkFJTCAoJXMp OiAlcyBtYXRjaGVzIHRoZSBvbmUgbWVudGlvbmVkIGluIHRoZSBUTFNBIHJlY29yZCBidXQgdGhl IGZvbGxvd2luZyBlcnJvciB3YXMgcmFpc2VkIGR1cmluZyBQS0lYIHZhbGlkYXRpb24gKCVzKTog JXMnICUgKHV0LCB0ZXh0X2NlcnQsIHNvdXJjZSwgcmVhc29uKSkKKwkJCQlpZiBwcmVfZXhpdCA9 PSAwOiBwcmVfZXhpdCA9IDIKKwkJCWlmIGFyZ3MuZGVidWc6IHByaW50KCdUaGUgbWF0Y2hlZCBj ZXJ0aWZpY2F0ZSBoYXMgU3ViamVjdDogJXMnICUgY2VydC5nZXRfc3ViamVjdCgpKQorCQllbHNl OgorCQkJcHJpbnQoJ0ZBSUw6ICVzIGRvZXMgbm90IG1hdGNoIHRoZSBUTFNBIHJlY29yZCAoJXMp JyAlICh0ZXh0X2NlcnQsIHNvdXJjZSkpCisJCQlpZiBwcmVfZXhpdCA9PSAwOiBwcmVfZXhpdCA9 IDIKKworCWVsaWYgcmVjb3JkLnVzYWdlID09IDA6ICMgQ0EgY29uc3RyYWludAorCQkjIEZJWE1F OiBEb2VzIG5laXRoZXIgaGFuZGxlIGNoYWluIGRhdGEgaW4gZnVsbCBjZXJ0IFRMU0EgcmVjb3Jk cyAodHlwZSAwKSBjb3JyZWN0bHkKKwkJIyBub3IgaGFuZGxlcyBzaG9ydCBjZXJ0aWZpY2F0aW9u IGNoYWlucworCQkjIEluIHRoZXNlIGNhc2UgdGhlIGNoYWluIHNob3VsZCBiZSBjb21wbGV0ZWQg d2l0aCBtaXNzaW5nIHJlY29yZHMgZWl0aGVyCisJCSMgZnJvbSBUTFNBIG9yIGxvY2FsIGNlcnRp ZmljYXRlIHN0b3JlCisKKwkJIyBSZW1vdmUgdGhlIGZpcnN0ICg9IEVuZC1FbnRpdHkgY2VydCkg ZnJvbSB0aGUgY2hhaW4KKwkJY2hhaW5lZCwgbWF0Y2hlZCA9IGNoZWNrQ2hhaW5MaW5rKGNoYWlu WzE6XSwgcmVjb3JkKQorCQlpZiBub3QgY2hhaW5lZDoKKwkJCXByaW50KCJXQVJOOiBDZXJ0aWZp Y2F0ZXMgZG9uJ3QgY2hhaW4iKQorCQlpZiBtYXRjaGVkOgorCQkJaWYgY2VydC5jaGVja19jYSgp OgorCQkJCWlmIHZlcmlmeV9yZXN1bHQgPT0gMDoKKwkJCQkJcHJpbnQoJ1NVQ0NFU1MgKCVzKTog QSAlcyBtYXRjaGVzIHRoZSBvbmUgbWVudGlvbmVkIGluIHRoZSBUTFNBIHJlY29yZCBhbmQgaXMg YSBDQSBjZXJ0aWZpY2F0ZSAoJXMpJyAlICh1dCwgdGV4dF9jaGFpbiwgc291cmNlKSkKKwkJCQll bHNlOgorCQkJCQlpZiBsb2NhbDoKKwkJCQkJCXJlYXNvbiA9IHZlcmlmeV9yZXN1bHQKKwkJCQkJ ZWxzZToKKwkJCQkJCXJlYXNvbiA9IGdldFZlcmlmaWNhdGlvbkVycm9yUmVhc29uKHZlcmlmeV9y ZXN1bHQpCisJCQkJCXByaW50KCdGQUlMICglcyk6IEEgJXMgbWF0Y2hlcyB0aGUgb25lIG1lbnRp b25lZCBpbiB0aGUgVExTQSByZWNvcmQgYW5kIGlzIGEgQ0EgY2VydGlmaWNhdGUsIGJ1dCB0aGUg Zm9sbG93aW5nIGVycm9yIHdhcyByYWlzZWQgZHVyaW5nIFBLSVggdmFsaWRhdGlvbiAoJXMpOiAl cycgJSAodXQsIHRleHRfY2hhaW4sIHNvdXJjZSwgcmVhc29uKSkKKwkJCQkJaWYgcHJlX2V4aXQg PT0gMDogcHJlX2V4aXQgPSAyCisJCQllbHNlOgorCQkJCXByaW50KCdGQUlMICglcyk6IEEgJXMg bWF0Y2hlcyB0aGUgb25lIG1lbnRpb25lZCBpbiB0aGUgVExTQSByZWNvcmQgYnV0IGlzIG5vdCBh IENBIGNlcnRpZmljYXRlICglcyknICUgKHV0LCB0ZXh0X2NoYWluLCBzb3VyY2UpKQorCQkJCWlm IHByZV9leGl0ID09IDA6IHByZV9leGl0ID0gMgorCQkJaWYgYXJncy5kZWJ1ZzogcHJpbnQoJ1Ro ZSBtYXRjaGVkIGNlcnRpZmljYXRlIGhhcyBTdWJqZWN0OiAlcycgJSBjZXJ0LmdldF9zdWJqZWN0 KCkpCisJCWVsc2U6CisJCQlwcmludCgnRkFJTCAoJXMpOiBObyAlcyBtYXRjaGVzIHRoZSBUTFNB IHJlY29yZCAoJXMpJyAlICh1dCwgdGV4dF9jaGFpbiwgc291cmNlKSkKKwkJCWlmIHByZV9leGl0 ID09IDA6IHByZV9leGl0ID0gMgorCisJZWxpZiByZWNvcmQudXNhZ2UgPT0gMjogIyBVc2FnZSAy LCB1c2UgdGhlIGNlcnQgaW4gdGhlIHJlY29yZCBhcyB0cnVzdCBhbmNob3IKKwkJIyBGSVhNRTog RG9lcyBub3QgaGFuZGxlIGNoYWluIGRhdGEgaW4gZnVsbCBjZXJ0IFRMU0EgcmVjb3JkcyAodHlw ZSAwKSBjb3JyZWN0bHkKKwkJIyBJbiB0aGlzIGNhc2UgdGhlIGNoYWluIHNob3VsZCBiZSBjb21w bGV0ZWQgd2l0aCBtaXNzaW5nIHJlY29yZHMgaWYgY2hhaW4gaXMKKwkJIyBub3QgY29tcGxldGUK KwkJY2hhaW5lZCwgbWF0Y2hlZCA9IGNoZWNrQ2hhaW5MaW5rKGNoYWluLCByZWNvcmQpCisJCWlm IG1hdGNoZWQ6CisJCQlpZiBub3QgY2hhaW5lZDoKKwkJCQlwcmludCgiV0FSTjogQ2VydGlmaWNh dGVzIGRvbid0IGNoYWluIikKKwkJCXByaW50KCdTVUNDRVNTICglcyk6IEEgJXMgKGluY2x1ZGlu ZyB0aGUgZW5kLWVudGl0eSBjZXJ0aWZpY2F0ZSkgbWF0Y2hlcyB0aGUgVExTQSByZWNvcmQgKCVz KScgJSAodXQsIHRleHRfY2hhaW4sIHNvdXJjZSkpCisJCQlpZiBhcmdzLmRlYnVnOiBwcmludCgn VGhlIG1hdGNoZWQgY2VydGlmaWNhdGUgaGFzIFN1YmplY3Q6ICVzJyAlIG1hdGNoZWQuZ2V0X3N1 YmplY3QoKSkKKwkJZWxzZToKKwkJCWlmIG5vdCBjaGFpbmVkOgorCQkJCXByaW50KCJGQUlMOiBD ZXJ0aWZpY2F0ZXMgZG9uJ3QgY2hhaW4iKQorCQkJcHJpbnQoJ0ZBSUwgKCVzKTogTm8gJXMgKGlu Y2x1ZGluZyB0aGUgZW5kLWVudGl0eSBjZXJ0aWZpY2F0ZSkgbWF0Y2hlcyB0aGUgVExTQSByZWNv cmQgKCVzKScgJSAodXQsIHRleHRfY2hhaW4sIHNvdXJjZSkpCisJCQlpZiBwcmVfZXhpdCA9PSAw OiBwcmVfZXhpdCA9IDIKKworCWVsaWYgcmVjb3JkLnVzYWdlID09IDM6ICMgRUUgY2VydCBNVVNU IG1hdGNoCisJCWNoYWluZWQsIG1hdGNoZWQgPSBjaGVja0NoYWluTGluaygoY2hhaW5bMF0sKSwg cmVjb3JkKQorCQlpZiBub3QgY2hhaW5lZDoKKwkJCXByaW50KCJXQVJOOiBDZXJ0aWZpY2F0ZXMg ZG9uJ3QgY2hhaW4iKQorCQlpZiBtYXRjaGVkOgorCQkJcHJpbnQoJ1NVQ0NFU1MgKCVzKTogJXMg bWF0Y2hlcyB0aGUgVExTQSByZWNvcmQgKCVzKScgJSAodXQsIHRleHRfY2VydCwgc291cmNlKSkK KwkJCWlmIGFyZ3MuZGVidWc6IHByaW50KCdUaGUgbWF0Y2hlZCBjZXJ0aWZpY2F0ZSBoYXMgU3Vi amVjdDogJXMnICUgY2hhaW5bMF0uZ2V0X3N1YmplY3QoKSkKKwkJZWxzZToKKwkJCXByaW50KCdG QUlMICglcyk6ICVzIGRvZXMgbm90IG1hdGNoIHRoZSBUTFNBIHJlY29yZCAoJXMpJyAlICh1dCwg dGV4dF9jZXJ0LCBzb3VyY2UpKQorCQkJaWYgcHJlX2V4aXQgPT0gMDogcHJlX2V4aXQgPSAyCisJ cmV0dXJuIHByZV9leGl0CisKK2NsYXNzIFRMU0FSZWNvcmQ6CisJIiIiV2hlbiBpbnN0YW5jaWF0 ZWQsIHRoaXMgY2xhc3MgY29udGFpbnMgYWxsIHRoZSBmaWVsZHMgb2YgYSBUTFNBIHJlY29yZC4K KwkiIiIKKwlkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgdXNhZ2UsIHNlbGVjdG9yLCBtdHlwZSwg Y2VydCk6CisJCXIiIiJuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBSUiBpbiB0aGUgZm9ybWF0OiAv XihfXGR7MSw1fXxcKilcLl8odGNwfHVkcHxzY3RwKVwuKFthLXowLTldKlwuKXsyLH0kLworCQl1 c2FnZSwgc2VsZWN0b3IgYW5kIG10eXBlIHNob3VsZCBiZSBhbiBpbnRlZ2VyCisJCWNlcnQgc2hv dWxkIGJlIGEgaGV4aWRlY2ltYWwgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2VydGlmaWNhdGUg dG8gYmUgbWF0Y2hlZCBmaWVsZAorCQkiIiIKKwkJdHJ5OgorCQkJc2VsZi5ycnR5cGUgPSA1MiAg ICAjIFRMU0EgcGVyIGh0dHBzOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2Rucy1wYXJhbWV0 ZXJzCisJCQlzZWxmLnJyY2xhc3MgPSAxICAgICMgSU4KKwkJCXNlbGYubmFtZSA9IHN0cihuYW1l KQorCQkJc2VsZi51c2FnZSA9IGludCh1c2FnZSkKKwkJCXNlbGYuc2VsZWN0b3IgPSBpbnQoc2Vs ZWN0b3IpCisJCQlzZWxmLm10eXBlID0gaW50KG10eXBlKQorCQkJc2VsZi5jZXJ0ID0gY2VydAor CQlleGNlcHQ6CisJCQlyYWlzZSBFeGNlcHRpb24oJ0ludmFsaWQgdmFsdWUgcGFzc2VkLCB1bmFi bGUgdG8gY3JlYXRlIGEgVExTQVJlY29yZCcpCisKKwlkZWYgZ2V0UmVjb3JkKHNlbGYsIGdlbmVy aWM9RmFsc2UpOgorCQkiIiJSZXR1cm5zIHRoZSBSUiBzdHJpbmcgb2YgdGhpcyBUTFNBUmVjb3Jk LCBlaXRoZXIgaW4gcmZjIChkZWZhdWx0KSBvciBnZW5lcmljIGZvcm1hdCIiIgorCQlpZiBnZW5l cmljOgorCQkJcmV0dXJuIHInJXMgSU4gVFlQRTUyIFwjICVzICVzJXMlcyVzJyAlIChzZWxmLm5h bWUsIChsZW4oc2VsZi5jZXJ0KS8vMikrMyAsIHNlbGYuX3RvSGV4KHNlbGYudXNhZ2UpLCBzZWxm Ll90b0hleChzZWxmLnNlbGVjdG9yKSwgc2VsZi5fdG9IZXgoc2VsZi5tdHlwZSksIHNlbGYuY2Vy dCkKKwkJcmV0dXJuICclcyBJTiBUTFNBICVzICVzICVzICVzJyAlIChzZWxmLm5hbWUsIHNlbGYu dXNhZ2UsIHNlbGYuc2VsZWN0b3IsIHNlbGYubXR5cGUsIHNlbGYuY2VydCkKKworCWRlZiBfdG9I ZXgoc2VsZiwgdmFsKToKKwkJIiIiSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBoZXggc3RyaW5n cyBmcm9tIGludGVnZXJzIiIiCisJCXJldHVybiAiJTAuMngiICUgdmFsCisKKwlkZWYgaXNWYWxp ZChzZWxmLCByYWlzZUV4Y2VwdGlvbj1GYWxzZSk6CisJCSIiIkNoZWNrIHdoZXRoZXIgYWxsIGZp ZWxkcyBpbiB0aGUgVExTQSByZWNvcmQgYXJlIGNvbmZvcm1pbmcgdG8gdGhlIHNwZWMgYW5kIGNo ZWNrIGlmIHRoZSBwb3J0LCBwcm90b2NvbCBhbmQgbmFtZSBhcmUgZ29vZCIiIgorCQllcnIgPVtd CisJCXRyeToKKwkJCWlmIG5vdCAxIDw9IGludChzZWxmLmdldFBvcnQoKSkgPD0gNjU1MzU6CisJ CQkJZXJyLmFwcGVuZCgnUG9ydCAlcyBub3Qgd2l0aGluIGNvcnJlY3QgcmFuZ2UgKDEgPD0gcG9y dCA8PSA2NTUzNSknICUgc2VsZi5nZXRQb3J0KCkpCisJCWV4Y2VwdDoKKwkJCWlmIHNlbGYuZ2V0 UG9ydCgpICE9ICcqJzoKKwkJCQllcnIuYXBwZW5kKCdQb3J0ICVzIG5vdCBhIG51bWJlcicgJSBz ZWxmLmdldFBvcnQoKSkKKwkJaWYgbm90IHNlbGYudXNhZ2UgaW4gWzAsMSwyLDNdOgorCQkJZXJy LmFwcGVuZCgnVXNhZ2U6IGludmFsaWQgKCVzIGlzIG5vdCBvbmUgb2YgMCBbUEtJWC1DQV0sIDEg W1BLSVgtRUVdLCAyIFtEQU5FLVRBXSBvciAzIFtEQU5FLUVFXSknICUgc2VsZi51c2FnZSkKKwkJ aWYgbm90IHNlbGYuc2VsZWN0b3IgaW4gWzAsMV06CisJCQllcnIuYXBwZW5kKCdTZWxlY3Rvcjog aW52YWxpZCAoJXMgaXMgbm90IG9uZSBvZiAwIFtDZXJ0XSBvciAxIFtTUEtJXSknICUgc2VsZi5z ZWxlY3RvcikKKwkJaWYgbm90IHNlbGYubXR5cGUgaW4gWzAsMSwyXToKKwkJCWVyci5hcHBlbmQo J01hdGNoaW5nIFR5cGU6IGludmFsaWQgKCVzIGlzIG5vdCBvbmUgb2YgMCBbRlVMTF0sIDEgW1NI QS0yNTZdIG9yIDIgW1NIQS01MTJdKScgJSBzZWxmLm10eXBlKQorCQlpZiBub3Qgc2VsZi5pc05h bWVWYWxpZCgpOgorCQkJZXJyLmFwcGVuZCgnTmFtZSAoJXMpIGlzIG5vdCBpbiB0aGUgY29ycmVj dCBmb3JtYXQ6IF9wb3J0bnVtYmVyLl90cmFuc3BvcnRwcm90b2NvbC5ob3N0bmFtZS5kb20uJyAl IHNlbGYubmFtZSkKKwkJIyBBIGNlcnRpZmljYXRlIGxlbmd0aCBvZiAwIGlzIGFjY2VwdGVkCisJ CWlmIHNlbGYubXR5cGUgaW4gWzEsMl0gYW5kIGxlbihzZWxmLmNlcnQpICE9IDA6CisJCQlpZiBu b3QgbGVuKHNlbGYuY2VydCkgPT0gezE6NjQsMjoxMjh9W3NlbGYubXR5cGVdOgorCQkJCWVyci5h cHBlbmQoJ0NlcnRpZmljYXRlIGZvciBBc3NvY2lhdGlvbjogaW52YWxpZCAoSGFzaCBsZW5ndGgg ZG9lcyBub3QgbWF0Y2ggaGFzaC10eXBlIGluIE1hdGNoaW5nIFR5cGUoJXMpKScgJSB7MTonU0hB LTI1NicsMjonU0hBLTUxMid9W3NlbGYubXR5cGVdKQorCQlpZiBsZW4oZXJyKSAhPSAwOgorCQkJ aWYgbm90IHJhaXNlRXhjZXB0aW9uOgorCQkJCXJldHVybiBGYWxzZQorCQkJZWxzZToKKwkJCQlt c2cgPSAnVGhlIFRMU0EgcmVjb3JkIGlzIGludmFsaWQuJworCQkJCWZvciBlcnJvciBpbiBlcnI6 CisJCQkJCW1zZyArPSAnXG5cdCVzJyAlIGVycm9yCisJCQkJcmFpc2UgUmVjb3JkVmFsaWRpdHlF eGNlcHRpb24obXNnKQorCQllbHNlOgorCQkJcmV0dXJuIFRydWUKKworCWRlZiBpc05hbWVWYWxp ZChzZWxmKToKKwkJIiIiQ2hlY2sgaWYgdGhlIG5hbWUgaWYgaW4gdGhlIGNvcnJlY3QgZm9ybWF0 IiIiCisJCWlmIG5vdCByZS5tYXRjaChyJ14oX1xkezEsNX18XCopXC5fKHRjcHx1ZHB8c2N0cClc LihbLWEtejAtOV0qXC4pezIsfSQnLCBzZWxmLm5hbWUpOgorCQkJcmV0dXJuIEZhbHNlCisJCXJl dHVybiBUcnVlCisKKwlkZWYgZ2V0UHJvdG9jb2woc2VsZik6CisJCSIiIlJldHVybnMgdGhlIHBy b3RvY29sIGJhc2VkIG9uIHRoZSBuYW1lIiIiCisJCXJldHVybiByZS5zcGxpdChyJ1wuJywgc2Vs Zi5uYW1lKVsxXVsxOl0KKworCWRlZiBnZXRQb3J0KHNlbGYpOgorCQkiIiJSZXR1cm5zIHRoZSBw b3J0IGJhc2VkIG9uIHRoZSBuYW1lIiIiCisJCWlmIHJlLnNwbGl0KHInXC4nLCBzZWxmLm5hbWUp WzBdWzBdID09ICcqJzoKKwkJCXJldHVybiAnKicKKwkJZWxzZToKKwkJCXJldHVybiByZS5zcGxp dChyJ1wuJywgc2VsZi5uYW1lKVswXVsxOl0KKworCWRlZiBnZXRTaG9ydFRleHQoc2VsZik6CisJ CXJldHVybiAiJWQgJWQgJWQgJS44cy4uLiIgJSAoc2VsZi51c2FnZSwgc2VsZi5zZWxlY3Rvciwg c2VsZi5tdHlwZSwgc2VsZi5jZXJ0KQorCitjbGFzcyBBUmVjb3JkOgorCSIiIkFuIG9iamVjdCBy ZXByZXNlbnRpbmcgYW4gQSBSZWNvcmQgKElQdjQgYWRkcmVzcykiIiIKKwlkZWYgX19pbml0X18o c2VsZiwgaG9zdG5hbWUsIGFkZHJlc3MpOgorCQlzZWxmLnJydHlwZSA9IDEKKwkJc2VsZi5ob3N0 bmFtZSA9IGhvc3RuYW1lCisJCXNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKKworCWRlZiBfX3N0cl9f KHNlbGYpOgorCQlyZXR1cm4gc2VsZi5hZGRyZXNzCisKKwlkZWYgaXNWYWxpZChzZWxmKToKKwkJ dHJ5OgorCQkJSVB2NEFkZHJlc3Moc2VsZi5hZGRyZXNzKQorCQkJcmV0dXJuIFRydWUKKwkJZXhj ZXB0OgorCQkJcmV0dXJuIEZhbHNlCisKK2NsYXNzIEFBQUFSZWNvcmQ6CisJIiIiQW4gb2JqZWN0 IHJlcHJlc2VudGluZyBhbiBBQUFBIFJlY29yZCAoSVB2NiBhZGRyZXNzKSIiIgorCWRlZiBfX2lu aXRfXyhzZWxmLCBob3N0bmFtZSwgYWRkcmVzcyk6CisJCXNlbGYucnJ0eXBlID0gMjgKKwkJc2Vs Zi5ob3N0bmFtZSA9IGhvc3RuYW1lCisJCXNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKKworCWRlZiBf X3N0cl9fKHNlbGYpOgorCQlyZXR1cm4gc2VsZi5hZGRyZXNzCisKKwlkZWYgaXNWYWxpZChzZWxm KToKKwkJdHJ5OgorCQkJSVB2NkFkZHJlc3Moc2VsZi5hZGRyZXNzKQorCQkJcmV0dXJuIFRydWUK KwkJZXhjZXB0OgorCQkJcmV0dXJuIEZhbHNlCisKKyMgRXhjZXB0aW9ucworY2xhc3MgUmVjb3Jk VmFsaWRpdHlFeGNlcHRpb24oRXhjZXB0aW9uKToKKwlwYXNzCisKK2NsYXNzIEluc2VjdXJlTG9v a3VwRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisJcGFzcworCitjbGFzcyBETlNMb29rdXBFcnJvcihF eGNlcHRpb24pOgorCXBhc3MKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKwlpbXBvcnQg YXJncGFyc2UKKwkjIGNyZWF0ZSB0aGUgcGFyc2VyCisJcGFyc2VyID0gYXJncGFyc2UuQXJndW1l bnRQYXJzZXIoZGVzY3JpcHRpb249J0NyZWF0ZSBhbmQgdmVyaWZ5IFRMU0EgcmVjb3Jkcy4nLCBl cGlsb2c9J0ZvciBidWdzLiBzZWUgdGxzYUBub2hhdHMuY2EnKQorCisJIyBDYXZlYXQ6IEZvciBU TFNBIHZhbGlkYXRpb24sIHRoaXMgcHJvZ3JhbSBjaGFzZXMgdGhyb3VnaCB0aGUgY2VydGlmaWNh dGUgY2hhaW4gb2ZmZXJlZCBieSB0aGUgc2VydmVyLCBub3QgaXRzIGxvY2FsIGNlcnRpZmljYXRl cy4nCisJcGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJpZnknLCctdicsIGFjdGlvbj0nc3RvcmVf dHJ1ZScsIGhlbHA9J1ZlcmlmeSBhIFRMU0EgcmVjb3JkLCBleGl0IDAgd2hlbiBhbGwgVExTQSBy ZWNvcmRzIGFyZSBtYXRjaGVkLCBleGl0IDIgd2hlbiBhIHJlY29yZCBkb2VzIG5vdCBtYXRjaCB0 aGUgcmVjZWl2ZWQgY2VydGlmaWNhdGUsIGV4aXQgMSBvbiBlcnJvci4nKQorCisJcGFyc2VyLmFk ZF9hcmd1bWVudCgnLS1jcmVhdGUnLCctYycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J0Ny ZWF0ZSBhIFRMU0EgcmVjb3JkJykKKwlwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcnNpb24nLCBh Y3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSd0bHNhIHZlcnNpb246ICVzJyVWRVJTSU9OLCBoZWxw PSdzaG93IHZlcnNpb24gYW5kIGV4aXQnKQorCisJcGFyc2VyLmFkZF9hcmd1bWVudCgnLTQnLCAn LS1pcHY0JywgZGVzdD0naXB2NCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsaGVscD0ndXNlIGlwdjQg bmV0d29ya2luZyBvbmx5JykKKwlwYXJzZXIuYWRkX2FyZ3VtZW50KCctNicsICctLWlwdjYnLCBk ZXN0PSdpcHY2JywgYWN0aW9uPSdzdG9yZV90cnVlJyxoZWxwPSd1c2UgaXB2NiBuZXR3b3JraW5n IG9ubHknKQorCXBhcnNlci5hZGRfYXJndW1lbnQoJy0taW5zZWN1cmUnLCBhY3Rpb249J3N0b3Jl X3RydWUnLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSdBbGxvdyB1c2Ugb2Ygbm9uLWRuc3NlYyBzZWN1 cmVkIGFuc3dlcnMnKQorCXBhcnNlci5hZGRfYXJndW1lbnQoJy0tcmVzb2x2Y29uZicsIG1ldGF2 YXI9Jy9QQVRIL1RPL1JFU09MVi5DT05GJywgYWN0aW9uPSdzdG9yZScsIGRlZmF1bHQ9Jy9ldGMv cmVzb2x2LmNvbmYnLCBoZWxwPSdVc2UgYSByZWN1cnNpdmUgcmVzb2x2ZXIgbGlzdGVkIGluIGEg cmVzb2x2LmNvbmYgZmlsZSAoZGVmYXVsdDogL2V0Yy9yZXNvbHYuY29uZiknKQorCXBhcnNlci5h ZGRfYXJndW1lbnQoJ2hvc3QnLCBtZXRhdmFyPSJob3N0bmFtZSIpCisKKwlwYXJzZXIuYWRkX2Fy Z3VtZW50KCctLXBvcnQnLCAnLXAnLCBhY3Rpb249J3N0b3JlJywgZGVmYXVsdD0nNDQzJywgaGVs cD0nVGhlIHBvcnQsIG9yIFwnKlwnIHdoZXJlIHJ1bm5pbmcgVExTIGlzIGxvY2F0ZWQgKGRlZmF1 bHQ6ICUoZGVmYXVsdClzKS4nKQorCXBhcnNlci5hZGRfYXJndW1lbnQoJy0tc3RhcnR0bHMnLCAn LXQnLCBhY3Rpb249J3N0b3JlJywgY2hvaWNlcz1bJ25vJywgJ3NtdHAnLCAnaW1hcCcsICdwb3Az JywgJ2Z0cCddLCBoZWxwPSdQcm90b2NvbCBuZWVkcyBzcGVjaWFsIHN0YXJ0IHByb2NlZHVyZSwg cmVxdWlyZXMgcHJvdG9jb2wgbmFtZS4nKQorCXBhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvdG9j b2wnLCBhY3Rpb249J3N0b3JlJywgY2hvaWNlcz1bJ3RjcCcsJ3VkcCcsJ3NjdHAnXSwgZGVmYXVs dD0ndGNwJywgaGVscD0nVGhlIHByb3RvY29sIHRoZSBUTFMgc2VydmljZSBpcyB1c2luZyAoZGVm YXVsdDogJShkZWZhdWx0KXMpLicpCisJcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vbmx5LXJyJywg YWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nT25seSB2ZXJpZnkgdGhhdCB0aGUgVExTQSByZXNv dXJjZSByZWNvcmQgaXMgY29ycmVjdCAoZG8gbm90IGNoZWNrIGNlcnRpZmljYXRlKScpCisJcGFy c2VyLmFkZF9hcmd1bWVudCgnLS1yb290a2V5JywgbWV0YXZhcj0nL1BBVEgvVE8vUk9PVC5LRVkn LCBhY3Rpb249J3N0b3JlJywgaGVscD0nU3BlY2lmeSBmaWxlIGxvY2F0aW9uIGNvbnRhaW5pbmcg dGhlIEROU1NFQyByb290IGtleScpCisKKwlpZiBvcy5wYXRoLmlzZGlyKCIvZXRjL3BraS90bHMv Y2VydHMvIik6CisJCWNhZGlyID0gIi9ldGMvcGtpL3Rscy9jZXJ0cy8iCisJZWxpZiBvcy5wYXRo LmlzZGlyKCIvZXRjL3NzbC9jZXJ0cy8iKToKKwkJY2FkaXIgPSAiL2V0Yy9zc2wvY2VydHMvIgor CWVsc2U6CisJCWNhZGlyID0gIi4iCisJCXByaW50ICgid2FybmluZzogbm8gc3lzdGVtIHdpZGUg Q0FkaXIgZm91bmQsIHVzaW5nIGN1cnJlbnQgZGlyZWN0b3J5IikKKworCXBhcnNlci5hZGRfYXJn dW1lbnQoJy0tY2EtY2VydCcsIG1ldGF2YXI9Jy9QQVRIL1RPL0NFUlRTVE9SRScsIGFjdGlvbj0n c3RvcmUnLCBkZWZhdWx0ID0gY2FkaXIsIGhlbHA9J1BhdGggdG8gYSBDQSBjZXJ0aWZpY2F0ZSBv ciBhIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBjZXJ0aWZpY2F0ZXMgKGRlZmF1bHQ6ICUoZGVm YXVsdClzKScpCisJcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kZWJ1ZycsICctZCcsIGFjdGlvbj0n c3RvcmVfdHJ1ZScsIGhlbHA9J1ByaW50IGRldGFpbHMgcGx1cyB0aGUgcmVzdWx0IG9mIHRoZSB2 YWxpZGF0aW9uJykKKwlwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXF1aWV0JywgJy1xJywgYWN0aW9u PSdzdG9yZV90cnVlJywgaGVscD0nSWdub3JlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkn KQorCisJcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jZXJ0aWZpY2F0ZScsIGhlbHA9J1RoZSBjZXJ0 aWZpY2F0ZSB1c2VkIGZvciB0aGUgaG9zdC4gSWYgY2VydGlmaWNhdGUgaXMgZW1wdHksIHRoZSBj ZXJ0aWZpY2F0ZSB3aWxsIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgc2VydmVyJykKKwlwYXJzZXIu YWRkX2FyZ3VtZW50KCctLW91dHB1dCcsICctbycsIGFjdGlvbj0nc3RvcmUnLCBkZWZhdWx0PSdy ZmMnLCBjaG9pY2VzPVsnZ2VuZXJpYycsJ3JmYycsJ2JvdGgnXSwgaGVscD0nVGhlIHR5cGUgb2Yg b3V0cHV0LiBHZW5lcmljIChSRkMgMzU5NywgVFlQRTUyKSwgUkZDIChUTFNBKSBvciBib3RoIChk ZWZhdWx0OiAlKGRlZmF1bHQpcykuJykKKworCSMgVXNhZ2Ugb2YgdGhlIGNlcnRpZmljYXRlCisJ cGFyc2VyLmFkZF9hcmd1bWVudCgnLS11c2FnZScsICctdScsIGFjdGlvbj0nc3RvcmUnLCB0eXBl PWludCwgZGVmYXVsdD0zLCBjaG9pY2VzPVswLDEsMiwzXSwgaGVscD0nVGhlIFVzYWdlIG9mIHRo ZSBDZXJ0aWZpY2F0ZSBmb3IgQXNzb2NpYXRpb24uIFwnMFwnIGZvciBDQSBbUEtJWC1DQV0sIFwn MVwnIGZvciBFbmQgRW50aXR5IFtQS0lYLUVFXSwgXCcyXCcgZm9yIHRydXN0LWFuY2hvciBbREFO RS1UQV0sIFwnM1wnIGZvciBPTkxZIEVuZC1FbnRpdHkgbWF0Y2ggW0RBTkUtRUVdIChkZWZhdWx0 OiAlKGRlZmF1bHQpcykuJykKKwlwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNlbGVjdG9yJywgJy1z JywgYWN0aW9uPSdzdG9yZScsIHR5cGU9aW50LCBkZWZhdWx0PTAsIGNob2ljZXM9WzAsMV0sIGhl bHA9J1RoZSBTZWxlY3RvciBmb3IgdGhlIENlcnRpZmljYXRlIGZvciBBc3NvY2lhdGlvbi4gXCcw XCcgZm9yIEZ1bGwgQ2VydGlmaWNhdGUgW0NlcnRdLCBcJzFcJyBmb3IgU3ViamVjdFB1YmxpY0tl eUluZm8gW1NQS0ldIChkZWZhdWx0OiAlKGRlZmF1bHQpcykuJykKKwlwYXJzZXIuYWRkX2FyZ3Vt ZW50KCctLW10eXBlJywgJy1tJywgYWN0aW9uPSdzdG9yZScsIHR5cGU9aW50LCBkZWZhdWx0PTEs IGNob2ljZXM9WzAsMSwyXSwgaGVscD0nVGhlIE1hdGNoaW5nIFR5cGUgb2YgdGhlIENlcnRpZmlj YXRlIGZvciBBc3NvY2lhdGlvbi4gXCcwXCcgZm9yIEV4YWN0IG1hdGNoLCBcJzFcJyBmb3IgU0hB LTI1NiBoYXNoLCBcJzJcJyBmb3IgU0hBLTUxMiAoZGVmYXVsdDogJShkZWZhdWx0KXMpLicpCisK KwlhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisJaWYgYXJncy5yb290a2V5OgorCQlpZiBv cy5wYXRoLmlzZmlsZShhcmdzLnJvb3RrZXkpOgorCQkJUk9PVEtFWSA9IGFyZ3Mucm9vdGtleQor CQllbHNlOgorCQkJcHJpbnQoImlnbm9yZWQgc3BlY2lmaWVkIG5vbi1leGlzdGluZyByb290a2V5 IGZpbGUgJXMiJWFyZ3Mucm9vdGtleSkKKworCSMgY2hlY2sgd2hldGhlciBpdCdzIEFTQ0lJIG9y IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIFB1bm55Y29kZQorCXRyeToKKwkJYXJncy5ob3N0 LmVuY29kZSgnYXNjaWknKQorCWV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisJCWFyZ3MuaG9z dCA9IHN0cihhcmdzLmhvc3QuZW5jb2RlKCdpZG5hJyksICd1dGYtOCcpCisKKwlpZiBhcmdzLmhv c3RbLTFdICE9ICcuJzoKKwkJYXJncy5ob3N0ICs9ICcuJworCXNuaWhvc3QgPSBhcmdzLmhvc3Rb MDotMV0KKworCWlmIG5vdCBhcmdzLnN0YXJ0dGxzOgorCQlpZiBhcmdzLnBvcnQgPT0gIjI1IiBv ciBhcmdzLnBvcnQgPT0gIjU4NyI6CisJCQlhcmdzLnN0YXJ0dGxzID0gInNtdHAiCisJCWVsaWYg YXJncy5wb3J0ID09ICIxNDMiOgorCQkJYXJncy5zdGFydHRscyA9ICJpbWFwIgorCQllbGlmIGFy Z3MucG9ydCA9PSAiMTEwIjoKKwkJCWFyZ3Muc3RhcnR0bHMgPSAicG9wMyIKKwkJZWxpZiBhcmdz LnBvcnQgPT0gIjIxIjoKKwkJCWFyZ3Muc3RhcnR0bHMgPSAiZnRwIgorCWVsaWYgYXJncy5zdGFy dHRscyA9PSAibm8iOgorCQlhcmdzLnN0YXJ0dGxzID0gTm9uZQorCisJZ2xvYmFsIHJlc29sdmNv bmYKKwlpZiBhcmdzLnJlc29sdmNvbmY6CisJCWlmIG9zLnBhdGguaXNmaWxlKGFyZ3MucmVzb2x2 Y29uZik6CisJCQlyZXNvbHZjb25mID0gYXJncy5yZXNvbHZjb25mCisJCWVsc2U6CisJCQlwcmlu dCgnJXMgaXMgbm90IGEgZmlsZS4gVW5hYmxlIHRvIHVzZSBpdCBhcyByZXNvbHYuY29uZicgJSBh cmdzLnJlc29sdmNvbmYsIGZpbGU9c3lzLnN0ZG91dCkKKwkJCXN5cy5leGl0KDEpCisJZWxzZToK KwkJcmVzb2x2Y29uZiA9IE5vbmUKKworCSMgbm90IG9wZXJhdGlvbnMgYXJlIGZ1biEKKwlzZWN1 cmUgPSBub3QgYXJncy5pbnNlY3VyZQorCisJaWYgYXJncy52ZXJpZnk6CisJCXJlY29yZHMgPSBn ZXRUTFNBKGFyZ3MuaG9zdCwgYXJncy5wb3J0LCBhcmdzLnByb3RvY29sLCBzZWN1cmUpCisJCWlm IGxlbihyZWNvcmRzKSA9PSAwOgorCQkJc3lzLmV4aXQoMSkKKwkJcHJlX2V4aXQgPSAwCisJCWZv ciByZWNvcmQgaW4gcmVjb3JkczoKKwkJCSMgRmlyc3QsIGNoZWNrIGlmIHRoZSBmaXJzdCB0aHJl ZSBmaWVsZHMgaGF2ZSBjb3JyZWN0IHZhbHVlcy4KKwkJCWlmIGFyZ3MuZGVidWc6CisJCQkJcHJp bnQoJ1JlY2VpdmVkIHRoZSBmb2xsb3dpbmcgcmVjb3JkIGZvciBuYW1lICVzOicgJSByZWNvcmQu bmFtZSkKKwkJCQlwcmludCgnXHRVc2FnZTpcdFx0XHRcdCVkICglcyknICUgKHJlY29yZC51c2Fn ZSwgezA6J0NBIENvbnN0cmFpbnQgW1BLSVgtQ0FdJywgMTonRW5kLUVudGl0eSBDb25zdHJhaW50 ICsgY2hhaW4gdG8gQ0EgW1BLSVgtRUVdJywgMjonVHJ1c3QgQW5jaG9yIFtEQU5FLVRBXScsIDM6 J0VuZC1FbnRpdHkgW0RBTkUtRUVdJ30uZ2V0KHJlY29yZC51c2FnZSwgJ0lOVkFMSUQnKSkpCisJ CQkJcHJpbnQoJ1x0U2VsZWN0b3I6XHRcdFx0JWQgKCVzKScgJSAocmVjb3JkLnNlbGVjdG9yLCB7 MDonQ2VydGlmaWNhdGUgW0NlcnRdJywgMTonU3ViamVjdFB1YmxpY0tleUluZm8gW1NQS0ldJ30u Z2V0KHJlY29yZC5zZWxlY3RvciwgJ0lOVkFMSUQnKSkpCisJCQkJcHJpbnQoJ1x0TWF0Y2hpbmcg VHlwZTpcdFx0XHQlZCAoJXMpJyAlIChyZWNvcmQubXR5cGUsIHswOidGdWxsIENlcnRpZmljYXRl JywgMTonU0hBLTI1NicsIDI6J1NIQS01MTInfS5nZXQocmVjb3JkLm10eXBlLCAnSU5WQUxJRCcp KSkKKwkJCQlwcmludCgnXHRDZXJ0aWZpY2F0ZSBmb3IgQXNzb2NpYXRpb246XHQlcycgJSByZWNv cmQuY2VydCkKKworCQkJdHJ5OgorCQkJCXJlY29yZC5pc1ZhbGlkKHJhaXNlRXhjZXB0aW9uPVRy dWUpCisJCQlleGNlcHQgUmVjb3JkVmFsaWRpdHlFeGNlcHRpb24gYXMgZToKKwkJCQlwcmludCgn RXJyb3I6ICVzJyAlIHN0cihlKSwgZmlsZT1zeXMuc3RkZXJyKQorCQkJCWNvbnRpbnVlCisJCQll bHNlOgorCQkJCWlmIGFyZ3MuZGVidWc6CisJCQkJCXByaW50KCdUaGlzIHJlY29yZCBpcyB2YWxp ZCAod2VsbC1mb3JtZWQpLicpCisKKwkJCWlmIGFyZ3Mub25seV9ycjoKKwkJCQkjIEdvIHRvIHRo ZSBuZXh0IHJlY29yZAorCQkJCWNvbnRpbnVlCisKKwkJCSMgV2hlbiB3ZSBhcmUgaGVyZSwgVGhl IHVzZXIgYWxzbyB3YW50cyB0byB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlcyB3aXRoIHRoZSByZWNv cmQKKwkJCWlmIGFyZ3MucHJvdG9jb2wgIT0gJ3RjcCc6CisJCQkJcHJpbnQoJ09ubHkgU1NMIG92 ZXIgVENQIGlzIHN1cHBvcnRlZCAoc29ycnkpJywgZmlsZT1zeXMuc3RkZXJyKQorCQkJCXN5cy5l eGl0KDApCisKKwkJCWlmIGFyZ3MuZGVidWc6CisJCQkJcHJpbnQoJ0F0dGVtcHRpbmcgdG8gdmVy aWZ5IHRoZSByZWNvcmQgd2l0aCB0aGUgVExTIHNlcnZpY2UuLi4nKQorCisJCQlpZiBub3QgYXJn cy5pcHY0IGFuZCBub3QgYXJncy5pcHY2OgorCQkJCWFkZHJlc3NlcyA9IGdldEEoYXJncy5ob3N0 LCBzZWN1cmU9c2VjdXJlKSArIGdldEFBQUEoYXJncy5ob3N0LCBzZWN1cmU9c2VjdXJlKQorCQkJ ZWxpZiBhcmdzLmlwdjQ6CisJCQkJYWRkcmVzc2VzID0gZ2V0QShhcmdzLmhvc3QsIHNlY3VyZT1z ZWN1cmUpCisJCQllbHNlOgorCQkJCWFkZHJlc3NlcyA9IGdldEFBQUEoYXJncy5ob3N0LCBzZWN1 cmU9c2VjdXJlKQorCisJCQlpZiBhcmdzLmNlcnRpZmljYXRlOgorCQkJCXRyeToKKwkJCQkJY2hh aW4sIHZlcmlmeV9yZXN1bHQgPSBnZXRMb2NhbENoYWluKGFyZ3MuY2VydGlmaWNhdGUsIGFyZ3Mu ZGVidWcpCisJCQkJCXByZV9leGl0ID0gdmVyaWZ5Q2hhaW4ocmVjb3JkLCBjaGFpbiwgdmVyaWZ5 X3Jlc3VsdCwgcHJlX2V4aXQsIFRydWUsIGFyZ3MuY2VydGlmaWNhdGUpCisJCQkJZXhjZXB0IEV4 Y2VwdGlvbiBhcyBlOgorCQkJCQlwcmludCgnQ291bGQgbm90IHZlcmlmeSBsb2NhbCBjZXJ0aWZp Y2F0ZTogJXMuJyAlIGUpCisJCQkJCXN5cy5leGl0KDApCisJCQlmb3IgYWRkcmVzcyBpbiBhZGRy ZXNzZXM6CisJCQkJaWYgYXJncy5kZWJ1ZzoKKwkJCQkJcHJpbnQoJ0dvdCB0aGUgZm9sbG93aW5n IElQOiAlcycgJSBzdHIoYWRkcmVzcykpCisJCQkJIyBXZSBkbyB0aGUgY2VydGlmaWNhdGUgaGFu ZGxpbmcgaGVyZSwgYXMgTTJDcnlwdG8ga2VlcHMgc2VnZmF1bHRpbmcgd2hlbiB3ZSBkbyBpdCBp biBhIG1ldGhvZAorCQkJCWN0eCA9IFNTTC5Db250ZXh0KCkKKwkJCQlpZiBvcy5wYXRoLmlzZmls ZShhcmdzLmNhX2NlcnQpOgorCQkJCQlpZiBjdHgubG9hZF92ZXJpZnlfbG9jYXRpb25zKGNhZmls ZT1hcmdzLmNhX2NlcnQpICE9IDE6IHJhaXNlIEV4Y2VwdGlvbignTm8gQ0EgY2VydCcpCisJCQkJ ZWxpZiBvcy5wYXRoLmV4aXN0cyhhcmdzLmNhX2NlcnQpOgorCQkJCQlpZiBjdHgubG9hZF92ZXJp ZnlfbG9jYXRpb25zKGNhcGF0aD1hcmdzLmNhX2NlcnQpICE9IDE6IHJhaXNlIEV4Y2VwdGlvbign Tm8gQ0EgY2VydHMnKQorCQkJCWVsc2U6CisJCQkJCXByaW50KCclcyBpcyBuZWl0aGVyIGEgZmls ZSBub3IgYSBkaXJlY3RvcnksIHVuYWJsZSB0byBjb250aW51ZScgJSBhcmdzLmNhX2NlcnQsIGZp bGU9c3lzLnN0ZGVycikKKwkJCQkJc3lzLmV4aXQoMSkKKwkJCQkjIERvbid0IGVycm9yIHdoZW4g dGhlIHZlcmlmaWNhdGlvbiBmYWlscyBpbiB0aGUgU1NMIGhhbmRzaGFrZQorCQkJCWN0eC5zZXRf dmVyaWZ5KFNTTC52ZXJpZnlfbm9uZSwgZGVwdGg9OSkKKwkJCQlpZiBpc2luc3RhbmNlKGFkZHJl c3MsIEFBQUFSZWNvcmQpOgorCQkJCQlzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5F VDYsIHNvY2tldC5TT0NLX1NUUkVBTSkKKwkJCQkJc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xf U09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorCQkJCWVsc2U6CisJCQkJCXNvY2sgPSBO b25lCisJCQkJY29ubmVjdGlvbiA9IFNTTC5Db25uZWN0aW9uKGN0eCwgc29jaz1zb2NrKQorCQkJ CXRyeToKKwkJCQkJY29ubmVjdGlvbi5zZXRfdGxzZXh0X2hvc3RfbmFtZShzbmlob3N0KQorCQkJ CQlpZihhcmdzLmRlYnVnKToKKwkJCQkJCXByaW50KCdEaWQgc2V0IHNlcnZlcm5hbWUgJXMnICUg c25paG9zdCkKKwkJCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6CisJCQkJCXByaW50KCdDb3VsZCBu b3Qgc2V0IFNOSSAob2xkIE0yQ3J5cHRvIHZlcnNpb24/KScpCisJCQkJZXhjZXB0OgorCQkJCQlw cmludCgnQ291bGQgbm90IHNldCBTTkknKQorCQkJCXRyeToKKwkJCQkJaWYgYXJncy5zdGFydHRs czoKKwkJCQkJCXNzbFN0YXJ0VExTQ29ubmVjdChjb25uZWN0aW9uLCAoc3RyKGFkZHJlc3MpLCBp bnQoYXJncy5wb3J0KSksIGFyZ3Muc3RhcnR0bHMpCisJCQkJCQkjY29ubmVjdGlvbi5jb25uZWN0 KChzdHIoYWRkcmVzcyksIGludChhcmdzLnBvcnQpKSwgYXJncy5zdGFydHRscykKKwkJCQkJZWxz ZToKKwkJCQkJCWNvbm5lY3Rpb24uY29ubmVjdCgoc3RyKGFkZHJlc3MpLCBpbnQoYXJncy5wb3J0 KSkpCisJCQkJI2V4Y2VwdCBUeXBlRXJyb3I6CisJCQkJIwlwcmludCAnQ2Fubm90IGNvbm5lY3Qg dG8gJXMgKG9sZCBNMkNyeXB0byB2ZXJzaW9uIG5vdCBzdXBwb3J0aW5nIHN0YXJ0IHNjcmlwdD8p JyAlIGFkZHJlc3MKKwkJCQkjCWNvbnRpbnVlCisJCQkJZXhjZXB0IFNTTC5DaGVja2VyLldyb25n SG9zdCBhcyBlOgorCQkJCQkjIFRoZSBuYW1lIG9uIHRoZSByZW1vdGUgY2VydCBkb2Vzbid0IG1h dGNoIHRoZSBob3N0bmFtZSBiZWNhdXNlIHdlIGNvbm5lY3Qgb24gSVAsIG5vdCBob3N0bmFtZSAo YXMgd2Ugd2FudCBzZWN1cmUgbG9va3VwKQorCQkJCQlwYXNzCisJCQkJZXhjZXB0IHNvY2tldC5l cnJvciBhcyBlOgorCQkJCQlwcmludCgnQ2Fubm90IGNvbm5lY3QgdG8gJXM6ICVzJyAlIChhZGRy ZXNzLCBzdHIoZSkpKQorCQkJCQljb250aW51ZQorCQkJCWNoYWluID0gY29ubmVjdGlvbi5nZXRf cGVlcl9jZXJ0X2NoYWluKCkKKwkJCQl2ZXJpZnlfcmVzdWx0ID0gY29ubmVjdGlvbi5nZXRfdmVy aWZ5X3Jlc3VsdCgpCisKKwkJCQkjIEdvb2QsIG5vdyBsZXQncyB2ZXJpZnkKKwkJCQlwcmVfZXhp dCA9IHZlcmlmeUNoYWluKHJlY29yZCwgY2hhaW4sIHZlcmlmeV9yZXN1bHQsIHByZV9leGl0LCBG YWxzZSwgYWRkcmVzcykKKwkJCQkjIENsZWFudXAsIGp1c3QgaW4gY2FzZQorCQkJCWNvbm5lY3Rp b24uY2xlYXIoKQorCQkJCWNvbm5lY3Rpb24uY2xvc2UoKQorCQkJCWN0eC5jbG9zZSgpCisKKwkJ CSMgRU5EIGZvciBhZGRyZXNzIGluIGFkZHJlc3NlcworCQkjIEVORCBmb3IgcmVjb3JkIGluIHJl Y29yZHMKKwkJc3lzLmV4aXQocHJlX2V4aXQpCisJIyBFTkQgaWYgYXJncy52ZXJpZnkKKworCWVs c2U6ICMgd2Ugd2FudCB0byBjcmVhdGUKKwkJY2VydCA9IE5vbmUKKwkJaWYgbm90IGFyZ3MuY2Vy dGlmaWNhdGU6CisJCQlpZiBhcmdzLnByb3RvY29sICE9ICd0Y3AnOgorCQkJCXByaW50KCdPbmx5 IFNTTCBvdmVyIFRDUCBpcyBzdXBwb3J0ZWQgKHNvcnJ5KScsIGZpbGU9c3lzLnN0ZGVycikKKwkJ CQlzeXMuZXhpdCgxKQorCQkJaWYgYXJncy5kZWJ1ZzoKKwkJCQlwcmludCgnTm8gY2VydGlmaWNh dGUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBp dCBmcm9tIHRoZSBzZXJ2ZXIgJXMnICUgKGFyZ3MuaG9zdCkpCisJCQljb25uZWN0aW9uX3BvcnQg PSBhcmdzLnBvcnQKKwkJCWlmIGFyZ3MucG9ydCA9PSAnKic6CisJCQkJc3lzLnN0ZG91dC53cml0 ZSgnVGhlIHBvcnQgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSBpcyAqLCBwbGVhc2Ugc3Bl Y2lmeSB0aGUgcG9ydCBvZiB0aGUgVExTIHNlcnZpY2Ugb24gJXMgKDQ0Myk6ICcgJSBhcmdzLmhv c3QpCisJCQkJaW5wdXRfb2sgPSBGYWxzZQorCQkJCXdoaWxlIG5vdCBpbnB1dF9vazoKKwkJCQkJ dXNlcl9pbnB1dCA9IGlucHV0KCkKKwkJCQkJaWYgdXNlcl9pbnB1dCA9PSAnJzoKKwkJCQkJCWNv bm5lY3Rpb25fcG9ydCA9IDQ0MworCQkJCQkJYnJlYWsKKwkJCQkJdHJ5OgorCQkJCQkJaWYgMSA8 PSBpbnQodXNlcl9pbnB1dCkgPD0gNjU1MzU6CisJCQkJCQkJY29ubmVjdGlvbl9wb3J0ID0gdXNl cl9pbnB1dAorCQkJCQkJCWlucHV0X29rID0gVHJ1ZQorCQkJCQlleGNlcHQ6CisJCQkJCQlzeXMu c3Rkb3V0LndyaXRlKCdQb3J0ICVzIG5vdCBudW1lcmljYWwgb3Igd2l0aGluIGNvcnJlY3QgcmFu Z2UgKDEgPD0gcG9ydCA8PSA2NTUzNSksIHRyeSBhZ2FpbiAoaGl0IGVudGVyIGZvciBkZWZhdWx0 IDQ0Myk6ICcgJSB1c2VyX2lucHV0KQorCQkJIyBHZXQgdGhlIGFkZHJlc3MgcmVjb3JkcyBmb3Ig dGhlIGhvc3QKKwkJCXRyeToKKwkJCQkjYWRkcmVzc2VzID0gZ2V0QShhcmdzLmhvc3QsIHNlY3Vy ZT1zZWN1cmUpICsgZ2V0QUFBQShhcmdzLmhvc3QsIHNlY3VyZT1zZWN1cmUpCisJCQkJaWYgbm90 IGFyZ3MuaXB2NCBhbmQgbm90IGFyZ3MuaXB2NjoKKwkJCQkJYWRkcmVzc2VzID0gZ2V0QShhcmdz Lmhvc3QsIHNlY3VyZT1zZWN1cmUpICsgZ2V0QUFBQShhcmdzLmhvc3QsIHNlY3VyZT1zZWN1cmUp CisKKwkJCQllbGlmIGFyZ3MuaXB2NDoKKwkJCQkJYWRkcmVzc2VzID0gZ2V0QShhcmdzLmhvc3Qs IHNlY3VyZT1zZWN1cmUpCisJCQkJZWxzZToKKwkJCQkJYWRkcmVzc2VzID0gZ2V0QUFBQShhcmdz Lmhvc3QsIHNlY3VyZT1zZWN1cmUpCisKKwkJCWV4Y2VwdCBJbnNlY3VyZUxvb2t1cEV4Y2VwdGlv biBhcyBlOgorCQkJCXByaW50KHN0cihlKSwgZmlsZT1zeXMuc3RkZXJyKQorCQkJCXN5cy5leGl0 KDEpCisKKwkJCWZvciBhZGRyZXNzIGluIGFkZHJlc3NlczoKKwkJCQlpZiBhcmdzLmRlYnVnOgor CQkJCQlwcmludCgnQXR0ZW1wdGluZyB0byBnZXQgY2VydGlmaWNhdGUgZnJvbSAlcycgJSBzdHIo YWRkcmVzcykpCisJCQkJIyBXZSBkbyB0aGUgY2VydGlmaWNhdGUgaGFuZGxpbmcgaGVyZSwgYXMg TTJDcnlwdG8ga2VlcHMgc2VnZmF1bHRpbmcgd2hlbiB0cnkgdG8gZG8gc3R1ZmYgd2l0aCB0aGUg Y2VydCBpZiB3ZSBkb24ndAorCQkJCWN0eCA9IFNTTC5Db250ZXh0KCkKKwkJCQljdHguc2V0X3Zl cmlmeShTU0wudmVyaWZ5X25vbmUsIGRlcHRoPTkpCisJCQkJaWYgaXNpbnN0YW5jZShhZGRyZXNz LCBBQUFBUmVjb3JkKToKKwkJCQkJc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQ2 LCBzb2NrZXQuU09DS19TVFJFQU0pCisJCQkJCXNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NP Q0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKwkJCQllbHNlOgorCQkJCQlzb2NrID0gTm9u ZQorCQkJCWNvbm5lY3Rpb24gPSBTU0wuQ29ubmVjdGlvbihjdHgsIHNvY2s9c29jaykKKwkJCQl0 cnk6CisJCQkJCWNvbm5lY3Rpb24uc2V0X3Rsc2V4dF9ob3N0X25hbWUoc25paG9zdCkKKwkJCQkJ aWYoYXJncy5kZWJ1Zyk6CisJCQkJCQlwcmludCgnRGlkIHNldCBzZXJ2ZXJuYW1lICVzJyAlIHNu aWhvc3QpCisJCQkJZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorCQkJCQlwcmludCgnQ291bGQgbm90 IHNldCBTTkkgKG9sZCBNMkNyeXB0byB2ZXJzaW9uPyknKQorCQkJCWV4Y2VwdDoKKwkJCQkJcHJp bnQoJ0NvdWxkIG5vdCBzZXQgU05JJykKKwkJCQl0cnk6CisJCQkJCWlmIGFyZ3Muc3RhcnR0bHM6 CisJCQkJCQlzc2xTdGFydFRMU0Nvbm5lY3QoY29ubmVjdGlvbiwgKHN0cihhZGRyZXNzKSwgaW50 KGNvbm5lY3Rpb25fcG9ydCkpLCBhcmdzLnN0YXJ0dGxzKQorCQkJCQkJI2Nvbm5lY3Rpb24uY29u bmVjdCgoc3RyKGFkZHJlc3MpLCBpbnQoY29ubmVjdGlvbl9wb3J0KSksIGFyZ3Muc3RhcnR0bHMp CisJCQkJCWVsc2U6CisJCQkJCQljb25uZWN0aW9uLmNvbm5lY3QoKHN0cihhZGRyZXNzKSwgaW50 KGNvbm5lY3Rpb25fcG9ydCkpKQorCQkJCSNleGNlcHQgVHlwZUVycm9yOgorCQkJCSMJcHJpbnQg J0Nhbm5vdCBjb25uZWN0IHRvICVzIChvbGQgTTJDcnlwdG8gdmVyc2lvbiBub3Qgc3VwcG9ydGlu ZyBzdGFydCBzY3JpcHQ/KScgJSBhZGRyZXNzCisJCQkJIwljb250aW51ZQorCQkJCWV4Y2VwdCBT U0wuQ2hlY2tlci5Xcm9uZ0hvc3Q6CisJCQkJCXBhc3MKKwkJCQlleGNlcHQgc29ja2V0LmVycm9y IGFzIGU6CisJCQkJCXByaW50KCdDYW5ub3QgY29ubmVjdCB0byAlczogJXMnICUgKGFkZHJlc3Ms IHN0cihlKSkpCisJCQkJCWNvbnRpbnVlCisKKwkJCQljaGFpbiA9IGNvbm5lY3Rpb24uZ2V0X3Bl ZXJfY2VydF9jaGFpbigpCisJCQkJaWYgbm90IHZlcmlmeUNlcnROYW1lV2l0aEhvc3ROYW1lKGNl cnQ9Y2hhaW5bMF0sIGhvc3RuYW1lPXN0cihhcmdzLmhvc3QpLCB3aXRoX21zZz1hcmdzLmRlYnVn KToKKwkJCQkJcHJpbnQoJ1dBUk5JTkc6IENlcnRpZmljYXRlIG5hbWUgZG9lcyBub3QgbWF0Y2gg dGhlIGhvc3RuYW1lJykKKwkJCQlnZW5SZWNvcmRzKGFyZ3MuaG9zdCwgYWRkcmVzcywgYXJncy5w cm90b2NvbCwgYXJncy5wb3J0LCBjaGFpbiwgYXJncy5vdXRwdXQsIGFyZ3MudXNhZ2UsIGFyZ3Mu c2VsZWN0b3IsIGFyZ3MubXR5cGUpCisJCQkJIyBDbGVhbnVwIHRoZSBjb25uZWN0aW9uIGFuZCBj b250ZXh0CisJCQkJY29ubmVjdGlvbi5jbGVhcigpCisJCQkJY29ubmVjdGlvbi5jbG9zZSgpCisJ CQkJY3R4LmNsb3NlKCkKKworCQllbHNlOiAjIFBhc3MgdGhlIHBhdGggdG8gdGhlIGNlcnRpZmlj YXRlIHRvIHRoZSBnZW5UTFNBIGZ1bmN0aW9uCisJCQl0cnk6CisJCQkJY2hhaW4sIHZlcmlmeV9y ZXN1bHQgPSBnZXRMb2NhbENoYWluKGFyZ3MuY2VydGlmaWNhdGUsIGFyZ3MuZGVidWcpCisJCQkJ aWYgYXJncy51c2FnZSA9PSAwIG9yIGFyZ3MudXNhZ2UgPT0gMSBhbmQgbm90IHZlcmlmeV9yZXN1 bHQ6CisJCQkJCXByaW50KCdGb2xsb3dpbmcgZXJyb3Igd2FzIHJhaXNlZCBkdXJpbmcgUEtJWCB2 YWxpZGF0aW9uOiAlcycgJSB2ZXJpZnlfcmVzdWx0KQorCQkJCWdlblJlY29yZHMoYXJncy5ob3N0 LCBhcmdzLmhvc3QsIGFyZ3MucHJvdG9jb2wsIGFyZ3MucG9ydCwgY2hhaW4sIGFyZ3Mub3V0cHV0 LCBhcmdzLnVzYWdlLCBhcmdzLnNlbGVjdG9yLCBhcmdzLm10eXBlKQorCQkJZXhjZXB0IEV4Y2Vw dGlvbiBhcyBlOgorCQkJCXByaW50KCdDb3VsZCBub3QgdmVyaWZ5IGxvY2FsIGNlcnRpZmljYXRl OiAlcy4nICUgZSkK