1 line
44 KiB
Python
1 line
44 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKCmZyb20gb2RvbyBpbXBvcnQgZmllbGRzCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvciwgVmFsaWRhdGlvbkVycm9yCgpmcm9tIC5jb21tb24gaW1wb3J0IFRlc3RUb3dlckNvbW1vbgoKCmNsYXNzIFRlc3RUb3dlclNjaGVkdWxlZFRhc2soVGVzdFRvd2VyQ29tbW9uKToKICAgICIiIlRlc3QgdGhlIGN4LnRvd2VyLnNjaGVkdWxlZC50YXNrIG1vZGVsLiIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQoKICAgICAgICAjIENyZWF0ZSBhbiBhZGRpdGlvbmFsIHNlcnZlciBmb3IgbXVsdGktc2VydmVyIGNvbW1hbmQgdGVzdAogICAgICAgIGNscy5zZXJ2ZXJfdGVzdF8yID0gY2xzLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgMiIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICJsb2NhbGhvc3QiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgImhvc3Rfa2V5IjogInRlc3Rfa2V5IiwKICAgICAgICAgICAgICAgICJvc19pZCI6IGNscy5vc19kZWJpYW5fMTAuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2NoZWR1bGVkIHRhc2s6IGNvbW1hbmQgKG11bHRpLXNlcnZlcikKICAgICAgICBjbHMuY29tbWFuZF9zY2hlZHVsZWRfdGFzayA9IGNscy5TY2hlZHVsZWRUYXNrLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBDb21tYW5kIFNjaGVkdWxlZCBUYXNrIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNscy5jb21tYW5kX2xpc3RfZGlyLmlkLAogICAgICAgICAgICAgICAgImludGVydmFsX251bWJlciI6IDEsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfdHlwZSI6ICJkYXlzIiwKICAgICAgICAgICAgICAgICJuZXh0X2NhbGwiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW2Nscy5zZXJ2ZXJfdGVzdF8xLmlkLCBjbHMuc2VydmVyX3Rlc3RfMi5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTY2hlZHVsZWQgdGFzazogcGxhbiAoc2luZ2xlIHNlcnZlcikKICAgICAgICBjbHMucGxhbl9zY2hlZHVsZWRfdGFzayA9IGNscy5TY2hlZHVsZWRUYXNrLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBQbGFuIFNjaGVkdWxlZCBUYXNrIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAicGxhbiIsCiAgICAgICAgICAgICAgICAicGxhbl9pZCI6IGNscy5wbGFuXzEuaWQsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfbnVtYmVyIjogMSwKICAgICAgICAgICAgICAgICJpbnRlcnZhbF90eXBlIjogImRheXMiLAogICAgICAgICAgICAgICAgIm5leHRfY2FsbCI6IGZpZWxkcy5EYXRldGltZS5ub3coKSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbY2xzLnNlcnZlcl90ZXN0XzEuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3VzdG9tIHZhcmlhYmxlIGZvciB0YXNrIChvcHRpb24gdHlwZSkKICAgICAgICBjbHMudmFyaWFibGVfb2Rvb192ZXJzaW9ucyA9IGNscy5WYXJpYWJsZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIm9kb29fdmVyc2lvbnMiLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX3R5cGUiOiAibyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnZhcmlhYmxlX29wdGlvbl8xNl8wID0gY2xzLlZhcmlhYmxlT3B0aW9uLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiMTYuMCIsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICIxNi4wIiwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IGNscy52YXJpYWJsZV9vZG9vX3ZlcnNpb25zLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIEFkZCBjdXN0b20gdmFyaWFibGVzIHRvIHRhc2tzCiAgICAgICAgY2xzLnNjaGVkdWxlZF90YXNrX2N2X29zID0gY2xzLlNjaGVkdWxlZFRhc2tDdi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlZHVsZWRfdGFza19pZCI6IGNscy5jb21tYW5kX3NjaGVkdWxlZF90YXNrLmlkLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogY2xzLnZhcmlhYmxlX29zLmlkLAogICAgICAgICAgICAgICAgInZhbHVlX2NoYXIiOiAiV2luZG93cyAyayIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnNjaGVkdWxlZF90YXNrX2N2X3ZlcnNpb24gPSBjbHMuU2NoZWR1bGVkVGFza0N2LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgInNjaGVkdWxlZF90YXNrX2lkIjogY2xzLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2suaWQsCiAgICAgICAgICAgICAgICAidmFyaWFibGVfaWQiOiBjbHMudmFyaWFibGVfb2Rvb192ZXJzaW9ucy5pZCwKICAgICAgICAgICAgICAgICJvcHRpb25faWQiOiBjbHMudmFyaWFibGVfb3B0aW9uXzE2XzAuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgY2xzLnNjaGVkdWxlZF90YXNrX2N2X3ZlcnNpb25fcGxhbiA9IGNscy5TY2hlZHVsZWRUYXNrQ3YuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZWR1bGVkX3Rhc2tfaWQiOiBjbHMucGxhbl9zY2hlZHVsZWRfdGFzay5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IGNscy52YXJpYWJsZV9vZG9vX3ZlcnNpb25zLmlkLAogICAgICAgICAgICAgICAgIm9wdGlvbl9pZCI6IGNscy52YXJpYWJsZV9vcHRpb25fMTZfMC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYWRkaXRpb25hbCBKZXQgVGVtcGxhdGUgZm9yIGFjY2VzcyB0ZXN0aW5nCiAgICAgICAgY2xzLmpldF90ZW1wbGF0ZV90ZXN0X2FjY2VzcyA9IGNscy5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgSmV0IFRlbXBsYXRlIGZvciBBY2Nlc3MiLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDQsIGNscy5zZXJ2ZXJfdGVzdF8xLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGFkZGl0aW9uYWwgSmV0IGZvciBhY2Nlc3MgdGVzdGluZwogICAgICAgIGNscy5qZXRfdGVzdF9hY2Nlc3MgPSBjbHMuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBKZXQgZm9yIEFjY2VzcyIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogY2xzLmpldF90ZW1wbGF0ZV90ZXN0X2FjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBjbHMuc2VydmVyX3Rlc3RfMS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTY2hlZHVsZWQgdGFzayB3aXRoIEpldCBhbmQgSmV0IFRlbXBsYXRlIGZvciBhY2Nlc3MgdGVzdGluZwogICAgICAgIGNscy5qZXRfc2NoZWR1bGVkX3Rhc2sgPSBjbHMuU2NoZWR1bGVkVGFzay5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgSmV0IFNjaGVkdWxlZCBUYXNrIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IGNscy5jb21tYW5kX2xpc3RfZGlyLmlkLAogICAgICAgICAgICAgICAgImludGVydmFsX251bWJlciI6IDEsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfdHlwZSI6ICJkYXlzIiwKICAgICAgICAgICAgICAgICJuZXh0X2NhbGwiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICAiamV0X2lkcyI6IFsoNiwgMCwgW2Nscy5qZXRfdGVzdF9hY2Nlc3MuaWRdKV0sCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkcyI6IFsoNiwgMCwgW2Nscy5qZXRfdGVtcGxhdGVfdGVzdF9hY2Nlc3MuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgZGVmIF9hc3NlcnRfbG9nX3JlY29yZHMoc2VsZiwgbG9nX21vZGVsLCBzY2hlZHVsZWRfdGFzaywgZXhwZWN0ZWRfY291bnQpOgogICAgICAgICIiIkhlbHBlcjogQXNzZXJ0IHRoYXQgbG9nIHJlY29yZHMgZXhpc3QgZm9yIHRoZSB0YXNrIiIiCiAgICAgICAgbG9ncyA9IGxvZ19tb2RlbC5zZWFyY2goWygic2NoZWR1bGVkX3Rhc2tfaWQiLCAiPSIsIHNjaGVkdWxlZF90YXNrLmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ3MsIGYie2xvZ19tb2RlbC5fbmFtZX0gbG9ncyBzaG91bGQgYmUgY3JlYXRlZCBhZnRlciBydW4uIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4obG9ncyksCiAgICAgICAgICAgIGV4cGVjdGVkX2NvdW50LAogICAgICAgICAgICBmIkV4cGVjdGVkIHtleHBlY3RlZF9jb3VudH0gbG9ncyBmb3Ige3NjaGVkdWxlZF90YXNrLmRpc3BsYXlfbmFtZX0sICIKICAgICAgICAgICAgZiJnb3Qge2xlbihsb2dzKX0uIiwKICAgICAgICApCgogICAgZGVmIF9hc3NlcnRfbmV4dF9hbmRfbGFzdF9jYWxsX2NoYW5nZWQoCiAgICAgICAgc2VsZiwgdGFzaywgbGFzdF9jYWxsX2JlZm9yZSwgbmV4dF9jYWxsX2JlZm9yZQogICAgKToKICAgICAgICAiIiJIZWxwZXI6IEFzc2VydCBuZXh0X2NhbGwgYW5kIGxhc3RfY2FsbCBjaGFuZ2VkIGFmdGVyIHJ1biIiIgogICAgICAgIHRhc2suaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCiAgICAgICAgICAgIHRhc2subGFzdF9jYWxsLCBsYXN0X2NhbGxfYmVmb3JlLCAibGFzdF9jYWxsIG11c3QgYmUgY2hhbmdlZCBhZnRlciBydW4uIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICB0YXNrLm5leHRfY2FsbCwgbmV4dF9jYWxsX2JlZm9yZSwgIm5leHRfY2FsbCBtdXN0IGJlIGNoYW5nZWQgYWZ0ZXIgcnVuLiIKICAgICAgICApCgogICAgZGVmIF9jbGVhcl9hbGxfYWNjZXNzKAogICAgICAgIHNlbGYsCiAgICAgICAgc2NoZWR1bGVkX3Rhc2ssCiAgICAgICAgamV0PU5vbmUsCiAgICAgICAgamV0X3RlbXBsYXRlPU5vbmUsCiAgICAgICAgc2VydmVyPU5vbmUsCiAgICAgICAgc2VydmVyX3RlbXBsYXRlPU5vbmUsCiAgICApOgogICAgICAgICIiIkhlbHBlcjogQ2xlYXIgYWxsIGFjY2VzcyBwYXRocyBmb3IgYSBzY2hlZHVsZWQgdGFzayBhbmQgcmVsYXRlZCBvYmplY3RzLiIiIgogICAgICAgIHNjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBzY2hlZHVsZWRfdGFzay51c2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgaWYgamV0OgogICAgICAgICAgICBqZXQubWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgICAgICBqZXQudXNlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIGlmIGpldF90ZW1wbGF0ZToKICAgICAgICAgICAgamV0X3RlbXBsYXRlLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICAgICAgamV0X3RlbXBsYXRlLnVzZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBpZiBzZXJ2ZXI6CiAgICAgICAgICAgIHNlcnZlci5tYW5hZ2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgICAgIHNlcnZlci51c2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgaWYgc2VydmVyX3RlbXBsYXRlOgogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGUubWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGUudXNlcl9pZHMgPSBbKDUsIDAsIDApXQoKICAgIGRlZiB0ZXN0X3Jlc2VydmVfdGFza3NfYXRvbWljKHNlbGYpOgogICAgICAgICIiIlNjaGVkdWxlZCBUYXNrOiByZXNlcnZlX3Rhc2tzIG11c3Qgb25seSBsb2NrIGF2YWlsYWJsZSIiIgogICAgICAgIHRhc2tzID0gc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrICsgc2VsZi5wbGFuX3NjaGVkdWxlZF90YXNrCiAgICAgICAgcmVzZXJ2ZWQgPSB0YXNrcy5fcmVzZXJ2ZV90YXNrcygpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgc2V0KHJlc2VydmVkLmlkcyksIHNldCh0YXNrcy5pZHMpLCAiQm90aCB0YXNrcyBzaG91bGQgYmUgcmVzZXJ2ZWQiCiAgICAgICAgKQogICAgICAgICMgUmVwZWF0ZWQgcmVzZXJ2YXRpb24gc2hvdWxkIHJldHVybiBlbXB0eSAoYWxyZWFkeSBydW5uaW5nKQogICAgICAgIHRhc2tzLmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICByZXNlcnZlZF9hZ2FpbiA9IHRhc2tzLl9yZXNlcnZlX3Rhc2tzKCkKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZXNlcnZlZF9hZ2FpbiwgIkFscmVhZHkgcmVzZXJ2ZWQgdGFza3MgbXVzdCBub3QgYmUgcmVzZXJ2ZWQgYWdhaW4iCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3J1bl90YXNrX2NvbW1hbmQoc2VsZik6CiAgICAgICAgIiIiUnVubmluZyBhIHNjaGVkdWxlZCBjb21tYW5kIHRhc2sgY3JlYXRlcyBsb2dzIHBlciBzZXJ2ZXIuIiIiCiAgICAgICAgbG9nc19iZWZvcmUgPSBzZWxmLkNvbW1hbmRMb2cuc2VhcmNoKAogICAgICAgICAgICBbKCJzY2hlZHVsZWRfdGFza19pZCIsICI9Iiwgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2dzX2JlZm9yZSwgIk5vIGNvbW1hbmQgbG9ncyBzaG91bGQgZXhpc3QgYmVmb3JlIHJ1bi4iKQoKICAgICAgICBsYXN0X2NhbGxfYmVmb3JlID0gc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLmxhc3RfY2FsbAogICAgICAgIG5leHRfY2FsbF9iZWZvcmUgPSBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2submV4dF9jYWxsCgogICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5fcnVuKCkKICAgICAgICBzZWxmLl9hc3NlcnRfbmV4dF9hbmRfbGFzdF9jYWxsX2NoYW5nZWQoCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzaywgbGFzdF9jYWxsX2JlZm9yZSwgbmV4dF9jYWxsX2JlZm9yZQogICAgICAgICkKICAgICAgICBzZWxmLl9hc3NlcnRfbG9nX3JlY29yZHMoCiAgICAgICAgICAgIHNlbGYuQ29tbWFuZExvZywKICAgICAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLAogICAgICAgICAgICBleHBlY3RlZF9jb3VudD1sZW4oc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLnNlcnZlcl9pZHMpLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9ydW5fdGFza19wbGFuKHNlbGYpOgogICAgICAgICIiIlJ1bm5pbmcgYSBzY2hlZHVsZWQgcGxhbiB0YXNrIGNyZWF0ZXMgb25lIGxvZyBwZXIgc2VydmVyLiIiIgogICAgICAgIGxvZ3NfYmVmb3JlID0gc2VsZi5QbGFuTG9nLnNlYXJjaCgKICAgICAgICAgICAgWygic2NoZWR1bGVkX3Rhc2tfaWQiLCAiPSIsIHNlbGYucGxhbl9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9nc19iZWZvcmUsICJObyBwbGFuIGxvZ3Mgc2hvdWxkIGV4aXN0IGJlZm9yZSBydW4uIikKCiAgICAgICAgbGFzdF9jYWxsX2JlZm9yZSA9IHNlbGYucGxhbl9zY2hlZHVsZWRfdGFzay5sYXN0X2NhbGwKICAgICAgICBuZXh0X2NhbGxfYmVmb3JlID0gc2VsZi5wbGFuX3NjaGVkdWxlZF90YXNrLm5leHRfY2FsbAoKICAgICAgICBzZWxmLnBsYW5fc2NoZWR1bGVkX3Rhc2suX3J1bigpCiAgICAgICAgc2VsZi5fYXNzZXJ0X25leHRfYW5kX2xhc3RfY2FsbF9jaGFuZ2VkKAogICAgICAgICAgICBzZWxmLnBsYW5fc2NoZWR1bGVkX3Rhc2ssIGxhc3RfY2FsbF9iZWZvcmUsIG5leHRfY2FsbF9iZWZvcmUKICAgICAgICApCiAgICAgICAgc2VsZi5fYXNzZXJ0X2xvZ19yZWNvcmRzKAogICAgICAgICAgICBzZWxmLlBsYW5Mb2csCiAgICAgICAgICAgIHNlbGYucGxhbl9zY2hlZHVsZWRfdGFzaywKICAgICAgICAgICAgZXhwZWN0ZWRfY291bnQ9bGVuKHNlbGYucGxhbl9zY2hlZHVsZWRfdGFzay5zZXJ2ZXJfaWRzKSwKICAgICAgICApCgogICAgZGVmIHRlc3RfdXNlcl93cml0ZV9jcmVhdGVfdW5saW5rX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJVc2VyOiBjYW5ub3QgY3JlYXRlLCB3cml0ZSBvciB1bmxpbmsgc2NoZWR1bGVkIHRhc2tzLiIiIgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF91c2VyKHNlbGYudXNlcikuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QiLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfbGlzdF9kaXIuaWQsCiAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdKV0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLndpdGhfdXNlcihzZWxmLnVzZXIpLndyaXRlKHsic2VxdWVuY2UiOiAzM30pCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay53aXRoX3VzZXIoc2VsZi51c2VyKS51bmxpbmsoKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiTWFuYWdlcjogY2FuIHJlYWQgc2NoZWR1bGVkIHRhc2sgaWYgaW4gbWFuYWdlcl9pZHMgb3IgaW4gc2VydmVyJ3MKICAgICAgICBtYW5hZ2VyX2lkcy91c2VyX2lkcy4iIiIKICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2subWFuYWdlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2suaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2ssCiAgICAgICAgICAgIHRhc2tzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRoZWlyIHRhc2suIiwKICAgICAgICApCgogICAgICAgICMgUmVtb3ZlIGZyb20gbWFuYWdlcl9pZHMsIGJ1dCBhZGQgdG8gc2VydmVyIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEubWFuYWdlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2suaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2ssCiAgICAgICAgICAgIHRhc2tzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRhc2sgdmlhIHNlcnZlciBtYW5hZ2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IHNlcnZlciB1c2VyX2lkcyBhY2Nlc3MKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEubWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS51c2VyX2lkcyA9IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXQogICAgICAgIHRhc2tzID0gc2VsZi5TY2hlZHVsZWRUYXNrLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzaywKICAgICAgICAgICAgdGFza3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGFzayB2aWEgc2VydmVyIHVzZXJfaWRzLiIsCiAgICAgICAgKQoKICAgICAgICAjIFJlbW92ZSBtYW5hZ2VyIGZyb20gZXZlcnl3aGVyZQogICAgICAgIHNlbGYuX2NsZWFyX2FsbF9hY2Nlc3Moc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLCBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xKQogICAgICAgIHRhc2tzID0gc2VsZi5TY2hlZHVsZWRUYXNrLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzaywKICAgICAgICAgICAgdGFza3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBOT1QgYmUgYWJsZSB0byByZWFkIHRhc2sgd2l0aG91dCByZWxhdGlvbi4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX3ZpYV9qZXQoc2VsZik6CiAgICAgICAgIiIiTWFuYWdlcjogY2FuIHJlYWQgc2NoZWR1bGVkIHRhc2sgaWYgaW4gamV0J3MgdXNlcl9pZHMvbWFuYWdlcl9pZHMuIiIiCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgamV0IG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdF9hY2Nlc3MubWFuYWdlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLmpldF9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuamV0X3NjaGVkdWxlZF90YXNrLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0YXNrIHZpYSBqZXQgbWFuYWdlcl9pZHMuIiwKICAgICAgICApCgogICAgICAgICMgVGVzdCBhY2Nlc3MgdmlhIGpldCB1c2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3RfYWNjZXNzLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBzZWxmLmpldF90ZXN0X2FjY2Vzcy51c2VyX2lkcyA9IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXQogICAgICAgIHRhc2tzID0gc2VsZi5TY2hlZHVsZWRUYXNrLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuamV0X3NjaGVkdWxlZF90YXNrLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5qZXRfc2NoZWR1bGVkX3Rhc2ssCiAgICAgICAgICAgIHRhc2tzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHRhc2sgdmlhIGpldCB1c2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgamV0X3RlbXBsYXRlIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdF9hY2Nlc3MudXNlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3RfYWNjZXNzLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgdGFza3MgPSBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi5qZXRfc2NoZWR1bGVkX3Rhc2suaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLmpldF9zY2hlZHVsZWRfdGFzaywKICAgICAgICAgICAgdGFza3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGFzayB2aWEgamV0X3RlbXBsYXRlIG1hbmFnZXJfaWRzLiIsCiAgICAgICAgKQoKICAgICAgICAjIFRlc3QgYWNjZXNzIHZpYSBqZXRfdGVtcGxhdGUgdXNlcl9pZHMKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0X2FjY2Vzcy5tYW5hZ2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdF9hY2Nlc3MudXNlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLmpldF9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuamV0X3NjaGVkdWxlZF90YXNrLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0YXNrIHZpYSBqZXRfdGVtcGxhdGUgdXNlcl9pZHMuIiwKICAgICAgICApCgogICAgICAgICMgUmVtb3ZlIG1hbmFnZXIgZnJvbSBldmVyeXdoZXJlCiAgICAgICAgc2VsZi5fY2xlYXJfYWxsX2FjY2VzcygKICAgICAgICAgICAgc2VsZi5qZXRfc2NoZWR1bGVkX3Rhc2ssCiAgICAgICAgICAgIGpldD1zZWxmLmpldF90ZXN0X2FjY2VzcywKICAgICAgICAgICAgamV0X3RlbXBsYXRlPXNlbGYuamV0X3RlbXBsYXRlX3Rlc3RfYWNjZXNzLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICkKICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLmpldF9zY2hlZHVsZWRfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlbGYuamV0X3NjaGVkdWxlZF90YXNrLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIE5PVCBiZSBhYmxlIHRvIHJlYWQgdGFzayB3aXRob3V0IHJlbGF0aW9uLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3NfdmlhX3NlcnZlcl90ZW1wbGF0ZShzZWxmKToKICAgICAgICAiIiJNYW5hZ2VyOiBjYW4gcmVhZCBzY2hlZHVsZWQgdGFzayBpZiBpbiBzZXJ2ZXJfdGVtcGxhdGUncwogICAgICAgIHVzZXJfaWRzL21hbmFnZXJfaWRzLiIiIgogICAgICAgICMgQ3JlYXRlIHNjaGVkdWxlZCB0YXNrIHdpdGggc2VydmVyIHRlbXBsYXRlCiAgICAgICAgc2VydmVyX3RlbXBsYXRlX3Rhc2sgPSBzZWxmLlNjaGVkdWxlZFRhc2suY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciBUZW1wbGF0ZSBTY2hlZHVsZWQgVGFzayIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfbGlzdF9kaXIuaWQsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfbnVtYmVyIjogMSwKICAgICAgICAgICAgICAgICJpbnRlcnZhbF90eXBlIjogImRheXMiLAogICAgICAgICAgICAgICAgIm5leHRfY2FsbCI6IGZpZWxkcy5EYXRldGltZS5ub3coKSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfdGVtcGxhdGVfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVtcGxhdGVfc2FtcGxlLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFRlc3QgYWNjZXNzIHZpYSBzZXJ2ZXJfdGVtcGxhdGUgbWFuYWdlcl9pZHMKICAgICAgICBzZWxmLnNlcnZlcl90ZW1wbGF0ZV9zYW1wbGUubWFuYWdlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZXJ2ZXJfdGVtcGxhdGVfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZV90YXNrLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCB0YXNrIHZpYSBzZXJ2ZXJfdGVtcGxhdGUgbWFuYWdlcl9pZHMuIiwKICAgICAgICApCgogICAgICAgICMgVGVzdCBhY2Nlc3MgdmlhIHNlcnZlcl90ZW1wbGF0ZSB1c2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyX3RlbXBsYXRlX3NhbXBsZS5tYW5hZ2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVtcGxhdGVfc2FtcGxlLnVzZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgdGFza3MgPSBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VydmVyX3RlbXBsYXRlX3Rhc2suaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGVfdGFzaywKICAgICAgICAgICAgdGFza3MsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgdGFzayB2aWEgc2VydmVyX3RlbXBsYXRlIHVzZXJfaWRzLiIsCiAgICAgICAgKQoKICAgICAgICAjIFJlbW92ZSBtYW5hZ2VyIGZyb20gZXZlcnl3aGVyZQogICAgICAgIHNlbGYuX2NsZWFyX2FsbF9hY2Nlc3MoCiAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZV90YXNrLAogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGU9c2VsZi5zZXJ2ZXJfdGVtcGxhdGVfc2FtcGxlLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICkKICAgICAgICB0YXNrcyA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZXJ2ZXJfdGVtcGxhdGVfdGFzay5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZV90YXNrLAogICAgICAgICAgICB0YXNrcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIE5PVCBiZSBhYmxlIHRvIHJlYWQgdGFzayB3aXRob3V0IHJlbGF0aW9uLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfd3JpdGVfY3JlYXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJNYW5hZ2VyOiBjYW4gY3JlYXRlL3dyaXRlIGlmIGluIG1hbmFnZXJfaWRzLCBlbHNlIGRlbmllZC4iIiIKICAgICAgICAjIENyZWF0ZSBhcyBtYW5hZ2VyCiAgICAgICAgdGFzayA9IHNlbGYuU2NoZWR1bGVkVGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjb21tYW5kIiwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2xpc3RfZGlyLmlkLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgdHJ5OgogICAgICAgICAgICB0YXNrLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndyaXRlKHsic2VxdWVuY2UiOiA3N30pCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgdGhlaXIgb3duIHNjaGVkdWxlZCB0YXNrcy4iKQoKICAgICAgICAjIFNob3VsZCBmYWlsIGlmIG5vdCBpbiBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5tYW5hZ2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSh7InNlcXVlbmNlIjogMTF9KQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfdW5saW5rX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJNYW5hZ2VyOiBjYW4gdW5saW5rIG9ubHkgdGhlaXIgb3duIHRhc2tzIChpbiBtYW5hZ2VyX2lkcyAmIGNyZWF0b3IpLiIiIgogICAgICAgICMgQ3JlYXRlIGFzIG1hbmFnZXIKICAgICAgICB0YXNrID0gc2VsZi5TY2hlZHVsZWRUYXNrLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfbGlzdF9kaXIuaWQsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0sCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIHRhc2sud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB1bmxpbmsgdGhlaXIgb3duIHRhc2suIikKCiAgICAgICAgIyBOb3QgY3JlYXRvcgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2sud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKCiAgICBkZWYgdGVzdF9yb290X3VucmVzdHJpY3RlZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiUm9vdDogZnVsbCB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIGFsbCBzY2hlZHVsZWQgdGFza3MuIiIiCiAgICAgICAgIyBSZWFkCiAgICAgICAgdGFza3MgPSBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLCB0YXNrcywgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbnkgdGFzay4iCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZQogICAgICAgIHRhc2sgPSBzZWxmLlNjaGVkdWxlZFRhc2sud2l0aF91c2VyKHNlbGYucm9vdCkuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9saXN0X2Rpci5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgdGFzay53aXRoX3VzZXIoc2VsZi5yb290KS53cml0ZSh7InNlcXVlbmNlIjogMTIzfSkKICAgICAgICAgICAgdGFzay53aXRoX3VzZXIoc2VsZi5yb290KS51bmxpbmsoKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlL3VubGluayBhbnkgc2NoZWR1bGVkIHRhc2suIikKCiAgICBkZWYgdGVzdF9nZXRfbmV4dF9jYWxsX2Rvd193ZWRuZXNkYXkoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfZ2V0X25leHRfY2FsbF9kb3cgd2hlbiB0b2RheSBpcyBXZWRuZXNkYXkuCiAgICAgICAgVGFzayBydW5zIE1vbmRheSwgV2VkbmVzZGF5LCBGcmlkYXkgLT4gc2hvdWxkIHJldHVybiBGcmlkYXkuIiIiCiAgICAgICAgIyBDcmVhdGUgdGFzayB3aXRoIE1vbmRheSwgV2VkbmVzZGF5LCBGcmlkYXkgc2VsZWN0ZWQKICAgICAgICB0YXNrID0gc2VsZi5TY2hlZHVsZWRUYXNrLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBET1cgVGFzayIsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImNvbW1hbmQiLAogICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfbGlzdF9kaXIuaWQsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfdHlwZSI6ICJkb3ciLAogICAgICAgICAgICAgICAgIm1vbmRheSI6IFRydWUsCiAgICAgICAgICAgICAgICAid2VkbmVzZGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICJmcmlkYXkiOiBUcnVlLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZHMiOiBbKDYsIDAsIFtzZWxmLnNlcnZlcl90ZXN0XzEuaWRdKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGEgV2VkbmVzZGF5IGRhdGV0aW1lICgyMDI0LTAxLTAzIGlzIGEgV2VkbmVzZGF5KQogICAgICAgICMgU2V0IHRpbWUgdG8gMTA6MzA6NDUKICAgICAgICB3ZWRuZXNkYXlfZGF0ZSA9IGRhdGV0aW1lKDIwMjQsIDEsIDMsIDEwLCAzMCwgNDUpCgogICAgICAgICMgQ2FsY3VsYXRlIG5leHQgY2FsbAogICAgICAgIG5leHRfY2FsbCA9IHRhc2suX2dldF9uZXh0X2NhbGxfZG93KHRhc2ssIHdlZG5lc2RheV9kYXRlKQoKICAgICAgICAjIFNob3VsZCBiZSBGcmlkYXkgKDIgZGF5cyBhaGVhZCkgYXQgdGhlIHNhbWUgdGltZQogICAgICAgIGV4cGVjdGVkX2ZyaWRheSA9IGRhdGV0aW1lKDIwMjQsIDEsIDUsIDEwLCAzMCwgNDUpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmV4dF9jYWxsLAogICAgICAgICAgICBleHBlY3RlZF9mcmlkYXksCiAgICAgICAgICAgICJOZXh0IGNhbGwgZnJvbSBXZWRuZXNkYXkgc2hvdWxkIGJlIEZyaWRheSBhdCB0aGUgc2FtZSB0aW1lLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2dldF9uZXh0X2NhbGxfZG93X2ZyaWRheShzZWxmKToKICAgICAgICAiIiJUZXN0IF9nZXRfbmV4dF9jYWxsX2RvdyB3aGVuIHRvZGF5IGlzIEZyaWRheS4KICAgICAgICBUYXNrIHJ1bnMgTW9uZGF5LCBXZWRuZXNkYXksIEZyaWRheSAtPiBzaG91bGQgcmV0dXJuIE1vbmRheSAobmV4dCB3ZWVrKS4iIiIKICAgICAgICAjIENyZWF0ZSB0YXNrIHdpdGggTW9uZGF5LCBXZWRuZXNkYXksIEZyaWRheSBzZWxlY3RlZAogICAgICAgIHRhc2sgPSBzZWxmLlNjaGVkdWxlZFRhc2suY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IERPVyBUYXNrIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9saXN0X2Rpci5pZCwKICAgICAgICAgICAgICAgICJpbnRlcnZhbF90eXBlIjogImRvdyIsCiAgICAgICAgICAgICAgICAibW9uZGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICJ3ZWRuZXNkYXkiOiBUcnVlLAogICAgICAgICAgICAgICAgImZyaWRheSI6IFRydWUsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYSBGcmlkYXkgZGF0ZXRpbWUgKDIwMjQtMDEtMDUgaXMgYSBGcmlkYXkpCiAgICAgICAgIyBTZXQgdGltZSB0byAxNDoxNTozMAogICAgICAgIGZyaWRheV9kYXRlID0gZGF0ZXRpbWUoMjAyNCwgMSwgNSwgMTQsIDE1LCAzMCkKCiAgICAgICAgIyBDYWxjdWxhdGUgbmV4dCBjYWxsCiAgICAgICAgbmV4dF9jYWxsID0gdGFzay5fZ2V0X25leHRfY2FsbF9kb3codGFzaywgZnJpZGF5X2RhdGUpCgogICAgICAgICMgU2hvdWxkIGJlIE1vbmRheSBuZXh0IHdlZWsgKDMgZGF5cyBhaGVhZCkgYXQgdGhlIHNhbWUgdGltZQogICAgICAgIGV4cGVjdGVkX21vbmRheSA9IGRhdGV0aW1lKDIwMjQsIDEsIDgsIDE0LCAxNSwgMzApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbmV4dF9jYWxsLAogICAgICAgICAgICBleHBlY3RlZF9tb25kYXksCiAgICAgICAgICAgICJOZXh0IGNhbGwgZnJvbSBGcmlkYXkgc2hvdWxkIGJlIE1vbmRheSBuZXh0IHdlZWsgYXQgdGhlIHNhbWUgdGltZS4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9jaGVja19kYXlzX29mX3dlZWtfY29uc3RyYWludChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IF9jaGVja19kYXlzX29mX3dlZWsgY29uc3RyYWludDoKICAgICAgICBubyBkYXlzIHNlbGVjdGVkIHNob3VsZCByYWlzZSBWYWxpZGF0aW9uRXJyb3IuCiAgICAgICAgIiIiCiAgICAgICAgIyBUcnkgdG8gY3JlYXRlIGEgdGFzayB3aXRoIGludGVydmFsX3R5cGU9ImRvdyIgYnV0IG5vIGRheXMgc2VsZWN0ZWQKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgc2VsZi5TY2hlZHVsZWRUYXNrLmNyZWF0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IERPVyBUYXNrIE5vIERheXMiLAogICAgICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRfaWQiOiBzZWxmLmNvbW1hbmRfbGlzdF9kaXIuaWQsCiAgICAgICAgICAgICAgICAgICAgImludGVydmFsX3R5cGUiOiAiZG93IiwKICAgICAgICAgICAgICAgICAgICAibW9uZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInR1ZXNkYXkiOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAid2VkbmVzZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInRodXJzZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImZyaWRheSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzYXR1cmRheSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzdW5kYXkiOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3Rlc3RfMS5pZF0pXSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgICJBdCBsZWFzdCBvbmUgZGF5IG9mIHdlZWsgbXVzdCBiZSBzZWxlY3RlZCIsCiAgICAgICAgICAgIHN0cihjb250ZXh0LmV4Y2VwdGlvbiksCiAgICAgICAgICAgICJWYWxpZGF0aW9uRXJyb3Igc2hvdWxkIG1lbnRpb24gdGhhdCBhdCAiICJsZWFzdCBvbmUgZGF5IG11c3QgYmUgc2VsZWN0ZWQuIiwKICAgICAgICApCgogICAgICAgICMgVHJ5IHRvIHVwZGF0ZSBhbiBleGlzdGluZyB0YXNrIHRvIGhhdmUgbm8gZGF5cyBzZWxlY3RlZAogICAgICAgIHRhc2sgPSBzZWxmLlNjaGVkdWxlZFRhc2suY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IERPVyBUYXNrIiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9saXN0X2Rpci5pZCwKICAgICAgICAgICAgICAgICJpbnRlcnZhbF90eXBlIjogImRvdyIsCiAgICAgICAgICAgICAgICAibW9uZGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsaWRhdGlvbkVycm9yKToKICAgICAgICAgICAgdGFzay53cml0ZSgKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibW9uZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInR1ZXNkYXkiOiBGYWxzZSwKICAgICAgICAgICAgICAgICAgICAid2VkbmVzZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgInRodXJzZGF5IjogRmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImZyaWRheSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzYXR1cmRheSI6IEZhbHNlLAogICAgICAgICAgICAgICAgICAgICJzdW5kYXkiOiBGYWxzZSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2dldF9uZXh0X2NhbGxfZG93X3NpbmdsZV9kYXlfbW9uZGF5KHNlbGYpOgogICAgICAgICIiIlRlc3QgX2dldF9uZXh0X2NhbGxfZG93IGVkZ2UgY2FzZTogb25seSBNb25kYXkgc2VsZWN0ZWQsCiAgICAgICAgY3VycmVudCBkYXkgaXMgTW9uZGF5LgogICAgICAgIFNob3VsZCB3cmFwIHRvIG5leHQgd2VlaydzIE1vbmRheS4iIiIKICAgICAgICAjIENyZWF0ZSB0YXNrIHdpdGggb25seSBNb25kYXkgc2VsZWN0ZWQKICAgICAgICB0YXNrID0gc2VsZi5TY2hlZHVsZWRUYXNrLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBET1cgVGFzayBTaW5nbGUgRGF5IiwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiY29tbWFuZCIsCiAgICAgICAgICAgICAgICAiY29tbWFuZF9pZCI6IHNlbGYuY29tbWFuZF9saXN0X2Rpci5pZCwKICAgICAgICAgICAgICAgICJpbnRlcnZhbF90eXBlIjogImRvdyIsCiAgICAgICAgICAgICAgICAibW9uZGF5IjogVHJ1ZSwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWRzIjogWyg2LCAwLCBbc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhIE1vbmRheSBkYXRldGltZSAoMjAyNC0wMS0wMSBpcyBhIE1vbmRheSkKICAgICAgICAjIFNldCB0aW1lIHRvIDA5OjAwOjAwCiAgICAgICAgbW9uZGF5X2RhdGUgPSBkYXRldGltZSgyMDI0LCAxLCAxLCA5LCAwLCAwKQoKICAgICAgICAjIENhbGN1bGF0ZSBuZXh0IGNhbGwKICAgICAgICBuZXh0X2NhbGwgPSB0YXNrLl9nZXRfbmV4dF9jYWxsX2Rvdyh0YXNrLCBtb25kYXlfZGF0ZSkKCiAgICAgICAgIyBTaG91bGQgYmUgTW9uZGF5IG5leHQgd2VlayAoNyBkYXlzIGFoZWFkKSBhdCB0aGUgc2FtZSB0aW1lCiAgICAgICAgZXhwZWN0ZWRfbmV4dF9tb25kYXkgPSBkYXRldGltZSgyMDI0LCAxLCA4LCA5LCAwLCAwKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIG5leHRfY2FsbCwKICAgICAgICAgICAgZXhwZWN0ZWRfbmV4dF9tb25kYXksCiAgICAgICAgICAgICJOZXh0IGNhbGwgZnJvbSBNb25kYXkgKG9ubHkgZGF5IHNlbGVjdGVkKSBzaG91bGQgYmUiCiAgICAgICAgICAgICIgbmV4dCBNb25kYXkgYXQgdGhlIHNhbWUgdGltZS4iLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9zY2hlZHVsZWRfdGFza19jdl9tYW5hZ2VyX3JlYWRfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIk1hbmFnZXI6IGNhbiByZWFkIHNjaGVkdWxlZCB0YXNrIENWIGlmIGluIHNjaGVkdWxlZCB0YXNrJ3MKICAgICAgICBtYW5hZ2VyX2lkcy91c2VyX2lkcyBvciB2aWEgc2VydmVyJ3MgbWFuYWdlcl9pZHMvdXNlcl9pZHMuIiIiCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgc2NoZWR1bGVkIHRhc2sgbWFuYWdlcl9pZHMKICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2subWFuYWdlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICBjdnMgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnNjaGVkdWxlZF90YXNrX2N2X29zLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5zY2hlZHVsZWRfdGFza19jdl9vcywKICAgICAgICAgICAgY3ZzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIENWIHZpYSBzY2hlZHVsZWQgdGFzayBtYW5hZ2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgc2NoZWR1bGVkIHRhc2sgdXNlcl9pZHMKICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2subWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay51c2VyX2lkcyA9IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXQogICAgICAgIGN2cyA9IHNlbGYuU2NoZWR1bGVkVGFza0N2LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuc2NoZWR1bGVkX3Rhc2tfY3Zfb3MuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnNjaGVkdWxlZF90YXNrX2N2X29zLAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIHNjaGVkdWxlZCB0YXNrIHVzZXJfaWRzLiIsCiAgICAgICAgKQoKICAgICAgICAjIFRlc3QgYWNjZXNzIHZpYSBzZXJ2ZXIgbWFuYWdlcl9pZHMKICAgICAgICBzZWxmLmNvbW1hbmRfc2NoZWR1bGVkX3Rhc2sudXNlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS5tYW5hZ2VyX2lkcyA9IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXQogICAgICAgIGN2cyA9IHNlbGYuU2NoZWR1bGVkVGFza0N2LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlbGYuc2NoZWR1bGVkX3Rhc2tfY3Zfb3MuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZWxmLnNjaGVkdWxlZF90YXNrX2N2X29zLAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIHNlcnZlciBtYW5hZ2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgc2VydmVyIHVzZXJfaWRzCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEudXNlcl9pZHMgPSBbKDYsIDAsIFtzZWxmLm1hbmFnZXIuaWRdKV0KICAgICAgICBjdnMgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnNjaGVkdWxlZF90YXNrX2N2X29zLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VsZi5zY2hlZHVsZWRfdGFza19jdl9vcywKICAgICAgICAgICAgY3ZzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIENWIHZpYSBzZXJ2ZXIgdXNlcl9pZHMuIiwKICAgICAgICApCgogICAgICAgICMgUmVtb3ZlIG1hbmFnZXIgZnJvbSBldmVyeXdoZXJlCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVzdF8xLnVzZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICBjdnMgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBzZWxmLnNjaGVkdWxlZF90YXNrX2N2X29zLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgc2VsZi5zY2hlZHVsZWRfdGFza19jdl9vcywKICAgICAgICAgICAgY3ZzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgTk9UIGJlIGFibGUgdG8gcmVhZCBDViB3aXRob3V0IHJlbGF0aW9uLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NjaGVkdWxlZF90YXNrX2N2X21hbmFnZXJfcmVhZF9hY2Nlc3NfdmlhX2pldChzZWxmKToKICAgICAgICAiIiJNYW5hZ2VyOiBjYW4gcmVhZCBzY2hlZHVsZWQgdGFzayBDViBpZiBpbiBqZXQncyB1c2VyX2lkcy9tYW5hZ2VyX2lkcy4iIiIKICAgICAgICAjIENyZWF0ZSBDViBmb3IgamV0IHNjaGVkdWxlZCB0YXNrCiAgICAgICAgamV0X2N2ID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3YuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAic2NoZWR1bGVkX3Rhc2tfaWQiOiBzZWxmLmpldF9zY2hlZHVsZWRfdGFzay5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJMaW51eCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVGVzdCBhY2Nlc3MgdmlhIGpldCBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3RfYWNjZXNzLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgamV0X2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0X2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIGpldCBtYW5hZ2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgamV0IHVzZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdF9hY2Nlc3MubWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuamV0X3Rlc3RfYWNjZXNzLnVzZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgamV0X2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0X2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIGpldCB1c2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgamV0X3RlbXBsYXRlIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVzdF9hY2Nlc3MudXNlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3RfYWNjZXNzLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgamV0X2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0X2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIGpldF90ZW1wbGF0ZSBtYW5hZ2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBUZXN0IGFjY2VzcyB2aWEgamV0X3RlbXBsYXRlIHVzZXJfaWRzCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdF9hY2Nlc3MubWFuYWdlcl9pZHMgPSBbKDUsIDAsIDApXQogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3RfYWNjZXNzLnVzZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgamV0X2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0X2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIGpldF90ZW1wbGF0ZSB1c2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBSZW1vdmUgbWFuYWdlciBmcm9tIGV2ZXJ5d2hlcmUKICAgICAgICBzZWxmLl9jbGVhcl9hbGxfYWNjZXNzKAogICAgICAgICAgICBzZWxmLmpldF9zY2hlZHVsZWRfdGFzaywKICAgICAgICAgICAgamV0PXNlbGYuamV0X3Rlc3RfYWNjZXNzLAogICAgICAgICAgICBqZXRfdGVtcGxhdGU9c2VsZi5qZXRfdGVtcGxhdGVfdGVzdF9hY2Nlc3MsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgKQogICAgICAgIGN2cyA9IHNlbGYuU2NoZWR1bGVkVGFza0N2LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIGpldF9jdi5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgIGpldF9jdiwKICAgICAgICAgICAgY3ZzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgTk9UIGJlIGFibGUgdG8gcmVhZCBDViB3aXRob3V0IHJlbGF0aW9uLiIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3NjaGVkdWxlZF90YXNrX2N2X21hbmFnZXJfcmVhZF9hY2Nlc3NfdmlhX3NlcnZlcl90ZW1wbGF0ZShzZWxmKToKICAgICAgICAiIiJNYW5hZ2VyOiBjYW4gcmVhZCBzY2hlZHVsZWQgdGFzayBDViBpZiBpbiBzZXJ2ZXJfdGVtcGxhdGUncwogICAgICAgIHVzZXJfaWRzL21hbmFnZXJfaWRzLiIiIgogICAgICAgICMgQ3JlYXRlIHNjaGVkdWxlZCB0YXNrIHdpdGggc2VydmVyIHRlbXBsYXRlCiAgICAgICAgc2VydmVyX3RlbXBsYXRlX3Rhc2sgPSBzZWxmLlNjaGVkdWxlZFRhc2suY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciBUZW1wbGF0ZSBTY2hlZHVsZWQgVGFzayBmb3IgQ1YiLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJjb21tYW5kIiwKICAgICAgICAgICAgICAgICJjb21tYW5kX2lkIjogc2VsZi5jb21tYW5kX2xpc3RfZGlyLmlkLAogICAgICAgICAgICAgICAgImludGVydmFsX251bWJlciI6IDEsCiAgICAgICAgICAgICAgICAiaW50ZXJ2YWxfdHlwZSI6ICJkYXlzIiwKICAgICAgICAgICAgICAgICJuZXh0X2NhbGwiOiBmaWVsZHMuRGF0ZXRpbWUubm93KCksCiAgICAgICAgICAgICAgICAic2VydmVyX3RlbXBsYXRlX2lkcyI6IFsoNiwgMCwgW3NlbGYuc2VydmVyX3RlbXBsYXRlX3NhbXBsZS5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICBzZXJ2ZXJfdGVtcGxhdGVfY3YgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlZHVsZWRfdGFza19pZCI6IHNlcnZlcl90ZW1wbGF0ZV90YXNrLmlkLAogICAgICAgICAgICAgICAgInZhcmlhYmxlX2lkIjogc2VsZi52YXJpYWJsZV9vcy5pZCwKICAgICAgICAgICAgICAgICJ2YWx1ZV9jaGFyIjogIkRlYmlhbiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVGVzdCBhY2Nlc3MgdmlhIHNlcnZlcl90ZW1wbGF0ZSBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyX3RlbXBsYXRlX3NhbXBsZS5tYW5hZ2VyX2lkcyA9IFsoNiwgMCwgW3NlbGYubWFuYWdlci5pZF0pXQogICAgICAgIGN2cyA9IHNlbGYuU2NoZWR1bGVkVGFza0N2LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHNlcnZlcl90ZW1wbGF0ZV9jdi5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlcnZlcl90ZW1wbGF0ZV9jdiwKICAgICAgICAgICAgY3ZzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIENWIHZpYSBzZXJ2ZXJfdGVtcGxhdGUgbWFuYWdlcl9pZHMuIiwKICAgICAgICApCgogICAgICAgICMgVGVzdCBhY2Nlc3MgdmlhIHNlcnZlcl90ZW1wbGF0ZSB1c2VyX2lkcwogICAgICAgIHNlbGYuc2VydmVyX3RlbXBsYXRlX3NhbXBsZS5tYW5hZ2VyX2lkcyA9IFsoNSwgMCwgMCldCiAgICAgICAgc2VsZi5zZXJ2ZXJfdGVtcGxhdGVfc2FtcGxlLnVzZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VydmVyX3RlbXBsYXRlX2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlX2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHJlYWQgQ1YgdmlhIHNlcnZlcl90ZW1wbGF0ZSB1c2VyX2lkcy4iLAogICAgICAgICkKCiAgICAgICAgIyBSZW1vdmUgbWFuYWdlciBmcm9tIGV2ZXJ5d2hlcmUKICAgICAgICBzZWxmLl9jbGVhcl9hbGxfYWNjZXNzKAogICAgICAgICAgICBzZXJ2ZXJfdGVtcGxhdGVfdGFzaywKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlPXNlbGYuc2VydmVyX3RlbXBsYXRlX3NhbXBsZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICApCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VydmVyX3RlbXBsYXRlX2N2LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnROb3RJbigKICAgICAgICAgICAgc2VydmVyX3RlbXBsYXRlX2N2LAogICAgICAgICAgICBjdnMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBOT1QgYmUgYWJsZSB0byByZWFkIENWIHdpdGhvdXQgcmVsYXRpb24uIiwKICAgICAgICApCgogICAgZGVmIHRlc3Rfc2NoZWR1bGVkX3Rhc2tfY3ZfbWFuYWdlcl93cml0ZV9jcmVhdGVfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIk1hbmFnZXI6IGNhbiBjcmVhdGUvd3JpdGUgQ1YgaWYgaW4gc2NoZWR1bGVkIHRhc2sncyBtYW5hZ2VyX2lkcy4iIiIKICAgICAgICAjIENyZWF0ZSBDViBhcyBtYW5hZ2VyCiAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3YgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlZHVsZWRfdGFza19pZCI6IHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJVYnVudHUiLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIHRyeToKICAgICAgICAgICAgY3Yud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJ2YWx1ZV9jaGFyIjogIkZlZG9yYSJ9KQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKAogICAgICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gd3JpdGUgQ1YgaWYgaW4gc2NoZWR1bGVkIHRhc2sgbWFuYWdlcl9pZHMuIgogICAgICAgICAgICApCgogICAgICAgICMgU2hvdWxkIGZhaWwgaWYgbm90IGluIG1hbmFnZXJfaWRzCiAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg1LCAwLCAwKV0KICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5zY2hlZHVsZWRfdGFza19jdl9vcy53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSgKICAgICAgICAgICAgICAgIHsidmFsdWVfY2hhciI6ICJDZW50T1MifQogICAgICAgICAgICApCgogICAgZGVmIHRlc3Rfc2NoZWR1bGVkX3Rhc2tfY3ZfbWFuYWdlcl91bmxpbmtfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIk1hbmFnZXI6IGNhbiB1bmxpbmsgQ1Ygb25seSBpZiBpbiBzY2hlZHVsZWQgdGFzaydzIG1hbmFnZXJfaWRzICYgY3JlYXRvci4iIiIKICAgICAgICAjIENyZWF0ZSBDViBhcyBtYW5hZ2VyCiAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgY3YgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlZHVsZWRfdGFza19pZCI6IHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJBcmNoIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN2LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdW5saW5rIENWIHRoZXkgY3JlYXRlZC4iKQoKICAgICAgICAjIE5vdCBjcmVhdG9yCiAgICAgICAgc2VsZi5jb21tYW5kX3NjaGVkdWxlZF90YXNrLm1hbmFnZXJfaWRzID0gWyg2LCAwLCBbc2VsZi5tYW5hZ2VyLmlkXSldCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYuc2NoZWR1bGVkX3Rhc2tfY3Zfb3Mud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKCiAgICBkZWYgdGVzdF9zY2hlZHVsZWRfdGFza19jdl9yb290X3VucmVzdHJpY3RlZF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiUm9vdDogZnVsbCB1bnJlc3RyaWN0ZWQgYWNjZXNzIHRvIGFsbCBzY2hlZHVsZWQgdGFzayBDVnMuIiIiCiAgICAgICAgIyBSZWFkCiAgICAgICAgY3ZzID0gc2VsZi5TY2hlZHVsZWRUYXNrQ3Yud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9Iiwgc2VsZi5zY2hlZHVsZWRfdGFza19jdl9vcy5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlbGYuc2NoZWR1bGVkX3Rhc2tfY3Zfb3MsCiAgICAgICAgICAgIGN2cywKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhbnkgQ1YuIiwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlCiAgICAgICAgY3YgPSBzZWxmLlNjaGVkdWxlZFRhc2tDdi53aXRoX3VzZXIoc2VsZi5yb290KS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJzY2hlZHVsZWRfdGFza19pZCI6IHNlbGYuY29tbWFuZF9zY2hlZHVsZWRfdGFzay5pZCwKICAgICAgICAgICAgICAgICJ2YXJpYWJsZV9pZCI6IHNlbGYudmFyaWFibGVfb3MuaWQsCiAgICAgICAgICAgICAgICAidmFsdWVfY2hhciI6ICJTVVNFIiwKICAgICAgICAgICAgfQogICAgICAgICkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGN2LndpdGhfdXNlcihzZWxmLnJvb3QpLndyaXRlKHsidmFsdWVfY2hhciI6ICJPcGVuU1VTRSJ9KQogICAgICAgICAgICBjdi53aXRoX3VzZXIoc2VsZi5yb290KS51bmxpbmsoKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJSb290IHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlL3VubGluayBhbnkgc2NoZWR1bGVkIHRhc2sgQ1YuIikK |