ZGlmZiAtLWdpdCBhL0xpYi90YXJmaWxlLnB5IGIvTGliL3RhcmZpbGUucHkKaW5kZXggNTRiYjFiOC4uYjZkYzNlZSAxMDA2NDQKLS0tIGEvTGliL3RhcmZpbGUucHkKKysrIGIvTGliL3RhcmZpbGUucHkKQEAgLTMzLDcgKzMzLDcgQEAKIF9fdmVyc2lvbl9fID0gIiRSZXZpc2lvbiQiCiAjICRTb3VyY2UkCiAKLXZlcnNpb24gICAgID0gIjAuOC4wIgordmVyc2lvbiAgICAgPSAiMC45LjAiCiBfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCiBfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCiBfX2N2c2lkX18gICA9ICIkSWQkIgpAQCAtNTAsNiArNTAsNyBAQAogaW1wb3J0IHRpbWUKIGltcG9ydCBzdHJ1Y3QKIGltcG9ydCBjb3B5CitpbXBvcnQgcmUKIAogaWYgc3lzLnBsYXRmb3JtID09ICdtYWMnOgogICAgICMgVGhpcyBtb2R1bGUgbmVlZHMgd29yayBmb3IgTWFjT1M5LCBlc3BlY2lhbGx5IGluIHRoZSBhcmVhIG9mIHBhdGhuYW1lCkBAIC02OSw0MiArNzAsNjAgQEAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgdGFyIGNvbnN0YW50cwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTlVMICAgICAgICA9ICJcMCIgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgotQkxPQ0tTSVpFICA9IDUxMiAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcworTlVMID0gIlwwIiAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBudWxsIGNoYXJhY3RlcgorQkxPQ0tTSVpFID0gNTEyICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBwcm9jZXNzaW5nIGJsb2NrcwogUkVDT1JEU0laRSA9IEJMT0NLU0laRSAqIDIwICAgICAjIGxlbmd0aCBvZiByZWNvcmRzCi1NQUdJQyAgICAgID0gInVzdGFyIiAgICAgICAgICAgICMgbWFnaWMgdGFyIHN0cmluZwotVkVSU0lPTiAgICA9ICIwMCIgICAgICAgICAgICAgICAjIHZlcnNpb24gbnVtYmVyCitHTlVfTUFHSUMgPSAidXN0YXIgIFwwIiAgICAgICAgICMgbWFnaWMgZ251IHRhciBzdHJpbmcKK1BPU0lYX01BR0lDID0gInVzdGFyXHgwMDAwIiAgICAgIyBtYWdpYyBwb3NpeCB0YXIgc3RyaW5nCiAKLUxFTkdUSF9OQU1FICAgID0gMTAwICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiBhIGZpbGVuYW1lCi1MRU5HVEhfTElOSyAgICA9IDEwMCAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBsaW5rbmFtZQotTEVOR1RIX1BSRUZJWCAgPSAxNTUgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBwcmVmaXggZmllbGQKLU1BWFNJWkVfTUVNQkVSID0gMDc3Nzc3Nzc3Nzc3TCAgIyBtYXhpbXVtIHNpemUgb2YgYSBmaWxlICgxMSBvY3RhbCBkaWdpdHMpCitMRU5HVEhfTkFNRSA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQorTEVOR1RIX0xJTksgPSAxMDAgICAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgbGlua25hbWUKK0xFTkdUSF9QUkVGSVggPSAxNTUgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJlZml4IGZpZWxkCiAKLVJFR1RZUEUgID0gIjAiICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKK1JFR1RZUEUgPSAiMCIgICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKIEFSRUdUWVBFID0gIlwwIiAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKLUxOS1RZUEUgID0gIjEiICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKLVNZTVRZUEUgID0gIjIiICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCi1DSFJUWVBFICA9ICIzIiAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCi1CTEtUWVBFICA9ICI0IiAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKLURJUlRZUEUgID0gIjUiICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKK0xOS1RZUEUgPSAiMSIgICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKK1NZTVRZUEUgPSAiMiIgICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCitDSFJUWVBFID0gIjMiICAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCitCTEtUWVBFID0gIjQiICAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKK0RJUlRZUEUgPSAiNSIgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKIEZJRk9UWVBFID0gIjYiICAgICAgICAgICAgICAgICAgIyBmaWZvIHNwZWNpYWwgZGV2aWNlCiBDT05UVFlQRSA9ICI3IiAgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCiAKLUdOVVRZUEVfTE9OR05BTUUgPSAiTCIgICAgICAgICAgIyBHTlUgdGFyIGV4dGVuc2lvbiBmb3IgbG9uZ25hbWVzCi1HTlVUWVBFX0xPTkdMSU5LID0gIksiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIGxvbmdsaW5rCi1HTlVUWVBFX1NQQVJTRSAgID0gIlMiICAgICAgICAgICMgR05VIHRhciBleHRlbnNpb24gZm9yIHNwYXJzZSBmaWxlCitHTlVUWVBFX0xPTkdOQU1FID0gIkwiICAgICAgICAgICMgR05VIHRhciBsb25nbmFtZQorR05VVFlQRV9MT05HTElOSyA9ICJLIiAgICAgICAgICAjIEdOVSB0YXIgbG9uZ2xpbmsKK0dOVVRZUEVfU1BBUlNFID0gIlMiICAgICAgICAgICAgIyBHTlUgdGFyIHNwYXJzZSBmaWxlCisKK1hIRFRZUEUgPSAieCIgICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZXh0ZW5kZWQgaGVhZGVyCitYR0xUWVBFID0gImciICAgICAgICAgICAgICAgICAgICMgUE9TSVguMS0yMDAxIGdsb2JhbCBoZWFkZXIKK1NPTEFSSVNfWEhEVFlQRSA9ICJYIiAgICAgICAgICAgIyBTb2xhcmlzIGV4dGVuZGVkIGhlYWRlcgorCitVU1RBUl9GT1JNQVQgPSAwICAgICAgICAgICAgICAgICMgUE9TSVguMS0xOTg4ICh1c3RhcikgZm9ybWF0CitHTlVfRk9STUFUID0gMSAgICAgICAgICAgICAgICAgICMgR05VIHRhciBmb3JtYXQKK1BBWF9GT1JNQVQgPSAyICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgKHBheCkgZm9ybWF0CitERUZBVUxUX0ZPUk1BVCA9IEdOVV9GT1JNQVQKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB0YXJmaWxlIGNvbnN0YW50cwogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLCAgIyBmaWxlIHR5cGVzIHRoYXQgdGFyZmlsZQotICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLCAgIyBjYW4gY29wZSB3aXRoLgorIyBGaWxlIHR5cGVzIHRoYXQgdGFyZmlsZSBzdXBwb3J0czoKK1NVUFBPUlRFRF9UWVBFUyA9IChSRUdUWVBFLCBBUkVHVFlQRSwgTE5LVFlQRSwKKyAgICAgICAgICAgICAgICAgICBTWU1UWVBFLCBESVJUWVBFLCBGSUZPVFlQRSwKICAgICAgICAgICAgICAgICAgICBDT05UVFlQRSwgQ0hSVFlQRSwgQkxLVFlQRSwKICAgICAgICAgICAgICAgICAgICBHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAogICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQogCi1SRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCAgICAgICAgICAgICAjIGZpbGUgdHlwZXMgdGhhdCBzb21laG93Ci0gICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkgICAgICAjIHJlcHJlc2VudCByZWd1bGFyIGZpbGVzCisjIEZpbGUgdHlwZXMgdGhhdCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCitSRUdVTEFSX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLAorICAgICAgICAgICAgICAgICBDT05UVFlQRSwgR05VVFlQRV9TUEFSU0UpCisKKyMgRmlsZSB0eXBlcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBHTlUgdGFyIGZvcm1hdC4KK0dOVV9UWVBFUyA9IChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LLAorICAgICAgICAgICAgIEdOVVRZUEVfU1BBUlNFKQorCisjIEZpZWxkcyBmcm9tIGEgcGF4IGhlYWRlciB0aGF0IG92ZXJyaWRlIGEgVGFySW5mbyBhdHRyaWJ1dGUuCitQQVhfRklFTERTID0gKCJwYXRoIiwgImxpbmtwYXRoIiwgInNpemUiLCAibXRpbWUiLAorICAgICAgICAgICAgICAidWlkIiwgImdpZCIsICJ1bmFtZSIsICJnbmFtZSIpCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQml0cyB1c2VkIGluIHRoZSBtb2RlIGZpZWxkLCB2YWx1ZXMgaW4gb2N0YWwuCkBAIC0xMzEsNiArMTUwLDEzIEBACiBUT0VYRUMgID0gMDAwMSAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvdGhlcgogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGluaXRpYWxpemF0aW9uCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitFTkNPRElORyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQoraWYgRU5DT0RJTkcgaXMgTm9uZToKKyAgICBFTkNPRElORyA9ICJhc2NpaSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTM5LDYgKzE2NSwxNSBAQAogICAgICIiIgogICAgIHJldHVybiBzWzpsZW5ndGhdICsgKGxlbmd0aCAtIGxlbihzKSkgKiBOVUwKIAorZGVmIG50cyhzKToKKyAgICAiIiJDb252ZXJ0IGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBmaWVsZCB0byBhIHB5dGhvbiBzdHJpbmcuCisgICAgIiIiCisgICAgIyBVc2UgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgbnVsbCBjaGFyLgorICAgIHAgPSBzLmZpbmQoIlwwIikKKyAgICBpZiBwID09IC0xOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiBzWzpwXQorCiBkZWYgbnRpKHMpOgogICAgICIiIkNvbnZlcnQgYSBudW1iZXIgZmllbGQgdG8gYSBweXRob24gbnVtYmVyLgogICAgICIiIgpAQCAtMTQ2LDcgKzE4MSw3IEBACiAgICAgIyBpdG4oKSBiZWxvdy4KICAgICBpZiBzWzBdICE9IGNocigwMjAwKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgbiA9IGludChzLnJzdHJpcChOVUwgKyAiICIpIG9yICIwIiwgOCkKKyAgICAgICAgICAgIG4gPSBpbnQobnRzKHMpIG9yICIwIiwgOCkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICByYWlzZSBIZWFkZXJFcnJvcigiaW52YWxpZCBoZWFkZXIiKQogICAgIGVsc2U6CkBAIC0xNTYsNyArMTkxLDcgQEAKICAgICAgICAgICAgIG4gKz0gb3JkKHNbaSArIDFdKQogICAgIHJldHVybiBuCiAKLWRlZiBpdG4obiwgZGlnaXRzPTgsIHBvc2l4PUZhbHNlKToKK2RlZiBpdG4obiwgZGlnaXRzPTgsIGZvcm1hdD1ERUZBVUxUX0ZPUk1BVCk6CiAgICAgIiIiQ29udmVydCBhIHB5dGhvbiBudW1iZXIgdG8gYSBudW1iZXIgZmllbGQuCiAgICAgIiIiCiAgICAgIyBQT1NJWCAxMDAzLjEtMTk4OCByZXF1aXJlcyBudW1iZXJzIHRvIGJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YKQEAgLTE2OCw3ICsyMDMsNyBAQAogICAgIGlmIDAgPD0gbiA8IDggKiogKGRpZ2l0cyAtIDEpOgogICAgICAgICBzID0gIiUwKm8iICUgKGRpZ2l0cyAtIDEsIG4pICsgTlVMCiAgICAgZWxzZToKLSAgICAgICAgaWYgcG9zaXg6CisgICAgICAgIGlmIGZvcm1hdCAhPSBHTlVfRk9STUFUIG9yIG4gPj0gMjU2ICoqIChkaWdpdHMgLSAxKToKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm92ZXJmbG93IGluIG51bWJlciBmaWVsZCIpCiAKICAgICAgICAgaWYgbiA8IDA6CkBAIC01MTQsNyArNTQ5LDEwIEBACiAgICAgICAgICAgICBidWYgPSBzZWxmLl9fcmVhZChzZWxmLmJ1ZnNpemUpCiAgICAgICAgICAgICBpZiBub3QgYnVmOgogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNtcC5kZWNvbXByZXNzKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigiaW52YWxpZCBjb21wcmVzc2VkIGRhdGEiKQogICAgICAgICAgICAgdC5hcHBlbmQoYnVmKQogICAgICAgICAgICAgYyArPSBsZW4oYnVmKQogICAgICAgICB0ID0gIiIuam9pbih0KQpAQCAtNTc1LDYgKzYxMyw3IEBACiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUpOgogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLmZpbGVvYmosICJuYW1lIiwgTm9uZSkKICAgICAgICAgc2VsZi5pbml0KCkKIAogICAgIGRlZiBpbml0KHNlbGYpOgpAQCAtODQ3LDggKzg4Niw4IEBACiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0LiBuYW1lIGlzIHRoZSBvcHRpb25hbCBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lIChkaXJuYW1lcyBtdXN0IGVuZCB3aXRoICcvJykKLSAgICAgICAgc2VsZi5tb2RlID0gMDY2NiAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUgICAgICAgICMgbWVtYmVyIG5hbWUKKyAgICAgICAgc2VsZi5tb2RlID0gMDY0NCAgICAgICAgIyBmaWxlIHBlcm1pc3Npb25zCiAgICAgICAgIHNlbGYudWlkID0gMCAgICAgICAgICAgICMgdXNlciBpZAogICAgICAgICBzZWxmLmdpZCA9IDAgICAgICAgICAgICAjIGdyb3VwIGlkCiAgICAgICAgIHNlbGYuc2l6ZSA9IDAgICAgICAgICAgICMgZmlsZSBzaXplCkBAIC04NTYsMTcgKzg5NSwyNzQgQEAKICAgICAgICAgc2VsZi5jaGtzdW0gPSAwICAgICAgICAgIyBoZWFkZXIgY2hlY2tzdW0KICAgICAgICAgc2VsZi50eXBlID0gUkVHVFlQRSAgICAgIyBtZW1iZXIgdHlwZQogICAgICAgICBzZWxmLmxpbmtuYW1lID0gIiIgICAgICAjIGxpbmsgbmFtZQotICAgICAgICBzZWxmLnVuYW1lID0gInVzZXIiICAgICAjIHVzZXIgbmFtZQotICAgICAgICBzZWxmLmduYW1lID0gImdyb3VwIiAgICAjIGdyb3VwIG5hbWUKKyAgICAgICAgc2VsZi51bmFtZSA9ICJyb290IiAgICAgIyB1c2VyIG5hbWUKKyAgICAgICAgc2VsZi5nbmFtZSA9ICJyb290IiAgICAgIyBncm91cCBuYW1lCiAgICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgogICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAjIGRldmljZSBtaW5vciBudW1iZXIKIAogICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCiAgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCiAKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBwYXggaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAjIEluIHBheCBoZWFkZXJzIHRoZSAibmFtZSIgYW5kICJsaW5rbmFtZSIgZmllbGQgYXJlIGNhbGxlZAorICAgICMgInBhdGgiIGFuZCAibGlua3BhdGgiLgorICAgIGRlZiBfZ2V0cGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBfc2V0cGF0aChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHBhdGggPSBwcm9wZXJ0eShfZ2V0cGF0aCwgX3NldHBhdGgpCisKKyAgICBkZWYgX2dldGxpbmtwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saW5rbmFtZQorICAgIGRlZiBfc2V0bGlua3BhdGgoc2VsZiwgbGlua25hbWUpOgorICAgICAgICBzZWxmLmxpbmtuYW1lID0gbGlua25hbWUKKyAgICBsaW5rcGF0aCA9IHByb3BlcnR5KF9nZXRsaW5rcGF0aCwgX3NldGxpbmtwYXRoKQorCiAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCiAKKyAgICBkZWYgZ2V0X2luZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHsKKyAgICAgICAgICAgICJuYW1lIjogICAgIG5vcm1wYXRoKHNlbGYubmFtZSksCisgICAgICAgICAgICAibW9kZSI6ICAgICBzZWxmLm1vZGUgJiAwNzc3NywKKyAgICAgICAgICAgICJ1aWQiOiAgICAgIHNlbGYudWlkLAorICAgICAgICAgICAgImdpZCI6ICAgICAgc2VsZi5naWQsCisgICAgICAgICAgICAic2l6ZSI6ICAgICBzZWxmLnNpemUsCisgICAgICAgICAgICAibXRpbWUiOiAgICBzZWxmLm10aW1lLAorICAgICAgICAgICAgImNoa3N1bSI6ICAgc2VsZi5jaGtzdW0sCisgICAgICAgICAgICAidHlwZSI6ICAgICBzZWxmLnR5cGUsCisgICAgICAgICAgICAibGlua25hbWUiOiBub3JtcGF0aChzZWxmLmxpbmtuYW1lKSBpZiBzZWxmLmxpbmtuYW1lIGVsc2UgIiIsCisgICAgICAgICAgICAidW5hbWUiOiAgICBzZWxmLnVuYW1lLAorICAgICAgICAgICAgImduYW1lIjogICAgc2VsZi5nbmFtZSwKKyAgICAgICAgICAgICJkZXZtYWpvciI6IHNlbGYuZGV2bWFqb3IsCisgICAgICAgICAgICAiZGV2bWlub3IiOiBzZWxmLmRldm1pbm9yCisgICAgICAgIH0KKworICAgICAgICBpZiBpbmZvWyJ0eXBlIl0gPT0gRElSVFlQRSBhbmQgbm90IGluZm9bIm5hbWUiXS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgorCisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICBkZWYgdG9idWYoc2VsZiwgZm9ybWF0PURFRkFVTFRfRk9STUFULCBlbmNvZGluZz1FTkNPRElORyk6CisgICAgICAgICIiIlJldHVybiBhIHRhciBoZWFkZXIgYXMgYSBzdHJpbmcgb2YgNTEyIGJ5dGUgYmxvY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoKQorICAgICAgICBlbGlmIGZvcm1hdCA9PSBHTlVfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2dudV9oZWFkZXIoKQorICAgICAgICBlbGlmIGZvcm1hdCA9PSBQQVhfRk9STUFUOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX3BheF9oZWFkZXIoZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGZvcm1hdCIpCisKKyAgICBkZWYgY3JlYXRlX3VzdGFyX2hlYWRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQworCisgICAgICAgIGlmIGxlbihpbmZvWyJsaW5rbmFtZSJdKSA+IExFTkdUSF9MSU5LOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibGlua25hbWUgaXMgdG9vIGxvbmciKQorCisgICAgICAgIGlmIGxlbihpbmZvWyJuYW1lIl0pID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKQorCisgICAgZGVmIGNyZWF0ZV9nbnVfaGVhZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIEdOVSBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICBpbmZvID0gc2VsZi5nZXRfaW5mbygpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKKworICAgICAgICBidWYgPSAiIgorICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bImxpbmtuYW1lIl0sIEdOVVRZUEVfTE9OR0xJTkspCisKKyAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bIm5hbWUiXSwgR05VVFlQRV9MT05HTkFNRSkKKworICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBHTlVfRk9STUFUKQorCisgICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvYmplY3QgYXMgYSB1c3RhciBoZWFkZXIgYmxvY2suIElmIGl0IGNhbm5vdCBiZQorICAgICAgICAgICByZXByZXNlbnRlZCB0aGlzIHdheSwgcHJlcGVuZCBhIHBheCBleHRlbmRlZCBoZWFkZXIgc2VxdWVuY2UKKyAgICAgICAgICAgd2l0aCBzdXBwbGVtZW50IGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHNlbGYuZ2V0X2luZm8oKQorICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKKyAgICAgICAgcGF4X2hlYWRlcnMgPSBzZWxmLnBheF9oZWFkZXJzLmNvcHkoKQorCisgICAgICAgICMgVGVzdCBzdHJpbmcgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxlbmd0aCBvciBjYW5ub3QKKyAgICAgICAgIyBiZSByZXByZXNlbnRlZCBpbiBBU0NJSSBlbmNvZGluZy4KKyAgICAgICAgZm9yIG5hbWUsIGhuYW1lLCBsZW5ndGggaW4gKAorICAgICAgICAgICAgICAgICgibmFtZSIsICJwYXRoIiwgTEVOR1RIX05BTUUpLCAoImxpbmtuYW1lIiwgImxpbmtwYXRoIiwgTEVOR1RIX0xJTkspLAorICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgorCisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdLmRlY29kZShlbmNvZGluZykKKworICAgICAgICAgICAgIyBUcnkgdG8gZW5jb2RlIHRoZSBzdHJpbmcgYXMgQVNDSUkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBsZW4odmFsKSA+IGxlbmd0aDoKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJuYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgIyBUcnkgdG8gc3F1ZWV6ZSBhIGxvbmduYW1lIGluIHRoZSBwcmVmaXggYW5kIG5hbWUgZmllbGRzIGFzIGluCisgICAgICAgICAgICAgICAgICAgICMgdXN0YXIgZm9ybWF0LgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvWyJwcmVmaXgiXSwgaW5mb1sibmFtZSJdID0gc2VsZi5fcG9zaXhfc3BsaXRfbmFtZShpbmZvWyJuYW1lIl0pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF4X2hlYWRlcnNbaG5hbWVdID0gdmFsCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAorCisgICAgICAgICMgVGVzdCBudW1iZXIgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxpbWl0IG9yIHZhbHVlcworICAgICAgICAjIHRoYXQgbGlrZSB0byBiZSBzdG9yZWQgYXMgZmxvYXQuCisgICAgICAgIGZvciBuYW1lLCBkaWdpdHMgaW4gKCgidWlkIiwgOCksICgiZ2lkIiwgOCksICgic2l6ZSIsIDEyKSwgKCJtdGltZSIsIDEyKSk6CisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdCisgICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gdW5pY29kZSh2YWwpCisgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKKworICAgICAgICBpZiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYgPSAiIgorCisgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgZW5jb2RpbmcpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHBheCBnbG9iYWwgaGVhZGVyIGJsb2NrIHNlcXVlbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbmV3X2hlYWRlcnMgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWwgaW4gcGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBrZXkgPSBjbHMuX3RvX3VuaWNvZGUoa2V5LCBlbmNvZGluZykKKyAgICAgICAgICAgIHZhbCA9IGNscy5fdG9fdW5pY29kZSh2YWwsIGVuY29kaW5nKQorICAgICAgICAgICAgbmV3X2hlYWRlcnNba2V5XSA9IHZhbAorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKG5ld19oZWFkZXJzLCB0eXBlPVhHTFRZUEUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF90b191bmljb2RlKHZhbHVlLCBlbmNvZGluZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZywgZmxvYXQpKToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZSh2YWx1ZSwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmFibGUgdG8gY29udmVydCB0byB1bmljb2RlOiAlciIgJSB2YWx1ZSkKKworICAgIGRlZiBfcG9zaXhfc3BsaXRfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiU3BsaXQgYSBuYW1lIGxvbmdlciB0aGFuIDEwMCBjaGFycyBpbnRvIGEgcHJlZml4CisgICAgICAgICAgIGFuZCBhIG5hbWUgcGFydC4KKyAgICAgICAgIiIiCisgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQorICAgICAgICB3aGlsZSBwcmVmaXggYW5kIHByZWZpeFstMV0gIT0gIi8iOgorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KKworICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCisgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgaWYgbm90IHByZWZpeCBvciBsZW4obmFtZSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQorICAgICAgICByZXR1cm4gcHJlZml4LCBuYW1lCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfaGVhZGVyKGluZm8sIGZvcm1hdCk6CisgICAgICAgICIiIlJldHVybiBhIGhlYWRlciBibG9jay4gaW5mbyBpcyBhIGRpY3Rpb25hcnkgd2l0aCBmaWxlCisgICAgICAgICAgIGluZm9ybWF0aW9uLCBmb3JtYXQgbXVzdCBiZSBvbmUgb2YgdGhlICpfRk9STUFUIGNvbnN0YW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gWworICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtb2RlIiwgMCkgJiAwNzc3NywgOCwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgidWlkIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImdpZCIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJzaXplIiwgMCksIDEyLCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJtdGltZSIsIDApLCAxMiwgZm9ybWF0KSwKKyAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKKyAgICAgICAgICAgIGluZm8uZ2V0KCJ0eXBlIiwgUkVHVFlQRSksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImxpbmtuYW1lIiwgIiIpLCAxMDApLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJtYWdpYyIsICIiKSwgOCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInVuYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoImduYW1lIiwgIiIpLCAzMiksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1ham9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoImRldm1pbm9yIiwgMCksIDgsIGZvcm1hdCksCisgICAgICAgICAgICBzdG4oaW5mby5nZXQoInByZWZpeCIsICIiKSwgMTU1KQorICAgICAgICBdCisKKyAgICAgICAgYnVmID0gc3RydWN0LnBhY2soIiVkcyIgJSBCTE9DS1NJWkUsICIiLmpvaW4ocGFydHMpKQorICAgICAgICBjaGtzdW0gPSBjYWxjX2Noa3N1bXMoYnVmWy1CTE9DS1NJWkU6XSlbMF0KKyAgICAgICAgYnVmID0gYnVmWzotMzY0XSArICIlMDZvXDAiICUgY2hrc3VtICsgYnVmWy0zNTc6XQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfcGF5bG9hZChwYXlsb2FkKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJpbmcgcGF5bG9hZCBmaWxsZWQgd2l0aCB6ZXJvIGJ5dGVzCisgICAgICAgICAgIHVwIHRvIHRoZSBuZXh0IDUxMiBieXRlIGJvcmRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGxlbihwYXlsb2FkKSwgQkxPQ0tTSVpFKQorICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgcGF5bG9hZCArPSAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSAqIE5VTAorICAgICAgICByZXR1cm4gcGF5bG9hZAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGNscywgbmFtZSwgdHlwZSk6CisgICAgICAgICIiIlJldHVybiBhIEdOVVRZUEVfTE9OR05BTUUgb3IgR05VVFlQRV9MT05HTElOSyBzZXF1ZW5jZQorICAgICAgICAgICBmb3IgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgKz0gTlVMCisKKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQExvbmdMaW5rIgorICAgICAgICBpbmZvWyJ0eXBlIl0gPSB0eXBlCisgICAgICAgIGluZm9bInNpemUiXSA9IGxlbihuYW1lKQorICAgICAgICBpbmZvWyJtYWdpYyJdID0gR05VX01BR0lDCisKKyAgICAgICAgIyBjcmVhdGUgZXh0ZW5kZWQgaGVhZGVyICsgbmFtZSBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKG5hbWUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIoY2xzLCBwYXhfaGVhZGVycywgdHlwZT1YSERUWVBFKToKKyAgICAgICAgIiIiUmV0dXJuIGEgUE9TSVguMS0yMDAxIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgc2VxdWVuY2UKKyAgICAgICAgICAgdGhhdCBjb250YWlucyBhIGxpc3Qgb2Yga2V5d29yZCwgdmFsdWUgcGFpcnMuIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgbXVzdCBiZSB1bmljb2RlIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICByZWNvcmRzID0gW10KKyAgICAgICAgZm9yIGtleXdvcmQsIHZhbHVlIGluIHBheF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAga2V5d29yZCA9IGtleXdvcmQuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKCJ1dGY4IikKKyAgICAgICAgICAgIGwgPSBsZW4oa2V5d29yZCkgKyBsZW4odmFsdWUpICsgMyAgICMgJyAnICsgJz0nICsgJ1xuJworICAgICAgICAgICAgbiA9IHAgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIG4gPSBsICsgbGVuKHN0cihwKSkKKyAgICAgICAgICAgICAgICBpZiBuID09IHA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcCA9IG4KKyAgICAgICAgICAgIHJlY29yZHMuYXBwZW5kKCIlZCAlcz0lc1xuIiAlIChwLCBrZXl3b3JkLCB2YWx1ZSkpCisgICAgICAgIHJlY29yZHMgPSAiIi5qb2luKHJlY29yZHMpCisKKyAgICAgICAgIyBXZSB1c2UgYSBoYXJkY29kZWQgIi4vLi9AUGF4SGVhZGVyIiBuYW1lIGxpa2Ugc3RhciBkb2VzCisgICAgICAgICMgaW5zdGVhZCBvZiB0aGUgb25lIHRoYXQgUE9TSVggcmVjb21tZW5kcy4KKyAgICAgICAgaW5mbyA9IHt9CisgICAgICAgIGluZm9bIm5hbWUiXSA9ICIuLy4vQFBheEhlYWRlciIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4ocmVjb3JkcykKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgIyBDcmVhdGUgcGF4IGhlYWRlciArIHJlY29yZCBibG9ja3MuCisgICAgICAgIHJldHVybiBjbHMuX2NyZWF0ZV9oZWFkZXIoaW5mbywgVVNUQVJfRk9STUFUKSArIFwKKyAgICAgICAgICAgICAgICBjbHMuX2NyZWF0ZV9wYXlsb2FkKHJlY29yZHMpCisKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgZnJvbWJ1ZihjbHMsIGJ1Zik6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0IGZyb20gYSA1MTIgYnl0ZSBzdHJpbmcgYnVmZmVyLgpAQCAtODgwLDEyNSArMTE3NiwyNTEgQEAKICAgICAgICAgaWYgY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKICAgICAgICAgICAgIHJhaXNlIEhlYWRlckVycm9yKCJiYWQgY2hlY2tzdW0iKQogCi0gICAgICAgIHRhcmluZm8gPSBjbHMoKQotICAgICAgICB0YXJpbmZvLmJ1ZiA9IGJ1ZgotICAgICAgICB0YXJpbmZvLm5hbWUgPSBidWZbMDoxMDBdLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCi0gICAgICAgIHRhcmluZm8udWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKLSAgICAgICAgdGFyaW5mby5naWQgPSBudGkoYnVmWzExNjoxMjRdKQotICAgICAgICB0YXJpbmZvLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQotICAgICAgICB0YXJpbmZvLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKLSAgICAgICAgdGFyaW5mby5jaGtzdW0gPSBjaGtzdW0KLSAgICAgICAgdGFyaW5mby50eXBlID0gYnVmWzE1NjoxNTddCi0gICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBidWZbMTU3OjI1N10ucnN0cmlwKE5VTCkKLSAgICAgICAgdGFyaW5mby51bmFtZSA9IGJ1ZlsyNjU6Mjk3XS5yc3RyaXAoTlVMKQotICAgICAgICB0YXJpbmZvLmduYW1lID0gYnVmWzI5NzozMjldLnJzdHJpcChOVUwpCi0gICAgICAgIHRhcmluZm8uZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQotICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gbnRpKGJ1ZlszMzc6MzQ1XSkKLSAgICAgICAgcHJlZml4ID0gYnVmWzM0NTo1MDBdLnJzdHJpcChOVUwpCisgICAgICAgIG9iaiA9IGNscygpCisgICAgICAgIG9iai5idWYgPSBidWYKKyAgICAgICAgb2JqLm5hbWUgPSBudHMoYnVmWzA6MTAwXSkKKyAgICAgICAgb2JqLm1vZGUgPSBudGkoYnVmWzEwMDoxMDhdKQorICAgICAgICBvYmoudWlkID0gbnRpKGJ1ZlsxMDg6MTE2XSkKKyAgICAgICAgb2JqLmdpZCA9IG50aShidWZbMTE2OjEyNF0pCisgICAgICAgIG9iai5zaXplID0gbnRpKGJ1ZlsxMjQ6MTM2XSkKKyAgICAgICAgb2JqLm10aW1lID0gbnRpKGJ1ZlsxMzY6MTQ4XSkKKyAgICAgICAgb2JqLmNoa3N1bSA9IGNoa3N1bQorICAgICAgICBvYmoudHlwZSA9IGJ1ZlsxNTY6MTU3XQorICAgICAgICBvYmoubGlua25hbWUgPSBudHMoYnVmWzE1NzoyNTddKQorICAgICAgICBvYmoudW5hbWUgPSBudHMoYnVmWzI2NToyOTddKQorICAgICAgICBvYmouZ25hbWUgPSBudHMoYnVmWzI5NzozMjldKQorICAgICAgICBvYmouZGV2bWFqb3IgPSBudGkoYnVmWzMyOTozMzddKQorICAgICAgICBvYmouZGV2bWlub3IgPSBudGkoYnVmWzMzNzozNDVdKQorICAgICAgICBwcmVmaXggPSBudHMoYnVmWzM0NTo1MDBdKQogCi0gICAgICAgIGlmIHByZWZpeCBhbmQgbm90IHRhcmluZm8uaXNzcGFyc2UoKToKLSAgICAgICAgICAgIHRhcmluZm8ubmFtZSA9IHByZWZpeCArICIvIiArIHRhcmluZm8ubmFtZQorICAgICAgICAjIE9sZCBWNyB0YXIgZm9ybWF0IHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCisgICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCisgICAgICAgIGlmIG9iai50eXBlID09IEFSRUdUWVBFIGFuZCBvYmoubmFtZS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgb2JqLnR5cGUgPSBESVJUWVBFCiAKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KKyAgICAgICAgIyBSZW1vdmUgcmVkdW5kYW50IHNsYXNoZXMgZnJvbSBkaXJlY3Rvcmllcy4KKyAgICAgICAgaWYgb2JqLmlzZGlyKCk6CisgICAgICAgICAgICBvYmoubmFtZSA9IG9iai5uYW1lLnJzdHJpcCgiLyIpCiAKLSAgICBkZWYgdG9idWYoc2VsZiwgcG9zaXg9RmFsc2UpOgotICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KKyAgICAgICAgIyBSZWNvbnN0cnVjdCBhIHVzdGFyIGxvbmduYW1lLgorICAgICAgICBpZiBwcmVmaXggYW5kIG9iai50eXBlIG5vdCBpbiBHTlVfVFlQRVM6CisgICAgICAgICAgICBvYmoubmFtZSA9IHByZWZpeCArICIvIiArIG9iai5uYW1lCisgICAgICAgIHJldHVybiBvYmoKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tdGFyZmlsZShjbHMsIHRhcmZpbGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgVGFySW5mbyBvYmplY3QgZnJvbSBUYXJGaWxlIG9iamVjdAorICAgICAgICAgICB0YXJmaWxlLgogICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gIiIKLSAgICAgICAgdHlwZSA9IHNlbGYudHlwZQotICAgICAgICBwcmVmaXggPSAiIgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmKQorICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQorICAgICAgICByZXR1cm4gb2JqLl9wcm9jX21lbWJlcih0YXJmaWxlKQogCi0gICAgICAgIGlmIHNlbGYubmFtZS5lbmRzd2l0aCgiLyIpOgotICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKLQotICAgICAgICBpZiB0eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKLSAgICAgICAgICAgICMgUHJldmVudCAiLi8uL0BMb25nTGluayIgZnJvbSBiZWluZyBub3JtYWxpemVkLgotICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgbmFtZSA9IG5vcm1wYXRoKHNlbGYubmFtZSkKLQotICAgICAgICBpZiB0eXBlID09IERJUlRZUEU6Ci0gICAgICAgICAgICAjIGRpcmVjdG9yaWVzIHNob3VsZCBlbmQgd2l0aCAnLycKLSAgICAgICAgICAgIG5hbWUgKz0gIi8iCi0KLSAgICAgICAgbGlua25hbWUgPSBzZWxmLmxpbmtuYW1lCi0gICAgICAgIGlmIGxpbmtuYW1lOgotICAgICAgICAgICAgIyBpZiBsaW5rbmFtZSBpcyBlbXB0eSB3ZSBlbmQgdXAgd2l0aCBhICcuJwotICAgICAgICAgICAgbGlua25hbWUgPSBub3JtcGF0aChsaW5rbmFtZSkKLQotICAgICAgICBpZiBwb3NpeDoKLSAgICAgICAgICAgIGlmIHNlbGYuc2l6ZSA+IE1BWFNJWkVfTUVNQkVSOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImZpbGUgaXMgdG9vIGxhcmdlICg+PSA4IEdCKSIpCi0KLSAgICAgICAgICAgIGlmIGxlbihzZWxmLmxpbmtuYW1lKSA+IExFTkdUSF9MSU5LOgotICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxpbmtuYW1lIGlzIHRvbyBsb25nICg+JWQpIiAlIChMRU5HVEhfTElOSykpCi0KLSAgICAgICAgICAgIGlmIGxlbihuYW1lKSA+IExFTkdUSF9OQU1FOgotICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVbOkxFTkdUSF9QUkVGSVggKyAxXQotICAgICAgICAgICAgICAgIHdoaWxlIHByZWZpeCBhbmQgcHJlZml4Wy0xXSAhPSAiLyI6Ci0gICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCi0KLSAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVtsZW4ocHJlZml4KTpdCi0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4WzotMV0KLQotICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5hbWUgaXMgdG9vIGxvbmciKQotCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5rbmFtZSkgPiBMRU5HVEhfTElOSzoKLSAgICAgICAgICAgICAgICBidWYgKz0gc2VsZi5fY3JlYXRlX2dudWxvbmcoc2VsZi5saW5rbmFtZSwgR05VVFlQRV9MT05HTElOSykKLQotICAgICAgICAgICAgaWYgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6Ci0gICAgICAgICAgICAgICAgYnVmICs9IHNlbGYuX2NyZWF0ZV9nbnVsb25nKG5hbWUsIEdOVVRZUEVfTE9OR05BTUUpCi0KLSAgICAgICAgcGFydHMgPSBbCi0gICAgICAgICAgICBzdG4obmFtZSwgMTAwKSwKLSAgICAgICAgICAgIGl0bihzZWxmLm1vZGUgJiAwNzc3NywgOCwgcG9zaXgpLAotICAgICAgICAgICAgaXRuKHNlbGYudWlkLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5naWQsIDgsIHBvc2l4KSwKLSAgICAgICAgICAgIGl0bihzZWxmLnNpemUsIDEyLCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5tdGltZSwgMTIsIHBvc2l4KSwKLSAgICAgICAgICAgICIgICAgICAgICIsICMgY2hlY2tzdW0gZmllbGQKLSAgICAgICAgICAgIHR5cGUsCi0gICAgICAgICAgICBzdG4oc2VsZi5saW5rbmFtZSwgMTAwKSwKLSAgICAgICAgICAgIHN0bihNQUdJQywgNiksCi0gICAgICAgICAgICBzdG4oVkVSU0lPTiwgMiksCi0gICAgICAgICAgICBzdG4oc2VsZi51bmFtZSwgMzIpLAotICAgICAgICAgICAgc3RuKHNlbGYuZ25hbWUsIDMyKSwKLSAgICAgICAgICAgIGl0bihzZWxmLmRldm1ham9yLCA4LCBwb3NpeCksCi0gICAgICAgICAgICBpdG4oc2VsZi5kZXZtaW5vciwgOCwgcG9zaXgpLAotICAgICAgICAgICAgc3RuKHByZWZpeCwgMTU1KQotICAgICAgICBdCi0KLSAgICAgICAgYnVmICs9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKLSAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCi0gICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlstMzU3Ol0KLSAgICAgICAgc2VsZi5idWYgPSBidWYKLSAgICAgICAgcmV0dXJuIGJ1ZgotCi0gICAgZGVmIF9jcmVhdGVfZ251bG9uZyhzZWxmLCBuYW1lLCB0eXBlKToKLSAgICAgICAgIiIiQ3JlYXRlIGEgR05VIGxvbmduYW1lL2xvbmdsaW5rIGhlYWRlciBmcm9tIG5hbWUuCi0gICAgICAgICAgIEl0IGNvbnNpc3RzIG9mIGFuIGV4dGVuZGVkIHRhciBoZWFkZXIsIHdpdGggdGhlIGxlbmd0aAotICAgICAgICAgICBvZiB0aGUgbG9uZ25hbWUgYXMgc2l6ZSwgZm9sbG93ZWQgYnkgZGF0YSBibG9ja3MsCi0gICAgICAgICAgIHdoaWNoIGNvbnRhaW4gdGhlIGxvbmduYW1lIGFzIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZy4KKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBhCisgICAgIyBtZW1iZXIuIFRoZSBlbnRyeSBwb2ludCBpcyBfcHJvY19tZW1iZXIoKSB3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBhZGQgY3VzdG9tIF9wcm9jXyooKSBtZXRob2RzLiBBIF9wcm9jXyooKSBtZXRob2QgTVVTVAorICAgICMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcKKyAgICAjIG9wZXJhdGlvbnM6CisgICAgIyAxLiBTZXQgc2VsZi5vZmZzZXRfZGF0YSB0byB0aGUgcG9zaXRpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGJlZ2luLAorICAgICMgICAgaWYgdGhlcmUgaXMgZGF0YSB0aGF0IGZvbGxvd3MuCisgICAgIyAyLiBTZXQgdGFyZmlsZS5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBuZXh0IG1lbWJlcidzIGhlYWRlciB3aWxsCisgICAgIyAgICBiZWdpbi4KKyAgICAjIDMuIFJldHVybiBzZWxmIG9yIGFub3RoZXIgdmFsaWQgVGFySW5mbyBvYmplY3QuCisgICAgZGVmIF9wcm9jX21lbWJlcihzZWxmLCB0YXJmaWxlKToKKyAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBkZXBlbmRpbmcgb24KKyAgICAgICAgICAgdGhlIHR5cGUgYW5kIGNhbGwgaXQuCiAgICAgICAgICIiIgotICAgICAgICBuYW1lICs9IE5VTAorICAgICAgICBpZiBzZWxmLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfZ251bG9uZyh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX1NQQVJTRToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3NwYXJzZSh0YXJmaWxlKQorICAgICAgICBlbGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgWEdMVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX3BheCh0YXJmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2NfYnVpbHRpbih0YXJmaWxlKQogCi0gICAgICAgIHRhcmluZm8gPSBzZWxmLl9fY2xhc3NfXygpCi0gICAgICAgIHRhcmluZm8ubmFtZSA9ICIuLy4vQExvbmdMaW5rIgotICAgICAgICB0YXJpbmZvLnR5cGUgPSB0eXBlCi0gICAgICAgIHRhcmluZm8ubW9kZSA9IDAKLSAgICAgICAgdGFyaW5mby5zaXplID0gbGVuKG5hbWUpCisgICAgZGVmIF9wcm9jX2J1aWx0aW4oc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBidWlsdGluIHR5cGUgb3IgYW4gdW5rbm93biB0eXBlIHdoaWNoCisgICAgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSB0YXJmaWxlLmZpbGVvYmoudGVsbCgpCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0X2RhdGEKKyAgICAgICAgaWYgc2VsZi5pc3JlZygpIG9yIHNlbGYudHlwZSBub3QgaW4gU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICAgICAgIyBTa2lwIHRoZSBmb2xsb3dpbmcgZGF0YSBibG9ja3MuCisgICAgICAgICAgICBvZmZzZXQgKz0gc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICB0YXJmaWxlLm9mZnNldCA9IG9mZnNldAogCi0gICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlcgotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKCkKLSAgICAgICAgIyBjcmVhdGUgbmFtZSBibG9ja3MKLSAgICAgICAgYnVmICs9IG5hbWUKLSAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKG5hbWUpLCBCTE9DS1NJWkUpCi0gICAgICAgIGlmIHJlbWFpbmRlciA+IDA6Ci0gICAgICAgICAgICBidWYgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKLSAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGV4dGVuZGVkCisgICAgICAgICMgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBmb3Iga2V5d29yZCwgdmFsdWUgaW4gdGFyZmlsZS5wYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQorICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfcHJvY19nbnVsb25nKHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCisgICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCisKKyAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCisgICAgICAgIGIgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgIHQgPSBzZWxmLmZyb21idWYoYikKKyAgICAgICAgdC5vZmZzZXQgPSBzZWxmLm9mZnNldAorICAgICAgICBuZXh0ID0gdC5fcHJvY19tZW1iZXIodGFyZmlsZSkKKworICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBuZXh0IGhlYWRlciB3aXRoCisgICAgICAgICMgdGhlIGxvbmduYW1lIGluZm9ybWF0aW9uLgorICAgICAgICBuZXh0Lm9mZnNldCA9IHNlbGYub2Zmc2V0CisgICAgICAgIGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdOQU1FOgorICAgICAgICAgICAgbmV4dC5uYW1lID0gYnVmLnJzdHJpcChOVUwpCisgICAgICAgIGVsaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR0xJTks6CisgICAgICAgICAgICBuZXh0LmxpbmtuYW1lID0gYnVmLnJzdHJpcChOVUwpCisKKyAgICAgICAgcmV0dXJuIG5leHQKKworICAgIGRlZiBfcHJvY19zcGFyc2Uoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCisgICAgICAgICIiIgorICAgICAgICBidWYgPSBzZWxmLmJ1ZgorICAgICAgICBzcCA9IF9yaW5nYnVmZmVyKCkKKyAgICAgICAgcG9zID0gMzg2CisgICAgICAgIGxhc3Rwb3MgPSAwTAorICAgICAgICByZWFscG9zID0gMEwKKyAgICAgICAgIyBUaGVyZSBhcmUgNCBwb3NzaWJsZSBzcGFyc2Ugc3RydWN0cyBpbiB0aGUKKyAgICAgICAgIyBmaXJzdCBoZWFkZXIuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgorICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKKyAgICAgICAgICAgIHJlYWxwb3MgKz0gbnVtYnl0ZXMKKyAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgcG9zICs9IDI0CisKKyAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNDgyXSkKKyAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQorCisgICAgICAgICMgSWYgdGhlIGlzZXh0ZW5kZWQgZmxhZyBpcyBnaXZlbiwKKyAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgorICAgICAgICB3aGlsZSBpc2V4dGVuZGVkID09IDE6CisgICAgICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCisgICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgICAgIHBvcyArPSAyNAorICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKKworICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6CisgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKKworICAgICAgICBzZWxmLnNwYXJzZSA9IHNwCisKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKKyAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICBzZWxmLnNpemUgPSBvcmlnc2l6ZQorCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgIFBPU0lYLjEtMjAwMS4KKyAgICAgICAgIiIiCisgICAgICAgICMgUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQorCisgICAgICAgICMgQSBwYXggaGVhZGVyIHN0b3JlcyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZm9yIGVpdGhlcgorICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKKyAgICAgICAgIyAoZ2xvYmFsKS4KKyAgICAgICAgaWYgc2VsZi50eXBlID09IFhHTFRZUEU6CisgICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKKworICAgICAgICAjIEZpZWxkcyBpbiBQT1NJWC4xLTIwMDEgdGhhdCBhcmUgbnVtYmVycywgYWxsIG90aGVyIGZpZWxkcworICAgICAgICAjIGFyZSB0cmVhdGVkIGFzIFVURi04IHN0cmluZ3MuCisgICAgICAgIHR5cGVfbWFwcGluZyA9IHsKKyAgICAgICAgICAgICJhdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJjdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJtdGltZSI6ICAgICAgICBmbG9hdCwKKyAgICAgICAgICAgICJ1aWQiOiAgICAgICAgICBpbnQsCisgICAgICAgICAgICAiZ2lkIjogICAgICAgICAgaW50LAorICAgICAgICAgICAgInNpemUiOiAgICAgICAgIGludAorICAgICAgICB9CisKKyAgICAgICAgIyBQYXJzZSBwYXggaGVhZGVyIGluZm9ybWF0aW9uLiBBIHJlY29yZCBsb29rcyBsaWtlIHRoYXQ6CisgICAgICAgICMgIiVkICVzPSVzXG4iICUgKGxlbmd0aCwga2V5d29yZCwgdmFsdWUpLiBsZW5ndGggaXMgdGhlIHNpemUKKyAgICAgICAgIyBvZiB0aGUgY29tcGxldGUgcmVjb3JkIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiBhbmQKKyAgICAgICAgIyB0aGUgbmV3bGluZS4KKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKHIiKFxkKykgKFtePV0rKT0iLCByZS5VKQorICAgICAgICBwb3MgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBtYXRjaCA9IHJlZ2V4Lm1hdGNoKGJ1ZiwgcG9zKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGxlbmd0aCwga2V5d29yZCA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBsZW5ndGggPSBpbnQobGVuZ3RoKQorICAgICAgICAgICAgdmFsdWUgPSBidWZbbWF0Y2guZW5kKDIpICsgMTptYXRjaC5zdGFydCgxKSArIGxlbmd0aCAtIDFdCisKKyAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmRlY29kZSgidXRmOCIpCisgICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5lbmNvZGUodGFyZmlsZS5lbmNvZGluZykKKworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5kZWNvZGUoInV0ZjgiKQorICAgICAgICAgICAgaWYga2V5d29yZCBpbiB0eXBlX21hcHBpbmc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHR5cGVfbWFwcGluZ1trZXl3b3JkXSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKHRhcmZpbGUuZW5jb2RpbmcpCisKKyAgICAgICAgICAgIHBheF9oZWFkZXJzW2tleXdvcmRdID0gdmFsdWUKKyAgICAgICAgICAgIHBvcyArPSBsZW5ndGgKKworICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciB0aGF0IHdpbGwgYmUgcGF0Y2hlZCB3aXRoIHRoZQorICAgICAgICAjIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF4IGhlYWRlciAoZXh0ZW5kZWQKKyAgICAgICAgIyBvbmx5KS4KKyAgICAgICAgdCA9IHNlbGYuZnJvbXRhcmZpbGUodGFyZmlsZSkKKworICAgICAgICBpZiBzZWxmLnR5cGUgIT0gWEdMVFlQRSBhbmQgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKKyAgICAgICAgICAgICMgdGhlIHBheCBoZWFkZXIncyBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGtleXdvcmQgaW4gUEFYX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0LCBrZXl3b3JkLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisgICAgICAgICAgICB0LnBheF9oZWFkZXJzID0gcGF4X2hlYWRlcnMuY29weSgpCisKKyAgICAgICAgcmV0dXJuIHQKKworICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgorICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCisgICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCisgICAgICAgIGlmIHJlbWFpbmRlcjoKKyAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKIAogICAgIGRlZiBpc3JlZyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCkBAIC0xMDM4LDEyICsxNDYwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWVzc2FnZXMgKGlmIGRlYnVnID49IDApLiBJZiA+IDAsIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyZSBwYXNzZWQgdG8gdGhlIGNhbGxlciBhcyBleGNlcHRpb25zLgogCi0gICAgcG9zaXggPSBGYWxzZSAgICAgICAgICAgICAgICMgSWYgVHJ1ZSwgZ2VuZXJhdGVzIFBPU0lYLjEtMTk5MC1jb21wbGlhbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlcyAobm8gR05VIGV4dGVuc2lvbnMhKQorICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUICAgICAjIFRoZSBmb3JtYXQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYW4gYXJjaGl2ZS4KIAotICAgIGZpbGVvYmplY3QgPSBFeEZpbGVPYmplY3QKKyAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBUcmFuc2ZlciBVVEYtOCBzdHJpbmdzIGZyb20gUE9TSVguMS0yMDAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaGVhZGVycyB0byB0aGlzIGVuY29kaW5nLgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSk6CisgICAgdGFyaW5mbyA9IFRhckluZm8gICAgICAgICAgICMgVGhlIGRlZmF1bHQgVGFySW5mbyBjbGFzcyB0byB1c2UuCisKKyAgICBmaWxlb2JqZWN0ID0gRXhGaWxlT2JqZWN0ICAgIyBUaGUgZGVmYXVsdCBFeEZpbGVPYmplY3QgY2xhc3MgdG8gdXNlLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWU9Tm9uZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgZm9ybWF0PU5vbmUsCisgICAgICAgICAgICB0YXJpbmZvPU5vbmUsIGRlcmVmZXJlbmNlPU5vbmUsIGlnbm9yZV96ZXJvcz1Ob25lLCBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKICAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCiAgICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKICAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKQEAgLTEwNTIsNTggKzE0ODAsODYgQEAKICAgICAgICAgICAgY2FuIGJlIGRldGVybWluZWQsIGBtb2RlJyBpcyBvdmVycmlkZGVuIGJ5IGBmaWxlb2JqJ3MgbW9kZS4KICAgICAgICAgICAgYGZpbGVvYmonIGlzIG5vdCBjbG9zZWQsIHdoZW4gVGFyRmlsZSBpcyBjbG9zZWQuCiAgICAgICAgICIiIgotICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgobmFtZSkKLQogICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJyYXciOgogICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJywgJ2EnIG9yICd3JyIpCi0gICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCi0gICAgICAgIHNlbGYubW9kZSA9IHsiciI6ICJyYiIsICJhIjogInIrYiIsICJ3IjogIndiIn1bbW9kZV0KKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLl9tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQogCiAgICAgICAgIGlmIG5vdCBmaWxlb2JqOgotICAgICAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiYSIgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLm5hbWUpOgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgogICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgotICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSAidyIKLSAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAid2IiCi0gICAgICAgICAgICBmaWxlb2JqID0gZmlsZShzZWxmLm5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLm1vZGUgPSAidyIKKyAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gIndiIgorICAgICAgICAgICAgZmlsZW9iaiA9IGZpbGUobmFtZSwgc2VsZi5fbW9kZSkKICAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgaWYgc2VsZi5uYW1lIGlzIE5vbmUgYW5kIGhhc2F0dHIoZmlsZW9iaiwgIm5hbWUiKToKLSAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW9iai5uYW1lKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lIGFuZCBoYXNhdHRyKGZpbGVvYmosICJuYW1lIik6CisgICAgICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQogICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAibW9kZSIpOgotICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9IGZpbGVvYmoubW9kZQorICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSBmaWxlb2JqLm1vZGUKICAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBUcnVlCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguYWJzcGF0aChuYW1lKQogICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCiAKLSAgICAgICAgIyBJbml0IGRhdGFzdHJ1Y3R1cmVzCisgICAgICAgICMgSW5pdCBhdHRyaWJ1dGVzLgorICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAorICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50YXJpbmZvID0gdGFyaW5mbworICAgICAgICBpZiBkZXJlZmVyZW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVyZWZlcmVuY2UgPSBkZXJlZmVyZW5jZQorICAgICAgICBpZiBpZ25vcmVfemVyb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcworICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBpZiBkZWJ1ZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVidWcgPSBkZWJ1ZworICAgICAgICBpZiBlcnJvcmxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lcnJvcmxldmVsID0gZXJyb3JsZXZlbAorCisgICAgICAgICMgSW5pdCBkYXRhc3RydWN0dXJlcy4KICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQogICAgICAgICBzZWxmLm1lbWJlcnMgPSBbXSAgICAgICAjIGxpc3Qgb2YgbWVtYmVycyBhcyBUYXJJbmZvIG9iamVjdHMKICAgICAgICAgc2VsZi5fbG9hZGVkID0gRmFsc2UgICAgIyBmbGFnIGlmIGFsbCBtZW1iZXJzIGhhdmUgYmVlbiByZWFkCiAgICAgICAgIHNlbGYub2Zmc2V0ID0gMEwgICAgICAgICMgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgYXJjaGl2ZSBmaWxlCiAgICAgICAgIHNlbGYuaW5vZGVzID0ge30gICAgICAgICMgZGljdGlvbmFyeSBjYWNoaW5nIHRoZSBpbm9kZXMgb2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhcmNoaXZlIG1lbWJlcnMgYWxyZWFkeSBhZGRlZAorICAgICAgICBzZWxmLnBheF9oZWFkZXJzID0ge30gICAjIHNhdmUgY29udGVudHMgb2YgZ2xvYmFsIHBheCBoZWFkZXJzCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiciI6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiciI6CiAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQogICAgICAgICAgICAgc2VsZi5maXJzdG1lbWJlciA9IHNlbGYubmV4dCgpCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAiYSI6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAiYSI6CiAgICAgICAgICAgICAjIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSwKICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBOb25lCiAgICAgICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYubmV4dCgpCi0gICAgICAgICAgICAgICAgZXhjZXB0IFJlYWRFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBpZiB0YXJpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uZXh0KCkgaXMgTm9uZToKICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPiAwOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoLSBCTE9DS1NJWkUsIDEpCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAKLSAgICAgICAgaWYgc2VsZi5fbW9kZSBpbiAiYXciOgorICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKIAorICAgICAgICAgICAgaWYgcGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi50YXJpbmZvLmNyZWF0ZV9wYXhfZ2xvYmFsX2hlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzLmNvcHkoKSwgc2VsZi5lbmNvZGluZykKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoYnVmKQorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCisKKyAgICBkZWYgX2dldHBvc2l4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQgPT0gVVNUQVJfRk9STUFUCisgICAgZGVmIF9zZXRwb3NpeChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIGZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IFVTVEFSX0ZPUk1BVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBHTlVfRk9STUFUCisgICAgcG9zaXggPSBwcm9wZXJ0eShfZ2V0cG9zaXgsIF9zZXRwb3NpeCkKKwogICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICMgQmVsb3cgYXJlIHRoZSBjbGFzc21ldGhvZHMgd2hpY2ggYWN0IGFzIGFsdGVybmF0ZSBjb25zdHJ1Y3RvcnMgdG8gdGhlCiAgICAgIyBUYXJGaWxlIGNsYXNzLiBUaGUgb3BlbigpIG1ldGhvZCBpcyB0aGUgb25seSBvbmUgdGhhdCBpcyBuZWVkZWQgZm9yCkBAIC0xMTE2LDcgKzE1NzIsNyBAQAogICAgICMgYnkgYWRkaW5nIGl0IHRvIHRoZSBtYXBwaW5nIGluIE9QRU5fTUVUSC4KIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPTIwKjUxMik6CisgICAgZGVmIG9wZW4oY2xzLCBuYW1lPU5vbmUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGJ1ZnNpemU9UkVDT1JEU0laRSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIGEgdGFyIGFyY2hpdmUgZm9yIHJlYWRpbmcsIHdyaXRpbmcgb3IgYXBwZW5kaW5nLiBSZXR1cm4KICAgICAgICAgICAgYW4gYXBwcm9wcmlhdGUgVGFyRmlsZSBjbGFzcy4KIApAQCAtMTE0OSw4ICsxNjA1LDggQEAKICAgICAgICAgICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICBzYXZlZF9wb3MgPSBmaWxlb2JqLnRlbGwoKQogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqKQotICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgInIiLCBmaWxlb2JqLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBleGNlcHQgKFJlYWRFcnJvciwgQ29tcHJlc3Npb25FcnJvciksIGU6CiAgICAgICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoc2F2ZWRfcG9zKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtMTE2Nyw3ICsxNjIzLDcgQEAKICAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIHR5cGUgJXIiICUgY29tcHR5cGUpCi0gICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCBmaWxlbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBmdW5jKG5hbWUsIGZpbGVtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICBlbGlmICJ8IiBpbiBtb2RlOgogICAgICAgICAgICAgZmlsZW1vZGUsIGNvbXB0eXBlID0gbW9kZS5zcGxpdCgifCIsIDEpCkBAIC0xMTc4LDI1ICsxNjM0LDI2IEBACiAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibW9kZSBtdXN0IGJlICdyJyBvciAndyciKQogCiAgICAgICAgICAgICB0ID0gY2xzKG5hbWUsIGZpbGVtb2RlLAotICAgICAgICAgICAgICAgICAgICBfU3RyZWFtKG5hbWUsIGZpbGVtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgIF9TdHJlYW0obmFtZSwgZmlsZW1vZGUsIGNvbXB0eXBlLCBmaWxlb2JqLCBidWZzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgICAgIHJldHVybiB0CiAKICAgICAgICAgZWxpZiBtb2RlIGluICJhdyI6Ci0gICAgICAgICAgICByZXR1cm4gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaikKKyAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKIAogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lKToKKyAgICBkZWYgdGFyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsICoqa3dhcmdzKToKICAgICAgICAgIiIiT3BlbiB1bmNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAiIiIKICAgICAgICAgaWYgbGVuKG1vZGUpID4gMSBvciBtb2RlIG5vdCBpbiAicmF3IjoKICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicsICdhJyBvciAndyciKQotICAgICAgICByZXR1cm4gY2xzKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgIHJldHVybiBjbHMobmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgZ3pvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CiAgICAgICAgICIiIk9wZW4gZ3ppcCBjb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KICAgICAgICAgICAgQXBwZW5kaW5nIGlzIG5vdCBhbGxvd2VkLgogICAgICAgICAiIiIKQEAgLTEyMTQsMTQgKzE2NzEsMTUgQEAKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwKLSAgICAgICAgICAgICAgICBnemlwLkd6aXBGaWxlKG5hbWUsIG1vZGUsIGNvbXByZXNzbGV2ZWwsIGZpbGVvYmopKQorICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaiksCisgICAgICAgICAgICAgICAgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQogICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKICAgICAgICAgcmV0dXJuIHQKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05KToKKyAgICBkZWYgYnoyb3BlbihjbHMsIG5hbWUsIG1vZGU9InIiLCBmaWxlb2JqPU5vbmUsIGNvbXByZXNzbGV2ZWw9OSwgKiprd2FyZ3MpOgogICAgICAgICAiIiJPcGVuIGJ6aXAyIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgogICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCiAgICAgICAgICIiIgpAQCAtMTIzOSw3ICsxNjk3LDcgQEAKICAgICAgICAgICAgIGZpbGVvYmogPSBiejIuQloyRmlsZShuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsPWNvbXByZXNzbGV2ZWwpCiAKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdCA9IGNscy50YXJvcGVuKG5hbWUsIG1vZGUsIGZpbGVvYmopCisgICAgICAgICAgICB0ID0gY2xzLnRhcm9wZW4obmFtZSwgbW9kZSwgZmlsZW9iaiwgKiprd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgogICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBiemlwMiBmaWxlIikKICAgICAgICAgdC5fZXh0ZmlsZW9iaiA9IEZhbHNlCkBAIC0xMjYyLDcgKzE3MjAsNyBAQAogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIGlmIHNlbGYuX21vZGUgaW4gImF3IjoKKyAgICAgICAgaWYgc2VsZi5tb2RlIGluICJhdyI6CiAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoTlVMICogKEJMT0NLU0laRSAqIDIpKQogICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gKEJMT0NLU0laRSAqIDIpCiAgICAgICAgICAgICAjIGZpbGwgdXAgdGhlIGVuZCB3aXRoIHplcm8tYmxvY2tzCkBAIC0xMzI4LDcgKzE3ODYsOCBAQAogCiAgICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCiAgICAgICAgICMgaW5mb3JtYXRpb24gc3BlY2lmaWMgZm9yIHRoZSBmaWxlLgotICAgICAgICB0YXJpbmZvID0gVGFySW5mbygpCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8oKQorICAgICAgICB0YXJpbmZvLnRhcmZpbGUgPSBzZWxmCiAKICAgICAgICAgIyBVc2Ugb3Muc3RhdCBvciBvcy5sc3RhdCwgZGVwZW5kaW5nIG9uIHBsYXRmb3JtCiAgICAgICAgICMgYW5kIGlmIHN5bWxpbmtzIHNoYWxsIGJlIHJlc29sdmVkLgpAQCAtMTM0NCw4ICsxODAzLDggQEAKICAgICAgICAgc3RtZCA9IHN0YXRyZXMuc3RfbW9kZQogICAgICAgICBpZiBzdGF0LlNfSVNSRUcoc3RtZCk6CiAgICAgICAgICAgICBpbm9kZSA9IChzdGF0cmVzLnN0X2lubywgc3RhdHJlcy5zdF9kZXYpCi0gICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgXAotICAgICAgICAgICAgICAgICAgICBzdGF0cmVzLnN0X25saW5rID4gMSBhbmQgaW5vZGUgaW4gc2VsZi5pbm9kZXM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kZXJlZmVyZW5jZSBhbmQgc3RhdHJlcy5zdF9ubGluayA+IDEgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgaW5vZGUgaW4gc2VsZi5pbm9kZXMgYW5kIGFyY25hbWUgIT0gc2VsZi5pbm9kZXNbaW5vZGVdOgogICAgICAgICAgICAgICAgICMgSXMgaXQgYSBoYXJkbGluayB0byBhbiBhbHJlYWR5CiAgICAgICAgICAgICAgICAgIyBhcmNoaXZlZCBmaWxlPwogICAgICAgICAgICAgICAgIHR5cGUgPSBMTktUWVBFCkBAIC0xNDIyLDcgKzE4ODEsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ICIlZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiIFwKICAgICAgICAgICAgICAgICAgICAgICAlIHRpbWUubG9jYWx0aW1lKHRhcmluZm8ubXRpbWUpWzo2XSwKIAotICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lLAorICAgICAgICAgICAgcHJpbnQgdGFyaW5mby5uYW1lICsgKCIvIiBpZiB0YXJpbmZvLmlzZGlyKCkgZWxzZSAiIiksCiAKICAgICAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpOgpAQCAtMTQ1NCw3ICsxOTEzLDcgQEAKICAgICAgICAgICAgIGlmIHJlY3Vyc2l2ZToKICAgICAgICAgICAgICAgICBpZiBhcmNuYW1lID09ICIuIjoKICAgICAgICAgICAgICAgICAgICAgYXJjbmFtZSA9ICIiCi0gICAgICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcigiLiIpOgorICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGYsIG9zLnBhdGguam9pbihhcmNuYW1lLCBmKSkKICAgICAgICAgICAgIHJldHVybgogCkBAIC0xNDkzLDcgKzE5NTIsNyBAQAogCiAgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKIAotICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYucG9zaXgpCisgICAgICAgIGJ1ZiA9IHRhcmluZm8udG9idWYoc2VsZi5mb3JtYXQsIHNlbGYuZW5jb2RpbmcpCiAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCiAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCiAKQEAgLTE1MjUsNyArMTk4NCw3IEBACiAgICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yeSB3aXRoIGEgc2FmZSBtb2RlLCBzbyB0aGF0CiAgICAgICAgICAgICAgICAgIyBhbGwgZmlsZXMgYmVsb3cgY2FuIGJlIGV4dHJhY3RlZCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMob3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSksIDA3NzcpCisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguam9pbihwYXRoLCB0YXJpbmZvLm5hbWUpLCAwNzAwKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMuYXBwZW5kKHRhcmluZm8pCkBAIC0xNTU3LDEwICsyMDE2LDEwIEBACiAgICAgICAgICIiIgogICAgICAgICBzZWxmLl9jaGVjaygiciIpCiAKLSAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIFRhckluZm8pOgotICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgotICAgICAgICBlbHNlOgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgogCiAgICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCiAgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKQEAgLTE1OTMsMTAgKzIwNTIsMTAgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKIAotICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgVGFySW5mbyk6Ci0gICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCi0gICAgICAgIGVsc2U6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVtYmVyLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLmdldG1lbWJlcihtZW1iZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YXJpbmZvID0gbWVtYmVyCiAKICAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iamVjdChzZWxmLCB0YXJpbmZvKQpAQCAtMTgwOSwyMCArMjI2OCwxMSBAQAogICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCiAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQogICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgaWYgbm90IGJ1ZjoKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGFyaW5mbyA9IFRhckluZm8uZnJvbWJ1ZihidWYpCi0KLSAgICAgICAgICAgICAgICAjIFNldCB0aGUgVGFySW5mbyBvYmplY3QncyBvZmZzZXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCi0gICAgICAgICAgICAgICAgIyBUYXJGaWxlIGFuZCBzZXQgc2VsZi5vZmZzZXQgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcwotICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlZ2luLgotICAgICAgICAgICAgICAgIHRhcmluZm8ub2Zmc2V0ID0gc2VsZi5vZmZzZXQKLSAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKLQotICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnByb2NfbWVtYmVyKHRhcmluZm8pCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQogCiAgICAgICAgICAgICBleGNlcHQgSGVhZGVyRXJyb3IsIGU6CiAgICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CkBAIC0xODM1LDE0OSArMjI4NSwxMSBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICAgICAgYnJlYWsKIAotICAgICAgICAjIFNvbWUgb2xkIHRhciBwcm9ncmFtcyByZXByZXNlbnQgYSBkaXJlY3RvcnkgYXMgYSByZWd1bGFyCi0gICAgICAgICMgZmlsZSB3aXRoIGEgdHJhaWxpbmcgc2xhc2guCi0gICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBhbmQgdGFyaW5mby5uYW1lLmVuZHN3aXRoKCIvIik6Ci0gICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSBESVJUWVBFCi0KLSAgICAgICAgIyBEaXJlY3RvcnkgbmFtZXMgc2hvdWxkIGhhdmUgYSAnLycgYXQgdGhlIGVuZC4KLSAgICAgICAgaWYgdGFyaW5mby5pc2RpcigpOgotICAgICAgICAgICAgdGFyaW5mby5uYW1lICs9ICIvIgotCi0gICAgICAgIHNlbGYubWVtYmVycy5hcHBlbmQodGFyaW5mbykKLSAgICAgICAgcmV0dXJuIHRhcmluZm8KLQotICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICMgVGhlIGZvbGxvd2luZyBhcmUgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIGEKLSAgICAjIG1lbWJlci4gVGhlIGVudHJ5IHBvaW50IGlzIHByb2NfbWVtYmVyKCkgd2hpY2ggaXMgY2FsbGVkIHdpdGggYSBUYXJJbmZvCi0gICAgIyBvYmplY3QgY3JlYXRlZCBmcm9tIHRoZSBoZWFkZXIgYmxvY2sgZnJvbSB0aGUgY3VycmVudCBvZmZzZXQuIFRoZQotICAgICMgcHJvY19tZW1iZXIoKSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcyB0byBhZGQgY3VzdG9tCi0gICAgIyBwcm9jXyooKSBtZXRob2RzLiBBIHByb2NfKigpIG1ldGhvZCBNVVNUIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCi0gICAgIyBvcGVyYXRpb25zOgotICAgICMgMS4gU2V0IHRhcmluZm8ub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKLSAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdGhhdCBmb2xsb3dzLgotICAgICMgMi4gU2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAotICAgICMgICAgYmVnaW4uCi0gICAgIyAzLiBSZXR1cm4gdGFyaW5mbyBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgotICAgIGRlZiBwcm9jX21lbWJlcihzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiQ2hvb3NlIHRoZSByaWdodCBwcm9jZXNzaW5nIG1ldGhvZCBmb3IgdGFyaW5mbyBkZXBlbmRpbmcKLSAgICAgICAgICAgb24gaXRzIHR5cGUgYW5kIGNhbGwgaXQuCi0gICAgICAgICIiIgotICAgICAgICBpZiB0YXJpbmZvLnR5cGUgaW4gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkspOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19nbnVsb25nKHRhcmluZm8pCi0gICAgICAgIGVsaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfU1BBUlNFOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYucHJvY19zcGFyc2UodGFyaW5mbykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2NfYnVpbHRpbih0YXJpbmZvKQotCi0gICAgZGVmIHByb2NfYnVpbHRpbihzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiUHJvY2VzcyBhIGJ1aWx0aW4gdHlwZSBtZW1iZXIgb3IgYW4gdW5rbm93biBtZW1iZXIKLSAgICAgICAgICAgd2hpY2ggd2lsbCBiZSB0cmVhdGVkIGFzIGEgcmVndWxhciBmaWxlLgotICAgICAgICAiIiIKLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIGlmIHRhcmluZm8uaXNyZWcoKSBvciB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKLSAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2VsZi5fYmxvY2sodGFyaW5mby5zaXplKQotICAgICAgICByZXR1cm4gdGFyaW5mbwotCi0gICAgZGVmIHByb2NfZ251bG9uZyhzZWxmLCB0YXJpbmZvKToKLSAgICAgICAgIiIiUHJvY2VzcyB0aGUgYmxvY2tzIHRoYXQgaG9sZCBhIEdOVSBsb25nbmFtZQotICAgICAgICAgICBvciBsb25nbGluayBtZW1iZXIuCi0gICAgICAgICIiIgotICAgICAgICBidWYgPSAiIgotICAgICAgICBjb3VudCA9IHRhcmluZm8uc2l6ZQotICAgICAgICB3aGlsZSBjb3VudCA+IDA6Ci0gICAgICAgICAgICBibG9jayA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKLSAgICAgICAgICAgIGJ1ZiArPSBibG9jawotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgICAgICBjb3VudCAtPSBCTE9DS1NJWkUKLQotICAgICAgICAjIEZldGNoIHRoZSBuZXh0IGhlYWRlciBhbmQgcHJvY2VzcyBpdC4KLSAgICAgICAgYiA9IHNlbGYuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKLSAgICAgICAgdCA9IFRhckluZm8uZnJvbWJ1ZihiKQotICAgICAgICB0Lm9mZnNldCA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIHNlbGYub2Zmc2V0ICs9IEJMT0NLU0laRQotICAgICAgICBuZXh0ID0gc2VsZi5wcm9jX21lbWJlcih0KQotCi0gICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKLSAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCi0gICAgICAgIG5leHQub2Zmc2V0ID0gdGFyaW5mby5vZmZzZXQKLSAgICAgICAgaWYgdGFyaW5mby50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6Ci0gICAgICAgICAgICBuZXh0Lm5hbWUgPSBidWYucnN0cmlwKE5VTCkKLSAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgPT0gR05VVFlQRV9MT05HTElOSzoKLSAgICAgICAgICAgIG5leHQubGlua25hbWUgPSBidWYucnN0cmlwKE5VTCkKLQotICAgICAgICByZXR1cm4gbmV4dAotCi0gICAgZGVmIHByb2Nfc3BhcnNlKHNlbGYsIHRhcmluZm8pOgotICAgICAgICAiIiJQcm9jZXNzIGEgR05VIHNwYXJzZSBoZWFkZXIgcGx1cyBleHRyYSBoZWFkZXJzLgotICAgICAgICAiIiIKLSAgICAgICAgYnVmID0gdGFyaW5mby5idWYKLSAgICAgICAgc3AgPSBfcmluZ2J1ZmZlcigpCi0gICAgICAgIHBvcyA9IDM4NgotICAgICAgICBsYXN0cG9zID0gMEwKLSAgICAgICAgcmVhbHBvcyA9IDBMCi0gICAgICAgICMgVGhlcmUgYXJlIDQgcG9zc2libGUgc3BhcnNlIHN0cnVjdHMgaW4gdGhlCi0gICAgICAgICMgZmlyc3QgaGVhZGVyLgotICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNCk6Ci0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgIG51bWJ5dGVzID0gbnRpKGJ1Zltwb3MgKyAxMjpwb3MgKyAyNF0pCi0gICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgaWYgb2Zmc2V0ID4gbGFzdHBvczoKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb2Zmc2V0IC0gbGFzdHBvcykpCi0gICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICByZWFscG9zICs9IG51bWJ5dGVzCi0gICAgICAgICAgICBsYXN0cG9zID0gb2Zmc2V0ICsgbnVtYnl0ZXMKLSAgICAgICAgICAgIHBvcyArPSAyNAotCi0gICAgICAgIGlzZXh0ZW5kZWQgPSBvcmQoYnVmWzQ4Ml0pCi0gICAgICAgIG9yaWdzaXplID0gbnRpKGJ1Zls0ODM6NDk1XSkKLQotICAgICAgICAjIElmIHRoZSBpc2V4dGVuZGVkIGZsYWcgaXMgZ2l2ZW4sCi0gICAgICAgICMgdGhlcmUgYXJlIGV4dHJhIGhlYWRlcnMgdG8gcHJvY2Vzcy4KLSAgICAgICAgd2hpbGUgaXNleHRlbmRlZCA9PSAxOgotICAgICAgICAgICAgYnVmID0gc2VsZi5maWxlb2JqLnJlYWQoQkxPQ0tTSVpFKQotICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCi0gICAgICAgICAgICBwb3MgPSAwCi0gICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQotICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQotICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6Ci0gICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKLSAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCi0gICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcwotICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcwotICAgICAgICAgICAgICAgIHBvcyArPSAyNAotICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKLQotICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6Ci0gICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKLQotICAgICAgICB0YXJpbmZvLnNwYXJzZSA9IHNwCi0KLSAgICAgICAgdGFyaW5mby5vZmZzZXRfZGF0YSA9IHNlbGYub2Zmc2V0Ci0gICAgICAgIHNlbGYub2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHRhcmluZm8uc2l6ZSkKLSAgICAgICAgdGFyaW5mby5zaXplID0gb3JpZ3NpemUKLQogICAgICAgICByZXR1cm4gdGFyaW5mbwogCiAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgIyBMaXR0bGUgaGVscGVyIG1ldGhvZHM6CiAKLSAgICBkZWYgX2Jsb2NrKHNlbGYsIGNvdW50KToKLSAgICAgICAgIiIiUm91bmQgdXAgYSBieXRlIGNvdW50IGJ5IEJMT0NLU0laRSBhbmQgcmV0dXJuIGl0LAotICAgICAgICAgICBlLmcuIF9ibG9jayg4MzQpID0+IDEwMjQuCi0gICAgICAgICIiIgotICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChjb3VudCwgQkxPQ0tTSVpFKQotICAgICAgICBpZiByZW1haW5kZXI6Ci0gICAgICAgICAgICBibG9ja3MgKz0gMQotICAgICAgICByZXR1cm4gYmxvY2tzICogQkxPQ0tTSVpFCi0KICAgICBkZWYgX2dldG1lbWJlcihzZWxmLCBuYW1lLCB0YXJpbmZvPU5vbmUpOgogICAgICAgICAiIiJGaW5kIGFuIGFyY2hpdmUgbWVtYmVyIGJ5IG5hbWUgZnJvbSBib3R0b20gdG8gdG9wLgogICAgICAgICAgICBJZiB0YXJpbmZvIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzdGFydGluZyBwb2ludC4KQEAgLTIwMTAsOCArMjMyMiw4IEBACiAgICAgICAgICIiIgogICAgICAgICBpZiBzZWxmLmNsb3NlZDoKICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKLSAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5fbW9kZSBub3QgaW4gbW9kZToKLSAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImJhZCBvcGVyYXRpb24gZm9yIG1vZGUgJXIiICUgc2VsZi5fbW9kZSkKKyAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5tb2RlIG5vdCBpbiBtb2RlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCiAKICAgICBkZWYgX19pdGVyX18oc2VsZik6CiAgICAgICAgICIiIlByb3ZpZGUgYW4gaXRlcmF0b3Igb2JqZWN0Lgo=