1 line
24 KiB
Python
1 line
24 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IGxvZ2dpbmcKCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwoKZnJvbSAuY29uc3RhbnRzIGltcG9ydCBQTEFOX0lTX0VNUFRZLCBQTEFOX1NUT1BQRUQKCl9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKCgpjbGFzcyBDeFRvd2VyUGxhbkxvZyhtb2RlbHMuTW9kZWwpOgogICAgIiIiRmxpZ2h0IFBsYW4gTG9nIiIiCgogICAgX25hbWUgPSAiY3gudG93ZXIucGxhbi5sb2ciCiAgICBfZGVzY3JpcHRpb24gPSAiQ2V0bWl4IFRvd2VyIEZsaWdodCBQbGFuIExvZyIKICAgIF9vcmRlciA9ICJzdGFydF9kYXRlIGRlc2MsIGlkIGRlc2MiCgogICAgYWN0aXZlID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1UcnVlKQogICAgbmFtZSA9IGZpZWxkcy5DaGFyKGNvbXB1dGU9Il9jb21wdXRlX25hbWUiLCBjb21wdXRlX3N1ZG89VHJ1ZSwgc3RvcmU9VHJ1ZSkKICAgIGxhYmVsID0gZmllbGRzLkNoYXIoCiAgICAgICAgaGVscD0iQ3VzdG9tIGxhYmVsLiBDYW4gYmUgdXNlZCBmb3Igc2VhcmNoL3RyYWNraW5nIiwKICAgICAgICBpbmRleD0idHJpZ3JhbSIsCiAgICAgICAgdW5hY2NlbnQ9RmFsc2UsCiAgICApCiAgICBzZXJ2ZXJfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIiLCByZXF1aXJlZD1UcnVlLCBpbmRleD1UcnVlLCBvbmRlbGV0ZT0iY2FzY2FkZSIKICAgICkKICAgIGpldF90ZW1wbGF0ZV9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZSIsCiAgICAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgICAgICBpbmRleD1UcnVlLAogICAgICAgIG9uZGVsZXRlPSJjYXNjYWRlIiwKICAgICkKICAgIGpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIHN0cmluZz0iSmV0IFRlbXBsYXRlIEluc3RhbGwgSm9iIiwKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC50ZW1wbGF0ZS5pbnN0YWxsIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIG9uZGVsZXRlPSJjYXNjYWRlIiwKICAgICAgICBpbmRleD1UcnVlLAogICAgICAgIGhlbHA9IkpldCBUZW1wbGF0ZSBJbnN0YWxsL1VuaW5zdGFsbCByZWNvcmQgYmVpbmcgcnVuLiAiLAogICAgKQogICAgamV0X2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuamV0IiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIGluZGV4PVRydWUsCiAgICAgICAgb25kZWxldGU9ImNhc2NhZGUiLAogICAgKQogICAgamV0X2FjdGlvbl9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLmpldC5hY3Rpb24iLAogICAgICAgIHJlYWRvbmx5PVRydWUsCiAgICAgICAgaGVscD0iVXNlZCB0byB0cmFjayBmbGlnaHQgcGxhbnMgZXhlY3V0ZWQgYnkgamV0IGFjdGlvbnMiLAogICAgKQogICAgd2F5cG9pbnRfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5qZXQud2F5cG9pbnQiLAogICAgICAgIGhlbHA9IldheXBvaW50IHRoaXMgcGxhbiBsb2cgYmVsb25ncyB0byIsCiAgICApCgogICAgcGxhbl9pZCA9IGZpZWxkcy5NYW55Mm9uZSgKICAgICAgICBzdHJpbmc9IkZsaWdodCBQbGFuIiwKICAgICAgICBjb21vZGVsX25hbWU9ImN4LnRvd2VyLnBsYW4iLAogICAgICAgIHJlcXVpcmVkPVRydWUsCiAgICAgICAgaW5kZXg9VHJ1ZSwKICAgICAgICBvbmRlbGV0ZT0iY2FzY2FkZSIsCiAgICApCiAgICBhY2Nlc3NfbGV2ZWwgPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHJlbGF0ZWQ9InBsYW5faWQuYWNjZXNzX2xldmVsIiwKICAgICAgICByZWFkb25seT1UcnVlLAogICAgICAgIHN0b3JlPVRydWUsCiAgICAgICAgaW5kZXg9VHJ1ZSwKICAgICkKCiAgICAjIC0tIFRpbWUKICAgIHN0YXJ0X2RhdGUgPSBmaWVsZHMuRGF0ZXRpbWUoc3RyaW5nPSJTdGFydGVkIikKICAgIGZpbmlzaF9kYXRlID0gZmllbGRzLkRhdGV0aW1lKHN0cmluZz0iRmluaXNoZWQiKQogICAgZHVyYXRpb24gPSBmaWVsZHMuRmxvYXQoCiAgICAgICAgaGVscD0iVGltZSBjb25zdW1lZCBmb3IgZXhlY3V0aW9uLCBzZWNvbmRzIiwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9kdXJhdGlvbiIsCiAgICAgICAgc3RvcmU9VHJ1ZSwKICAgICkKICAgIGR1cmF0aW9uX2N1cnJlbnQgPSBmaWVsZHMuRmxvYXQoCiAgICAgICAgc3RyaW5nPSJEdXJhdGlvbiwgc2VjIiwKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9kdXJhdGlvbl9jdXJyZW50IiwKICAgICAgICBoZWxwPSJGb3IgaG93IGxvbmcgYSBmbGlnaHQgcGxhbiBpcyBhbHJlYWR5IHJ1bm5pbmciLAogICAgKQoKICAgICMgLS0gQ29tbWFuZHMKICAgIGlzX3J1bm5pbmcgPSBmaWVsZHMuQm9vbGVhbigKICAgICAgICBoZWxwPSJQbGFuIGlzIGJlaW5nIGV4ZWN1dGVkIHJpZ2h0IG5vdyIsIGNvbXB1dGU9Il9jb21wdXRlX2R1cmF0aW9uIiwgc3RvcmU9VHJ1ZQogICAgKQogICAgaXNfc3RvcHBlZCA9IGZpZWxkcy5Cb29sZWFuKAogICAgICAgIHN0cmluZz0iU3RvcHBlZCIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IkZsaWdodCBwbGFuIHdhcyBzdG9wcGVkIGJ5IHVzZXIiCiAgICApCiAgICBwbGFuX2xpbmVfZXhlY3V0ZWRfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5wbGFuLmxpbmUiLAogICAgICAgIGhlbHA9IkZsaWdodCBQbGFuIGxpbmUgdGhhdCBpcyBiZWluZyBjdXJyZW50bHkgZXhlY3V0ZWQiLAogICAgKQogICAgY29tbWFuZF9sb2dfaWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuY29tbWFuZC5sb2ciLCBpbnZlcnNlX25hbWU9InBsYW5fbG9nX2lkIiwgYXV0b19qb2luPVRydWUKICAgICkKICAgIHBsYW5fc3RhdHVzID0gZmllbGRzLkludGVnZXIoCiAgICAgICAgc3RyaW5nPSJTdGF0dXMiLAogICAgICAgIGhlbHA9IjAgaWYgcGxhbiBpcyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkuIFxuIgogICAgICAgICItMzAxIGlmIGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhpcyBmbGlnaHQgcGxhbiBpcyBydW5uaW5nLCBcbiIKICAgICAgICAiLTMwMiBpZiBwbGFuIGlzIGVtcHR5LCBcbiIKICAgICAgICAiLTMwMyBpZiBwbGFuIHJlZmVyZW5jZSBpcyBtaXNzaW5nLCBcbiIKICAgICAgICAiLTMwNCBpZiBwbGFuIGxpbmUgcmVmZXJlbmNlIGlzIG1pc3NpbmcsIFxuIgogICAgICAgICItMzA2IGlmIHBsYW4gaXMgbm90IGNvbXBhdGlibGUgd2l0aCBzZXJ2ZXIsXG4iCiAgICAgICAgIi0zMDggaWYgcGxhbiBpcyBzdG9wcGVkIGJ5IHVzZXIiLAogICAgKQogICAgY3VzdG9tX21lc3NhZ2UgPSBmaWVsZHMuVGV4dCgKICAgICAgICBoZWxwPSJDdXN0b20gbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIHBsYW4gbG9nIiwKICAgICkKICAgIHBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgImN4LnRvd2VyLnBsYW4ubG9nIiwgc3RyaW5nPSJNYWluIExvZyIsIG9uZGVsZXRlPSJjYXNjYWRlIgogICAgKQogICAgc2NoZWR1bGVkX3Rhc2tfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgImN4LnRvd2VyLnNjaGVkdWxlZC50YXNrIiwKICAgICAgICBvbmRlbGV0ZT0ic2V0IG51bGwiLAogICAgICAgIGhlbHA9IlNjaGVkdWxlZCB0YXNrIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZmxpZ2h0IHBsYW4iLAogICAgKQogICAgdmFyaWFibGVfdmFsdWVzID0gZmllbGRzLkpzb24oCiAgICAgICAgZGVmYXVsdD17fSwKICAgICAgICBoZWxwPSJDdXN0b20gdmFyaWFibGUgdmFsdWVzIHBhc3NlZCB0byB0aGUgZmxpZ2h0IHBsYW4iLAogICAgKQoKICAgIEBhcGkuZGVwZW5kcygic2VydmVyX2lkLm5hbWUiLCAibmFtZSIpCiAgICBkZWYgX2NvbXB1dGVfbmFtZShzZWxmKToKICAgICAgICBmb3IgcmVjIGluIHNlbGY6CiAgICAgICAgICAgIHJlYy5uYW1lID0gIjogIi5qb2luKChyZWMuc2VydmVyX2lkLm5hbWUsIHJlYy5wbGFuX2lkLm5hbWUpKSAgIyB0eXBlOiBpZ25vcmUKCiAgICBAYXBpLmRlcGVuZHMoInN0YXJ0X2RhdGUiLCAiZmluaXNoX2RhdGUiKQogICAgZGVmIF9jb21wdXRlX2R1cmF0aW9uKHNlbGYpOgogICAgICAgIGZvciBwbGFuX2xvZyBpbiBzZWxmOgogICAgICAgICAgICAjIE5vdCBzdGFydGVkIHlldAogICAgICAgICAgICBpZiBub3QgcGxhbl9sb2cuc3RhcnRfZGF0ZToKICAgICAgICAgICAgICAgIGNvbnRpbnVlCgogICAgICAgICAgICAjIElmIHBsYW4gaXMgZmluaXNoZWQsIGNvbXB1dGUgZHVyYXRpb24KICAgICAgICAgICAgaWYgcGxhbl9sb2cuZmluaXNoX2RhdGU6CiAgICAgICAgICAgICAgICBwbGFuX2xvZy51cGRhdGUoCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb24iOiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFuX2xvZy5maW5pc2hfZGF0ZSAtIHBsYW5fbG9nLnN0YXJ0X2RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgKS50b3RhbF9zZWNvbmRzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICJpc19ydW5uaW5nIjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgY29udGludWUKCiAgICAgICAgICAgICMgSWYgcGxhbiBpcyBydW5uaW5nLCBzZXQgaXNfcnVubmluZyB0byBUcnVlCiAgICAgICAgICAgIHBsYW5fbG9nLmlzX3J1bm5pbmcgPSBUcnVlCgogICAgQGFwaS5kZXBlbmRzKCJpc19ydW5uaW5nIikKICAgIGRlZiBfY29tcHV0ZV9kdXJhdGlvbl9jdXJyZW50KHNlbGYpOgogICAgICAgICIiIlNob3dzIHJlbGF0aXZlIHRpbWUgYmV0d2VlbiBub3coKSBhbmQgc3RhcnQgdGltZSBmb3IgcnVubmluZyBwbGFucywKICAgICAgICBhbmQgY29tcHV0ZWQgZHVyYXRpb24gZm9yIGZpbmlzaGVkIG9uZXMuCiAgICAgICAgIiIiCiAgICAgICAgbm93ID0gZmllbGRzLkRhdGV0aW1lLm5vdygpCiAgICAgICAgZm9yIHBsYW5fbG9nIGluIHNlbGY6CiAgICAgICAgICAgIGlmIHBsYW5fbG9nLmlzX3J1bm5pbmc6CiAgICAgICAgICAgICAgICBwbGFuX2xvZy5kdXJhdGlvbl9jdXJyZW50ID0gKG5vdyAtIHBsYW5fbG9nLnN0YXJ0X2RhdGUpLnRvdGFsX3NlY29uZHMoKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcGxhbl9sb2cuZHVyYXRpb25fY3VycmVudCA9IHBsYW5fbG9nLmR1cmF0aW9uCgogICAgZGVmIHN0YXJ0KHNlbGYsIHNlcnZlciwgcGxhbiwgc3RhcnRfZGF0ZT1Ob25lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUnVucyBwbGFuIG9uIHNlcnZlci4KICAgICAgICBDcmVhdGVzIGluaXRpYWwgbG9nIHJlY29yZHMgZm9yIGVhY2ggY29tbWFuZCB0aGF0IGNhbm5vdCBiZSBleGVjdXRlZCB1bnRpbAogICAgICAgIGl0IGZpbmRzIHRoZSBmaXJzdCBleGVjdXRhYmxlIGNvbW1hbmQuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpIHNlcnZlci4KICAgICAgICAgICAgcGxhbiAoY3gudG93ZXIucGxhbigpKSBGbGlnaHQgUGxhbi4KICAgICAgICAgICAgc3RhcnRfZGF0ZSAoZGF0ZXRpbWUpIGZsaWdodCBwbGFuIHN0YXJ0IGRhdGUgdGltZS4KICAgICAgICAgICAgKiprd2FyZ3MgKGRpY3QpOiBvcHRpb25hbCB2YWx1ZXMKICAgICAgICAgICAgICAgIEZvbGxvd2luZyBrZXlzIGFyZSBzdXBwb3J0ZWQgYnV0IG5vdCBsaW1pdGVkIHRvOgogICAgICAgICAgICAgICAgLSAicGxhbl9sb2ciOiB7dmFsdWVzIHBhc3NlZCB0byBmbGlnaHRwbGFuIGxvZ2dlcn0KICAgICAgICAgICAgICAgIC0gImxvZyI6IHt2YWx1ZXMgcGFzc2VkIHRvIGxvZ2dlcn0KICAgICAgICAgICAgICAgIC0gImtleSI6IHt2YWx1ZXMgcGFzc2VkIHRvIGtleSBwYXJzZXJ9CiAgICAgICAgICAgICAgICAtICJub19jb21tYW5kX2xvZyIgKGJvb2wpOiBJZiBUcnVlLCBubyBsb2dzIHdpbGwgYmUgcmVjb3JkZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWV4ZWN1dGFibGUgbGluZXMuCiAgICAgICAgICAgICAgICAtICJ2YXJpYWJsZV92YWx1ZXMiLCBkaWN0KCk6IGN1c3RvbSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZm9ybWF0IG9mIGB7dmFyaWFibGVfcmVmZXJlbmNlOiB2YXJpYWJsZV92YWx1ZX1gCiAgICAgICAgICAgICAgICAgICAgZWcgYHsnb2Rvb192ZXJzaW9uJzogJzE2LjAnfWAKICAgICAgICAgICAgICAgICAgICBXaWxsIGJlIGFwcGxpZWQgb25seSBpZiB1c2VyIGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhlIHNlcnZlci4KICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBjeC50b3dlci5wbGFuLmxvZygpOiBOZXcgZmxpZ2h0cGxhbiBsb2cgcmVjb3JkLgogICAgICAgICIiIgoKICAgICAgICBkZWYgZ2V0X2V4ZWN1dGFibGVfbGluZSgKICAgICAgICAgICAgcGxhbiwgc2VydmVyLCBqZXRfdGVtcGxhdGU9Tm9uZSwgamV0PU5vbmUsIHZhcmlhYmxlX3ZhbHVlcz1Ob25lCiAgICAgICAgKToKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIEdlbmVyYXRvciB0byBnZXQgZWFjaCBsaW5lIGFuZCBjaGVjayBpZiBpdCdzIGV4ZWN1dGFibGUuCiAgICAgICAgICAgIEFyZ3M6CiAgICAgICAgICAgICAgICBwbGFuIChjeC50b3dlci5wbGFuKCkpOiBGbGlnaHQgUGxhbi4KICAgICAgICAgICAgICAgIHNlcnZlciAoY3gudG93ZXIuc2VydmVyKCkpOiBTZXJ2ZXIuCiAgICAgICAgICAgICAgICBqZXRfdGVtcGxhdGUgKGN4LnRvd2VyLmpldC50ZW1wbGF0ZSgpKTogSmV0IFRlbXBsYXRlLgogICAgICAgICAgICAgICAgamV0IChjeC50b3dlci5qZXQoKSk6IEpldC4KICAgICAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgICAgIHR1cGxlOiAobGluZSwgaXNfZXhlY3V0YWJsZSkKICAgICAgICAgICAgIiIiCiAgICAgICAgICAgIGZvciBsaW5lIGluIHBsYW4ubGluZV9pZHM6CiAgICAgICAgICAgICAgICB5aWVsZCAoCiAgICAgICAgICAgICAgICAgICAgbGluZSwKICAgICAgICAgICAgICAgICAgICBsaW5lLl9pc19leGVjdXRhYmxlX2xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGpldD1qZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcz12YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgdmFscyA9IHsKICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgInBsYW5faWQiOiBwbGFuLmlkLAogICAgICAgICAgICAiaXNfcnVubmluZyI6IFRydWUsCiAgICAgICAgICAgICJzdGFydF9kYXRlIjogc3RhcnRfZGF0ZSBvciBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgfQoKICAgICAgICAjIEV4dHJhY3QgYW5kIGFwcGx5IHBsYW4gbG9nIGt3YXJncwogICAgICAgIHBsYW5fbG9nX2t3YXJncyA9IGt3YXJncy5nZXQoInBsYW5fbG9nIikKICAgICAgICBpZiBwbGFuX2xvZ19rd2FyZ3M6CiAgICAgICAgICAgIHZhbHMudXBkYXRlKHBsYW5fbG9nX2t3YXJncykKCiAgICAgICAgIyBFeHRyYWN0IGFuZCBhcHBseSB2YXJpYWJsZSB2YWx1ZXMKICAgICAgICB2YXJpYWJsZV92YWx1ZXMgPSBrd2FyZ3MuZ2V0KCJ2YXJpYWJsZV92YWx1ZXMiKQogICAgICAgIGlmIHZhcmlhYmxlX3ZhbHVlczoKICAgICAgICAgICAgdmFsc1sidmFyaWFibGVfdmFsdWVzIl0gPSB2YXJpYWJsZV92YWx1ZXMKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnN1ZG8oKS5jcmVhdGUodmFscykKCiAgICAgICAgIyBQcm9jZXNzIGVhY2ggbGluZSB1bnRpbCB0aGUgZmlyc3QgZXhlY3V0YWJsZSBvbmUgaXMgZm91bmQKICAgICAgICBmb3IgbGluZSwgaXNfZXhlY3V0YWJsZSBpbiBnZXRfZXhlY3V0YWJsZV9saW5lKAogICAgICAgICAgICBwbGFuPXBsYW4sCiAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsCiAgICAgICAgICAgIGpldF90ZW1wbGF0ZT1wbGFuX2xvZy5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgIGpldD1wbGFuX2xvZy5qZXRfaWQsCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHVlcz12YXJpYWJsZV92YWx1ZXMsCiAgICAgICAgKToKICAgICAgICAgICAgaWYgaXNfZXhlY3V0YWJsZToKICAgICAgICAgICAgICAgIGxpbmUuX3J1bihzZXJ2ZXI9c2VydmVyLCBwbGFuX2xvZ19yZWNvcmQ9cGxhbl9sb2csICoqa3dhcmdzKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbnRleHQuZ2V0KCJub19jb21tYW5kX2xvZyIpOgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBsaW5lLl9za2lwKAogICAgICAgICAgICAgICAgICAgIHNlcnZlciwKICAgICAgICAgICAgICAgICAgICBwbGFuX2xvZywKICAgICAgICAgICAgICAgICAgICBsb2c9ewogICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFibGVfdmFsdWVzIjogZGljdCh2YXJpYWJsZV92YWx1ZXMgb3Ige30pLAogICAgICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogcGxhbl9sb2cuamV0X3RlbXBsYXRlX2lkLmlkCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBsYW5fbG9nLmpldF90ZW1wbGF0ZV9pZAogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICJqZXRfaWQiOiBwbGFuX2xvZy5qZXRfaWQuaWQgaWYgcGxhbl9sb2cuamV0X2lkIGVsc2UgTm9uZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBlbHNlOgogICAgICAgICAgICBwbGFuX2xvZy5maW5pc2gocGxhbl9zdGF0dXM9UExBTl9JU19FTVBUWSkKCiAgICAgICAgcmV0dXJuIHBsYW5fbG9nCgogICAgZGVmIHN0b3Aoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgRm9yY2Ugc3RvcCB0aGlzIHBsYW4gbG9nIChhbmQgY3VycmVudGx5IHJ1bm5pbmcgY29tbWFuZCBpZiBwb3NzaWJsZSkuCiAgICAgICAgIiIiCiAgICAgICAgdXNlcl9uYW1lID0gc2VsZi5lbnYudXNlci5uYW1lCiAgICAgICAgZm9yIGxvZyBpbiBzZWxmOgogICAgICAgICAgICBpZiBub3QgbG9nLmlzX3J1bm5pbmc6CiAgICAgICAgICAgICAgICBjb250aW51ZQoKICAgICAgICAgICAgIyBGaW5pc2ggcGxhbiBsb2cKICAgICAgICAgICAgbG9nLmZpbmlzaCgKICAgICAgICAgICAgICAgIHBsYW5fc3RhdHVzPVBMQU5fU1RPUFBFRCwKICAgICAgICAgICAgICAgIGN1c3RvbV9tZXNzYWdlPV8oIlN0b3BwZWQgYnkgdXNlciAlKHVzZXIpcyIsIHVzZXI9dXNlcl9uYW1lKSwKICAgICAgICAgICAgICAgIGlzX3N0b3BwZWQ9VHJ1ZSwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBTdG9wIHJ1bm5pbmcgY29tbWFuZAogICAgICAgICAgICBydW5uaW5nX2NtZF9sb2dzID0gbG9nLmNvbW1hbmRfbG9nX2lkcy5maWx0ZXJlZChsYW1iZGEgYzogYy5pc19ydW5uaW5nKQogICAgICAgICAgICBydW5uaW5nX2NtZF9sb2dzLnN0b3AoKQoKICAgIGRlZiBhY3Rpb25fc3RvcChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBY3Rpb24gdG8gc3RvcCB0aGUgcnVubmluZyBwbGFucy4KICAgICAgICAiIiIKICAgICAgICBzZWxmLnN0b3AoKQoKICAgICAgICBpZiBsZW4oc2VsZikgPiAxOiAgIyBtb3JlIHRoYW4gb25lIHBsYW4gaXMgcnVubmluZwogICAgICAgICAgICB0aXRsZSA9IF8oIkZsaWdodCBQbGFucyBTdG9wcGVkIikKICAgICAgICAgICAgbWVzc2FnZSA9ICIsICIuam9pbihbcGxhbi5uYW1lIGZvciBwbGFuIGluIHNlbGZdKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHRpdGxlID0gXygiRmxpZ2h0IFBsYW4gU3RvcHBlZCIpCiAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLm5hbWUKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5jbGllbnQiLAogICAgICAgICAgICAidGFnIjogImRpc3BsYXlfbm90aWZpY2F0aW9uIiwKICAgICAgICAgICAgInBhcmFtcyI6IHsKICAgICAgICAgICAgICAgICJ0aXRsZSI6IHRpdGxlLAogICAgICAgICAgICAgICAgIm1lc3NhZ2UiOiBtZXNzYWdlLAogICAgICAgICAgICAgICAgInN0aWNreSI6IEZhbHNlLAogICAgICAgICAgICAgICAgIm5leHQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93X2Nsb3NlIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfQoKICAgIGRlZiBmaW5pc2goc2VsZiwgcGxhbl9zdGF0dXMsICoqa3dhcmdzKToKICAgICAgICAiIiJGaW5pc2ggcGxhbiBleGVjdXRpb24KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcGxhbl9zdGF0dXMgKEludGVnZXIpIHBsYW4gZXhlY3V0aW9uIGNvZGUKICAgICAgICAgICAgKiprd2FyZ3MgKGRpY3QpOiBvcHRpb25hbCB2YWx1ZXMKICAgICAgICAiIiIKICAgICAgICB2YWx1ZXMgPSB7CiAgICAgICAgICAgICJpc19ydW5uaW5nIjogRmFsc2UsCiAgICAgICAgICAgICJwbGFuX3N0YXR1cyI6IHBsYW5fc3RhdHVzLAogICAgICAgICAgICAiZmluaXNoX2RhdGUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgfQoKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQoKICAgICAgICAjIEFwcGx5IGt3YXJncwogICAgICAgIGlmIGt3YXJnczoKICAgICAgICAgICAgdmFsdWVzLnVwZGF0ZShrd2FyZ3MpCiAgICAgICAgc2VsZi5zdWRvKCkud3JpdGUodmFsdWVzKQoKICAgICAgICAjIENhbGwgdGhlIHBsYW4gZmluaXNoZWQgaG9vawogICAgICAgICMgVXNlIHRyeS9leGNlcHQgdG8gZW5zdXJlIHRoYXQgdGhlIHBsYW4gZmluaXNoZWQgaG9vayBpcyBjYWxsZWQKICAgICAgICB0cnk6CiAgICAgICAgICAgICMgU2F2ZXBvaW50IHRvIGVuc3VyZSB0aGF0IHZhbHVlcyBhcmUgc3RvcmVkCiAgICAgICAgICAgICMgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCiAgICAgICAgICAgIHdpdGggc2VsZi5lbnYuY3Iuc2F2ZXBvaW50KCk6CiAgICAgICAgICAgICAgICBzZWxmLl9wbGFuX2ZpbmlzaGVkKCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIF9sb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICJQb3N0LWZpbmlzaCBob29rIGZvciBwbGFuICclcycgZmFpbGVkOiAlcyIsIHNlbGYucGxhbl9pZC5uYW1lLCBlCiAgICAgICAgICAgICkKICAgICAgICAjIENvbnRpbnVlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGxvZ2ljCgogICAgICAgICMgSmV0IFRlbXBsYXRlIGFjdGlvbjogb25seSBpZiBpdCdzIG5vdCBhIHN1Yi1wbGFuCiAgICAgICAgIyBOQjogSmV0IFRlbXBsYXRlIGlzIGFsd2F5cyBzZXQgYXV0b21hdGljYWxseSBldmVuIGlmCiAgICAgICAgIyBpdCdzIG5vdCBwcm92aWRlZCBleHBsaWNpdGx5IHdoZW4gdGhlIHBsYW4gaXMgcnVuLgogICAgICAgIGlmIG5vdCBzZWxmLmpldF90ZW1wbGF0ZV9pZCBvciBzZWxmLnBhcmVudF9mbGlnaHRfcGxhbl9sb2dfaWQ6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICAjIFdheXBvaW50IGFjdGlvbjogb25seSBpZiBpdCdzIG5vdCBhIHN1Yi1wbGFuCiAgICAgICAgaWYgc2VsZi53YXlwb2ludF9pZDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgd2l0aCBzZWxmLmVudi5jci5zYXZlcG9pbnQoKToKICAgICAgICAgICAgICAgICAgICBzZWxmLndheXBvaW50X2lkLl9wbGFuX2ZpbmlzaGVkKHNlbGYpCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9sb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiUG9zdC1maW5pc2ggaG9vayBmb3Igd2F5cG9pbnQgJyVzJyBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICBzZWxmLndheXBvaW50X2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgIyBGaW5pc2ggdGVtcGxhdGUgaW5zdGFsbC91bmluc3RhbGwKICAgICAgICBpZiBzZWxmLmpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYuZW52LmNyLnNhdmVwb2ludCgpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX2luc3RhbGxfaWQuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKAogICAgICAgICAgICAgICAgICAgICAgICBwbGFuX3N0YXR1cz1zZWxmLnBsYW5fc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICAgICAgX2xvZ2dlci53YXJuaW5nKAogICAgICAgICAgICAgICAgICAgICJQb3N0LWZpbmlzaCBob29rIGZvciB0ZW1wbGF0ZSBpbnN0YWxsL3VuaW5zdGFsbCAiCiAgICAgICAgICAgICAgICAgICAgIiclcyciCiAgICAgICAgICAgICAgICAgICAgIiBmYWlsZWQ6ICVzIiwKICAgICAgICAgICAgICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICkKCiAgICAgICAgIyBKZXQKICAgICAgICBpZiBzZWxmLmpldF9pZCBhbmQgc2VsZi5qZXRfYWN0aW9uX2lkOgogICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICB3aXRoIHNlbGYuZW52LmNyLnNhdmVwb2ludCgpOgogICAgICAgICAgICAgICAgICAgIHNlbGYuamV0X2lkLl9mbGlnaHRfcGxhbl9maW5pc2hlZCgKICAgICAgICAgICAgICAgICAgICAgICAgcGxhbl9zdGF0dXM9c2VsZi5wbGFuX3N0YXR1cywKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgICAgIF9sb2dnZXIud2FybmluZygKICAgICAgICAgICAgICAgICAgICAiUG9zdC1maW5pc2ggaG9vayBmb3IgamV0ICclcycgZmFpbGVkOiAlcyIsIHNlbGYuamV0X2lkLm5hbWUsIGUKICAgICAgICAgICAgICAgICkKCiAgICBkZWYgcmVjb3JkKHNlbGYsIHNlcnZlciwgcGxhbiwgc3RhdHVzLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUmVjb3JkIHBsYW4gbG9nIHdpdGhvdXQgcnVubmluZyBpdC4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgc2VydmVyIChjeC50b3dlci5zZXJ2ZXIoKSkgc2VydmVyLgogICAgICAgICAgICBwbGFuIChjeC50b3dlci5wbGFuKCkpIEZsaWdodCBQbGFuLgogICAgICAgICAgICBzdGF0dXMgKGludCkgcGxhbiBleGVjdXRpb24gY29kZQogICAgICAgICAgICBzdGFydF9kYXRlIChkYXRldGltZSkgZmxpZ2h0IHBsYW4gc3RhcnQgZGF0ZSB0aW1lLgogICAgICAgICAgICBmaW5pc2hfZGF0ZSAoZGF0ZXRpbWUpIGZsaWdodCBwbGFuIGZpbmlzaCBkYXRlIHRpbWUuCiAgICAgICAgICAgICoqa3dhcmdzIChkaWN0KTogb3B0aW9uYWwgdmFsdWVzCiAgICAgICAgICAgICAgICBGb2xsb3dpbmcga2V5cyBhcmUgc3VwcG9ydGVkIGJ1dCBub3QgbGltaXRlZCB0bzoKICAgICAgICAgICAgICAgIC0gInBsYW5fbG9nIjoge3ZhbHVlcyBwYXNzZWQgdG8gZmxpZ2h0cGxhbiBsb2dnZXJ9CiAgICAgICAgICAgICAgICAtICJsb2ciOiB7dmFsdWVzIHBhc3NlZCB0byBsb2dnZXJ9CiAgICAgICAgICAgICAgICAtICJrZXkiOiB7dmFsdWVzIHBhc3NlZCB0byBrZXkgcGFyc2VyfQogICAgICAgICAgICAgICAgLSAibm9fY29tbWFuZF9sb2ciIChib29sKTogSWYgVHJ1ZSwgbm8gbG9ncyB3aWxsIGJlIHJlY29yZGVkIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1leGVjdXRhYmxlIGxpbmVzLgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGN4LnRvd2VyLnBsYW4ubG9nKCk6IE5ldyBmbGlnaHRwbGFuIGxvZyByZWNvcmQuCiAgICAgICAgIiIiCgogICAgICAgIHZhbHMgPSB7CiAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbi5pZCwKICAgICAgICAgICAgInN0YXJ0X2RhdGUiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgfQoKICAgICAgICAjIEV4dHJhY3QgYW5kIGFwcGx5IHBsYW4gbG9nIGt3YXJncwogICAgICAgIHBsYW5fbG9nX2t3YXJncyA9IGt3YXJncy5nZXQoInBsYW5fbG9nIikKICAgICAgICBpZiBwbGFuX2xvZ19rd2FyZ3M6CiAgICAgICAgICAgIHZhbHMudXBkYXRlKHBsYW5fbG9nX2t3YXJncykKCiAgICAgICAgcGxhbl9sb2cgPSBzZWxmLnN1ZG8oKS5jcmVhdGUodmFscykKICAgICAgICBwbGFuX2xvZy5maW5pc2gocGxhbl9zdGF0dXM9c3RhdHVzKQogICAgICAgIHJldHVybiBwbGFuX2xvZwoKICAgIGRlZiBfcGxhbl9maW5pc2hlZChzZWxmKToKICAgICAgICAiIiJUcmlnZ2VyZWQgd2hlbiBmbGlnaHRwbGFuIGluIGZpbmlzaGVkCiAgICAgICAgSW5oZXJpdCB0byBpbXBsZW1lbnQgeW91ciBvd24gaG9va3MKCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgYm9vbDogVHJ1ZSBpZiBldmVudCB3YXMgaGFuZGxlZAogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCgogICAgICAgICMgRG8gbm90IG5vdGlmeSBpZiBhIHBsYW4gdGhhdCB3YXMgcnVuIGZyb20gYW5vdGhlciBwbGFuIGhhcyBiZWVuIGV4ZWN1dGVkCiAgICAgICAgaWYgc2VsZi5wYXJlbnRfZmxpZ2h0X3BsYW5fbG9nX2lkOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIENoZWNrIGlmIG5vdGlmaWNhdGlvbnMgYXJlIGVuYWJsZWQKICAgICAgICBJQ1Bfc3VkbyA9IHNlbGYuZW52WyJpci5jb25maWdfcGFyYW1ldGVyIl0uc3VkbygpCiAgICAgICAgbm90aWZpY2F0aW9uX3R5cGVfc3VjY2VzcyA9IElDUF9zdWRvLmdldF9wYXJhbSgKICAgICAgICAgICAgImNldG1peF90b3dlcl9zZXJ2ZXIubm90aWZpY2F0aW9uX3R5cGVfc3VjY2VzcyIKICAgICAgICApCiAgICAgICAgbm90aWZpY2F0aW9uX3R5cGVfZXJyb3IgPSBJQ1Bfc3Vkby5nZXRfcGFyYW0oCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLm5vdGlmaWNhdGlvbl90eXBlX2Vycm9yIgogICAgICAgICkKCiAgICAgICAgIyBQcmVwYXJlIG5vdGlmaWNhdGlvbnMKICAgICAgICBpZiBub3Qgbm90aWZpY2F0aW9uX3R5cGVfc3VjY2VzcyBhbmQgbm90IG5vdGlmaWNhdGlvbl90eXBlX2Vycm9yOgogICAgICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICAgICAjIFVzZSBjb250ZXh0IHRpbWVzdGFtcCB0byBhdm9pZCB0aW1lem9uZSBpc3N1ZXMKICAgICAgICBjb250ZXh0X3RpbWVzdGFtcCA9IGZpZWxkcy5EYXRldGltZS5jb250ZXh0X3RpbWVzdGFtcCgKICAgICAgICAgICAgc2VsZiwgZmllbGRzLkRhdGV0aW1lLm5vdygpCiAgICAgICAgKQoKICAgICAgICAjIEFjdGlvbiBmb3IgYnV0dG9uCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5hY3Rpb25fY3hfdG93ZXJfcGxhbl9sb2ciCiAgICAgICAgKQoKICAgICAgICBjb250ZXh0ID0gc2VsZi5lbnYuY29udGV4dC5jb3B5KCkKICAgICAgICBwYXJhbXMgPSBkaWN0KGNvbnRleHQuZ2V0KCJwYXJhbXMiKSBvciB7fSkKICAgICAgICBwYXJhbXNbImJ1dHRvbl9uYW1lIl0gPSBfKCJWaWV3IExvZyIpCiAgICAgICAgY29udGV4dFsicGFyYW1zIl0gPSBwYXJhbXMKCiAgICAgICAgIyBBZGQgcmVjb3JkIGlkIGFuZCBjb250ZXh0IHRvIHRoZSBhY3Rpb24KICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiY29udGV4dCI6IGNvbnRleHQsCiAgICAgICAgICAgICAgICAicmVzX2lkIjogc2VsZi5pZCwKICAgICAgICAgICAgICAgICJ2aWV3cyI6IFsoRmFsc2UsICJmb3JtIildLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNlbmQgbm90aWZpY2F0aW9uIG9ubHkgaWYgbm90IGEgamV0LXJlbGF0ZWQgcGxhbgogICAgICAgIGlmICgKICAgICAgICAgICAgc2VsZi5wbGFuX3N0YXR1cyA9PSAwCiAgICAgICAgICAgIGFuZCBub3RpZmljYXRpb25fdHlwZV9zdWNjZXNzCiAgICAgICAgICAgIGFuZCBub3Qgc2VsZi5qZXRfdGVtcGxhdGVfaWQKICAgICAgICApOgogICAgICAgICAgICAjIFN1Y2Nlc3Mgbm90aWZpY2F0aW9uCiAgICAgICAgICAgIHNlbGYuY3JlYXRlX3VpZC5ub3RpZnlfc3VjY2VzcygKICAgICAgICAgICAgICAgIG1lc3NhZ2U9XygKICAgICAgICAgICAgICAgICAgICAiJSh0aW1lc3RhbXApczxici8+IiAiRmxpZ2h0IFBsYW4gJyUobmFtZSlzJyBmaW5pc2hlZCBzdWNjZXNzZnVsbHkiLAogICAgICAgICAgICAgICAgICAgIG5hbWU9c2VsZi5wbGFuX2lkLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wPWNvbnRleHRfdGltZXN0YW1wLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIHRpdGxlPXNlbGYuc2VydmVyX2lkLm5hbWUsCiAgICAgICAgICAgICAgICBzdGlja3k9bm90aWZpY2F0aW9uX3R5cGVfc3VjY2VzcyA9PSAic3RpY2t5IiwKICAgICAgICAgICAgICAgIGFjdGlvbj1hY3Rpb24sCiAgICAgICAgICAgICkKCiAgICAgICAgIyBFcnJvciBub3RpZmljYXRpb24KICAgICAgICAjIFRoZXkgYXJlIHNob3duIGZvciBqZXQtcmVsYXRlZCBwbGFucyBhbmQgdGVtcGxhdGUgaW5zdGFsbGF0aW9uL3VuaW5zdGFsbGF0aW9uCiAgICAgICAgIyBhcyB3ZWxsIHRvIHNpbXBsaWZ5IHRoZSBkZWJ1Z2dpbmcgcHJvY2Vzcy4KICAgICAgICBpZiBzZWxmLnBsYW5fc3RhdHVzICE9IDAgYW5kIG5vdGlmaWNhdGlvbl90eXBlX2Vycm9yOgogICAgICAgICAgICBzZWxmLmNyZWF0ZV91aWQubm90aWZ5X2RhbmdlcigKICAgICAgICAgICAgICAgIG1lc3NhZ2U9XygKICAgICAgICAgICAgICAgICAgICAiJSh0aW1lc3RhbXApczxici8+IgogICAgICAgICAgICAgICAgICAgICJGbGlnaHQgUGxhbiAnJShuYW1lKXMnIgogICAgICAgICAgICAgICAgICAgICIgZmluaXNoZWQgd2l0aCBlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgbmFtZT1zZWxmLnBsYW5faWQubmFtZSwKICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXA9Y29udGV4dF90aW1lc3RhbXAsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgdGl0bGU9c2VsZi5zZXJ2ZXJfaWQubmFtZSwKICAgICAgICAgICAgICAgIHN0aWNreT1ub3RpZmljYXRpb25fdHlwZV9lcnJvciA9PSAic3RpY2t5IiwKICAgICAgICAgICAgICAgIGFjdGlvbj1hY3Rpb24sCiAgICAgICAgICAgICkKCiAgICAgICAgcmV0dXJuIFRydWUKCiAgICBkZWYgX3BsYW5fY29tbWFuZF9maW5pc2hlZChzZWxmLCBjb21tYW5kX2xvZyk6CiAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiBpcyB0cmlnZ2VyZWQgd2hlbiBhIGNvbW1hbmQgZnJvbSB0aGlzIGxvZyBpcyBmaW5pc2hlZC4KICAgICAgICBOZXh0IGFjdGlvbiBpcyB0cmlnZ2VyZWQgYmFzZWQgb24gY29tbWFuZCBzdGF0dXMgKGFrIGV4aXQgY29kZSkKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgY29tbWFuZF9sb2cgKGN4LnRvd2VyLmNvbW1hbmQubG9nKCkpOiBDb21tYW5kIGxvZyBvYmplY3QKCiAgICAgICAgIiIiCiAgICAgICAgc2VsZi5lbnN1cmVfb25lKCkKCiAgICAgICAgIyBQcmV2ZW50IHNjaGVkdWxpbmcgZnVydGhlciBhY3Rpb25zIGlmIHRoaXMgbG9nIHdhcyBzdG9wcGVkCiAgICAgICAgaWYgc2VsZi5pc19zdG9wcGVkOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgIyBVcGRhdGUgcGxhbiBsb2cgdmFyaWFibGUgdmFsdWVzIGZyb20gY29tbWFuZCBsb2cKICAgICAgICAjIE92ZXJ3cml0ZSB3aXRoIGNvbW1hbmQgbG9nIHZhbHVlcyAobGFzdCBjb21tYW5kJ3MgdmFsdWVzIHRha2UgcHJlY2VkZW5jZSkKICAgICAgICBzZWxmLnZhcmlhYmxlX3ZhbHVlcyA9IGNvbW1hbmRfbG9nLnZhcmlhYmxlX3ZhbHVlcwoKICAgICAgICAjIEdldCBuZXh0IGxpbmUgdG8gZXhlY3V0ZQogICAgICAgIHNlbGYucGxhbl9pZC5fcnVuX25leHRfYWN0aW9uKGNvbW1hbmRfbG9nKSAgIyB0eXBlOiBpZ25vcmUK |