Files
odoo-addons/addons/cetmix_tower_server/tests/test_server.py

1 line
42 KiB
Python

ZnJvbSBvZG9vLmV4Y2VwdGlvbnMgaW1wb3J0IEFjY2Vzc0Vycm9yLCBWYWxpZGF0aW9uRXJyb3IKCmZyb20gLi5tb2RlbHMuY29uc3RhbnRzIGltcG9ydCBDT01NQU5EX05PVF9DT01QQVRJQkxFX1dJVEhfU0VSVkVSCmZyb20gLmNvbW1vbiBpbXBvcnQgVGVzdFRvd2VyQ29tbW9uCgoKY2xhc3MgVGVzdFRvd2VyU2VydmVyKFRlc3RUb3dlckNvbW1vbik6CiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKCiAgICAgICAgY2xzLm9zX3VidW50dV8yMF8wNCA9IGNscy5lbnZbImN4LnRvd2VyLm9zIl0uY3JlYXRlKHsibmFtZSI6ICJVYnVudHUgMjAuMDQifSkKCiAgICAgICAgIyBEZWZpbmUgbW9kZWwgdmFyaWFibGVzIHRvIGF2b2lkIHVuc3Vic2NyaXB0YWJsZSBlcnJvcnMKICAgICAgICBLZXkgPSBjbHMuZW52WyJjeC50b3dlci5rZXkiXQogICAgICAgIFNlcnZlciA9IGNscy5lbnZbImN4LnRvd2VyLnNlcnZlciJdCgogICAgICAgIHNlY3JldF8xID0gS2V5LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiU2VjcmV0IDEiLAogICAgICAgICAgICAgICAgInNlY3JldF92YWx1ZSI6ICJzZWNyZXRfdmFsdWVfMSIsCiAgICAgICAgICAgICAgICAia2V5X3R5cGUiOiAicyIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKQogICAgICAgIHNlY3JldF8yID0gS2V5LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiU2VjcmV0IDIiLAogICAgICAgICAgICAgICAgInNlY3JldF92YWx1ZSI6ICJzZWNyZXRfdmFsdWVfMiIsCiAgICAgICAgICAgICAgICAia2V5X3R5cGUiOiAicyIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKQogICAgICAgIGNscy5zZXJ2ZXJfdGVzdF8yID0gU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgIzIiLAogICAgICAgICAgICAgICAgImNvbG9yIjogMiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAiayIsCiAgICAgICAgICAgICAgICAiaG9zdF9rZXkiOiAidGVzdF9rZXkiLAogICAgICAgICAgICAgICAgInVzZV9zdWRvIjogInAiLAogICAgICAgICAgICAgICAgInNzaF9rZXlfaWQiOiBjbHMua2V5XzEuaWQsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBjbHMub3NfdWJ1bnR1XzIwXzA0LmlkLAogICAgICAgICAgICAgICAgInNlY3JldF9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAia2V5X2lkIjogc2VjcmV0XzEuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VjcmV0X3ZhbHVlIjogInNlY3JldF92YWx1ZV8xIiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleV9pZCI6IHNlY3JldF8yLmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY3JldF92YWx1ZSI6ICJzZWNyZXRfdmFsdWVfMiIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAidGFnX2lkcyI6IFsoNiwgMCwgW2Nscy50YWdfdGVzdF9wcm9kdWN0aW9uLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIEZpbGVzCiAgICAgICAgRmlsZSA9IGNscy5lbnZbImN4LnRvd2VyLmZpbGUiXQogICAgICAgIGNscy5zZXJ2ZXJfdGVzdF8yX2ZpbGUgPSBGaWxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAidG93ZXJfZGVtb193aXRob3V0X3RlbXBsYXRlX3t7IGJyYW5jaCB9fS50eHQiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJ0b3dlciIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzIuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2RpciI6ICJ7eyB0ZXN0X3BhdGggfX0iLAogICAgICAgICAgICAgICAgImNvZGUiOiAiUGxlYXNlLCBjaGVjayB1cmw6IHt7IHVybCB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgRmxpZ2h0IHBsYW4gdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKICAgICAgICBDb21tYW5kID0gY2xzLmVudlsiY3gudG93ZXIuY29tbWFuZCJdCiAgICAgICAgUGxhbiA9IGNscy5lbnZbImN4LnRvd2VyLnBsYW4iXQoKICAgICAgICAjIEFkZCBhIGNvbW1hbmQgdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKICAgICAgICBjbHMuY29tbWFuZF9kZWxldGVfc2VydmVyID0gQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlB5dGhvbiBjb21tYW5kIGZvciBkZWxldGluZyBzZXJ2ZXIiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJweXRob25fY29kZSIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICIiIgpwYXJ0bmVyID0gZW52WyJyZXMucGFydG5lciJdLmNyZWF0ZSh7Im5hbWUiOiAiUGFydG5lciAxIiwgInJlZiI6ICJkZWxldGVfc2VydmVyIn0pCnJlc3VsdCA9IHsKICAgICJleGl0X2NvZGUiOiAwLAogICAgIm1lc3NhZ2UiOiBwYXJ0bmVyLm5hbWUsCn0KICAgICIiIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLnBsYW5fZGVsZXRlX3NlcnZlciA9IFBsYW4uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJEZWxldGUgc2VydmVyIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAoMCwgMCwgeyJjb21tYW5kX2lkIjogY2xzLmNvbW1hbmRfZGVsZXRlX3NlcnZlci5pZCwgInNlcXVlbmNlIjogMX0pLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgdHdvIHRlc3QgdXNlcnMgdGhhdCBiZWxvbmcgb25seSB0byB0aGUgIlVzZXIiIGdyb3VwLgogICAgICAgIGNscy51c2VyMSA9IGNscy5Vc2Vycy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVXNlciAxIiwKICAgICAgICAgICAgICAgICJsb2dpbiI6ICJ0ZXN0X3VzZXIxIiwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJ0ZXN0X3VzZXIxQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgICAgICJncm91cHNfaWQiOiBbKDYsIDAsIFtjbHMuZ3JvdXBfdXNlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMudXNlcjIgPSBjbHMuVXNlcnMuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFVzZXIgMiIsCiAgICAgICAgICAgICAgICAibG9naW4iOiAidGVzdF91c2VyMiIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAidGVzdF91c2VyMkBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgICAgICAiZ3JvdXBzX2lkIjogWyg2LCAwLCBbY2xzLmdyb3VwX3VzZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgdHdvICJNYW5hZ2VyIiBncm91cCB1c2Vycy4KICAgICAgICBjbHMubWFuYWdlcjEgPSBjbHMuVXNlcnMuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJNYW5hZ2VyIDEiLAogICAgICAgICAgICAgICAgImxvZ2luIjogIm1hbmFnZXIxIiwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJtYW5hZ2VyMUBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgICAgICAiZ3JvdXBzX2lkIjogWyg2LCAwLCBbY2xzLmdyb3VwX21hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLm1hbmFnZXIyID0gY2xzLlVzZXJzLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFuYWdlciAyIiwKICAgICAgICAgICAgICAgICJsb2dpbiI6ICJtYW5hZ2VyMiIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAibWFuYWdlcjJAZXhhbXBsZS5jb20iLAogICAgICAgICAgICAgICAgImdyb3Vwc19pZCI6IFsoNiwgMCwgW2Nscy5ncm91cF9tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9jb3B5KHNlbGYpOgogICAgICAgICIiIlRlc3Qgc2VydmVyIGNvcHkiIiIKCiAgICAgICAgIyBMZXQncyBzYXkgd2UgaGF2ZSBhdXRvIHN5bmMgZW5hYmxlZCBvbiBvbmUgb2YgdGhlIGZpbGVzIGluIHNlcnZlciAyCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8yX2ZpbGUuYXV0b19zeW5jID0gVHJ1ZQogICAgICAgIGZpZWxkc190b19jaGVjayA9IFsKICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiLAogICAgICAgICAgICAiaXBfdjZfYWRkcmVzcyIsCiAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiLAogICAgICAgICAgICAic3NoX3Bhc3N3b3JkIiwKICAgICAgICAgICAgInNzaF9rZXlfaWQiLAogICAgICAgIF0KCiAgICAgICAgIyBDcmV0ZSBhIGxvZyBmcm9tIGZpbGUgb2YgdHlwZSAnc2VydmVyJwogICAgICAgIGZpbGVfZm9yX2xvZyA9IHNlbGYuRmlsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAic2VydmVyIiwKICAgICAgICAgICAgICAgICJuYW1lIjogInRlc3QubG9nIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogIi90bXAiLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlbGYuc2VydmVyX3Rlc3RfMi5pZCwKICAgICAgICAgICAgICAgICJjb2RlIjogIlNvbWUgbG9nIHJlY29yZCAtIHNlcnZlciIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlcnZlcl9sb2dfc2VydmVyID0gc2VsZi5TZXJ2ZXJMb2cuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJMb2cgZnJvbSBmaWxlIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzIuaWQsCiAgICAgICAgICAgICAgICAibG9nX3R5cGUiOiAiZmlsZSIsCiAgICAgICAgICAgICAgICAiZmlsZV9pZCI6IGZpbGVfZm9yX2xvZy5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIEFkZCB2YXJpYWJsZSB2YWx1ZXMgdG8gc2VydmVyCiAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8yLmlkLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJ0ZXN0IiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDb3B5IHNlcnZlciAyCiAgICAgICAgc2VydmVyX3Rlc3RfMl9jb3B5ID0gc2VsZi5zZXJ2ZXJfdGVzdF8yLmNvcHkoKQoKICAgICAgICAjIFRoZSBuYW1lIG9mIGNvcHkgc2hvdWxkIGNvbnRhaW4gJ34gKGNvcHkpJyBzdWZmaXgKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHNlcnZlcl90ZXN0XzJfY29weS5uYW1lID09IHNlbGYuc2VydmVyX3Rlc3RfMi5uYW1lICsgIiAoY29weSkiLAogICAgICAgICAgICBtc2c9IlNlcnZlciBuYW1lIHNob3VsZCBjb250YWluICd+IChjb3B5KScgc3VmZml4ISIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIHNlcnZlciBsb2dzCiAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBjb3BpZWQgc2VydmVyIGhhcyB0aGUgc2FtZSBudW1iZXIgb2Ygc2VydmVyIGxvZ3MKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oc2VydmVyX3Rlc3RfMl9jb3B5LnNlcnZlcl9sb2dfaWRzKSwKICAgICAgICAgICAgbGVuKHNlbGYuc2VydmVyX3Rlc3RfMi5zZXJ2ZXJfbG9nX2lkcyksCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICJDb3BpZWQgdGVtcGxhdGUgc2hvdWxkIGhhdmUgdGhlIHNhbWUgIgogICAgICAgICAgICAgICAgIm51bWJlciBvZiBzZXJ2ZXIgbG9ncyBhcyB0aGUgb3JpZ2luYWwiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIEVuc3VyZSB0aGUgZmlyc3Qgc2VydmVyIGxvZyBpbiB0aGUgY29waWVkIHNlcnZlciBtYXRjaGVzIHRoZSBvcmlnaW5hbAogICAgICAgIGNvcGllZF9sb2cgPSBzZXJ2ZXJfdGVzdF8yX2NvcHkuc2VydmVyX2xvZ19pZHMKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjb3BpZWRfbG9nLm5hbWUsCiAgICAgICAgICAgIHNlcnZlcl9sb2dfc2VydmVyLm5hbWUsCiAgICAgICAgICAgICJTZXJ2ZXIgbG9nIG5hbWUgc2hvdWxkIGJlIHRoZSBzYW1lIGluIHRoZSBjb3BpZWQgc2VydmVyIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2xvZy5jb21tYW5kX2lkLmlkLAogICAgICAgICAgICBzZXJ2ZXJfbG9nX3NlcnZlci5jb21tYW5kX2lkLmlkLAogICAgICAgICAgICAiQ29tbWFuZCBJRCBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBzZXJ2ZXIgbG9nIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgY29waWVkX2xvZy5jb21tYW5kX2lkLmNvZGUsCiAgICAgICAgICAgIHNlcnZlcl9sb2dfc2VydmVyLmNvbW1hbmRfaWQuY29kZSwKICAgICAgICAgICAgIkNvbW1hbmQgY29kZSBzaG91bGQgYmUgdGhlIHNhbWUgaW4gdGhlIGNvcGllZCBzZXJ2ZXIgbG9nIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgZmllbGRzIG1hdGNoIGxpc3QKICAgICAgICBmb3IgZmllbGRfIGluIGZpZWxkc190b19jaGVjazoKICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgZ2V0YXR0cihzZXJ2ZXJfdGVzdF8yX2NvcHksIGZpZWxkXykKICAgICAgICAgICAgICAgID09IGdldGF0dHIoc2VsZi5zZXJ2ZXJfdGVzdF8yLCBmaWVsZF8pLAogICAgICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICAgICBmIkZpZWxkIHtmaWVsZF99IHZhbHVlIG9uIHNlcnZlciBjb3B5ICIKICAgICAgICAgICAgICAgICAgICAiZG9lcyBub3QgbWF0Y2ggd2l0aCB0aGUgc291cmNlISIKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICkKCiAgICAgICAgIyBDaGVjayBpZiBhdXRvIHN5bmMgaXMgZGlzYWJsZWQgb24gdGhlIGFsbCB0aGUgZmlsZXMKICAgICAgICAjIGluIHRoZSBjb3BpZWQgc2VydmVyCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBhbGwoW25vdCBmaWxlLmF1dG9fc3luYyBmb3IgZmlsZSBpbiBzZXJ2ZXJfdGVzdF8yX2NvcHkuZmlsZV9pZHNdKSwKICAgICAgICAgICAgbXNnPSJBdXRvIHN5bmMgc2hvdWxkIGJlIGRpc2FibGVkIG9uIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGNvcGllZCBzZXJ2ZXIhIiwKICAgICAgICApCgogICAgICAgICMgQ2hlY2sgaWYgJ2tlZXBfd2hlbl9kZWxldGVkJyBvcHRpb24gaXMgZW5hYmxlZCBvbiBhbGwgdGhlIGZpbGVzCiAgICAgICAgIyBpbiB0aGUgY29waWVkIHNlcnZlcgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgYWxsKFtmaWxlLmtlZXBfd2hlbl9kZWxldGVkIGZvciBmaWxlIGluIHNlcnZlcl90ZXN0XzJfY29weS5maWxlX2lkc10pLAogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgImtlZXBfd2hlbl9kZWxldGVkIG9wdGlvbiBzaG91bGQgYmUgZW5hYmxlZCBvbiBhbGwgdGhlIGZpbGVzICIKICAgICAgICAgICAgICAgICJpbiB0aGUgY29waWVkIHNlcnZlciEiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIGlmIHNlY3JldCB2YWx1ZXMgb2Yga2V5cyBpbiB0aGUgY29waWVkIHNlcnZlciBhcmUgdGhlIHNhbWUKICAgICAgICAjIGFzIGluIHNvdXJjZSBzZXJ2ZXIKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIGFsbCgKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICBrZXlfY29weS5zZWNyZXRfdmFsdWUgPT0ga2V5X3NyYy5zZWNyZXRfdmFsdWUKICAgICAgICAgICAgICAgICAgICBmb3Iga2V5X3NyYywga2V5X2NvcHkgaW4gemlwKCAgIyBub3FhOiBCOTA1IHdlIG5lZWQgdG8gcnVuIG9uIFB5dGhvbiAzLjEwCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMi5zZWNyZXRfaWRzLnN1ZG8oKSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3Rlc3RfMl9jb3B5LnNlY3JldF9pZHMuc3VkbygpLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJTZWNyZXQgdmFsdWVzIG9mIGtleXMgaW4gdGhlIGNvcGllZCBzZXJ2ZXIgIgogICAgICAgICAgICAgICAgInNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiBzb3VyY2Ugc2VydmVyISIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgICMgVmFyaWFibGUgbmFtZXMgYW5kIHZhbHVlcyBpbiBzZXJ2ZXIgY29weSBzaG91bGQgYmUgdGhlIHNhbWUKICAgICAgICAjIGFzIGluIHNvdXJjZSBzZXJ2ZXIKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIGFsbCgKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB2YXJfY29weS52YXJpYWJsZV9yZWZlcmVuY2UgPT0gdmFyX3NyYy52YXJpYWJsZV9yZWZlcmVuY2UKICAgICAgICAgICAgICAgICAgICBhbmQgdmFyX2NvcHkudmFsdWVfY2hhciA9PSB2YXJfc3JjLnZhbHVlX2NoYXIKICAgICAgICAgICAgICAgICAgICBmb3IgdmFyX3NyYywgdmFyX2NvcHkgaW4gemlwKCAgIyBub3FhOiBCOTA1IHdlIG5lZWQgdG8gcnVuIG9uIFB5dGhvbiAzLjEwCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMi52YXJpYWJsZV92YWx1ZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl90ZXN0XzJfY29weS52YXJpYWJsZV92YWx1ZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICApLAogICAgICAgICAgICBtc2c9KAogICAgICAgICAgICAgICAgIlZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgaW4gc2VydmVyIGNvcHkgIgogICAgICAgICAgICAgICAgInNob3VsZCBiZSB0aGUgc2FtZSBhcyBpbiBzb3VyY2Ugc2VydmVyISIKICAgICAgICAgICAgKSwKICAgICAgICApCgogICAgICAgICMgQ29weSBjb3BpZWQgc2VydmVyCiAgICAgICAgc2VydmVyX3Rlc3RfMl9uZXdfY29weSA9IHNlcnZlcl90ZXN0XzJfY29weS5jb3B5KCkKICAgICAgICAjIFZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgaW4gc2VydmVyIGNvcHkgc2hvdWxkIGJlIHRoZSBzYW1lCiAgICAgICAgIyBhcyBpbiBzb3VyY2Ugc2VydmVyCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBhbGwoCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgdmFyX2NvcHkudmFyaWFibGVfcmVmZXJlbmNlID09IHZhcl9zcmMudmFyaWFibGVfcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgYW5kIHZhcl9jb3B5LnZhbHVlX2NoYXIgPT0gdmFyX3NyYy52YWx1ZV9jaGFyCiAgICAgICAgICAgICAgICAgICAgYW5kIHZhcl9jb3B5LnJlZmVyZW5jZSA9PSBmInt2YXJfc3JjLnJlZmVyZW5jZX1fY29weSIKICAgICAgICAgICAgICAgICAgICBmb3IgdmFyX3NyYywgdmFyX2NvcHkgaW4gemlwKCAgIyBub3FhOiBCOTA1IHdlIG5lZWQgdG8gcnVuIG9uIFB5dGhvbiAzLjEwCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl90ZXN0XzJfY29weS52YXJpYWJsZV92YWx1ZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl90ZXN0XzJfbmV3X2NvcHkudmFyaWFibGVfdmFsdWVfaWRzLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgbXNnPSgKICAgICAgICAgICAgICAgICJWYXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGluIHNlcnZlciBjb3B5ICIKICAgICAgICAgICAgICAgICJzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gc291cmNlIHNlcnZlciEiCiAgICAgICAgICAgICksCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9hcmNoaXZlX3VuYXJjaGl2ZShzZWxmKToKICAgICAgICAiIiJUZXN0IFNlcnZlciBhcmNoaXZlZC91bmFyY2hpdmVkIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xLmNvcHkoKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2ZXIsIG1zZz0iU2VydmVyIG11c3QgYmUgdW5hcmNoaXZlZCIpCiAgICAgICAgc2VydmVyLnRvZ2dsZV9hY3RpdmUoKQogICAgICAgIHNlcnZlci50b2dnbGVfYWN0aXZlKCkKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VydmVyLCBtc2c9IlNlcnZlciBtdXN0IGJlIHVuYXJjaGl2ZWQiKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl91bmxpbmsoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBjYXNjYWRpbmcgZGVsZXRpb24gb2Ygc2VydmVyIGFuZCBpdHMgcmVsYXRlZCByZWNvcmRzLgogICAgICAgICIiIgogICAgICAgIHNlY3JldF8xID0gc2VsZi5LZXkuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJTZWNyZXQgMSIsCiAgICAgICAgICAgICAgICAic2VjcmV0X3ZhbHVlIjogInNlY3JldF92YWx1ZV8xIiwKICAgICAgICAgICAgICAgICJrZXlfdHlwZSI6ICJzIiwKICAgICAgICAgICAgfSwKICAgICAgICApCiAgICAgICAgIyBDcmVhdGUgYSB0ZXN0IHNlcnZlcgogICAgICAgIHNlcnZlciA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgIzMiLAogICAgICAgICAgICAgICAgImNvbG9yIjogMywKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAiayIsCiAgICAgICAgICAgICAgICAidXNlX3N1ZG8iOiAicCIsCiAgICAgICAgICAgICAgICAic3NoX2tleV9pZCI6IHNlbGYua2V5XzEuaWQsCiAgICAgICAgICAgICAgICAiaG9zdF9rZXkiOiAidGVzdF9rZXkiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc191YnVudHVfMjBfMDQuaWQsCiAgICAgICAgICAgICAgICAic2VjcmV0X2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXlfaWQiOiBzZWNyZXRfMS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNyZXRfdmFsdWUiOiAic2VjcmV0X3ZhbHVlXzEiLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSByZWxhdGVkIGZpbGUKICAgICAgICBmaWxlID0gc2VsZi5GaWxlLmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIlRlc3QgRmlsZSIsICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsICJzb3VyY2UiOiAic2VydmVyIn0KICAgICAgICApCgogICAgICAgICMgUmVsYXRlZCBzZWNyZXQKICAgICAgICBzZWNyZXQgPSBzZXJ2ZXIuc2VjcmV0X2lkc1swXQoKICAgICAgICB2YXJpYWJsZV9tZW1lID0gc2VsZi5WYXJpYWJsZS5jcmVhdGUoeyJuYW1lIjogIm1lbWUifSkKCiAgICAgICAgIyBDcmVhdGUgcmVsYXRlZCB2YXJpYWJsZSB2YWx1ZQogICAgICAgIHZhcmlhYmxlX3ZhbHVlID0gc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiB2YXJpYWJsZV9tZW1lLmlkLCAgIyBSZXBsYWNlIHdpdGggdmFsaWQgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJUZXN0IFZhbHVlIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgcGxhbl8xID0gc2VsZi5QbGFuLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBwbGFuIiwKICAgICAgICAgICAgICAgICJub3RlIjogIkNyZWF0ZSBkaXJlY3RvcnkgYW5kIGxpc3QgaXRzIGNvbnRlbnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgQ3JlYXRlIGEgcmVsYXRlZCBwbGFuIGxvZwogICAgICAgIHBsYW5fbG9nID0gc2VsZi5QbGFuTG9nLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogcGxhbl8xLmlkLCAgIyBSZXBsYWNlIHdpdGggdmFsaWQgcmVmZXJlbmNlCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ2hlY2sgdGhhdCBhbGwgcmVjb3JkcyBhcmUgY3JlYXRlZAogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2ZXIsICJTZXJ2ZXIgc2hvdWxkIGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IikKICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZSwgIkZpbGUgc2hvdWxkIGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IikKICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VjcmV0LCAiU2VjcmV0IHNob3VsZCBiZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseSIpCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhcmlhYmxlX3ZhbHVlLCAiVmFyaWFibGUgVmFsdWUgc2hvdWxkIGJlIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IikKICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhbl9sb2csICJQbGFuIExvZyBzaG91bGQgYmUgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKQoKICAgICAgICAjIENvbGxlY3QgSURzIGZvciB2ZXJpZmljYXRpb24gcG9zdC1kZWxldGlvbgogICAgICAgIGZpbGVfaWQgPSBmaWxlLmlkCiAgICAgICAgdmFyaWFibGVfdmFsdWVfaWQgPSB2YXJpYWJsZV92YWx1ZS5pZAogICAgICAgIHBsYW5fbG9nX2lkID0gcGxhbl9sb2cuaWQKCiAgICAgICAgIyBEZWxldGUgdGhlIHNlcnZlcgogICAgICAgIHNlcnZlci51bmxpbmsoKQoKICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBzZXJ2ZXIgaXMgZGVsZXRlZAogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHNlbGYuU2VydmVyLnNlYXJjaChbKCJpZCIsICI9Iiwgc2VydmVyLmlkKV0pLAogICAgICAgICAgICBtc2c9IlNlcnZlciBzaG91bGQgYmUgZGVsZXRlZCIsCiAgICAgICAgKQogICAgICAgICMgVmVyaWZ5IHRoYXQgcmVsYXRlZCByZWNvcmRzIGFyZSBkZWxldGVkCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgc2VsZi5GaWxlLnNlYXJjaChbKCJpZCIsICI9IiwgZmlsZV9pZCldKSwKICAgICAgICAgICAgbXNnPSJGaWxlIHNob3VsZCBiZSBkZWxldGVkIHdoZW4gc2VydmVyIGlzIGRlbGV0ZWQiLAogICAgICAgICkKICAgICAgICAjIFZlcmlmeSB0aGF0IHVucmVsYXRlZCByZWNvcmRzIGFyZSBub3QgYWZmZWN0ZWQKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHNlbGYuUGxhbi5zZWFyY2goWygiaWQiLCAiPSIsIHBsYW5fMS5pZCldKSwKICAgICAgICAgICAgbXNnPSJVbnJlbGF0ZWQgcGxhbiBzaG91bGQgbm90IGJlIGRlbGV0ZWQgd2hlbiBzZXJ2ZXIgaXMgZGVsZXRlZCIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHNlbGYuS2V5VmFsdWUuc2VhcmNoKFsoImlkIiwgIj0iLCBzZWNyZXQuaWQpXSksCiAgICAgICAgICAgIG1zZz0iU2VjcmV0IHNob3VsZCBiZSBkZWxldGVkIHdoZW4gc2VydmVyIGlzIGRlbGV0ZWQiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICBzZWxmLlZhcmlhYmxlVmFsdWUuc2VhcmNoKFsoImlkIiwgIj0iLCB2YXJpYWJsZV92YWx1ZV9pZCldKSwKICAgICAgICAgICAgbXNnPSJWYXJpYWJsZSBWYWx1ZSBzaG91bGQgYmUgZGVsZXRlZCB3aGVuIHNlcnZlciBpcyBkZWxldGVkIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgc2VsZi5QbGFuTG9nLnNlYXJjaChbKCJpZCIsICI9IiwgcGxhbl9sb2dfaWQpXSksCiAgICAgICAgICAgIG1zZz0iUGxhbiBMb2cgc2hvdWxkIGJlIGRlbGV0ZWQgd2hlbiBzZXJ2ZXIgaXMgZGVsZXRlZCIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9kZWxldGVfcGxhbl9zdWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3Qgc2VydmVyIGRlbGV0ZSBwbGFuIiIiCgogICAgICAgICMgU2V0IHBsYW4gdG8gZGVsZXRlIHRoZSBzZXJ2ZXIKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzIucGxhbl9kZWxldGVfaWQgPSBzZWxmLnBsYW5fZGVsZXRlX3NlcnZlci5pZAoKICAgICAgICAjIERlbGV0ZSB0aGUgc2VydmVyCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8yLnVubGluaygpCgogICAgICAgICMgQ2hlY2sgaWYgdGhlIHNlcnZlciBoYXMgYmVlbiBkZWxldGVkCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8yLmV4aXN0cygpLAogICAgICAgICAgICBtc2c9IlNlcnZlciBzaG91bGQgYmUgZGVsZXRlZCIsCiAgICAgICAgKQoKICAgICAgICAjIENoZWNrIGlmIHRoZSBwYXJ0bmVyIGhhcyBiZWVuIGNyZWF0ZWQKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHNlbGYuZW52WyJyZXMucGFydG5lciJdLnNlYXJjaChbKCJyZWYiLCAiPSIsICJkZWxldGVfc2VydmVyIildKSwKICAgICAgICAgICAgbXNnPSJQYXJ0bmVyIHNob3VsZCBiZSBjcmVhdGVkIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2VydmVyX2RlbGV0ZV9wbGFuX2Vycm9yKHNlbGYpOgogICAgICAgICIiIlRlc3Qgc2VydmVyIGRlbGV0ZSBwbGFuIGVycm9yIiIiCgogICAgICAgICMgTW9kaWZ5IHRoZSBjb21tYW5kIHRvIGZhaWwKICAgICAgICBzZWxmLmNvbW1hbmRfZGVsZXRlX3NlcnZlci5jb2RlID0gIiIiCnJlc3VsdCA9IHsKICAgICJleGl0X2NvZGUiOiA0LAogICAgIm1lc3NhZ2UiOiAnU3VjaCBtdWNoIGVycm9yJywKfQogICAgIiIiCiAgICAgICAgIyBTZXQgcGxhbiB0byBkZWxldGUgdGhlIHNlcnZlcgogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMi5wbGFuX2RlbGV0ZV9pZCA9IHNlbGYucGxhbl9kZWxldGVfc2VydmVyLmlkCgogICAgICAgICMgRGVsZXRlIHRoZSBzZXJ2ZXIKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzIudW5saW5rKCkKCiAgICAgICAgIyBDaGVjayBpZiB0aGUgc2VydmVyIGhhcyBiZWVuIGRlbGV0ZWQKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMi5leGlzdHMoKSwKICAgICAgICAgICAgbXNnPSJTZXJ2ZXIgc2hvdWxkIG5vdCBiZSBkZWxldGVkIiwKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMi5zdGF0dXMsCiAgICAgICAgICAgICJkZWxldGVfZXJyb3IiLAogICAgICAgICAgICBtc2c9IlNlcnZlciBzdGF0dXMgc2hvdWxkIGJlIGRlbGV0ZV9lcnJvciIsCiAgICAgICAgKQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIC0tLS0gQWNjZXNzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZGVmIHRlc3RfdXNlcl9yZWNvcmRfbm90X3Zpc2libGVfd2l0aG91dF91c2VyX2lkcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgYSB1c2VyIGluIHRoZSAnY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF91c2VyJyBncm91cCBjYW5ub3Qgc2VlCiAgICAgICAgYSBUb3dlciBTZXJ2ZXIgcmVjb3JkIGlmIG5vdCBhZGRlZCB0byB1c2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSBhIFRvd2VyIFNlcnZlciByZWNvcmQgd2l0aG91dCBhbnkgdXNlcl9pZHMuCiAgICAgICAgcmVjb3JkID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJVc2VyIFZpc2liaWxpdHkgVGVzdCIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAidXNlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIEFzIHVzZXIxLCBzZWFyY2ggZm9yIHRoZSByZWNvcmQuIFNpbmNlIHVzZXIxJ3MgcGFydG5lciBpcyBub3Qgc3Vic2NyaWJlZCwKICAgICAgICAjIHRoZSByZWNvcmQgc2hvdWxkIG5vdCBiZSByZXR1cm5lZC4KICAgICAgICByZWNvcmRzID0gc2VsZi5TZXJ2ZXIud2l0aF91c2VyKHNlbGYudXNlcjEpLnNlYXJjaChbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVjb3JkcywKICAgICAgICAgICAgIlVzZXIxIHNob3VsZCBub3Qgc2VlIHRoZSByZWNvcmQgaWYgbm90IGFkZGVkIHRvIHVzZXJfaWRzLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VzZXJfcmVjb3JkX3Zpc2libGVfYWZ0ZXJfYWRkZWRfdG9fdXNlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCB0aGF0IGEgdXNlciBzZWVzIGEgVG93ZXIgU2VydmVyIHJlY29yZCBhZnRlciBiZWluZyBhZGRlZCB0byB1c2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICByZWNvcmQgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlVzZXIgVmlzaWJpbGl0eSBUZXN0IiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNCwgc2VsZi51c2VyMS5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgTm93LCBhcyB1c2VyMSB0aGUgcmVjb3JkIHNob3VsZCBiZSB2aXNpYmxlLgogICAgICAgIHJlY29yZHMgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi51c2VyMSkuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHJlY29yZHMsCiAgICAgICAgICAgICJVc2VyMSBzaG91bGQgc2VlIHRoZSByZWNvcmQgYWZ0ZXIgYmVpbmcgYWRkZWQgdG8gbWVzc2FnZV9wYXJ0bmVyX2lkcy4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9vbmx5X2FkZGVkX3VzZXJfY2FuX3NlZShzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgb25seSB0aGUgYWRkZWQgdXNlciBjYW4gc2VlIHRoZSBUb3dlciBTZXJ2ZXIgcmVjb3JkLgogICAgICAgICIiIgogICAgICAgIHJlY29yZCA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVXNlciBWaXNpYmlsaXR5IFRlc3QiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICJvc19pZCI6IHNlbGYub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg0LCBzZWxmLnVzZXIxLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBTdWJzY3JpYmUgb25seSB1c2VyMSdzIHBhcnRuZXIuCiAgICAgICAgcmVjb3Jkc191c2VyMSA9IHNlbGYuU2VydmVyLndpdGhfdXNlcihzZWxmLnVzZXIxKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICByZWNvcmRzX3VzZXIyID0gc2VsZi5TZXJ2ZXIud2l0aF91c2VyKHNlbGYudXNlcjIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHJlY29yZC5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgcmVjb3Jkc191c2VyMSwgIlVzZXIxIHNob3VsZCBzZWUgdGhlIHJlY29yZCBhZnRlciBiZWluZyBhZGRlZCB0byB1c2VyX2lkcy4iCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHJlY29yZHNfdXNlcjIsCiAgICAgICAgICAgICJVc2VyMiBzaG91bGQgbm90IHNlZSB0aGUgcmVjb3JkIGlmIHRoZXkgYXJlIG5vdCBhZGRlZCB0byB1c2VyX2lkcy4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2FzX2ZvbGxvd2VyKHNlbGYpOgogICAgICAgICIiIkEgbWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIGEgcmVjb3JkIGlmIGhpcyBwYXJ0bmVyIGlzIGEgZm9sbG93ZXIuIiIiCgogICAgICAgICMgQ3JlYXRlIGEgcmVjb3JkIHdpdGhvdXQgYW55IG1hbmFnZXJzIGluIG1hbmFnZXJfaWRzLgogICAgICAgIHJlY29yZCA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgKEZvbGxvd2VyKSIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAjIEV4cGxpY2l0bHkgY2xlYXIgbWFuYWdlcl9pZHMKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW10pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICAjIFN1YnNjcmliZSBtYW5hZ2VyMSB0byB0aGUgcmVjb3JkIHNvIHRoYXQgaGlzIHBhcnRuZXIgYmVjb21lcyBhIGZvbGxvd2VyLgogICAgICAgIHJlY29yZC53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIxLmlkKV19KQoKICAgICAgICAjIEFzIG1hbmFnZXIxIChhIGZvbGxvd2VyKSB0aGUgcmVjb3JkIHNob3VsZCBiZSB2aXNpYmxlLgogICAgICAgIHJlY29yZHMgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydFRydWUocmVjb3JkcywgIk1hbmFnZXIxICh1c2VyKSBtdXN0IGJlIGFibGUgdG8gcmVhZCB0aGUgcmVjb3JkLiIpCgogICAgICAgICMgQXMgbWFuYWdlcjIgKG5vdCBhIGZvbGxvd2VyIGFuZCBub3QgaW4gbWFuYWdlcl9pZHMpCiAgICAgICAgIyB0aGUgcmVjb3JkIHNob3VsZCBub3QgYmUgdmlzaWJsZS4KICAgICAgICByZWNvcmRzID0gc2VsZi5TZXJ2ZXIud2l0aF91c2VyKHNlbGYubWFuYWdlcjIpLnNlYXJjaChbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVjb3JkcywKICAgICAgICAgICAgIk1hbmFnZXIyIChub3QgdXNlcl9pZHMgYW5kIG5vdCBpbiBtYW5hZ2VyX2lkcykgbXVzdCBub3Qgc2VlIHRoZSByZWNvcmQuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2Vzc19hc19tYW5hZ2VyX2lkcyhzZWxmKToKICAgICAgICAiIiJBIG1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhIHJlY29yZCBpZiBoZSBpcyBhZGRlZCB0byBtYW5hZ2VyX2lkcy4iIiIKCiAgICAgICAgIyBDcmVhdGUgYSByZWNvcmQgd2l0aCBtYW5hZ2VyMiBhZGRlZCB0byBtYW5hZ2VyX2lkcy4KICAgICAgICByZWNvcmQgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIChNYW5hZ2VyKSIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgV2l0aG91dCBhZGRpbmcgdG8gdXNlcl9pZHMsIG1hbmFnZXIyIHNob3VsZCBiZSBhYmxlIHRvIHNlZSB0aGUgcmVjb3JkLgogICAgICAgIHJlY29yZHMgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMikuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHJlY29yZHMsICJNYW5hZ2VyMiAoaW4gbWFuYWdlcl9pZHMpIG11c3QgYmUgYWJsZSB0byByZWFkIHRoZSByZWNvcmQuIgogICAgICAgICkKCiAgICAgICAgIyBNYW5hZ2VyMSBpcyBub3QgYWRkZWQgdG8gdXNlcl9pZHMgbm9yIGluIG1hbmFnZXJfaWRzCiAgICAgICAgIyBzbyBzaG91bGQgbm90IHNlZSB0aGUgcmVjb3JkLgogICAgICAgIHJlY29yZHMgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAiTWFuYWdlcjEgKG5laXRoZXIgdXNlcl9pZHMgbm9yIGluIG1hbmFnZXJfaWRzKSBtdXN0IG5vdCBzZWUgdGhlIHJlY29yZC4iLAogICAgICAgICkKCiAgICAgICAgIyBBZGQgbWFuYWdlcjEgdG8gdXNlcl9pZHMKICAgICAgICByZWNvcmQud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyMS5pZCldfSkKICAgICAgICByZWNvcmRzID0gc2VsZi5TZXJ2ZXIud2l0aF91c2VyKHNlbGYubWFuYWdlcjEpLnNlYXJjaChbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAiTWFuYWdlcjEgKGFkZGVkIHRvIHVzZXJfaWRzKSBtdXN0IGJlIGFibGUgdG8gc2VlIHRoZSByZWNvcmQuIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiQSBtYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSBhIHJlY29yZCBvbmx5IGlmIGhlIGlzIGluIG1hbmFnZXJfaWRzLiIiIgoKICAgICAgICAjIENyZWF0ZSBhIHJlY29yZCB3aXRoIG5vIG1hbmFnZXJzLgogICAgICAgIHJlY29yZCA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgKFdyaXRlKSIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlcjEgKG5vdCBpbiBtYW5hZ2VyX2lkcykgdHJpZXMgdG8gdXBkYXRlOiBzaG91bGQgcmFpc2UgYW4gQWNjZXNzRXJyb3IuCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgTmFtZSJ9KQoKICAgICAgICAjIFVwZGF0ZSB0aGUgcmVjb3JkIHRvIGluY2x1ZGUgbWFuYWdlcjEgaW4gbWFuYWdlcl9pZHMuCiAgICAgICAgcmVjb3JkLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlcjEuaWQpXX0pCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcjEpLndyaXRlKHsibmFtZSI6ICJVcGRhdGVkIE5hbWUifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyMSBtdXN0IGJlIGFibGUgdG8gdXBkYXRlIHRoZSAiCiAgICAgICAgICAgICAgICAicmVjb3JkIGFmdGVyIGJlaW5nIGFkZGVkIHRvIG1hbmFnZXJfaWRzLiIKICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfY3JlYXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiIKICAgICAgICBBIG1hbmFnZXIgc2hvdWxkIGJlIGFsbG93ZWQgdG8gY3JlYXRlIGEgcmVjb3JkIG9ubHkgaWYgaGUgaXMgYWRkZWQKICAgICAgICBpbiB0aGUgIk1hbmFnZXJzIi4KICAgICAgICAiIiIKICAgICAgICAjIE1hbmFnZXIxIGF0dGVtcHRzIHRvIGNyZWF0ZSBhIHJlY29yZCB3aXRob3V0IGluY2x1ZGluZyBoaW1zZWxmIGluIG1hbmFnZXJfaWRzLgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIChDcmVhdGUgRGVuaWVkKSIsCiAgICAgICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBNYW5hZ2VyMSBjcmVhdGVzIGEgcmVjb3JkIHdpdGggaGltc2VsZiBhZGRlZCB0byBtYW5hZ2VyX2lkcy4KICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlY29yZCA9IHNlbGYuU2VydmVyLndpdGhfdXNlcihzZWxmLm1hbmFnZXIxKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgKENyZWF0ZSBBbGxvd2VkKSIsCiAgICAgICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIxLmlkXSldLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICAgIHJlY29yZCwKICAgICAgICAgICAgICAgICJNYW5hZ2VyMSBtdXN0IGJlIGFibGUgdG8gY3JlYXRlIHRoZSByZWNvcmQgaWYgaGUgaXMgaW4gbWFuYWdlcl9pZHMuIiwKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKAogICAgICAgICAgICAgICAgIk1hbmFnZXIxIHNob3VsZCBiZSBhbGxvd2VkIHRvIGNyZWF0ZSBhICIKICAgICAgICAgICAgICAgICJyZWNvcmQgd2hlbiBpbmNsdWRlZCBpbiBtYW5hZ2VyX2lkcy4iCiAgICAgICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2RlbGV0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgQSBtYW5hZ2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIGRlbGV0ZSBhIHJlY29yZCBvbmx5IGlmOgogICAgICAgICAtIEhlIGlzIGluIHRoZSBtYW5hZ2VyX2lkcyBmaWVsZCwgYW5kCiAgICAgICAgIC0gSGUgaXMgdGhlIGNyZWF0b3Igb2YgdGhlIHJlY29yZC4KICAgICAgICAiIiIKCiAgICAgICAgIyAtLSBTY2VuYXJpbyAxOiBNYW5hZ2VyMSBjcmVhdGVzIGEgcmVjb3JkIHdpdGggaGltc2VsZiBpbiBtYW5hZ2VyX2lkcy4KICAgICAgICByZWNvcmQgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciAoRGVsZXRlIEFsbG93ZWQpIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogImxvY2FsaG9zdCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBzZWxmLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNiwgMCwgW3NlbGYubWFuYWdlcjEuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBNYW5hZ2VyMSBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgaGlzIG93biByZWNvcmQuCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcjEpLnVubGluaygpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICAiTWFuYWdlcjEgbXVzdCBiZSBhYmxlIHRvIGRlbGV0ZSBoaXMgb3duIHJlY29yZCBpZiBpbiBtYW5hZ2VyX2lkcy4iCiAgICAgICAgICAgICkKCiAgICAgICAgIyAtLSBTY2VuYXJpbyAyOiBNYW5hZ2VyMiBjcmVhdGVzIGEgcmVjb3JkICh3aXRoIGhpbXNlbGYgaW4gbWFuYWdlcl9pZHMpLgogICAgICAgIHJlY29yZDIgPSBzZWxmLlNlcnZlci53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMikuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciAoRGVsZXRlIERlbmllZCAtIE5vdCBDcmVhdG9yKSIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogc2VsZi5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIyLmlkLCBzZWxmLm1hbmFnZXIxLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgICMgTWFuYWdlcjEsIHNob3VsZCBub3QgYmUgYWJsZSB0byBkZWxldGUgcmVjb3JkMi4KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgcmVjb3JkMi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyMSkudW5saW5rKCkKCiAgICAgICAgIyBSZW1vdmUgbWFuYWdlcjIgZnJvbSBtYW5hZ2VyX2lkcy4KICAgICAgICByZWNvcmQyLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtdKV19KQoKICAgICAgICAjIE1hbmFnZXIyIHNob3VsZCBub3QgYmUgYWJsZSB0byBkZWxldGUgcmVjb3JkMiBub3cKICAgICAgICAjIGJlY2F1c2UgaGUgaXMgbm90IGluIG1hbmFnZXJfaWRzLgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICByZWNvcmQyLndpdGhfdXNlcihzZWxmLm1hbmFnZXIyKS51bmxpbmsoKQoKICAgIGRlZiB0ZXN0X2NvbW1hbmRfc2VydmVyX2NvbXBhdGliaWxpdHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCBjb21tYW5kIGNvbXBhdGliaWxpdHkgd2l0aCBzZXJ2ZXJzIiIiCiAgICAgICAgIyBDcmVhdGUgYSBjb21tYW5kIHJlc3RyaWN0ZWQgdG8gc3BlY2lmaWMgc2VydmVycwogICAgICAgIGNvbW1hbmQgPSBzZWxmLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSZXN0cmljdGVkIENvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJzc2hfY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJlY2hvICd0ZXN0JyIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgd29yayBvbiBhbGxvd2VkIHNlcnZlcgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9jb21tYW5kKGNvbW1hbmQpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWwoZiJDb21tYW5kIHNob3VsZCBleGVjdXRlIG9uIGFsbG93ZWQgc2VydmVyIGJ1dCBmYWlsZWQ6IHtlfSIpCgogICAgICAgICMgU2hvdWxkIGZhaWwgb24gbm9uLWFsbG93ZWQgc2VydmVyCiAgICAgICAgY29tbWFuZF9yZXN1bHQgPSBzZWxmLnNlcnZlcl90ZXN0XzIud2l0aF9jb250ZXh0KAogICAgICAgICAgICBub19jb21tYW5kX2xvZz1UcnVlCiAgICAgICAgKS5ydW5fY29tbWFuZChjb21tYW5kKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfcmVzdWx0WyJzdGF0dXMiXSwKICAgICAgICAgICAgQ09NTUFORF9OT1RfQ09NUEFUSUJMRV9XSVRIX1NFUlZFUiwKICAgICAgICAgICAgIkNvbW1hbmQgc2hvdWxkIG5vdCBleGVjdXRlIG9uIG5vbi1hbGxvd2VkIHNlcnZlciIsCiAgICAgICAgKQoKICAgICAgICAjIENsZWFyIGFsbCBleGlzdGluZyBjb21tYW5kIGxvZ3MKICAgICAgICBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKFtdKS51bmxpbmsoKQogICAgICAgICMgU2FtZSB0ZXN0IGJ1dCB3aXRoIGNvbW1hbmQgbG9nCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8yLnJ1bl9jb21tYW5kKGNvbW1hbmQpCgogICAgICAgIGNvbW1hbmRfbG9nID0gc2VsZi5Db21tYW5kTG9nLnNlYXJjaChbXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjb21tYW5kX2xvZyksIDEsICJNdXN0IGJlIGEgc2luZ2xlIGxvZyByZWNvcmQiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGNvbW1hbmRfbG9nLmNvbW1hbmRfc3RhdHVzLAogICAgICAgICAgICBDT01NQU5EX05PVF9DT01QQVRJQkxFX1dJVEhfU0VSVkVSLAogICAgICAgICAgICAiQ29tbWFuZCBzaG91bGQgbm90IGV4ZWN1dGUgb24gbm9uLWFsbG93ZWQgc2VydmVyIiwKICAgICAgICApCgogICAgICAgICMgQ29tbWFuZCB3aXRob3V0IHNlcnZlciByZXN0cmljdGlvbnMgc2hvdWxkIHdvcmsgb24gYW55IHNlcnZlcgogICAgICAgIHVucmVzdHJpY3RlZF9jb21tYW5kID0gc2VsZi5Db21tYW5kLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVW5yZXN0cmljdGVkIENvbW1hbmQiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJzc2hfY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJlY2hvICd0ZXN0JyIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHRyeToKICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnJ1bl9jb21tYW5kKHVucmVzdHJpY3RlZF9jb21tYW5kKQogICAgICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzIucnVuX2NvbW1hbmQodW5yZXN0cmljdGVkX2NvbW1hbmQpCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBzZWxmLmZhaWwoCiAgICAgICAgICAgICAgICBmIlVucmVzdHJpY3RlZCBjb21tYW5kIHNob3VsZCBleGVjdXRlIG9uIGFueSBzZXJ2ZXIgYnV0IGZhaWxlZDoge2V9IgogICAgICAgICAgICApCgogICAgZGVmIHRlc3Rfc2VydmVyX2hvc3Rfa2V5X3ZhbGlkYXRpb24oc2VsZik6CiAgICAgICAgIiIiVGVzdCBzZXJ2ZXIgaG9zdCBrZXkgdmFsaWRhdGlvbiIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAibG9jYWxob3N0IiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICJvc19pZCI6IHNlbGYub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICAgICAgImhvc3Rfa2V5IjogInRlc3Rfa2V5IiwKICAgICAgICAgICAgICAgICJza2lwX2hvc3Rfa2V5IjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgIyBUZXN0IHdpdGggaG9zdCBrZXkKICAgICAgICBzZXJ2ZXIudGVzdF9zc2hfY29ubmVjdGlvbigpCgogICAgICAgICMgVGVzdCB3aXRob3V0IGhvc3Qga2V5CiAgICAgICAgc2VydmVyLmhvc3Rfa2V5ID0gTm9uZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgc2VydmVyLnRlc3Rfc3NoX2Nvbm5lY3Rpb24oKQoKICAgICAgICAjIFRlc3Qgd2l0aCBza2lwX2hvc3Rfa2V5CiAgICAgICAgc2VydmVyLnNraXBfaG9zdF9rZXkgPSBUcnVlCiAgICAgICAgc2VydmVyLnRlc3Rfc3NoX2Nvbm5lY3Rpb24oKQoKICAgIGRlZiB0ZXN0X3NlcnZlcl9yZWZlcmVuY2VfdXBkYXRlKHNlbGYpOgogICAgICAgICIiIlRlc3Qgc2VydmVyIHJlZmVyZW5jZSB1cGRhdGUgY2FzY2FkZXMgdG8gZGVwZW5kZW50IG1vZGVscyIiIgogICAgICAgICMgMS4gQWRkIGEgdmFyaWFibGUgdmFsdWUgdG8gc2VydmVyX3Rlc3RfMQogICAgICAgIHZhcmlhYmxlX3ZhbHVlID0gc2VsZi5WYXJpYWJsZVZhbHVlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV9vcy5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIlVidW50dSAyMC4wNCIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIDIuIEFkZCBhIGZpbGUgdG8gc2VydmVyX3Rlc3RfMQogICAgICAgIHNlcnZlcl9maWxlID0gc2VsZi5GaWxlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAidGVzdF9maWxlLnR4dCIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJ0b3dlciIsCiAgICAgICAgICAgICAgICAiY29kZSI6ICJUZXN0IGZpbGUgY29udGVudCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU3RvcmUgb3JpZ2luYWwgcmVmZXJlbmNlcyBmb3IgY29tcGFyaXNvbgogICAgICAgIG9yaWdpbmFsX3NlcnZlcl9yZWZlcmVuY2UgPSBzZWxmLnNlcnZlcl90ZXN0XzEucmVmZXJlbmNlCiAgICAgICAgb3JpZ2luYWxfdmFyaWFibGVfdmFsdWVfcmVmZXJlbmNlID0gdmFyaWFibGVfdmFsdWUucmVmZXJlbmNlCiAgICAgICAgb3JpZ2luYWxfZmlsZV9yZWZlcmVuY2UgPSBzZXJ2ZXJfZmlsZS5yZWZlcmVuY2UKCiAgICAgICAgIyAzLiBDaGFuZ2UgdGhlIHJlZmVyZW5jZSBmb3Igc2VydmVyX3Rlc3RfMSB0byAiYXdlc29tZV9zZXJ2ZXIiCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLndyaXRlKHsicmVmZXJlbmNlIjogImF3ZXNvbWVfc2VydmVyIn0pCgogICAgICAgICMgNC4gVmVyaWZ5IHRoYXQgcmVmZXJlbmNlcyBhcmUgdXBkYXRlZCBmb3IgZGVwZW5kZW50IG1vZGVscwogICAgICAgICMgSW52YWxpZGF0ZSBtb2RlbHMgdG8gcmVmcmVzaCBhbGwgcmVmZXJlbmNlcwogICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5zZXJ2ZXIiXS5pbnZhbGlkYXRlX21vZGVsKFsicmVmZXJlbmNlIl0pCiAgICAgICAgc2VsZi5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0uaW52YWxpZGF0ZV9tb2RlbChbInJlZmVyZW5jZSJdKQogICAgICAgIHNlbGYuZW52WyJjeC50b3dlci5maWxlIl0uaW52YWxpZGF0ZV9tb2RlbChbInJlZmVyZW5jZSJdKQoKICAgICAgICAjIENoZWNrIHRoYXQgc2VydmVyIHJlZmVyZW5jZSB3YXMgdXBkYXRlZAogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXJfdGVzdF8xLnJlZmVyZW5jZSwgImF3ZXNvbWVfc2VydmVyIikKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuc2VydmVyX3Rlc3RfMS5yZWZlcmVuY2UsIG9yaWdpbmFsX3NlcnZlcl9yZWZlcmVuY2UpCgogICAgICAgICMgQ2hlY2sgdGhhdCB2YXJpYWJsZSB2YWx1ZSByZWZlcmVuY2Ugd2FzIHVwZGF0ZWQKICAgICAgICAjIHRvIGluY2x1ZGUgdGhlIG5ldyBzZXJ2ZXIgcmVmZXJlbmNlCiAgICAgICAgc2VsZi5hc3NlcnRJbigiYXdlc29tZV9zZXJ2ZXIiLCB2YXJpYWJsZV92YWx1ZS5yZWZlcmVuY2UpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YXJpYWJsZV92YWx1ZS5yZWZlcmVuY2UsIG9yaWdpbmFsX3ZhcmlhYmxlX3ZhbHVlX3JlZmVyZW5jZSkKCiAgICAgICAgIyBDaGVjayB0aGF0IGZpbGUgcmVmZXJlbmNlIHdhcyB1cGRhdGVkIHRvIGluY2x1ZGUgdGhlIG5ldyBzZXJ2ZXIgcmVmZXJlbmNlCiAgICAgICAgc2VsZi5hc3NlcnRJbigiYXdlc29tZV9zZXJ2ZXIiLCBzZXJ2ZXJfZmlsZS5yZWZlcmVuY2UpCiAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZXJ2ZXJfZmlsZS5yZWZlcmVuY2UsIG9yaWdpbmFsX2ZpbGVfcmVmZXJlbmNlKQoKICAgICAgICAjIFZlcmlmeSB0aGUgcmVmZXJlbmNlIHBhdHRlcm4gZm9yIHZhcmlhYmxlIHZhbHVlIGZvbGxvd3MgdGhlIGV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAjIDx2YXJpYWJsZV9yZWZlcmVuY2U+Xzxtb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9tb2RlbF9nZW5lcmljX3JlZmVyZW5jZT5fPGxpbmtlZF9yZWNvcmRfcmVmZXJlbmNlPiAgIyBub3FhOiBFNTAxCiAgICAgICAgZXhwZWN0ZWRfdmFyaWFibGVfcGF0dGVybiA9ICgKICAgICAgICAgICAgZiJ7c2VsZi52YXJpYWJsZV9vcy5yZWZlcmVuY2V9X3ZhcmlhYmxlX3ZhbHVlX3NlcnZlcl8iCiAgICAgICAgICAgIGYie3NlbGYuc2VydmVyX3Rlc3RfMS5yZWZlcmVuY2V9IgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmlhYmxlX3ZhbHVlLnJlZmVyZW5jZSwgZXhwZWN0ZWRfdmFyaWFibGVfcGF0dGVybikKCiAgICAgICAgIyBWZXJpZnkgdGhlIHJlZmVyZW5jZSBwYXR0ZXJuIGZvciBmaWxlIGZvbGxvd3MgdGhlIGV4cGVjdGVkIGZvcm1hdDoKICAgICAgICAjIDxwYXJlbnRfcmVmZXJlbmNlPl88bW9kZWxfZ2VuZXJpY19yZWZlcmVuY2U+XzxpbmRleD4KICAgICAgICBleHBlY3RlZF9maWxlX3BhdHRlcm4gPSBmIntzZWxmLnNlcnZlcl90ZXN0XzEucmVmZXJlbmNlfV9maWxlXzEiCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXJfZmlsZS5yZWZlcmVuY2UsIGV4cGVjdGVkX2ZpbGVfcGF0dGVybikK