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

1 line
24 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjIgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KaW1wb3J0IG9zCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgTWFnaWNNb2NrLCBwYXRjaAoKZnJvbSBvZG9vIGltcG9ydCBfCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKCmZyb20gb2Rvby5hZGRvbnMuYmFzZS50ZXN0cy5jb21tb24gaW1wb3J0IEJhc2VDb21tb24KCmZyb20gLi5tb2RlbHMuY29uc3RhbnRzIGltcG9ydCBHRU5FUkFMX0VSUk9SCmZyb20gLi5zc2guc3NoIGltcG9ydCBTZnRwU2VydmljZSwgU1NIQ29ubmVjdGlvbgoKCmNsYXNzIFRlc3RUb3dlckNvbW1vbihCYXNlQ29tbW9uKToKICAgICIiIgogICAgQ29tbW9uIHRlc3QgY2xhc3MgZm9yIENldG1peCBUb3dlci4KICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQogICAgICAgICMgRGlzYWJsZSB0cmFuc2FjdGlvbiBjb21taXQgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zCiAgICAgICAgY2xzLmVudiA9IGNscy5lbnZbImJhc2UiXS53aXRoX2NvbnRleHQoY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlKS5lbnYKCiAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyAtLSBDcmVhdGUgY29yZSBlbGVtZW50cyBpbnZva2VkIGluIHRoZSB0ZXN0cwogICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgR3JvdXAgWE1MIHJlY29yZHMKICAgICAgICBjbHMuZ3JvdXBfdXNlciA9IGNscy5lbnYucmVmKCJjZXRtaXhfdG93ZXJfc2VydmVyLmdyb3VwX3VzZXIiKQogICAgICAgIGNscy5ncm91cF9tYW5hZ2VyID0gY2xzLmVudi5yZWYoImNldG1peF90b3dlcl9zZXJ2ZXIuZ3JvdXBfbWFuYWdlciIpCiAgICAgICAgY2xzLmdyb3VwX3Jvb3QgPSBjbHMuZW52LnJlZigiY2V0bWl4X3Rvd2VyX3NlcnZlci5ncm91cF9yb290IikKCiAgICAgICAgIyBDZXRtaXggVG93ZXIgaGVscGVyIG1vZGVsCiAgICAgICAgY2xzLkNldG1peFRvd2VyID0gY2xzLmVudlsiY2V0bWl4LnRvd2VyIl0KCiAgICAgICAgIyBUYWdzCiAgICAgICAgY2xzLlRhZyA9IGNscy5lbnZbImN4LnRvd2VyLnRhZyJdCiAgICAgICAgY2xzLnRhZ190ZXN0X3N0YWdpbmcgPSBjbHMuVGFnLmNyZWF0ZSh7Im5hbWUiOiAiVGVzdCBTdGFnaW5nIn0pCiAgICAgICAgY2xzLnRhZ190ZXN0X3Byb2R1Y3Rpb24gPSBjbHMuVGFnLmNyZWF0ZSh7Im5hbWUiOiAiVGVzdCBQcm9kdWN0aW9uIn0pCgogICAgICAgICMgVXNlcnMKICAgICAgICBjbHMuVXNlcnMgPSBjbHMuZW52WyJyZXMudXNlcnMiXQogICAgICAgIGNscy51c2VyX2JvYiA9IGNscy5Vc2Vycy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkJvYiIsCiAgICAgICAgICAgICAgICAibG9naW4iOiAiYm9iIiwKICAgICAgICAgICAgICAgICJncm91cHNfaWQiOiBbKDQsIGNscy5lbnYucmVmKCJiYXNlLmdyb3VwX3VzZXIiKS5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy51c2VyID0gY2xzLlVzZXJzLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBVc2VyIiwKICAgICAgICAgICAgICAgICJsb2dpbiI6ICJ0ZXN0X3VzZXIiLAogICAgICAgICAgICAgICAgImVtYWlsIjogInRlc3RfdXNlckBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgICAgICAiZ3JvdXBzX2lkIjogWyg2LCAwLCBbY2xzLmdyb3VwX3VzZXIuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLm1hbmFnZXIgPSBjbHMuVXNlcnMuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IE1hbmFnZXIiLAogICAgICAgICAgICAgICAgImxvZ2luIjogInRlc3RfbWFuYWdlciIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAidGVzdF9tYW5hZ2VyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgICAgICJncm91cHNfaWQiOiBbKDYsIDAsIFtjbHMuZ3JvdXBfbWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMucm9vdCA9IGNscy5Vc2Vycy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgUm9vdCIsCiAgICAgICAgICAgICAgICAibG9naW4iOiAidGVzdF9yb290IiwKICAgICAgICAgICAgICAgICJlbWFpbCI6ICJ0ZXN0X3Jvb3RAZXhhbXBsZS5jb20iLAogICAgICAgICAgICAgICAgImdyb3Vwc19pZCI6IFsoNiwgMCwgW2Nscy5ncm91cF9yb290LmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIE9TCiAgICAgICAgY2xzLm9zX2RlYmlhbl8xMCA9IGNscy5lbnZbImN4LnRvd2VyLm9zIl0uY3JlYXRlKHsibmFtZSI6ICJUZXN0IERlYmlhbiAxMCJ9KQoKICAgICAgICAjIFNlcnZlcgogICAgICAgIGNscy5TZXJ2ZXIgPSBjbHMuZW52WyJjeC50b3dlci5zZXJ2ZXIiXQogICAgICAgIGNscy5zZXJ2ZXJfdGVzdF8xID0gY2xzLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgMSIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgImhvc3Rfa2V5IjogInRlc3Rfa2V5IiwKICAgICAgICAgICAgICAgICJvc19pZCI6IGNscy5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2VydmVyIFRlbXBsYXRlCiAgICAgICAgY2xzLlNlcnZlclRlbXBsYXRlID0gY2xzLmVudlsiY3gudG93ZXIuc2VydmVyLnRlbXBsYXRlIl0KICAgICAgICBjbHMuc2VydmVyX3RlbXBsYXRlX3NhbXBsZSA9IGNscy5TZXJ2ZXJUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlNhbXBsZSBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAic3NoX3BvcnQiOiAyMiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgICAgICJvc19pZCI6IGNscy5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2VydmVyIGxvZwogICAgICAgIGNscy5TZXJ2ZXJMb2cgPSBjbHMuZW52WyJjeC50b3dlci5zZXJ2ZXIubG9nIl0KCiAgICAgICAgIyBWYXJpYWJsZQogICAgICAgIGNscy5WYXJpYWJsZSA9IGNscy5lbnZbImN4LnRvd2VyLnZhcmlhYmxlIl0KICAgICAgICBjbHMuVmFyaWFibGVWYWx1ZSA9IGNscy5lbnZbImN4LnRvd2VyLnZhcmlhYmxlLnZhbHVlIl0KICAgICAgICBjbHMuVmFyaWFibGVPcHRpb24gPSBjbHMuZW52WyJjeC50b3dlci52YXJpYWJsZS5vcHRpb24iXQoKICAgICAgICBjbHMudmFyaWFibGVfcGF0aCA9IGNscy5WYXJpYWJsZS5jcmVhdGUoeyJuYW1lIjogInRlc3RfcGF0aF8ifSkKICAgICAgICBjbHMudmFyaWFibGVfZGlyID0gY2xzLlZhcmlhYmxlLmNyZWF0ZSh7Im5hbWUiOiAidGVzdF9kaXIifSkKICAgICAgICBjbHMudmFyaWFibGVfb3MgPSBjbHMuVmFyaWFibGUuY3JlYXRlKHsibmFtZSI6ICJ0ZXN0X29zIn0pCiAgICAgICAgY2xzLnZhcmlhYmxlX3VybCA9IGNscy5WYXJpYWJsZS5jcmVhdGUoeyJuYW1lIjogInRlc3RfdXJsIn0pCiAgICAgICAgY2xzLnZhcmlhYmxlX3ZlcnNpb24gPSBjbHMuVmFyaWFibGUuY3JlYXRlKHsibmFtZSI6ICJ0ZXN0X3ZlcnNpb24ifSkKCiAgICAgICAgIyBLZXkKICAgICAgICBjbHMuS2V5ID0gY2xzLmVudlsiY3gudG93ZXIua2V5Il0KICAgICAgICBjbHMuS2V5VmFsdWUgPSBjbHMuZW52WyJjeC50b3dlci5rZXkudmFsdWUiXQoKICAgICAgICBjbHMua2V5XzEgPSBjbHMuS2V5LmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIlRlc3QgS2V5IDEiLCAia2V5X3R5cGUiOiAiayIsICJzZWNyZXRfdmFsdWUiOiAibXVjaCBrZXkifQogICAgICAgICkKICAgICAgICBjbHMuc2VjcmV0XzIgPSBjbHMuS2V5LmNyZWF0ZSgKICAgICAgICAgICAgeyJuYW1lIjogIlRlc3QgS2V5IDIiLCAia2V5X3R5cGUiOiAicyIsICJzZWNyZXRfdmFsdWUiOiAic2VjcmV0IHRvcCJ9CiAgICAgICAgKQoKICAgICAgICAjIENvbW1hbmQKICAgICAgICBjbHMuc3Vkb19wcmVmaXggPSAic3VkbyAtUyAtcCAnJyIKICAgICAgICBjbHMuQ29tbWFuZCA9IGNscy5lbnZbImN4LnRvd2VyLmNvbW1hbmQiXQogICAgICAgIGNscy5jb21tYW5kX2NyZWF0ZV9kaXIgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgY3JlYXRlIGRpcmVjdG9yeSIsCiAgICAgICAgICAgICAgICAicGF0aCI6ICIvaG9tZS97eyB0b3dlci5zZXJ2ZXIudXNlcm5hbWUgfX0iLAogICAgICAgICAgICAgICAgImNvZGUiOiAiY2Qge3sgdGVzdF9wYXRoXyB9fSAmJiBta2RpciB7eyB0ZXN0X2RpciB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLmNvbW1hbmRfbGlzdF9kaXIgPSBjbHMuQ29tbWFuZC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgY3JlYXRlIGRpcmVjdG9yeSIsCiAgICAgICAgICAgICAgICAicGF0aCI6ICIvaG9tZS97eyB0b3dlci5zZXJ2ZXIudXNlcm5hbWUgfX0iLAogICAgICAgICAgICAgICAgImNvZGUiOiAiY2Qge3sgdGVzdF9wYXRoXyB9fSAmJiBscyAtbCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy50ZW1wbGF0ZV9maWxlX3Rvd2VyID0gY2xzLmVudlsiY3gudG93ZXIuZmlsZS50ZW1wbGF0ZSJdLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBmaWxlIHRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJmaWxlX25hbWUiOiAidGVzdF9vcy50eHQiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJ0b3dlciIsCiAgICAgICAgICAgICAgICAic2VydmVyX2RpciI6ICIvaG9tZS97eyB0b3dlci5zZXJ2ZXIudXNlcm5hbWUgfX0iLAogICAgICAgICAgICAgICAgImNvZGUiOiAiSGVsbG8sIHdvcmxkISIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy50ZW1wbGF0ZV9maWxlX3NlcnZlciA9IGNscy5lbnZbImN4LnRvd2VyLmZpbGUudGVtcGxhdGUiXS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgZmlsZSB0ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiZmlsZV9uYW1lIjogInRlc3Rfb3MudHh0IiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAic2VydmVyIiwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfZGlyIjogIi9ob21lL3t7IHRvd2VyLnNlcnZlci51c2VybmFtZSB9fSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIGNscy5jb21tYW5kX2NyZWF0ZV9maWxlX3dpdGhfdGVtcGxhdGVfdG93ZXJfc291cmNlID0gY2xzLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IGNyZWF0ZSBmaWxlIHdpdGggdGVtcGxhdGUgd2l0aCB0b3dlciBzb3VyY2UiLAogICAgICAgICAgICAgICAgInBhdGgiOiAiL2hvbWUve3sgdG93ZXIuc2VydmVyLnVzZXJuYW1lIH19IiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiZmlsZV91c2luZ190ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiZmlsZV90ZW1wbGF0ZV9pZCI6IGNscy50ZW1wbGF0ZV9maWxlX3Rvd2VyLmlkLAogICAgICAgICAgICAgICAgImlmX2ZpbGVfZXhpc3RzIjogInJhaXNlIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgY2xzLmNvbW1hbmRfY3JlYXRlX2ZpbGVfd2l0aF90ZW1wbGF0ZV9zZXJ2ZXJfc291cmNlID0gY2xzLkNvbW1hbmQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IGNyZWF0ZSBmaWxlIHdpdGggdGVtcGxhdGUgd2l0aCBzZXJ2ZXIgc291cmNlIiwKICAgICAgICAgICAgICAgICJwYXRoIjogIi9ob21lL3t7IHRvd2VyLnNlcnZlci51c2VybmFtZSB9fSIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImZpbGVfdXNpbmdfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImZpbGVfdGVtcGxhdGVfaWQiOiBjbHMudGVtcGxhdGVfZmlsZV9zZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiaWZfZmlsZV9leGlzdHMiOiAicmFpc2UiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENvbW1hbmQgbG9nCiAgICAgICAgY2xzLkNvbW1hbmRMb2cgPSBjbHMuZW52WyJjeC50b3dlci5jb21tYW5kLmxvZyJdCgogICAgICAgICMgRmlsZSB0ZW1wbGF0ZQogICAgICAgIGNscy5GaWxlVGVtcGxhdGUgPSBjbHMuZW52WyJjeC50b3dlci5maWxlLnRlbXBsYXRlIl0KCiAgICAgICAgIyBGaWxlCiAgICAgICAgY2xzLkZpbGUgPSBjbHMuZW52WyJjeC50b3dlci5maWxlIl0KCiAgICAgICAgIyBGbGlnaHQgUGxhbnMKICAgICAgICBjbHMuUGxhbiA9IGNscy5lbnZbImN4LnRvd2VyLnBsYW4iXQogICAgICAgIGNscy5wbGFuX2xpbmUgPSBjbHMuZW52WyJjeC50b3dlci5wbGFuLmxpbmUiXQogICAgICAgIGNscy5wbGFuX2xpbmVfYWN0aW9uID0gY2xzLmVudlsiY3gudG93ZXIucGxhbi5saW5lLmFjdGlvbiJdCgogICAgICAgIGNscy5wbGFuXzEgPSBjbHMuUGxhbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgcGxhbiAxIiwKICAgICAgICAgICAgICAgICJub3RlIjogIkNyZWF0ZSBkaXJlY3RvcnkgYW5kIGxpc3QgaXRzIGNvbnRlbnQiLAogICAgICAgICAgICAgICAgInRhZ19pZHMiOiBbKDYsIDAsIFtjbHMudGFnX3Rlc3Rfc3RhZ2luZy5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMucGxhbl9saW5lXzEgPSBjbHMucGxhbl9saW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogNSwKICAgICAgICAgICAgICAgICJwbGFuX2lkIjogY2xzLnBsYW5fMS5pZCwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogY2xzLmNvbW1hbmRfY3JlYXRlX2Rpci5pZCwKICAgICAgICAgICAgICAgICJwYXRoIjogIi9zdWNoL211Y2gvcGF0aCIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnBsYW5fbGluZV8yID0gY2xzLnBsYW5fbGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDIwLAogICAgICAgICAgICAgICAgInBsYW5faWQiOiBjbHMucGxhbl8xLmlkLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBjbHMuY29tbWFuZF9saXN0X2Rpci5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBjbHMucGxhbl9saW5lXzFfYWN0aW9uXzEgPSBjbHMucGxhbl9saW5lX2FjdGlvbi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJsaW5lX2lkIjogY2xzLnBsYW5fbGluZV8xLmlkLAogICAgICAgICAgICAgICAgInNlcXVlbmNlIjogMSwKICAgICAgICAgICAgICAgICJjb25kaXRpb24iOiAiPT0iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMCIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnBsYW5fbGluZV8xX2FjdGlvbl8yID0gY2xzLnBsYW5fbGluZV9hY3Rpb24uY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibGluZV9pZCI6IGNscy5wbGFuX2xpbmVfMS5pZCwKICAgICAgICAgICAgICAgICJzZXF1ZW5jZSI6IDIsCiAgICAgICAgICAgICAgICAiY29uZGl0aW9uIjogIj4iLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiMCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImVjIiwKICAgICAgICAgICAgICAgICJjdXN0b21fZXhpdF9jb2RlIjogMjU1LAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5wbGFuX2xpbmVfMl9hY3Rpb25fMSA9IGNscy5wbGFuX2xpbmVfYWN0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImxpbmVfaWQiOiBjbHMucGxhbl9saW5lXzIuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAxLAogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICI9PSIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICItMSIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImVjIiwKICAgICAgICAgICAgICAgICJjdXN0b21fZXhpdF9jb2RlIjogMTAwLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5wbGFuX2xpbmVfMl9hY3Rpb25fMiA9IGNscy5wbGFuX2xpbmVfYWN0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImxpbmVfaWQiOiBjbHMucGxhbl9saW5lXzIuaWQsCiAgICAgICAgICAgICAgICAic2VxdWVuY2UiOiAyLAogICAgICAgICAgICAgICAgImNvbmRpdGlvbiI6ICI+PSIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIzIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAibiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgRmxpZ2h0IHBsYW4gbG9nCiAgICAgICAgY2xzLlBsYW5Mb2cgPSBjbHMuZW52WyJjeC50b3dlci5wbGFuLmxvZyJdCgogICAgICAgICMgU2hvcnRjdXQKICAgICAgICBjbHMuU2hvcnRjdXQgPSBjbHMuZW52WyJjeC50b3dlci5zaG9ydGN1dCJdCgogICAgICAgICMgTW9kZWwgcmVmZXJlbmNlcwogICAgICAgIGNscy5PUyA9IGNscy5lbnZbImN4LnRvd2VyLm9zIl0KICAgICAgICBjbHMuUGxhbkxpbmVBY3Rpb24gPSBjbHMuZW52WyJjeC50b3dlci5wbGFuLmxpbmUuYWN0aW9uIl0KCiAgICAgICAgIyBTY2hlZHVsZWQgdGFzawogICAgICAgIGNscy5TY2hlZHVsZWRUYXNrID0gY2xzLmVudlsiY3gudG93ZXIuc2NoZWR1bGVkLnRhc2siXQogICAgICAgIGNscy5TY2hlZHVsZWRUYXNrQ3YgPSBjbHMuZW52WyJjeC50b3dlci5zY2hlZHVsZWQudGFzay5jdiJdCiAgICAgICAgIyBKZXQgU3RhdGUKICAgICAgICBjbHMuSmV0U3RhdGUgPSBjbHMuZW52WyJjeC50b3dlci5qZXQuc3RhdGUiXQoKICAgICAgICAjIEpldCBBY3Rpb24KICAgICAgICBjbHMuSmV0QWN0aW9uID0gY2xzLmVudlsiY3gudG93ZXIuamV0LmFjdGlvbiJdCgogICAgICAgICMgSmV0IFRlbXBsYXRlIEluc3RhbGwKICAgICAgICBjbHMuSmV0VGVtcGxhdGVJbnN0YWxsID0gY2xzLmVudlsiY3gudG93ZXIuamV0LnRlbXBsYXRlLmluc3RhbGwiXQoKICAgICAgICAjIEpldCBUZW1wbGF0ZSBJbnN0YWxsIExpbmUKICAgICAgICBjbHMuSmV0VGVtcGxhdGVJbnN0YWxsTGluZSA9IGNscy5lbnZbImN4LnRvd2VyLmpldC50ZW1wbGF0ZS5pbnN0YWxsLmxpbmUiXQoKICAgICAgICAjIEpldCBUZW1wbGF0ZSBEZXBlbmRlbmN5CiAgICAgICAgY2xzLkpldFRlbXBsYXRlRGVwZW5kZW5jeSA9IGNscy5lbnZbImN4LnRvd2VyLmpldC50ZW1wbGF0ZS5kZXBlbmRlbmN5Il0KCiAgICAgICAgIyBKZXQgVGVtcGxhdGUKICAgICAgICBjbHMuSmV0VGVtcGxhdGUgPSBjbHMuZW52WyJjeC50b3dlci5qZXQudGVtcGxhdGUiXQogICAgICAgIGNscy5qZXRfdGVtcGxhdGVfc2FtcGxlID0gY2xzLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiU2FtcGxlIEpldCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNCwgY2xzLnNlcnZlcl90ZXN0XzEuaWQpXSwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV92YWx1ZV9pZHMiOiBbCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBjbHMudmFyaWFibGVfcGF0aC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIi9qZXRzL3RlbXBsYXRlcy90ZW1wbGF0ZTEiLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICB7InZhcmlhYmxlX2lkIjogY2xzLnZhcmlhYmxlX29zLmlkLCAidmFsdWVfY2hhciI6ICJEZWJpYW4gMTAifSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogY2xzLnZhcmlhYmxlX3VybC5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogImh0dHBzOi8vamV0cy5leGFtcGxlLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IGNscy52YXJpYWJsZV9kaXIuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJqZXRfdGVtcGxhdGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBKZXRzCiAgICAgICAgY2xzLkpldCA9IGNscy5lbnZbImN4LnRvd2VyLmpldCJdCiAgICAgICAgY2xzLmpldF9zYW1wbGUgPSBjbHMuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiU2FtcGxlIEpldCIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogY2xzLmpldF90ZW1wbGF0ZV9zYW1wbGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogY2xzLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAidmFyaWFibGVfdmFsdWVfaWRzIjogWwogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogY2xzLnZhcmlhYmxlX3BhdGguaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIvamV0cy9qZXQxIiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIGFwcGx5IHNzaCBjb25uZWN0aW9uIHBhdGNoZXMKICAgICAgICBjbHMuYXBwbHlfcGF0Y2hlcygpCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgYXBwbHlfcGF0Y2hlcyhjbHMpOgogICAgICAgICIiIgogICAgICAgIEFwcGx5IG1vY2sgcGF0Y2hlcyBmb3IgU1NILXJlbGF0ZWQgbWV0aG9kcyB0byBzaW11bGF0ZSB2YXJpb3VzCiAgICAgICAgc2NlbmFyaW9zIGR1cmluZyB0ZXN0aW5nLgoKICAgICAgICBQYXRjaGVzOgogICAgICAgIDEuIFNTSENvbm5lY3Rpb24uY29ubmVjdDoKICAgICAgICAgICAgLSBSZXR1cm5zIGEgbW9jayBjb25uZWN0aW9uIHdpdGggYSBmYWtlIGV4ZWNfY29tbWFuZCBtZXRob2QsCiAgICAgICAgICAgIHdoaWNoIHJldHVybnMgYSBzdWNjZXNzZnVsIG9yIHVuc3VjY2Vzc2Z1bCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICAgICBjb21tYW5kIGNvbnRlbnQuCiAgICAgICAgMi4gU2Z0cFNlcnZpY2UuZG93bmxvYWRfZmlsZToKICAgICAgICAgICAgLSBSZXR1cm5zIGIib2tceDAwIiBmb3IgZmlsZXMgd2l0aCB0aGUgLnppcCBleHRlbnNpb24gYW5kCiAgICAgICAgICAgIGIib2siIGZvciB0aGUgcmVzdC4KICAgICAgICAzLiBTZnRwU2VydmljZS51cGxvYWRfZmlsZToKICAgICAgICAgICAgLSBSZXR1cm5zIE1hZ2ljTW9jaywgc2ltdWxhdGluZyBmaWxlIHVwbG9hZC4KICAgICAgICA0LiBTZnRwU2VydmljZS5kZWxldGVfZmlsZToKICAgICAgICAgICAgLSBSZXR1cm5zIE1hZ2ljTW9jaywgc2ltdWxhdGluZyBmaWxlIGRlbGV0aW9uLgogICAgICAgICIiIgoKICAgICAgICAjIFBhdGNoIGNvbm5lY3Rpb24gU1NIIG1ldGhvZAogICAgICAgIGRlZiBzc2hfY29ubmVjdChzZWxmKToKICAgICAgICAgICAgY29ubmVjdGlvbl9tb2NrID0gTWFnaWNNb2NrKCkKCiAgICAgICAgICAgICMgc2V0IHVwIHN0ZGluIHdpdGggYSBjb25kaXRpb24gZm9yIGVycm9yIHNpbXVsYXRpb24KICAgICAgICAgICAgZGVmIGV4ZWNfY29tbWFuZF9zaWRlX2VmZmVjdChjb21tYW5kLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgICAgIyBDcmVhdGUgbW9ja3MgZm9yIHN0ZGluLCBzdGRvdXQsIGFuZCBzdGRlcnIKICAgICAgICAgICAgICAgIHN0ZGluX21vY2sgPSBNYWdpY01vY2soKQogICAgICAgICAgICAgICAgc3Rkb3V0X21vY2sgPSBNYWdpY01vY2soKQogICAgICAgICAgICAgICAgc3RkZXJyX21vY2sgPSBNYWdpY01vY2soKQoKICAgICAgICAgICAgICAgIGlmICJmYWlsIiBpbiBjb21tYW5kOgogICAgICAgICAgICAgICAgICAgICMgU2ltdWxhdGUgZmFpbHVyZQogICAgICAgICAgICAgICAgICAgIHN0ZG91dF9tb2NrLmNoYW5uZWwucmVjdl9leGl0X3N0YXR1cy5yZXR1cm5fdmFsdWUgPSBHRU5FUkFMX0VSUk9SCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0X21vY2sucmVhZGxpbmVzLnJldHVybl92YWx1ZSA9IFtdCiAgICAgICAgICAgICAgICAgICAgc3RkZXJyX21vY2sucmVhZGxpbmVzLnJldHVybl92YWx1ZSA9IFsiZXJyb3IiXQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGRpbl9tb2NrLCBzdGRvdXRfbW9jaywgc3RkZXJyX21vY2sKICAgICAgICAgICAgICAgIGVsaWYgInJhaXNlIiBpbiBjb21tYW5kOgogICAgICAgICAgICAgICAgICAgICMgU2ltdWxhdGUgYW4gZXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJlcnJvciIpICAjIHB5bGludDogZGlzYWJsZT1icm9hZC1leGNlcHRpb24tcmFpc2VkCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICMgU2ltdWxhdGUgc3VjY2VzcwogICAgICAgICAgICAgICAgICAgIHN0ZG91dF9tb2NrLmNoYW5uZWwucmVjdl9leGl0X3N0YXR1cy5yZXR1cm5fdmFsdWUgPSAwCiAgICAgICAgICAgICAgICAgICAgc3Rkb3V0X21vY2sucmVhZGxpbmVzLnJldHVybl92YWx1ZSA9IFsib2siXQogICAgICAgICAgICAgICAgICAgIHN0ZGVycl9tb2NrLnJlYWRsaW5lcy5yZXR1cm5fdmFsdWUgPSBbXQogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGRpbl9tb2NrLCBzdGRvdXRfbW9jaywgc3RkZXJyX21vY2sKCiAgICAgICAgICAgICMgQXBwbHkgc2lkZSBlZmZlY3QgdG8gZXhlY19jb21tYW5kCiAgICAgICAgICAgIGNvbm5lY3Rpb25fbW9jay5leGVjX2NvbW1hbmQuc2lkZV9lZmZlY3QgPSBleGVjX2NvbW1hbmRfc2lkZV9lZmZlY3QKCiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uX21vY2sKCiAgICAgICAgY29ubmVjdF9wYXRjaCA9IHBhdGNoLm9iamVjdChTU0hDb25uZWN0aW9uLCAiY29ubmVjdCIsIG5ldz1zc2hfY29ubmVjdCkKICAgICAgICBjb25uZWN0X3BhdGNoLnN0YXJ0KCkKICAgICAgICBjbHMuYWRkQ2xhc3NDbGVhbnVwKGNvbm5lY3RfcGF0Y2guc3RvcCkKCiAgICAgICAgIyBQYXRjaCBmaWxlIG1hbmlwdWxhdGlvbiBtZXRob2RzIGZvciB0ZXN0aW5nCiAgICAgICAgZGVmIHNzaF9kb3dubG9hZF9maWxlKHNlbGYsIHJlbW90ZV9wYXRoKToKICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiZW52Iik6CiAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuZW52LmNvbnRleHQuZ2V0KCJyYWlzZV9kb3dubG9hZF9lcnJvciIpCiAgICAgICAgICAgICAgICBpZiBlcnJvcjoKICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoZXJyb3IpCgogICAgICAgICAgICBfLCBleHRlbnNpb24gPSBvcy5wYXRoLnNwbGl0ZXh0KHJlbW90ZV9wYXRoKQogICAgICAgICAgICBpZiBleHRlbnNpb24gPT0gIi56aXAiOgogICAgICAgICAgICAgICAgcmV0dXJuIGIib2tceDAwIgogICAgICAgICAgICByZXR1cm4gYiJvayIKCiAgICAgICAgZG93bmxvYWRfcGF0Y2ggPSBwYXRjaC5vYmplY3QoCiAgICAgICAgICAgIFNmdHBTZXJ2aWNlLCAiZG93bmxvYWRfZmlsZSIsIG5ldz1zc2hfZG93bmxvYWRfZmlsZQogICAgICAgICkKICAgICAgICBkb3dubG9hZF9wYXRjaC5zdGFydCgpCiAgICAgICAgY2xzLmFkZENsYXNzQ2xlYW51cChkb3dubG9hZF9wYXRjaC5zdG9wKQoKICAgICAgICBkZWYgc3NoX3VwbG9hZF9maWxlKHNlbGYsIGZpbGUsIHJlbW90ZV9wYXRoKToKICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiZW52Iik6CiAgICAgICAgICAgICAgICBlcnJvciA9IHNlbGYuZW52LmNvbnRleHQuZ2V0KCJyYWlzZV91cGxvYWRfZXJyb3IiKQogICAgICAgICAgICAgICAgaWYgZXJyb3I6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKGVycm9yKQogICAgICAgICAgICByZXR1cm4gTWFnaWNNb2NrKCkKCiAgICAgICAgdXBsb2FkX3BhdGNoID0gcGF0Y2gub2JqZWN0KFNmdHBTZXJ2aWNlLCAidXBsb2FkX2ZpbGUiLCBuZXc9c3NoX3VwbG9hZF9maWxlKQogICAgICAgIHVwbG9hZF9wYXRjaC5zdGFydCgpCiAgICAgICAgY2xzLmFkZENsYXNzQ2xlYW51cCh1cGxvYWRfcGF0Y2guc3RvcCkKCiAgICAgICAgZGVmIHNzaF9kZWxldGVfZmlsZShzZWxmLCByZW1vdGVfcGF0aCk6CiAgICAgICAgICAgIHJldHVybiBNYWdpY01vY2soKQoKICAgICAgICBkZWxldGVfcGF0Y2ggPSBwYXRjaC5vYmplY3QoU2Z0cFNlcnZpY2UsICJkZWxldGVfZmlsZSIsIG5ldz1zc2hfZGVsZXRlX2ZpbGUpCiAgICAgICAgZGVsZXRlX3BhdGNoLnN0YXJ0KCkKICAgICAgICBjbHMuYWRkQ2xhc3NDbGVhbnVwKGRlbGV0ZV9wYXRjaC5zdG9wKQoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIGFkZF90b19ncm91cChjbHMsIHVzZXIsIGdyb3VwX3JlZnMpOgogICAgICAgICIiIkFkZCB1c2VyIHRvIGdyb3VwcwoKICAgICAgICBBcmdzOgogICAgICAgICAgICB1c2VyIChyZXMudXNlcnMpOiBVc2VyIHJlY29yZAogICAgICAgICAgICBncm91cF9yZWZzIChsaXN0KTogR3JvdXAgcmVmIE9SIExpc3Qgb2YgZ3JvdXAgcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgZWcgWydiYXNlLmdyb3VwX3VzZXInLCAnc29tZV9tb2R1bGUuc29tZV9ncm91cCcuLi5dCiAgICAgICAgIiIiCiAgICAgICAgaWYgaXNpbnN0YW5jZShncm91cF9yZWZzLCBzdHIpOgogICAgICAgICAgICBncm91cCA9IGNscy5lbnYucmVmKGdyb3VwX3JlZnMsIHJhaXNlX2lmX25vdF9mb3VuZD1GYWxzZSkKICAgICAgICAgICAgaWYgbm90IGdyb3VwOgogICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKF8oIkdyb3VwIHJlZmVyZW5jZSAlcyBub3QgZm91bmQhIikgJSBncm91cF9yZWZzKQogICAgICAgICAgICBhY3Rpb24gPSBbKDQsIGdyb3VwLmlkKV0KICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZ3JvdXBfcmVmcywgbGlzdCk6CiAgICAgICAgICAgIGFjdGlvbiA9IFtdCiAgICAgICAgICAgIGZvciBncm91cF9yZWYgaW4gZ3JvdXBfcmVmczoKICAgICAgICAgICAgICAgIGdyb3VwID0gY2xzLmVudi5yZWYoZ3JvdXBfcmVmLCByYWlzZV9pZl9ub3RfZm91bmQ9RmFsc2UpCiAgICAgICAgICAgICAgICBpZiBub3QgZ3JvdXA6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsaWRhdGlvbkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBfKCJHcm91cCByZWZlcmVuY2UgJXMgbm90IGZvdW5kISIpICUgZ3JvdXBfcmVmCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgYWN0aW9uLmFwcGVuZCgoNCwgZ3JvdXAuaWQpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJncm91cHNfcmVmIG11c3QgYmUgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyEiKSkKICAgICAgICB1c2VyLndyaXRlKHsiZ3JvdXBzX2lkIjogYWN0aW9ufSkKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiByZW1vdmVfZnJvbV9ncm91cChjbHMsIHVzZXIsIGdyb3VwX3JlZnMpOgogICAgICAgICIiIlJlbW92ZSB1c2VyIGZyb20gZ3JvdXBzCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHVzZXIgKHJlcy51c2Vycyk6IFVzZXIgcmVjb3JkCiAgICAgICAgICAgIGdyb3VwX3JlZnMgKGxpc3QpOiBMaXN0IG9mIGdyb3VwIHJlZmVyZW5jZXMKICAgICAgICAgICAgICAgIGVnIFsnYmFzZS5ncm91cF91c2VyJywgJ3NvbWVfbW9kdWxlLnNvbWVfZ3JvdXAnLi4uXQogICAgICAgICIiIgogICAgICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXBfcmVmcywgc3RyKToKICAgICAgICAgICAgZ3JvdXAgPSBjbHMuZW52LnJlZihncm91cF9yZWZzLCByYWlzZV9pZl9ub3RfZm91bmQ9RmFsc2UpCiAgICAgICAgICAgIGlmIG5vdCBncm91cDoKICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcihfKCJHcm91cCByZWZlcmVuY2UgJXMgbm90IGZvdW5kISIpICUgZ3JvdXBfcmVmcykKICAgICAgICAgICAgYWN0aW9uID0gWygzLCBncm91cC5pZCldCiAgICAgICAgZWxpZiBpc2luc3RhbmNlKGdyb3VwX3JlZnMsIGxpc3QpOgogICAgICAgICAgICBhY3Rpb24gPSBbXQogICAgICAgICAgICBmb3IgZ3JvdXBfcmVmIGluIGdyb3VwX3JlZnM6CiAgICAgICAgICAgICAgICBncm91cCA9IGNscy5lbnYucmVmKGdyb3VwX3JlZiwgcmFpc2VfaWZfbm90X2ZvdW5kPUZhbHNlKQogICAgICAgICAgICAgICAgaWYgbm90IGdyb3VwOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbGlkYXRpb25FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgXygiR3JvdXAgcmVmZXJlbmNlICVzIG5vdCBmb3VuZCEiKSAlIGdyb3VwX3JlZgogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIGFjdGlvbi5hcHBlbmQoKDMsIGdyb3VwLmlkKSkKICAgICAgICBlbHNlOgogICAgICAgICAgICByYWlzZSBWYWxpZGF0aW9uRXJyb3IoXygiZ3JvdXBzX3JlZiBtdXN0IGJlIHN0cmluZyBvciBsaXN0IG9mIHN0cmluZ3MhIikpCiAgICAgICAgdXNlci53cml0ZSh7Imdyb3Vwc19pZCI6IGFjdGlvbn0pCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgd3JpdGVfYW5kX2ludmFsaWRhdGUoY2xzLCByZWNvcmRzLCAqKnZhbHVlcyk6CiAgICAgICAgIiIiV3JpdGUgdmFsdWVzIGFuZCBpbnZhbGlkYXRlIGNhY2hlCgogICAgICAgIEFyZ3M6CiAgICAgICAgICAgIHJlY29yZHMgKHJlY29yZHNldCk6IHJlY29yZHNldCB0byBzYXZlIHZhbHVlcwogICAgICAgICAgICAqKnZhbHVlcyAoZGljdCk6IHZhbHVlcyB0byBzZXQKICAgICAgICAiIiIKICAgICAgICBpZiB2YWx1ZXM6CiAgICAgICAgICAgIHJlY29yZHMud3JpdGUodmFsdWVzKQogICAgICAgICAgICByZWNvcmRzLmludmFsaWRhdGVfcmVjb3Jkc2V0KHZhbHVlcy5rZXlzKCkpCg==