1 line
33 KiB
Python
1 line
33 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjQgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2RvbyBpbXBvcnQgXywgYXBpLCBmaWVsZHMsIG1vZGVscwpmcm9tIG9kb28uZXhjZXB0aW9ucyBpbXBvcnQgVmFsaWRhdGlvbkVycm9yCgoKY2xhc3MgQ3hUb3dlclNlcnZlclRlbXBsYXRlKG1vZGVscy5Nb2RlbCk6CiAgICAiIiJTZXJ2ZXIgVGVtcGxhdGUuIFVzZWQgdG8gc2ltcGxpZnkgc2VydmVyIGNyZWF0aW9uIiIiCgogICAgX25hbWUgPSAiY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlIgogICAgX2luaGVyaXQgPSBbCiAgICAgICAgImN4LnRvd2VyLnJlZmVyZW5jZS5taXhpbiIsCiAgICAgICAgIm1haWwudGhyZWFkIiwKICAgICAgICAibWFpbC5hY3Rpdml0eS5taXhpbiIsCiAgICAgICAgImN4LnRvd2VyLmFjY2Vzcy5yb2xlLm1peGluIiwKICAgICAgICAiY3gudG93ZXIudGFnLm1peGluIiwKICAgIF0KICAgIF9kZXNjcmlwdGlvbiA9ICJDZXRtaXggVG93ZXIgU2VydmVyIFRlbXBsYXRlIgogICAgX29yZGVyID0gIm5hbWUiCgogICAgYWN0aXZlID0gZmllbGRzLkJvb2xlYW4oZGVmYXVsdD1UcnVlKQoKICAgICMgLS0tIENvbm5lY3Rpb24KICAgIHNzaF9wb3J0ID0gZmllbGRzLkludGVnZXIoc3RyaW5nPSJTU0ggcG9ydCIsIGRlZmF1bHQ9MjIpCiAgICBzc2hfdXNlcm5hbWUgPSBmaWVsZHMuQ2hhcihzdHJpbmc9IlNTSCBVc2VybmFtZSIpCiAgICBzc2hfcGFzc3dvcmQgPSBmaWVsZHMuQ2hhcihzdHJpbmc9IlNTSCBQYXNzd29yZCIpCiAgICBzc2hfa2V5X2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIua2V5IiwKICAgICAgICBzdHJpbmc9IlNTSCBQcml2YXRlIEtleSIsCiAgICAgICAgZG9tYWluPVsoImtleV90eXBlIiwgIj0iLCAiayIpXSwKICAgICkKICAgIHNzaF9hdXRoX21vZGUgPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHN0cmluZz0iU1NIIEF1dGggTW9kZSIsCiAgICAgICAgc2VsZWN0aW9uPVsKICAgICAgICAgICAgKCJwIiwgIlBhc3N3b3JkIiksCiAgICAgICAgICAgICgiayIsICJLZXkiKSwKICAgICAgICBdLAogICAgKQogICAgdXNlX3N1ZG8gPSBmaWVsZHMuU2VsZWN0aW9uKAogICAgICAgIHN0cmluZz0iVXNlIHN1ZG8iLAogICAgICAgIHNlbGVjdGlvbj1bKCJuIiwgIldpdGhvdXQgcGFzc3dvcmQiKSwgKCJwIiwgIldpdGggcGFzc3dvcmQiKV0sCiAgICAgICAgaGVscD0iUnVuIGNvbW1hbmRzIHVzaW5nICdzdWRvJyIsCiAgICApCgogICAgIyAtLS0gQXR0cmlidXRlcwogICAgY29sb3IgPSBmaWVsZHMuSW50ZWdlcihoZWxwPSJGb3IgYmV0dGVyIHZpc3VhbGl6YXRpb24gaW4gdmlld3MiKQogICAgb3NfaWQgPSBmaWVsZHMuTWFueTJvbmUoc3RyaW5nPSJPcGVyYXRpbmcgU3lzdGVtIiwgY29tb2RlbF9uYW1lPSJjeC50b3dlci5vcyIpCiAgICB0YWdfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfc2VydmVyX3RlbXBsYXRlX3RhZ19yZWwiLAogICAgICAgIGNvbHVtbjE9InNlcnZlcl90ZW1wbGF0ZV9pZCIsCiAgICAgICAgY29sdW1uMj0idGFnX2lkIiwKICAgICkKCiAgICAjIC0tLSBWYXJpYWJsZXMKICAgICMgV2UgYXJlIG5vdCB1c2luZyB2YXJpYWJsZSBtaXhpbiBiZWNhdXNlIHdlIGRvbid0IG5lZWQgdG8gcGFyc2UgdmFsdWVzCiAgICB2YXJpYWJsZV92YWx1ZV9pZHMgPSBmaWVsZHMuT25lMm1hbnkoCiAgICAgICAgc3RyaW5nPSJWYXJpYWJsZSBWYWx1ZXMiLAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIudmFyaWFibGUudmFsdWUiLAogICAgICAgIGF1dG9fam9pbj1UcnVlLAogICAgICAgIGludmVyc2VfbmFtZT0ic2VydmVyX3RlbXBsYXRlX2lkIiwKICAgICkKCiAgICAjIC0tLSBTZXJ2ZXIgbG9ncwogICAgc2VydmVyX2xvZ19pZHMgPSBmaWVsZHMuT25lMm1hbnkoCiAgICAgICAgY29tb2RlbF9uYW1lPSJjeC50b3dlci5zZXJ2ZXIubG9nIiwgaW52ZXJzZV9uYW1lPSJzZXJ2ZXJfdGVtcGxhdGVfaWQiCiAgICApCgogICAgIyAtLS0gU2hvcnRjdXRzCiAgICBzaG9ydGN1dF9pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2hvcnRjdXQiLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9zZXJ2ZXJfdGVtcGxhdGVfc2hvcnRjdXRfcmVsIiwKICAgICAgICBjb2x1bW4xPSJzZXJ2ZXJfdGVtcGxhdGVfaWQiLAogICAgICAgIGNvbHVtbjI9InNob3J0Y3V0X2lkIiwKICAgICAgICBzdHJpbmc9IlNob3J0Y3V0cyIsCiAgICApCgogICAgIyAtLS0gU2NoZWR1bGVkIFRhc2tzCiAgICBzY2hlZHVsZWRfdGFza19pZHMgPSBmaWVsZHMuTWFueTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2NoZWR1bGVkLnRhc2siLAogICAgICAgIHJlbGF0aW9uPSJjeF90b3dlcl9zZXJ2ZXJfdGVtcGxhdGVfc2NoZWR1bGVkX3Rhc2tfcmVsIiwKICAgICAgICBjb2x1bW4xPSJzZXJ2ZXJfdGVtcGxhdGVfaWQiLAogICAgICAgIGNvbHVtbjI9InNjaGVkdWxlZF90YXNrX2lkIiwKICAgICAgICBzdHJpbmc9IlNjaGVkdWxlZCBUYXNrcyIsCiAgICApCgogICAgIyAtLS0gRmxpZ2h0IFBsYW4KICAgIGZsaWdodF9wbGFuX2lkID0gZmllbGRzLk1hbnkyb25lKAogICAgICAgICJjeC50b3dlci5wbGFuIiwKICAgICAgICBoZWxwPSJUaGlzIGZsaWdodCBwbGFuIHdpbGwgYmUgcnVuIHVwb24gc2VydmVyIGNyZWF0aW9uIiwKICAgICAgICBkb21haW49IlsoJ3NlcnZlcl9pZHMnLCAnPScsIEZhbHNlKV0iLAogICAgKQoKICAgICMgLS0tLSBEZWxldGUgcGxhbgogICAgcGxhbl9kZWxldGVfaWQgPSBmaWVsZHMuTWFueTJvbmUoCiAgICAgICAgImN4LnRvd2VyLnBsYW4iLAogICAgICAgIHN0cmluZz0iT24gRGVsZXRlIFBsYW4iLAogICAgICAgIGdyb3Vwcz0iY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9tYW5hZ2VyIiwKICAgICAgICBoZWxwPSJUaGlzIEZsaWdodHBsYW4gd2lsbCBiZSBleGVjdXRlZCB3aGVuIHRoZSBzZXJ2ZXIgaXMgZGVsZXRlZCIsCiAgICApCgogICAgIyAtLS0gQ3JlYXRlZCBTZXJ2ZXJzCiAgICBzZXJ2ZXJfaWRzID0gZmllbGRzLk9uZTJtYW55KAogICAgICAgIGNvbW9kZWxfbmFtZT0iY3gudG93ZXIuc2VydmVyIiwKICAgICAgICBpbnZlcnNlX25hbWU9InNlcnZlcl90ZW1wbGF0ZV9pZCIsCiAgICApCiAgICBzZXJ2ZXJfY291bnQgPSBmaWVsZHMuSW50ZWdlcigKICAgICAgICBjb21wdXRlPSJfY29tcHV0ZV9zZXJ2ZXJfY291bnQiLAogICAgKQoKICAgICMgLS0gT3RoZXIKICAgIG5vdGUgPSBmaWVsZHMuVGV4dCgpCgogICAgIyAtLS0tIEFjY2Vzcy4gQWRkIHJlbGF0aW9uIGZvciBtaXhpbiBmaWVsZHMKICAgIHVzZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfc2VydmVyX3RlbXBsYXRlX3VzZXJfcmVsIiwKICAgICAgICBkb21haW49bGFtYmRhIHNlbGY6IFsKICAgICAgICAgICAgKCJncm91cHNfaWQiLCAiaW4iLCBbc2VsZi5lbnYucmVmKCJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX21hbmFnZXIiKS5pZF0pCiAgICAgICAgXSwKICAgICkKICAgIG1hbmFnZXJfaWRzID0gZmllbGRzLk1hbnkybWFueSgKICAgICAgICByZWxhdGlvbj0iY3hfdG93ZXJfc2VydmVyX3RlbXBsYXRlX21hbmFnZXJfcmVsIiwKICAgICkKCiAgICBAYXBpLmRlcGVuZHMoInNlcnZlcl9pZHMiKQogICAgZGVmIF9jb21wdXRlX3NlcnZlcl9jb3VudChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBDb21wdXRlIHRvdGFsIHNlcnZlciBjb3VudHMgY3JlYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZXMKICAgICAgICAiIiIKICAgICAgICBmb3IgdGVtcGxhdGUgaW4gc2VsZjoKICAgICAgICAgICAgdGVtcGxhdGUuc2VydmVyX2NvdW50ID0gbGVuKHRlbXBsYXRlLnNlcnZlcl9pZHMpCgogICAgZGVmIGNvcHkoc2VsZiwgZGVmYXVsdD1Ob25lKToKICAgICAgICAiIiJEdXBsaWNhdGUgdGhlIHNlcnZlciB0ZW1wbGF0ZSBhbG9uZyB3aXRoIHZhcmlhYmxlIHZhbHVlcyBhbmQgc2VydmVyIGxvZ3MuIiIiCiAgICAgICAgZGVmYXVsdCA9IGRpY3QoZGVmYXVsdCBvciB7fSkKCiAgICAgICAgIyBEdXBsaWNhdGUgdGhlIHNlcnZlciB0ZW1wbGF0ZSBpdHNlbGYKICAgICAgICBuZXdfdGVtcGxhdGUgPSBzdXBlcigpLmNvcHkoZGVmYXVsdCkKCiAgICAgICAgIyBEdXBsaWNhdGUgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgZm9yIHZhcmlhYmxlX3ZhbHVlIGluIHNlbGYudmFyaWFibGVfdmFsdWVfaWRzOgogICAgICAgICAgICB2YXJpYWJsZV92YWx1ZS53aXRoX2NvbnRleHQocmVmZXJlbmNlX21peGluX3NraXBfc2VsZj1UcnVlKS5jb3B5KAogICAgICAgICAgICAgICAgeyJzZXJ2ZXJfdGVtcGxhdGVfaWQiOiBuZXdfdGVtcGxhdGUuaWR9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBEdXBsaWNhdGUgc2VydmVyIGxvZ3MKICAgICAgICBmb3Igc2VydmVyX2xvZyBpbiBzZWxmLnNlcnZlcl9sb2dfaWRzOgogICAgICAgICAgICBzZXJ2ZXJfbG9nLmNvcHkoeyJzZXJ2ZXJfdGVtcGxhdGVfaWQiOiBuZXdfdGVtcGxhdGUuaWR9KQoKICAgICAgICByZXR1cm4gbmV3X3RlbXBsYXRlCgogICAgZGVmIGFjdGlvbl9jcmVhdGVfc2VydmVyKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFJldHVybnMgd2l6YXJkIGFjdGlvbiB0byBjcmVhdGUgbmV3IHNlcnZlcgogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgY29udGV4dCA9IHNlbGYuZW52LmNvbnRleHQuY29weSgpCiAgICAgICAgY29udGV4dC51cGRhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJkZWZhdWx0X3NlcnZlcl90ZW1wbGF0ZV9pZCI6IHNlbGYuaWQsICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgICAgICJkZWZhdWx0X2NvbG9yIjogc2VsZi5jb2xvciwKICAgICAgICAgICAgICAgICJkZWZhdWx0X3NzaF9wb3J0Ijogc2VsZi5zc2hfcG9ydCwKICAgICAgICAgICAgICAgICJkZWZhdWx0X3NzaF91c2VybmFtZSI6IHNlbGYuc3NoX3VzZXJuYW1lLAogICAgICAgICAgICAgICAgImRlZmF1bHRfc3NoX3Bhc3N3b3JkIjogc2VsZi5zc2hfcGFzc3dvcmQsCiAgICAgICAgICAgICAgICAiZGVmYXVsdF9zc2hfa2V5X2lkIjogc2VsZi5zc2hfa2V5X2lkLmlkLAogICAgICAgICAgICAgICAgImRlZmF1bHRfc3NoX2F1dGhfbW9kZSI6IHNlbGYuc3NoX2F1dGhfbW9kZSwKICAgICAgICAgICAgICAgICJkZWZhdWx0X3BsYW5fZGVsZXRlX2lkIjogc2VsZi5wbGFuX2RlbGV0ZV9pZC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBpZiBzZWxmLnZhcmlhYmxlX3ZhbHVlX2lkczoKICAgICAgICAgICAgY29udGV4dC51cGRhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfbGluZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZV9pZCI6IGxpbmUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYudmFyaWFibGVfdmFsdWVfaWRzCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgInR5cGUiOiAiaXIuYWN0aW9ucy5hY3Rfd2luZG93IiwKICAgICAgICAgICAgIm5hbWUiOiBfKCJDcmVhdGUgU2VydmVyIiksCiAgICAgICAgICAgICJyZXNfbW9kZWwiOiAiY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlLmNyZWF0ZS53aXphcmQiLAogICAgICAgICAgICAidmlld19tb2RlIjogImZvcm0iLAogICAgICAgICAgICAidGFyZ2V0IjogIm5ldyIsCiAgICAgICAgICAgICJjb250ZXh0IjogY29udGV4dCwKICAgICAgICB9CgogICAgZGVmIGFjdGlvbl9vcGVuX3NlcnZlcnMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgUmV0dXJuIGFjdGlvbiB0byBvcGVuIHJlbGF0ZWQgc2VydmVycwogICAgICAgICIiIgogICAgICAgIHNlbGYuZW5zdXJlX29uZSgpCiAgICAgICAgYWN0aW9uID0gc2VsZi5lbnZbImlyLmFjdGlvbnMuYWN0X3dpbmRvdyJdLl9mb3JfeG1sX2lkKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5hY3Rpb25fY3hfdG93ZXJfc2VydmVyIgogICAgICAgICkKICAgICAgICBhY3Rpb24udXBkYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiZG9tYWluIjogWygic2VydmVyX3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmlkKV0sICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICByZXR1cm4gYWN0aW9uCgogICAgQGFwaS5tb2RlbAogICAgZGVmIGNyZWF0ZV9zZXJ2ZXJfZnJvbV90ZW1wbGF0ZShzZWxmLCB0ZW1wbGF0ZV9yZWZlcmVuY2UsIHNlcnZlcl9uYW1lLCAqKmt3YXJncyk6CiAgICAgICAgIiIiVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBpcyBtZWFudCB0byBiZSBjYWxsZWQKICAgICAgICB3aGVuIHdlIG5lZWQgdG8gY3JlYXRlIGEgc2VydmVyIGZyb20gc3BlY2lmaWMgc2VydmVyIHRlbXBsYXRlCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHRlbXBsYXRlX3JlZmVyZW5jZSAoQ2hhcik6IFNlcnZlciB0ZW1wbGF0ZSByZWZlcmVuY2UKICAgICAgICAgICAgc2VydmVyX25hbWUgKENoYXIpOiBOYW1lIG9mIHRoZSBuZXcgc2VydmVyCgogICAgICAgIEt3YXJnczoKICAgICAgICAgICAgcGFydG5lciAocmVzLnBhcnRuZXIoKSwgb3B0aW9uYWwpOiBQYXJ0bmVyIHRoaXMgc2VydmVyIGJlbG9uZ3MgdG8uCiAgICAgICAgICAgIGlwdjQgKENoYXIsIG9wdGlvbmFsKTogSVAgdjQgYWRkcmVzcy4gRGVmYXVsdHMgdG8gTm9uZS4KICAgICAgICAgICAgaXB2NiAoQ2hhciwgb3B0aW9uYWwpOiBJUCB2NiBhZGRyZXNzLgogICAgICAgICAgICAgICAgTXVzdCBiZSBwcm92aWRlZCBpbiBjYXNlIElQIHY0IGlzIG5vdC4gRGVmYXVsdHMgdG8gTm9uZS4KICAgICAgICAgICAgc3NoX3Bhc3N3b3JkIChDaGFyLCBvcHRpb25hbCk6IFNTSCBwYXNzd29yZC4gRGVmYXVsdHMgdG8gTm9uZS4KICAgICAgICAgICAgc3NoX2tleSAoQ2hhciwgb3B0aW9uYWwpOiBTU0ggcHJpdmF0ZSBrZXkgcmVjb3JkIHJlZmVyZW5jZS4KICAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIE5vbmUuCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzIChEaWN0LCBvcHRpb25hbCk6IEN1c3RvbSBjb25maWd1cmF0aW9uIHZhcmlhYmxlLgogICAgICAgICAgICAgICAgRm9sbG93aW5nIGZvcm1hdCBpcyB1c2VkOgogICAgICAgICAgICAgICAgICAgIGB2YXJpYWJsZV9yZWZlcmVuY2VgOiBgdmFyaWFibGVfdmFsdWVfY2hhcmAKICAgICAgICAgICAgICAgICAgICBlZzoKICAgICAgICAgICAgICAgICAgICB7J2JyYW5jaCc6ICdwcm9kJywgJ29kb29fdmVyc2lvbic6ICcxNi4wJ30KICAgICAgICAgICAgcGlja19hbGxfdGVtcGxhdGVfdmFyaWFibGVzIChib29sKTogIFRoaXMgcGFyYW1ldGVyIGVuc3VyZXMgdGhhdCB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICBiZWluZyBjcmVhdGVkIGNvbnNpZGVycyBleGlzdGluZyB2YXJpYWJsZXMgZnJvbSB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgICAgICBJZiBlbmFibGVkLCB0aGUgdGVtcGxhdGUgdmFyaWFibGVzIHdpbGwgYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICB2YXJpYWJsZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFRydWUuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGN4LnRvd2VyLnNlcnZlcjogbmV3bHkgY3JlYXRlZCBzZXJ2ZXIgcmVjb3JkCiAgICAgICAgIiIiCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmdldF9ieV9yZWZlcmVuY2UodGVtcGxhdGVfcmVmZXJlbmNlKQogICAgICAgIHJldHVybiB0ZW1wbGF0ZS5fY3JlYXRlX25ld19zZXJ2ZXIoc2VydmVyX25hbWUsICoqa3dhcmdzKQoKICAgIGRlZiBfY3JlYXRlX25ld19zZXJ2ZXIoc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgogICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgc2VydmVyIGZyb20gdGVtcGxhdGUKCiAgICAgICAgQXJnczoKICAgICAgICAgICAgbmFtZSAoQ2hhcik6IE5hbWUgb2YgdGhlIG5ldyBzZXJ2ZXIKCiAgICAgICAgS3dhcmdzOgogICAgICAgICAgICBwYXJ0bmVyIChyZXMucGFydG5lcigpLCBvcHRpb25hbCk6IFBhcnRuZXIgdGhpcyBzZXJ2ZXIgYmVsb25ncyB0by4KICAgICAgICAgICAgaXB2NCAoQ2hhciwgb3B0aW9uYWwpOiBJUCB2NCBhZGRyZXNzLiBEZWZhdWx0cyB0byBOb25lLgogICAgICAgICAgICBpcHY2IChDaGFyLCBvcHRpb25hbCk6IElQIHY2IGFkZHJlc3MuCiAgICAgICAgICAgICAgICBNdXN0IGJlIHByb3ZpZGVkIGluIGNhc2UgSVAgdjQgaXMgbm90LiBEZWZhdWx0cyB0byBOb25lLgogICAgICAgICAgICBzc2hfcGFzc3dvcmQgKENoYXIsIG9wdGlvbmFsKTogU1NIIHBhc3N3b3JkLiBEZWZhdWx0cyB0byBOb25lLgogICAgICAgICAgICBzc2hfa2V5IChDaGFyLCBvcHRpb25hbCk6IFNTSCBwcml2YXRlIGtleSByZWNvcmQgcmVmZXJlbmNlLgogICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gTm9uZS4KICAgICAgICAgICAgY29uZmlndXJhdGlvbl92YXJpYWJsZXMgKERpY3QsIG9wdGlvbmFsKTogQ3VzdG9tIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUuCiAgICAgICAgICAgICAgICBGb2xsb3dpbmcgZm9ybWF0IGlzIHVzZWQ6CiAgICAgICAgICAgICAgICAgICAgYHZhcmlhYmxlX3JlZmVyZW5jZWA6IGB2YXJpYWJsZV92YWx1ZV9jaGFyYAogICAgICAgICAgICAgICAgICAgIGVnOgogICAgICAgICAgICAgICAgICAgIHsnYnJhbmNoJzogJ3Byb2QnLCAnb2Rvb192ZXJzaW9uJzogJzE2LjAnfQogICAgICAgICAgICBwaWNrX2FsbF90ZW1wbGF0ZV92YXJpYWJsZXMgKGJvb2wpOiAgVGhpcyBwYXJhbWV0ZXIgZW5zdXJlcyB0aGF0IHRoZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIGJlaW5nIGNyZWF0ZWQgY29uc2lkZXJzIGV4aXN0aW5nIHZhcmlhYmxlcyBmcm9tIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAgICAgICAgIElmIGVuYWJsZWQsIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZXMgd2lsbCBhbHNvIGJlIGluY2x1ZGVkIGluIHRoZSBzZXJ2ZXIKICAgICAgICAgICAgICAgIHZhcmlhYmxlcy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgVHJ1ZS4KCiAgICAgICAgUmV0dXJuczoKICAgICAgICAgICAgY3gudG93ZXIuc2VydmVyOiBuZXdseSBjcmVhdGVkIHNlcnZlciByZWNvcmQKICAgICAgICAiIiIKICAgICAgICBzZWxmLmVuc3VyZV9vbmUoKQoKICAgICAgICAjIFJldHJpZXZlIHRoZSBwYXNzZWQgdmFyaWFibGVzCiAgICAgICAgY29uZmlndXJhdGlvbl92YXJpYWJsZXMgPSBrd2FyZ3MuZ2V0KCJjb25maWd1cmF0aW9uX3ZhcmlhYmxlcyIsIHt9KQoKICAgICAgICAjIFdlIHZhbGlkYXRlIG1hbmRhdG9yeSB2YXJpYWJsZXMKICAgICAgICBpZiBub3Qga3dhcmdzLmdldCgicGlja19hbGxfdGVtcGxhdGVfdmFyaWFibGVzIik6CiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX3JlcXVpcmVkX3ZhcmlhYmxlcyhjb25maWd1cmF0aW9uX3ZhcmlhYmxlcykKCiAgICAgICAgIyBXZSBhcmUgdXNpbmcgc3VkbyB0byBlbnN1cmUgYWxsIHZhbHVlcyBhcmUgY29waWVkCiAgICAgICAgc2VydmVyX3ZhbHVlcyA9IHNlbGYuc3VkbygpLl9wcmVwYXJlX3NlcnZlcl92YWx1ZXMoCiAgICAgICAgICAgIG5hbWU9bmFtZSwKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlX2lkPXNlbGYuaWQsICAjIHB5bGludDogZGlzYWJsZT1uby1tZW1iZXIKICAgICAgICAgICAgKiprd2FyZ3MsCiAgICAgICAgKQoKICAgICAgICAjIFBvcCB2YXJpYWJsZSB2YWx1ZXMgdG8gYWRkIHRoZW0gYWZ0ZXIgc2VydmVyIGNyZWF0aW9uLgogICAgICAgICMgVGhpcyBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgYWNjZXNzIHJ1bGVzIGFyZSBhcHBsaWVkIHByb3Blcmx5LgogICAgICAgIHZhcmlhYmxlX3ZhbHVlcyA9IHNlcnZlcl92YWx1ZXMucG9wKCJ2YXJpYWJsZV92YWx1ZV9pZHMiKQoKICAgICAgICAjIFByZXBhcmUgY29udGV4dCBmb3Igc2VydmVyIGNyZWF0aW9uCiAgICAgICAgY29udGV4dCA9IHNlbGYuZW52LmNvbnRleHQuY29weSgpCgogICAgICAgICMgU1NIIHNldHRpbmcgbWF5IGJlIGFkZGVkIGFmdGVyIHNlcnZlciBjcmVhdGlvbi4KICAgICAgICBjb250ZXh0LnVwZGF0ZSh7InNraXBfc3NoX3NldHRpbmdzX2NoZWNrIjogVHJ1ZX0pCiAgICAgICAgIyBXZSBuZWVkIHRvIHJlbW92ZSBkZWZhdWx0X3NlcnZlcl90ZW1wbGF0ZV9pZCB0byBhdm9pZCBpdCBiZWluZyB1c2VkCiAgICAgICAgIyBpbiB2YXJpYWJsZSB2YWx1ZXMuCiAgICAgICAgY29udGV4dC5wb3AoImRlZmF1bHRfc2VydmVyX3RlbXBsYXRlX2lkIiwgTm9uZSkKCiAgICAgICAgIyBDcmVhdGUgc2VydmVyCiAgICAgICAgc2VydmVyID0gKAogICAgICAgICAgICBzZWxmLmVudlsiY3gudG93ZXIuc2VydmVyIl0gICMgcHlsaW50OiBkaXNhYmxlPWNvbnRleHQtb3ZlcnJpZGRlbiAjIG5ldyBuZWVkIGEgbmV3IGNsZWFuIGNvbnRleHQKICAgICAgICAgICAgLnN1ZG8oKQogICAgICAgICAgICAud2l0aF9jb250ZXh0KGNvbnRleHQpCiAgICAgICAgICAgIC5jcmVhdGUoc2VydmVyX3ZhbHVlcykKICAgICAgICAgICAgLnN1ZG8oKQogICAgICAgICkKCiAgICAgICAgIyBBZGQgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgaWYgdmFyaWFibGVfdmFsdWVzOgogICAgICAgICAgICBzZXJ2ZXIud2l0aF9jb250ZXh0KGNvbnRleHQpLndyaXRlKHsidmFyaWFibGVfdmFsdWVfaWRzIjogdmFyaWFibGVfdmFsdWVzfSkgICMgcHlsaW50OiBkaXNhYmxlPWNvbnRleHQtb3ZlcnJpZGRlbiAjIG5ldyBuZWVkIGEgbmV3IGNsZWFuIGNvbnRleHQKCiAgICAgICAgIyBDcmVhdGUgc2VydmVyIGxvZ3MKICAgICAgICBsb2dzID0gc2VydmVyLnNlcnZlcl9sb2dfaWRzLmZpbHRlcmVkKGxhbWJkYSByZWM6IHJlYy5sb2dfdHlwZSA9PSAiZmlsZSIpCiAgICAgICAgZm9yIGxvZyBpbiBsb2dzLnN1ZG8oKToKICAgICAgICAgICAgbG9nLmZpbGVfaWQgPSBsb2cuZmlsZV90ZW1wbGF0ZV9pZC5jcmVhdGVfZmlsZSgKICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsIGlmX2ZpbGVfZXhpc3RzPSJza2lwIgogICAgICAgICAgICApLmlkCgogICAgICAgIGZsaWdodF9wbGFuID0gc2VydmVyLnNlcnZlcl90ZW1wbGF0ZV9pZC5mbGlnaHRfcGxhbl9pZAogICAgICAgIGlmIGZsaWdodF9wbGFuOgogICAgICAgICAgICBzZXJ2ZXIucnVuX2ZsaWdodF9wbGFuKGZsaWdodF9wbGFuKQoKICAgICAgICByZXR1cm4gc2VydmVyCgogICAgZGVmIF9nZXRfcG9zdF9jcmVhdGVfZmllbGRzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIEFkZCBmaWVsZHMgdGhhdCBzaG91bGQgYmUgcG9wdWxhdGVkIGFmdGVyIHNlcnZlciB0ZW1wbGF0ZSBjcmVhdGlvbgogICAgICAgICIiIgogICAgICAgIHJlcyA9IHN1cGVyKCkuX2dldF9wb3N0X2NyZWF0ZV9maWVsZHMoKQogICAgICAgIHJldHVybiByZXMgKyBbInZhcmlhYmxlX3ZhbHVlX2lkcyIsICJzZXJ2ZXJfbG9nX2lkcyJdCgogICAgZGVmIF9nZXRfZmllbGRzX3Rvd2VyX3NlcnZlcihzZWxmKToKICAgICAgICAiIiIKICAgICAgICBSZXR1cm4gZmllbGQgbmFtZSBsaXN0IHRvIHJlYWQgZnJvbSB0ZW1wbGF0ZSBhbmQgY3JlYXRlIG5ldyBzZXJ2ZXIKICAgICAgICAiIiIKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAic3NoX3VzZXJuYW1lIiwKICAgICAgICAgICAgInNzaF9wYXNzd29yZCIsCiAgICAgICAgICAgICJzc2hfa2V5X2lkIiwKICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiLAogICAgICAgICAgICAidXNlX3N1ZG8iLAogICAgICAgICAgICAiY29sb3IiLAogICAgICAgICAgICAib3NfaWQiLAogICAgICAgICAgICAicGxhbl9kZWxldGVfaWQiLAogICAgICAgICAgICAidGFnX2lkcyIsCiAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZV9pZHMiLAogICAgICAgICAgICAic2VydmVyX2xvZ19pZHMiLAogICAgICAgICAgICAic2hvcnRjdXRfaWRzIiwKICAgICAgICAgICAgInNjaGVkdWxlZF90YXNrX2lkcyIsCiAgICAgICAgXQoKICAgIGRlZiBfcHJlcGFyZV9zZXJ2ZXJfdmFsdWVzKHNlbGYsIHBpY2tfYWxsX3RlbXBsYXRlX3ZhcmlhYmxlcz1UcnVlLCAqKmt3YXJncyk6CiAgICAgICAgIiIiCiAgICAgICAgUHJlcGFyZSB0aGUgc2VydmVyIHZhbHVlcyB0byBjcmVhdGUgYSBuZXcgc2VydmVyIGJhc2VkIG9uCiAgICAgICAgdGhlIGN1cnJlbnQgdGVtcGxhdGUuIEl0IHJlYWRzIGFsbCBmaWVsZHMgZnJvbSB0aGUgdGVtcGxhdGUsIGNvcGllcyB0aGVtLAogICAgICAgIGFuZCBwcm9jZXNzZXMgT25lMm1hbnkgZmllbGRzIHRvIGNyZWF0ZSBuZXcgcmVsYXRlZCByZWNvcmRzLiBNYWdpYyBmaWVsZHMKICAgICAgICBsaWtlICdpZCcsIGNvbmN1cnJlbmN5IGZpZWxkcywgYW5kIGF1ZGl0IGZpZWxkcyBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgY29waWVkCiAgICAgICAgZGF0YS4KCiAgICAgICAgQXJnczoKICAgICAgICAgICAgcGlja19hbGxfdGVtcGxhdGVfdmFyaWFibGVzIChib29sKTogIFRoaXMgcGFyYW1ldGVyIGVuc3VyZXMgdGhhdCB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICBiZWluZyBjcmVhdGVkIGNvbnNpZGVycyBleGlzdGluZyB2YXJpYWJsZXMgZnJvbSB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgICAgICBJZiBlbmFibGVkLCB0aGUgdGVtcGxhdGUgdmFyaWFibGVzIHdpbGwgYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUgc2VydmVyCiAgICAgICAgICAgICAgICB2YXJpYWJsZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFRydWUuCiAgICAgICAgICAgICoqa3dhcmdzOiBBZGRpdGlvbmFsIHZhbHVlcyB0byB1cGRhdGUgaW4gdGhlIGZpbmFsIHNlcnZlciByZWNvcmQuCgogICAgICAgIFJldHVybnM6CiAgICAgICAgICAgIGxpc3Q6IEEgbGlzdCBvZiBkaWN0aW9uYXJpZXMgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgZm9yIHRoZSBuZXcgc2VydmVyCiAgICAgICAgICAgICAgICAgIHJlY29yZHMuCiAgICAgICAgIiIiCiAgICAgICAgbW9kZWxfZmllbGRzID0gc2VsZi5fZmllbGRzCiAgICAgICAgZmllbGRfbzJtX3R5cGUgPSBmaWVsZHMuT25lMm1hbnkKCiAgICAgICAgIyBkZWZpbmUgdGhlIG1hZ2ljIGZpZWxkcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkCiAgICAgICAgIyAoaW5jbHVkaW5nIElEIGFuZCBjb25jdXJyZW5jeSBmaWVsZHMpCiAgICAgICAgTUFHSUNfRklFTERTID0gbW9kZWxzLk1BR0lDX0NPTFVNTlMgKyBbc2VsZi5DT05DVVJSRU5DWV9DSEVDS19GSUVMRF0KCiAgICAgICAgIyByZWFkIGFsbCB2YWx1ZXMgcmVxdWlyZWQgdG8gY3JlYXRlIGEgbmV3IHNlcnZlciBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgIHZhbHVlcyA9IHNlbGYucmVhZChzZWxmLl9nZXRfZmllbGRzX3Rvd2VyX3NlcnZlcigpLCBsb2FkPUZhbHNlKVswXQoKICAgICAgICAjIHByZXBhcmUgc2VydmVyIGNvbmZpZyB2YWx1ZXMgZnJvbSBrd2FyZ3MKICAgICAgICBzZXJ2ZXJfY29uZmlnX3ZhbHVlcyA9IHNlbGYuX3BhcnNlX3NlcnZlcl9jb25maWdfdmFsdWVzKGt3YXJncykKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuYnJvd3NlKHZhbHVlc1siaWQiXSkKCiAgICAgICAgIyBQcm9jZXNzIGVhY2ggZmllbGQgaW4gdGhlIHRlbXBsYXRlCiAgICAgICAgZm9yIGZpZWxkIGluIHZhbHVlcy5rZXlzKCk6CiAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobW9kZWxfZmllbGRzW2ZpZWxkXSwgZmllbGRfbzJtX3R5cGUpOgogICAgICAgICAgICAgICAgIyBnZXQgcmVsYXRlZCByZWNvcmRzIGZvciBPbmUybWFueSBmaWVsZAogICAgICAgICAgICAgICAgcmVsYXRlZF9yZWNvcmRzID0gZ2V0YXR0cih0ZW1wbGF0ZSwgZmllbGQpCiAgICAgICAgICAgICAgICBuZXdfcmVjb3JkcyA9IFtdCiAgICAgICAgICAgICAgICAjIGZvciBlYWNoIHJlbGF0ZWQgcmVjb3JkLCByZWFkIGl0cyBkYXRhIGFuZCBwcmVwYXJlIGl0IGZvciBjb3B5aW5nCiAgICAgICAgICAgICAgICBmb3IgcmVjb3JkIGluIHJlbGF0ZWRfcmVjb3JkczoKICAgICAgICAgICAgICAgICAgICByZWNvcmRfZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgazogdgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiByZWNvcmQucmVhZChsb2FkPUZhbHNlKVswXS5pdGVtcygpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIE1BR0lDX0ZJRUxEUwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAjIHNldCB0aGUgaW52ZXJzZSBmaWVsZCAobGluayBiYWNrIHRvIHRoZSB0ZW1wbGF0ZSkKICAgICAgICAgICAgICAgICAgICAjIHRvIEZhbHNlIHRvIHVubGluayBmcm9tIHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIHJlY29yZF9kYXRhW21vZGVsX2ZpZWxkc1tmaWVsZF0uaW52ZXJzZV9uYW1lXSA9IEZhbHNlCiAgICAgICAgICAgICAgICAgICAgbmV3X3JlY29yZHMuYXBwZW5kKCgwLCAwLCByZWNvcmRfZGF0YSkpCgogICAgICAgICAgICAgICAgdmFsdWVzW2ZpZWxkXSA9IG5ld19yZWNvcmRzCgogICAgICAgICMgSGFuZGxlIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGlmIHByb3ZpZGVkLgogICAgICAgIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzID0ga3dhcmdzLnBvcCgiY29uZmlndXJhdGlvbl92YXJpYWJsZXMiLCBOb25lKQogICAgICAgIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVfb3B0aW9ucyA9IGt3YXJncy5wb3AoCiAgICAgICAgICAgICJjb25maWd1cmF0aW9uX3ZhcmlhYmxlX29wdGlvbnMiLCB7fQogICAgICAgICkKCiAgICAgICAgaWYgY29uZmlndXJhdGlvbl92YXJpYWJsZXM6CiAgICAgICAgICAgICMgVmFsaWRhdGUgcmVxdWlyZWQgdmFyaWFibGVzCiAgICAgICAgICAgIHNlbGYuX3ZhbGlkYXRlX3JlcXVpcmVkX3ZhcmlhYmxlcyhjb25maWd1cmF0aW9uX3ZhcmlhYmxlcykKCiAgICAgICAgICAgICMgU2VhcmNoIGZvciBleGlzdGluZyB2YXJpYWJsZSBvcHRpb25zLgogICAgICAgICAgICBvcHRpb25fcmVmZXJlbmNlcyA9IGxpc3QoY29uZmlndXJhdGlvbl92YXJpYWJsZV9vcHRpb25zLnZhbHVlcygpKQogICAgICAgICAgICBleGlzdGluZ19vcHRpb25zID0gb3B0aW9uX3JlZmVyZW5jZXMgYW5kIHNlbGYuZW52WwogICAgICAgICAgICAgICAgImN4LnRvd2VyLnZhcmlhYmxlLm9wdGlvbiIKICAgICAgICAgICAgXS5zZWFyY2goWygicmVmZXJlbmNlIiwgImluIiwgb3B0aW9uX3JlZmVyZW5jZXMpXSkKICAgICAgICAgICAgbWlzc2luZ19vcHRpb25zID0gbGlzdCgKICAgICAgICAgICAgICAgIHNldChvcHRpb25fcmVmZXJlbmNlcykKICAgICAgICAgICAgICAgIC0ge29wdGlvbi5yZWZlcmVuY2UgZm9yIG9wdGlvbiBpbiBleGlzdGluZ19vcHRpb25zfQogICAgICAgICAgICApCgogICAgICAgICAgICBpZiBtaXNzaW5nX29wdGlvbnM6CiAgICAgICAgICAgICAgICAjIE1hcCB2YXJpYWJsZSByZWZlcmVuY2VzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgICMgaW52YWxpZCBvcHRpb24gcmVmZXJlbmNlcy4KICAgICAgICAgICAgICAgIG1pc3Npbmdfb3B0aW9uc190b192YXJpYWJsZXMgPSB7CiAgICAgICAgICAgICAgICAgICAgdmFyX3JlZjogb3B0X3JlZgogICAgICAgICAgICAgICAgICAgIGZvciB2YXJfcmVmLCBvcHRfcmVmIGluIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVfb3B0aW9ucy5pdGVtcygpCiAgICAgICAgICAgICAgICAgICAgaWYgb3B0X3JlZiBpbiBtaXNzaW5nX29wdGlvbnMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgR2VuZXJhdGUgYSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlIGZvciBpbnZhbGlkIHZhcmlhYmxlIG9wdGlvbnMuCiAgICAgICAgICAgICAgICBkZXRhaWxlZF9tZXNzYWdlID0gIlxuIi5qb2luKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJWYXJpYWJsZSByZWZlcmVuY2UgJyUodmFyX3JlZilzJyBoYXMgYW4gaW52YWxpZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gcmVmZXJlbmNlICclKG9wdF9yZWYpcycuIiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFyX3JlZj12YXJfcmVmLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRfcmVmPW9wdF9yZWYsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIGZvciB2YXJfcmVmLCBvcHRfcmVmIGluIG1pc3Npbmdfb3B0aW9uc190b192YXJpYWJsZXMuaXRlbXMoKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgICAgICJTb21lIHZhcmlhYmxlIG9wdGlvbnMgYXJlIGludmFsaWQ6XG4lKGRldGFpbGVkX21lc3NhZ2UpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkX21lc3NhZ2U9ZGV0YWlsZWRfbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICAjIE1hcCB2YXJpYWJsZSBvcHRpb25zIHRvIHRoZWlyIElEcy4KICAgICAgICAgICAgY29uZmlndXJhdGlvbl92YXJpYWJsZV9vcHRpb25zX2RpY3QgPSB7CiAgICAgICAgICAgICAgICBvcHRpb24udmFyaWFibGVfaWQuaWQ6IG9wdGlvbiBmb3Igb3B0aW9uIGluIGV4aXN0aW5nX29wdGlvbnMKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyaWFibGVfb2JqID0gc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlIl0KICAgICAgICAgICAgdmFyaWFibGVfcmVmZXJlbmNlcyA9IGxpc3QoY29uZmlndXJhdGlvbl92YXJpYWJsZXMua2V5cygpKQoKICAgICAgICAgICAgIyBTZWFyY2ggZm9yIGV4aXN0aW5nIHZhcmlhYmxlcyBvciBjcmVhdGUgbmV3IG9uZXMgaWYgbWlzc2luZy4KICAgICAgICAgICAgZXhpc3RfdmFyaWFibGVzID0gdmFyaWFibGVfb2JqLnNlYXJjaCgKICAgICAgICAgICAgICAgIFsoInJlZmVyZW5jZSIsICJpbiIsIHZhcmlhYmxlX3JlZmVyZW5jZXMpXQogICAgICAgICAgICApCiAgICAgICAgICAgIG1pc3NpbmdfcmVmZXJlbmNlcyA9IGxpc3QoCiAgICAgICAgICAgICAgICBzZXQodmFyaWFibGVfcmVmZXJlbmNlcykKICAgICAgICAgICAgICAgIC0ge3ZhcmlhYmxlLnJlZmVyZW5jZSBmb3IgdmFyaWFibGUgaW4gZXhpc3RfdmFyaWFibGVzfQogICAgICAgICAgICApCiAgICAgICAgICAgIHZhcmlhYmxlX3ZhbHNfbGlzdCA9IFsKICAgICAgICAgICAgICAgIHsibmFtZSI6IHJlZmVyZW5jZX0gZm9yIHJlZmVyZW5jZSBpbiBtaXNzaW5nX3JlZmVyZW5jZXMKICAgICAgICAgICAgXQogICAgICAgICAgICBuZXdfdmFyaWFibGVzID0gdmFyaWFibGVfb2JqLmNyZWF0ZSh2YXJpYWJsZV92YWxzX2xpc3QpCiAgICAgICAgICAgIGFsbF92YXJpYWJsZXMgPSBleGlzdF92YXJpYWJsZXMgfCBuZXdfdmFyaWFibGVzCgogICAgICAgICAgICAjIEJ1aWxkIGEgZGljdGlvbmFyeSB7dmFyaWFibGU6IHZhcmlhYmxlX3ZhbHVlfS4KICAgICAgICAgICAgY29uZmlndXJhdGlvbl92YXJpYWJsZV9kaWN0ID0gewogICAgICAgICAgICAgICAgdmFyaWFibGU6IGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzW3ZhcmlhYmxlLnJlZmVyZW5jZV0KICAgICAgICAgICAgICAgIGZvciB2YXJpYWJsZSBpbiBhbGxfdmFyaWFibGVzCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHNlcnZlcl92YXJpYWJsZV92YWxzX2xpc3QgPSBbXQogICAgICAgICAgICBmb3IgdmFyaWFibGUsIHZhcmlhYmxlX3ZhbHVlIGluIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVfZGljdC5pdGVtcygpOgogICAgICAgICAgICAgICAgdmFyaWFibGVfb3B0aW9uID0gY29uZmlndXJhdGlvbl92YXJpYWJsZV9vcHRpb25zX2RpY3QuZ2V0KHZhcmlhYmxlLmlkKQoKICAgICAgICAgICAgICAgIHNlcnZlcl92YXJpYWJsZV92YWxzX2xpc3QuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogdmFyaWFibGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6IHZhcmlhYmxlX29wdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHZhcmlhYmxlX29wdGlvbi52YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB2YXJpYWJsZV92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25faWQiOiB2YXJpYWJsZV9vcHRpb24gYW5kIHZhcmlhYmxlX29wdGlvbi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCgogICAgICAgICAgICBpZiBwaWNrX2FsbF90ZW1wbGF0ZV92YXJpYWJsZXM6CiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBvciBhZGQgdmFyaWFibGUgdmFsdWVzCiAgICAgICAgICAgICAgICBleGlzdGluZ192YXJpYWJsZV92YWx1ZXMgPSB2YWx1ZXMuZ2V0KCJ2YXJpYWJsZV92YWx1ZV9pZHMiLCBbXSkKICAgICAgICAgICAgICAgIHZhcmlhYmxlX2lkX3RvX2luZGV4ID0gewogICAgICAgICAgICAgICAgICAgIGNtZFsyXVsidmFyaWFibGVfaWQiXTogaWR4CiAgICAgICAgICAgICAgICAgICAgZm9yIGlkeCwgY21kIGluIGVudW1lcmF0ZShleGlzdGluZ192YXJpYWJsZV92YWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgaWYgY21kWzBdID09IDAgYW5kICJ2YXJpYWJsZV9pZCIgaW4gY21kWzJdCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBVcGRhdGUgZXhpc3QgdmFyaWFibGUgb3B0aW9ucwogICAgICAgICAgICAgICAgZm9yIGV4aXN0X3ZhcmlhYmxlX2lkLCBpbmRleCBpbiB2YXJpYWJsZV9pZF90b19pbmRleC5pdGVtcygpOgogICAgICAgICAgICAgICAgICAgIG9wdGlvbiA9IGNvbmZpZ3VyYXRpb25fdmFyaWFibGVfb3B0aW9uc19kaWN0LmdldChleGlzdF92YXJpYWJsZV9pZCkKICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3B0aW9uOgogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3ZhcmlhYmxlX3ZhbHVlc1tpbmRleF1bMl0udXBkYXRlKAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uX2lkIjogb3B0aW9uLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiBvcHRpb24udmFsdWVfY2hhciwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICkKCiAgICAgICAgICAgICAgICAjIFByZXBhcmUgbmV3IGNvbW1hbmQgdmFsdWVzIGZvciBzZXJ2ZXIgdmFyaWFibGVzCiAgICAgICAgICAgICAgICBmb3IgbmV3X2NvbW1hbmQgaW4gc2VydmVyX3ZhcmlhYmxlX3ZhbHNfbGlzdDoKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9pZCA9IG5ld19jb21tYW5kWzJdWyJ2YXJpYWJsZV9pZCJdCiAgICAgICAgICAgICAgICAgICAgaWYgdmFyaWFibGVfaWQgaW4gdmFyaWFibGVfaWRfdG9faW5kZXg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IHZhcmlhYmxlX2lkX3RvX2luZGV4W3ZhcmlhYmxlX2lkXQogICAgICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBleGlzdCBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3ZhcmlhYmxlX3ZhbHVlc1tpZHhdID0gbmV3X2NvbW1hbmQKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBuZXcgY29tbWFuZAogICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ192YXJpYWJsZV92YWx1ZXMuYXBwZW5kKG5ld19jb21tYW5kKQoKICAgICAgICAgICAgICAgIHZhbHVlc1sidmFyaWFibGVfdmFsdWVfaWRzIl0gPSBleGlzdGluZ192YXJpYWJsZV92YWx1ZXMKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHZhbHVlc1sidmFyaWFibGVfdmFsdWVfaWRzIl0gPSBzZXJ2ZXJfdmFyaWFibGVfdmFsc19saXN0CgogICAgICAgICMgcmVtb3ZlIHRoZSBgaWRgIGZpZWxkIHRvIGVuc3VyZSBhIG5ldyByZWNvcmQgaXMgY3JlYXRlZAogICAgICAgICMgaW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgZXhpc3Rpbmcgb25lCiAgICAgICAgZGVsIHZhbHVlc1siaWQiXQogICAgICAgICMgdXBkYXRlIHRoZSB2YWx1ZXMgd2l0aCBhZGRpdGlvbmFsIGFyZ3VtZW50cyBmcm9tIGt3YXJncwogICAgICAgIHZhbHVlcy51cGRhdGUoa3dhcmdzKQogICAgICAgICMgdXBkYXRlIHNlcnZlciBjb25maWdzCiAgICAgICAgdmFsdWVzLnVwZGF0ZShzZXJ2ZXJfY29uZmlnX3ZhbHVlcykKICAgICAgICAjIEFkZCBjdXJyZW50IHVzZXIgYXMgdXNlci9tYW5hZ2VyIHRvIHRoZSBuZXdseSBjcmVhdGVkIHNlcnZlcgogICAgICAgIHZhbHVlcy51cGRhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNiwgMCwgc2VsZi5fZGVmYXVsdF91c2VyX2lkcygpKV0sCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIHNlbGYuX2RlZmF1bHRfbWFuYWdlcl9pZHMoKSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZXR1cm4gdmFsdWVzCgogICAgZGVmIF9wYXJzZV9zZXJ2ZXJfY29uZmlnX3ZhbHVlcyhzZWxmLCBjb25maWdfdmFsdWVzKToKICAgICAgICAiIiIKICAgICAgICBQcmVwYXJlcyBzZXJ2ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMuCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGNvbmZpZ192YWx1ZXMgKGRpY3QpOiBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBzZXJ2ZXIgY29uZmlndXJhdGlvbiB2YWx1ZXMuCiAgICAgICAgICAgICAgICBLZXlzIGFuZCB0aGVpciBleHBlY3RlZCB2YWx1ZXM6CiAgICAgICAgICAgICAgICAgICAgLSBwYXJ0bmVyIChyZXMucGFydG5lciwgb3B0aW9uYWwpOiBUaGUgcGFydG5lciB0aGlzIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgYmVsb25ncyB0by4KICAgICAgICAgICAgICAgICAgICAtIGlwdjQgKHN0ciwgb3B0aW9uYWwpOiBJUHY0IGFkZHJlc3MuIERlZmF1bHRzIHRvIE5vbmUuCiAgICAgICAgICAgICAgICAgICAgLSBpcHY2IChzdHIsIG9wdGlvbmFsKTogSVB2NiBhZGRyZXNzLiBNdXN0IGJlIHByb3ZpZGVkIGlmIElQdjQgaXMKICAgICAgICAgICAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQuIERlZmF1bHRzIHRvIE5vbmUuCiAgICAgICAgICAgICAgICAgICAgLSBzc2hfa2V5IChzdHIsIG9wdGlvbmFsKTogUmVmZXJlbmNlIHRvIGFuIFNTSCBwcml2YXRlIGtleSByZWNvcmQuCiAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBOb25lLgoKICAgICAgICBSZXR1cm5zOgogICAgICAgICAgICBkaWN0OiBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBwYXJzZWQgc2VydmVyIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHdpdGggdGhlCiAgICAgICAgICAgICAgICBmb2xsb3dpbmcga2V5czoKICAgICAgICAgICAgICAgICAgICAtIHBhcnRuZXJfaWQgKGludCwgb3B0aW9uYWwpOiBJRCBvZiB0aGUgcGFydG5lci4KICAgICAgICAgICAgICAgICAgICAtIHNzaF9rZXlfaWQgKGludCwgb3B0aW9uYWwpOiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBTU0gga2V5LgogICAgICAgICAgICAgICAgICAgIC0gaXBfdjRfYWRkcmVzcyAoc3RyLCBvcHRpb25hbCk6IFBhcnNlZCBJUHY0IGFkZHJlc3MuCiAgICAgICAgICAgICAgICAgICAgLSBpcF92Nl9hZGRyZXNzIChzdHIsIG9wdGlvbmFsKTogUGFyc2VkIElQdjYgYWRkcmVzcy4KICAgICAgICAiIiIKICAgICAgICB2YWx1ZXMgPSB7fQoKICAgICAgICAjIFRoaXMgZmllbGQgaXMgYWx3YXlzIHBvcHVsYXRlZCBmcm9tIFNlcnZlciBUZW1wbGF0ZSBhbmQKICAgICAgICAjIGNhbm5vdCBiZSBhbHRlcmVkIHdpdGggZnVuY3Rpb24gcGFyYW1zLgogICAgICAgIGNvbmZpZ192YWx1ZXMucG9wKCJwbGFuX2RlbGV0ZV9pZCIsIE5vbmUpCgogICAgICAgIHBhcnRuZXIgPSBjb25maWdfdmFsdWVzLnBvcCgicGFydG5lciIsIE5vbmUpCiAgICAgICAgaWYgcGFydG5lcjoKICAgICAgICAgICAgdmFsdWVzWyJwYXJ0bmVyX2lkIl0gPSBwYXJ0bmVyLmlkCgogICAgICAgIHNzaF9rZXlfcmVmZXJlbmNlID0gY29uZmlnX3ZhbHVlcy5wb3AoInNzaF9rZXkiLCBOb25lKQogICAgICAgIGlmIHNzaF9rZXlfcmVmZXJlbmNlOgogICAgICAgICAgICBzc2hfa2V5ID0gc2VsZi5lbnZbImN4LnRvd2VyLmtleSJdLmdldF9ieV9yZWZlcmVuY2Uoc3NoX2tleV9yZWZlcmVuY2UpCiAgICAgICAgICAgIGlmIHNzaF9rZXk6CiAgICAgICAgICAgICAgICB2YWx1ZXNbInNzaF9rZXlfaWQiXSA9IHNzaF9rZXkuaWQKCiAgICAgICAgaXB2NCA9IGNvbmZpZ192YWx1ZXMucG9wKCJpcHY0IiwgTm9uZSkKICAgICAgICBpZiBpcHY0OgogICAgICAgICAgICB2YWx1ZXNbImlwX3Y0X2FkZHJlc3MiXSA9IGlwdjQKCiAgICAgICAgaXB2NiA9IGNvbmZpZ192YWx1ZXMucG9wKCJpcHY2IiwgTm9uZSkKICAgICAgICBpZiBpcHY2OgogICAgICAgICAgICB2YWx1ZXNbImlwX3Y2X2FkZHJlc3MiXSA9IGlwdjYKCiAgICAgICAgcmV0dXJuIHZhbHVlcwoKICAgIGRlZiBfdmFsaWRhdGVfcmVxdWlyZWRfdmFyaWFibGVzKHNlbGYsIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzKToKICAgICAgICAiIiIKICAgICAgICBWYWxpZGF0ZSB0aGF0IGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlIHByZXNlbnQsIG5vdCBlbXB0eSwKICAgICAgICBhbmQgdGhhdCBubyByZXF1aXJlZCB2YXJpYWJsZSBpcyBlbnRpcmVseSBtaXNzaW5nIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzIChkaWN0KTogQSBkaWN0aW9uYXJ5IG9mIHZhcmlhYmxlIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZWlyIHZhbHVlcy4KCiAgICAgICAgUmFpc2VzOgogICAgICAgICAgICBWYWxpZGF0aW9uRXJyb3I6IElmIGFsbCByZXF1aXJlZCB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBhbnkgcmVxdWlyZWQgdmFyaWFibGUgaXMgZW1wdHkgb3IgbWlzc2luZy4KICAgICAgICAiIiIKICAgICAgICByZXF1aXJlZF92YXJpYWJsZXMgPSBzZWxmLnZhcmlhYmxlX3ZhbHVlX2lkcy5maWx0ZXJlZCgicmVxdWlyZWQiKQogICAgICAgIGlmIG5vdCByZXF1aXJlZF92YXJpYWJsZXM6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICByZXF1aXJlZF9yZWZzID0gW3Zhci52YXJpYWJsZV9yZWZlcmVuY2UgZm9yIHZhciBpbiByZXF1aXJlZF92YXJpYWJsZXNdCiAgICAgICAgY29uZmlnX3JlZnMgPSBsaXN0KGNvbmZpZ3VyYXRpb25fdmFyaWFibGVzLmtleXMoKSkKCiAgICAgICAgbWlzc2luZ192YXJpYWJsZXMgPSBbcmVmIGZvciByZWYgaW4gcmVxdWlyZWRfcmVmcyBpZiByZWYgbm90IGluIGNvbmZpZ19yZWZzXQogICAgICAgIGVtcHR5X3ZhcmlhYmxlcyA9IFsKICAgICAgICAgICAgcmVmCiAgICAgICAgICAgIGZvciByZWYgaW4gcmVxdWlyZWRfcmVmcwogICAgICAgICAgICBpZiByZWYgaW4gY29uZmlnX3JlZnMgYW5kIG5vdCBjb25maWd1cmF0aW9uX3ZhcmlhYmxlc1tyZWZdCiAgICAgICAgXQoKICAgICAgICBpZiBub3QgKG1pc3NpbmdfdmFyaWFibGVzIG9yIGVtcHR5X3ZhcmlhYmxlcyk6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICBlcnJvcl9wYXJ0cyA9IFsKICAgICAgICAgICAgXygiUGxlYXNlIHJlc29sdmUgdGhlIGZvbGxvd2luZyBpc3N1ZXMgd2l0aCBjb25maWd1cmF0aW9uIHZhcmlhYmxlczoiKQogICAgICAgIF0KCiAgICAgICAgaWYgbWlzc2luZ192YXJpYWJsZXM6CiAgICAgICAgICAgIGVycm9yX3BhcnRzLmFwcGVuZCgKICAgICAgICAgICAgICAgIF8oCiAgICAgICAgICAgICAgICAgICAgIiAgLSBNaXNzaW5nIHZhcmlhYmxlczogJSh2YXJpYWJsZXMpcyIsCiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzPSIsICIuam9pbihtaXNzaW5nX3ZhcmlhYmxlcyksCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKCiAgICAgICAgaWYgZW1wdHlfdmFyaWFibGVzOgogICAgICAgICAgICBlcnJvcl9wYXJ0cy5hcHBlbmQoCiAgICAgICAgICAgICAgICBfKAogICAgICAgICAgICAgICAgICAgICIgIC0gRW1wdHkgdmFsdWVzIGZvciB2YXJpYWJsZXM6ICUodmFyaWFibGVzKXMiLAogICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcz0iLCAiLmpvaW4oZW1wdHlfdmFyaWFibGVzKSwKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgKQoKICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoIlxuIi5qb2luKGVycm9yX3BhcnRzKSkKCiAgICBkZWYgX2dldF9kZXBlbmRlbnRfbW9kZWxfcmVsYXRpb25fZmllbGRzKHNlbGYpOgogICAgICAgICIiIkNoZWNrIGN4LnRvd2VyLnJlZmVyZW5jZS5taXhpbiBmb3IgdGhlIGZ1bmN0aW9uIGRvY3VtZW50YXRpb24iIiIKICAgICAgICByZXMgPSBzdXBlcigpLl9nZXRfZGVwZW5kZW50X21vZGVsX3JlbGF0aW9uX2ZpZWxkcygpCiAgICAgICAgcmV0dXJuIHJlcyArIFsidmFyaWFibGVfdmFsdWVfaWRzIl0K |