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

1 line
44 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJKZXRXYXlwb2ludEFjY2VzcyhUZXN0VG93ZXJKZXRzQ29tbW9uKToKICAgICIiIgogICAgVGVzdCBhY2Nlc3MgcnVsZXMgZm9yIEpldCBXYXlwb2ludCBtb2RlbAogICAgIiIiCgogICAgQGNsYXNzbWV0aG9kCiAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgogICAgICAgIHN1cGVyKCkuc2V0VXBDbGFzcygpCgogICAgICAgICMgVXNlIGV4aXN0aW5nIHVzZXJzIGZyb20gY29tbW9uLnB5IChjbHMudXNlciwgY2xzLm1hbmFnZXIsIGNscy5yb290KQogICAgICAgICMgQ3JlYXRlIGFkZGl0aW9uYWwgbWFuYWdlciBmb3IgbXVsdGktbWFuYWdlciB0ZXN0cwogICAgICAgIGNscy5tYW5hZ2VyMiA9IGNscy5Vc2Vycy5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgTWFuYWdlciAyIiwKICAgICAgICAgICAgICAgICJsb2dpbiI6ICJ0ZXN0X21hbmFnZXJfMiIsCiAgICAgICAgICAgICAgICAiZW1haWwiOiAidGVzdF9tYW5hZ2VyXzJAZXhhbXBsZS5jb20iLAogICAgICAgICAgICAgICAgImdyb3Vwc19pZCI6IFsoNiwgMCwgW2Nscy5ncm91cF9tYW5hZ2VyLmlkXSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYW5hZ2VyIFJlYWQgQWNjZXNzIFRlc3RzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2pldF91c2VyX2lkcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiB1c2VyIGlzIGFkZGVkIGluIGpldCdzIHVzZXJfaWRzIiIiCiAgICAgICAgIyBVc2UgZXhpc3RpbmcgamV0IGFuZCBhZGQgbWFuYWdlciB0byB1c2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQogICAgICAgIGpldCA9IHNlbGYuamV0X3Rlc3QKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIldheXBvaW50IHdpdGggVXNlciBBY2Nlc3MiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ3YXlwb2ludF91c2VyX2FjY2VzcyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW4gYWRkZWQgdG8gamV0J3MgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2pldF9tYW5hZ2VyX2lkcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiB1c2VyIGlzIGFkZGVkIGluIGpldCdzIG1hbmFnZXJfaWRzIiIiCiAgICAgICAgIyBVc2UgZXhpc3RpbmcgamV0IGFuZCBhZGQgbWFuYWdlciB0byBtYW5hZ2VyX2lkcwogICAgICAgIHNlbGYuamV0X3Rlc3Qud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQogICAgICAgIGpldCA9IHNlbGYuamV0X3Rlc3QKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIldheXBvaW50IHdpdGggTWFuYWdlciBBY2Nlc3MiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ3YXlwb2ludF9tYW5hZ2VyX2FjY2VzcyIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogc2VsZi53YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKHJlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byByZWFkIHdoZW4gYWRkZWQgdG8gamV0J3MgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX3Jvb3RfbGV2ZWwoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBObyByZWFkIGFjY2VzcyBmb3IgUm9vdCBsZXZlbCAoMykgZXZlbiB3aXRoIGpldCBhY2Nlc3MiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBqZXQgYW5kIGFkZCBtYW5hZ2VyIHRvIG1hbmFnZXJfaWRzIChoYXMgamV0IGFjY2VzcykKICAgICAgICBzZWxmLmpldF90ZXN0LndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICBqZXQgPSBzZWxmLmpldF90ZXN0CgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlIHdpdGggUm9vdCBsZXZlbAogICAgICAgIHdheXBvaW50X3RlbXBsYXRlX3Jvb3QgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSb290IExldmVsIFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAicm9vdF9sZXZlbF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIFJvb3QgbGV2ZWwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgTGV2ZWwgV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJyb290X2xldmVsX3dheXBvaW50IiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZV9yb290LmlkLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwgICMgRXhwbGljaXRseSBzZXQgUm9vdCBsZXZlbAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRXYXlwb2ludC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgcmVhZCBhY2Nlc3NfbGV2ZWw9JzMnICIKICAgICAgICAgICAgImV2ZW4gd2hlbiBpbiBqZXQncyBtYW5hZ2VyX2lkcyAoUm9vdCBsZXZlbCBibG9ja3MgYWNjZXNzKSIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9ub19hY2Nlc3Nfbm90X2luX2pldChzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IE5vIHJlYWQgYWNjZXNzIHdoZW4gbm90IGluIGpldCdzIFVzZXJzIG9yIE1hbmFnZXJzIiIiCiAgICAgICAgIyBVc2UgZXhpc3RpbmcgamV0IChtYW5hZ2VyIG5vdCBpbiB1c2VyX2lkcy9tYW5hZ2VyX2lkcykKICAgICAgICBqZXQgPSBzZWxmLmpldF90ZXN0CgogICAgICAgIHJlY29yZCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJObyBBY2Nlc3MgV2F5cG9pbnQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJub19hY2Nlc3Nfd2F5cG9pbnQiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IGpldC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHNlbGYud2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldFdheXBvaW50LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHJlY29yZC5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCByZWFkIHdoZW4gbm90IGluIGpldCdzIHVzZXJfaWRzIG9yIG1hbmFnZXJfaWRzIiwKICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE1hbmFnZXIgV3JpdGUvQ3JlYXRlIEFjY2VzcyBUZXN0cwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9hY2Nlc3NfbGV2ZWxfYW5kX3RlbXBsYXRlX21hbmFnZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogV3JpdGUgd2hlbiBhY2Nlc3NfbGV2ZWwgPD0gMiBBTkQgaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgamV0IGZyb20gdGhpcyB0ZW1wbGF0ZSB3aXRoIHVuaXF1ZSBuYW1lCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iV3JpdGUgQWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0id3JpdGVfYWNjZXNzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF93YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFuYWdlciBDYW4gV3JpdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJtYW5hZ2VyX2Nhbl93cml0ZSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB3cml0ZQogICAgICAgIHRyeToKICAgICAgICAgICAgcmVjb3JkLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndyaXRlKHsibmFtZSI6ICJVcGRhdGVkIE5hbWUifSkKICAgICAgICAgICAgcmVjb3JkLmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIHJlY29yZC5uYW1lLCAiVXBkYXRlZCBOYW1lIiwgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdXBkYXRlIgogICAgICAgICAgICApCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gdXBkYXRlIHdoZW4gaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIpCgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9mb3JiaWRkZW5fbm90X2luX3RlbXBsYXRlX21hbmFnZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gd3JpdGUgd2hlbiBub3QgaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRob3V0IG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMgKGZvciByZWFkIGFjY2VzcykKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJObyBXcml0ZSBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9Im5vX3dyaXRlX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF93YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTm8gV3JpdGUgQWNjZXNzIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibm9fd3JpdGVfYWNjZXNzIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSh7Im5hbWUiOiAiU2hvdWxkIEZhaWwifSkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3dyaXRlX2ZvcmJpZGRlbl9yb290X2xldmVsKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gd3JpdGUgd2hlbiBhY2Nlc3NfbGV2ZWwgaXMgUm9vdCAoMykiIiIKICAgICAgICAjIENyZWF0ZSBqZXQgdGVtcGxhdGUgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzCiAgICAgICAgamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCBmcm9tIHRoaXMgdGVtcGxhdGUgd2l0aCB1bmlxdWUgbmFtZQogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgIG5hbWU9IldyaXRlIEFjY2VzcyBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9IndyaXRlX2FjY2Vzc19qZXQiLAogICAgICAgICAgICB0ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIFJvb3QgbGV2ZWwKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZV9yb290ID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBMZXZlbCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInJvb3RfbGV2ZWxfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIFJvb3QgbGV2ZWwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgTGV2ZWwgTm8gV3JpdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJyb290X2xldmVsX25vX3dyaXRlIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZV9yb290LmlkLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwgICMgRXhwbGljaXRseSBzZXQgUm9vdCBsZXZlbAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgcmVjb3JkLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLndyaXRlKHsibmFtZSI6ICJTaG91bGQgRmFpbCJ9KQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfY3JlYXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENyZWF0ZSB3aGVuIGFjY2Vzc19sZXZlbCA8PSAyIEFORCBpbiB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzIiIiCiAgICAgICAgIyBDcmVhdGUgamV0IHRlbXBsYXRlIHdpdGggbWFuYWdlciBpbiBtYW5hZ2VyX2lkcwogICAgICAgIGpldF90ZW1wbGF0ZSA9IHNlbGYuSmV0VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBqZXQgZnJvbSB0aGlzIHRlbXBsYXRlIHdpdGggdW5pcXVlIG5hbWUKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJXcml0ZSBBY2Nlc3MgSmV0IiwKICAgICAgICAgICAgcmVmZXJlbmNlPSJ3cml0ZV9hY2Nlc3NfamV0IiwKICAgICAgICAgICAgdGVtcGxhdGU9amV0X3RlbXBsYXRlLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdGVtcGxhdGUKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3dheXBvaW50X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBqZXRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgVHJ5IHRvIGNyZWF0ZSB3aXRob3V0IGJlaW5nIGluIHRlbXBsYXRlJ3MgbWFuYWdlcl9pZHMgLSBzaG91bGQgZmFpbAogICAgICAgIGpldF90ZW1wbGF0ZV9ub19hY2Nlc3MgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTm8gQWNjZXNzIFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibm9fYWNjZXNzX3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IEZhbHNlLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBqZXRfbm9fYWNjZXNzID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iTm8gQWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0ibm9fYWNjZXNzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZV9ub19hY2Nlc3MsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sICAjIE1hbmFnZXIgaW4gamV0IGJ1dCBub3QgdGVtcGxhdGUKICAgICAgICApCgogICAgICAgIHdheXBvaW50X3RlbXBsYXRlX25vX2FjY2VzcyA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk5vIEFjY2VzcyBXYXlwb2ludCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIm5vX2FjY2Vzc193YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlX25vX2FjY2Vzcy5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNyZWF0ZSBGYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImNyZWF0ZV9mYWlsIiwKICAgICAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0X25vX2FjY2Vzcy5pZCwKICAgICAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZV9ub19hY2Nlc3MuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2l0aCBtYW5hZ2VyIGluIHRlbXBsYXRlJ3MgbWFuYWdlcl9pZHMgLSBzaG91bGQgc3VjY2VlZAogICAgICAgIHRyeToKICAgICAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ3JlYXRlIFN1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiY3JlYXRlX3N1Y2Nlc3MiLAogICAgICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjb3JkcyksIDEsICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGNyZWF0ZSIpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIHdoZW4gaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIpCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE1hbmFnZXIgRGVsZXRlIEFjY2VzcyBUZXN0cwogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIHRlc3RfbWFuYWdlcl9kZWxldGVfb3duX3JlY29yZChzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IERlbGV0ZSBvd24gcmVjb3JkIHdoZW4gaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgamV0IGZyb20gdGhpcyB0ZW1wbGF0ZSB3aXRoIHVuaXF1ZSBuYW1lCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iV3JpdGUgQWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0id3JpdGVfYWNjZXNzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF93YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTXkgUmVjb3JkIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAibXlfcmVjb3JkIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKICAgICAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQuc2VhcmNoKFsoImlkIiwgIj0iLCByZWNvcmQuaWQpXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxlbihyZWNvcmRzKSwgMCwgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIG93biByZWNvcmQiCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgb3duIHJlY29yZCIpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9kZWxldGVfbm90X2NyZWF0b3Ioc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBDYW5ub3QgZGVsZXRlIHJlY29yZCBjcmVhdGVkIGJ5IGFub3RoZXIgdXNlciIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIGJvdGggbWFuYWdlcnMgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpLCAoNCwgc2VsZi5tYW5hZ2VyMi5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBqZXQgZnJvbSB0aGlzIHRlbXBsYXRlIHdpdGggdW5pcXVlIG5hbWUKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJXcml0ZSBBY2Nlc3MgSmV0IiwKICAgICAgICAgICAgcmVmZXJlbmNlPSJ3cml0ZV9hY2Nlc3NfamV0IiwKICAgICAgICAgICAgdGVtcGxhdGU9amV0X3RlbXBsYXRlLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdGVtcGxhdGUKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3dheXBvaW50X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBqZXRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlY29yZCA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcjIpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiT3RoZXIncyBSZWNvcmQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJvdGhlcnNfcmVjb3JkIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBNYW5hZ2VyMSBjYW5ub3QgZGVsZXRlIE1hbmFnZXIyJ3MgcmVjb3JkCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS51bmxpbmsoKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfZGVsZXRlX25vdF9pbl90ZW1wbGF0ZV9tYW5hZ2VyX2lkcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBkZWxldGUgd2hlbiBub3QgaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgamV0IGZyb20gdGhpcyB0ZW1wbGF0ZSB3aXRoIHVuaXF1ZSBuYW1lCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iRGVsZXRlIE5vdCBJbiBUZW1wbGF0ZSBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9ImRlbGV0ZV9ub3RfaW5fdGVtcGxhdGVfamV0IiwKICAgICAgICAgICAgdGVtcGxhdGU9amV0X3RlbXBsYXRlLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdGVtcGxhdGUKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3dheXBvaW50X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBqZXRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlY29yZCA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSZW1vdmVkIE1hbmFnZXIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJyZW1vdmVkX21hbmFnZXIiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IGpldC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFJlbW92ZSBmcm9tIHRlbXBsYXRlJ3MgbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUud3JpdGUoeyJtYW5hZ2VyX2lkcyI6IEZhbHNlfSkKCiAgICAgICAgIyBDYW5ub3QgZGVsZXRlIGFueW1vcmUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgcmVjb3JkLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9kZWxldGVfcm9vdF9sZXZlbChzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBkZWxldGUgUm9vdCBsZXZlbCByZWNvcmQiIiIKICAgICAgICAjIENyZWF0ZSBqZXQgdGVtcGxhdGUgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzCiAgICAgICAgamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCBmcm9tIHRoaXMgdGVtcGxhdGUgd2l0aCB1bmlxdWUgbmFtZQogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgIG5hbWU9IldyaXRlIEFjY2VzcyBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9IndyaXRlX2FjY2Vzc19qZXQiLAogICAgICAgICAgICB0ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIFJvb3QgbGV2ZWwKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZV9yb290ID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBMZXZlbCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInJvb3RfbGV2ZWxfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIFJvb3QgbGV2ZWwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgcmVjb3JkIHdpdGggUm9vdCBsZXZlbCBhcyByb290IChkZWZhdWx0IHVzZXIpCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgTGV2ZWwgRGVsZXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAicm9vdF9sZXZlbF9kZWxldGUiLAogICAgICAgICAgICAgICAgImpldF9pZCI6IGpldC5pZCwKICAgICAgICAgICAgICAgICJ3YXlwb2ludF90ZW1wbGF0ZV9pZCI6IHdheXBvaW50X3RlbXBsYXRlX3Jvb3QuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICByZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KICAgICMgUm9vdCBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X3Jvb3RfZnVsbF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiCiAgICAgICAgVGVzdCBSb290OiBGdWxsIENSVUQgYWNjZXNzIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzX2xldmVsIG9yIGNyZWF0b3IuCgogICAgICAgIFJvb3QgaGFzIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gYWxsIHJlY29yZHMgdmlhIHNlY3VyaXR5IHJ1bGUKICAgICAgICBbKDEsICc9JywgMSldLCBzbyB3ZSB0ZXN0OgogICAgICAgIC0gQ3JlYXRlIHJlY29yZHMgd2l0aCBhbGwgYWNjZXNzIGxldmVscwogICAgICAgIC0gUmVhZCByZWNvcmRzIHdpdGggYWxsIGFjY2VzcyBsZXZlbHMKICAgICAgICAtIFdyaXRlIHRvIHJlY29yZHMgd2l0aCBhbGwgYWNjZXNzIGxldmVscwogICAgICAgIC0gRGVsZXRlIHJlY29yZHMgcmVnYXJkbGVzcyBvZiBjcmVhdG9yCiAgICAgICAgIiIiCiAgICAgICAgIyBDcmVhdGUgamV0IHRlbXBsYXRlIGZvciB0ZXN0aW5nCiAgICAgICAgamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgamV0IGZyb20gdGhpcyB0ZW1wbGF0ZSB3aXRoIHVuaXF1ZSBuYW1lCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iV3JpdGUgQWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0id3JpdGVfYWNjZXNzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICApCgogICAgICAgICMgVGVzdCBDUlVEIG9wZXJhdGlvbnMgZm9yIGFsbCBhY2Nlc3MgbGV2ZWxzIChvbmx5IE1hbmFnZXIgYW5kIFJvb3QgZXhpc3QpCiAgICAgICAgZm9yIGFjY2Vzc19sZXZlbCBpbiBbIjIiLCAiMyJdOgogICAgICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIHNwZWNpZmljIGFjY2VzcyBsZXZlbAogICAgICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBmIlRlbXBsYXRlIExldmVsIHthY2Nlc3NfbGV2ZWx9IiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogZiJ0ZW1wbGF0ZV9sZXZlbF97YWNjZXNzX2xldmVsfSIsCiAgICAgICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICAgICAiYWNjZXNzX2xldmVsIjogYWNjZXNzX2xldmVsLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgICAgICAjIFJvb3QgY2FuIGNyZWF0ZSBhbnkgbGV2ZWwKICAgICAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC53aXRoX3VzZXIoc2VsZi5yb290KS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiBmIlJvb3QgTGV2ZWwge2FjY2Vzc19sZXZlbH0iLAogICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiBmInJvb3RfbGV2ZWxfe2FjY2Vzc19sZXZlbH0iLAogICAgICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgUm9vdCBjYW4gcmVhZCBhbnkgbGV2ZWwKICAgICAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYucm9vdCkuc2VhcmNoKAogICAgICAgICAgICAgICAgWygiaWQiLCAiPSIsIHJlY29yZC5pZCldCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICBmIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gcmVhZCBhY2Nlc3NfbGV2ZWw9e2FjY2Vzc19sZXZlbH0iLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIFJvb3QgY2FuIHdyaXRlIGFueSBsZXZlbAogICAgICAgICAgICByZWNvcmQud2l0aF91c2VyKHNlbGYucm9vdCkud3JpdGUoCiAgICAgICAgICAgICAgICB7Im5hbWUiOiBmIlJvb3QgVXBkYXRlZCBMZXZlbCB7YWNjZXNzX2xldmVsfSJ9CiAgICAgICAgICAgICkKICAgICAgICAgICAgcmVjb3JkLmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIHJlY29yZC5uYW1lLAogICAgICAgICAgICAgICAgZiJSb290IFVwZGF0ZWQgTGV2ZWwge2FjY2Vzc19sZXZlbH0iLAogICAgICAgICAgICAgICAgZiJSb290IHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSBhY2Nlc3NfbGV2ZWw9e2FjY2Vzc19sZXZlbH0iLAogICAgICAgICAgICApCgogICAgICAgICMgVGVzdCBSb290IGNhbiBkZWxldGUgcmVjb3JkcyBjcmVhdGVkIGJ5IG90aGVyIHVzZXJzCiAgICAgICAgIyBBZGQgbWFuYWdlciB0byB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzIHNvIHRoZXkgY2FuIGNyZWF0ZSB0aGUgcmVjb3JkCiAgICAgICAgamV0X3RlbXBsYXRlLndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldfSkKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIk1hbmFnZXIgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJtYW5hZ2VyX3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBqZXRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgbWFuYWdlcl9yZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFuYWdlcidzIFJlY29yZCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIm1hbmFnZXJzX3JlY29yZCIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgbWFuYWdlcl9yZWNvcmQud2l0aF91c2VyKHNlbGYucm9vdCkudW5saW5rKCkKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXRXYXlwb2ludC53aXRoX3VzZXIoc2VsZi5yb290KS5zZWFyY2goCiAgICAgICAgICAgIFsoImlkIiwgIj0iLCBtYW5hZ2VyX3JlY29yZC5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlJvb3Qgc2hvdWxkIGJlIGFibGUgdG8gZGVsZXRlIHJlY29yZHMgZnJvbSBhbnkgY3JlYXRvciIsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBFZGdlIENhc2VzCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9hY2Nlc3NfbGV2ZWxfY2hhbmdlc192aXNpYmlsaXR5KHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCBjaGFuZ2luZyBhY2Nlc3NfbGV2ZWwgYWZmZWN0cyB2aXNpYmlsaXR5IiIiCiAgICAgICAgIyBDcmVhdGUgamV0IHRlbXBsYXRlIHdpdGggbWFuYWdlciBpbiBtYW5hZ2VyX2lkcwogICAgICAgIGpldF90ZW1wbGF0ZSA9IHNlbGYuSmV0VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBqZXQgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzIHdpdGggdW5pcXVlIG5hbWUKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJBY2Nlc3MgTGV2ZWwgQ2hhbmdlcyBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9ImFjY2Vzc19sZXZlbF9jaGFuZ2VzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlIHdpdGggTWFuYWdlciBsZXZlbAogICAgICAgIHdheXBvaW50X3RlbXBsYXRlID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfd2F5cG9pbnRfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMiIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlY29yZCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJDaGFuZ2luZyBMZXZlbCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImNoYW5naW5nX2xldmVsIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBNYW5hZ2VyIGNhbiByZWFkCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0V2F5cG9pbnQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKAogICAgICAgICAgICBbKCJpZCIsICI9IiwgcmVjb3JkLmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjb3JkcyksIDEsICJNYW5hZ2VyIHNob3VsZCByZWFkIGxldmVsIDIiKQoKICAgICAgICAjIENoYW5nZSB0ZW1wbGF0ZSB0byBSb290IGxldmVsCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUud3JpdGUoeyJhY2Nlc3NfbGV2ZWwiOiAiMyJ9KQogICAgICAgICMgVXBkYXRlIHdheXBvaW50J3MgYWNjZXNzX2xldmVsIHNpbmNlIGl0J3Mgc3RvcmVkIGFuZCBkb2Vzbid0IGF1dG8tdXBkYXRlCiAgICAgICAgcmVjb3JkLndyaXRlKHsiYWNjZXNzX2xldmVsIjogIjMifSkKICAgICAgICByZWNvcmQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQoKICAgICAgICAjIE1hbmFnZXIgY2Fubm90IHJlYWQgYW55bW9yZQogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldFdheXBvaW50LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaCgKICAgICAgICAgICAgWygiaWQiLCAiPSIsIHJlY29yZC5pZCldCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlY29yZHMpLCAwLCAiTWFuYWdlciBzaG91bGQgbm90IHJlYWQgbGV2ZWwgMyIpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9wcmVwYXJlX2ZvcmJpZGRlbl9ub193cml0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBDYW5ub3QgcHJlcGFyZSB3YXlwb2ludCB3aXRob3V0IHdyaXRlIGFjY2VzcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRob3V0IG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMgKGZvciByZWFkIGFjY2VzcykKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJQcmVwYXJlIEZvcmJpZGRlbiBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9InByZXBhcmVfZm9yYmlkZGVuX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF93YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHJlcGFyZSBGb3JiaWRkZW4iLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJwcmVwYXJlX2ZvcmJpZGRlbiIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiZHJhZnQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIE1hbmFnZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIHByZXBhcmUgd2l0aG91dCB3cml0ZSBhY2Nlc3MKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgcmVjb3JkLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnByZXBhcmUoKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcHJlcGFyZV9mb3JiaWRkZW5fcm9vdF9sZXZlbChzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBwcmVwYXJlIHdheXBvaW50IHdpdGggUm9vdCBsZXZlbCIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgamV0IGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgIG5hbWU9IlByZXBhcmUgUm9vdCBMZXZlbCBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9InByZXBhcmVfcm9vdF9sZXZlbF9qZXQiLAogICAgICAgICAgICB0ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZSB3aXRoIFJvb3QgbGV2ZWwKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZV9yb290ID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBMZXZlbCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInJvb3RfbGV2ZWxfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIFJvb3QgbGV2ZWwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgTGV2ZWwgUHJlcGFyZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInJvb3RfbGV2ZWxfcHJlcGFyZSIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGVfcm9vdC5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIEV4cGxpY2l0bHkgc2V0IFJvb3QgbGV2ZWwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkcmFmdCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gcHJlcGFyZSBSb290IGxldmVsIHdheXBvaW50CiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5wcmVwYXJlKCkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2ZseV90b19mb3JiaWRkZW5fbm9fd3JpdGVfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogQ2Fubm90IGZseV90byB3YXlwb2ludCB3aXRob3V0IHdyaXRlIGFjY2VzcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRob3V0IG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogRmFsc2UsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMgKGZvciByZWFkIGFjY2VzcykKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJGbHkgVG8gRm9yYmlkZGVuIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0iZmx5X3RvX2ZvcmJpZGRlbl9qZXQiLAogICAgICAgICAgICB0ZW1wbGF0ZT1qZXRfdGVtcGxhdGUsCiAgICAgICAgICAgIHNlcnZlcj1zZWxmLnNlcnZlcl90ZXN0XzEsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB3YXlwb2ludCB0ZW1wbGF0ZQogICAgICAgIHdheXBvaW50X3RlbXBsYXRlID0gc2VsZi5KZXRXYXlwb2ludFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBXYXlwb2ludCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfd2F5cG9pbnRfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IGpldF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVjb3JkID0gc2VsZi5KZXRXYXlwb2ludC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIkZseSBUbyBGb3JiaWRkZW4iLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJmbHlfdG9fZm9yYmlkZGVuIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJyZWFkeSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gZmx5X3RvIHdpdGhvdXQgd3JpdGUgYWNjZXNzCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5mbHlfdG8oKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfZmx5X3RvX2ZvcmJpZGRlbl9yb290X2xldmVsKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogQ2Fubm90IGZseV90byB3YXlwb2ludCB3aXRoIFJvb3QgbGV2ZWwiIiIKICAgICAgICAjIENyZWF0ZSBqZXQgdGVtcGxhdGUgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzCiAgICAgICAgamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGpldCBmcm9tIHRoaXMgdGVtcGxhdGUKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICBuYW1lPSJGbHkgVG8gUm9vdCBMZXZlbCBKZXQiLAogICAgICAgICAgICByZWZlcmVuY2U9ImZseV90b19yb290X2xldmVsX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlIHdpdGggUm9vdCBsZXZlbAogICAgICAgIHdheXBvaW50X3RlbXBsYXRlX3Jvb3QgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJSb290IExldmVsIFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAicm9vdF9sZXZlbF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgImFjY2Vzc19sZXZlbCI6ICIzIiwgICMgUm9vdCBsZXZlbAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9vdCBMZXZlbCBGbHkgVG8iLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJyb290X2xldmVsX2ZseV90byIsCiAgICAgICAgICAgICAgICAiamV0X2lkIjogamV0LmlkLAogICAgICAgICAgICAgICAgIndheXBvaW50X3RlbXBsYXRlX2lkIjogd2F5cG9pbnRfdGVtcGxhdGVfcm9vdC5pZCwKICAgICAgICAgICAgICAgICJhY2Nlc3NfbGV2ZWwiOiAiMyIsICAjIEV4cGxpY2l0bHkgc2V0IFJvb3QgbGV2ZWwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJyZWFkeSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgbm90IGJlIGFibGUgdG8gZmx5X3RvIFJvb3QgbGV2ZWwgd2F5cG9pbnQKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgcmVjb3JkLndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLmZseV90bygpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9wcmVwYXJlX3N1Y2Nlc3Nfd2l0aF93cml0ZV9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBDYW4gcHJlcGFyZSB3YXlwb2ludCB3aXRoIHdyaXRlIGFjY2VzcyIiIgogICAgICAgICMgQ3JlYXRlIGpldCB0ZW1wbGF0ZSB3aXRoIG1hbmFnZXIgaW4gbWFuYWdlcl9pZHMKICAgICAgICBqZXRfdGVtcGxhdGUgPSBzZWxmLkpldFRlbXBsYXRlLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBUZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3RfdGVtcGxhdGUiLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBFbnN1cmUgbWFuYWdlciBoYXMgc2VydmVyIGFjY2VzcwogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7InVzZXJfaWRzIjogWyg0LCBzZWxmLm1hbmFnZXIuaWQpXX0pCgogICAgICAgICMgQ3JlYXRlIGpldCBmcm9tIHRoaXMgdGVtcGxhdGUgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgbmFtZT0iUHJlcGFyZSBTdWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0icHJlcGFyZV9zdWNjZXNzX2pldCIsCiAgICAgICAgICAgIHRlbXBsYXRlPWpldF90ZW1wbGF0ZSwKICAgICAgICAgICAgc2VydmVyPXNlbGYuc2VydmVyX3Rlc3RfMSwKICAgICAgICAgICAgbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHdheXBvaW50IHRlbXBsYXRlCiAgICAgICAgd2F5cG9pbnRfdGVtcGxhdGUgPSBzZWxmLkpldFdheXBvaW50VGVtcGxhdGUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFdheXBvaW50IFRlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF93YXlwb2ludF90ZW1wbGF0ZSIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogamV0X3RlbXBsYXRlLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZWNvcmQgPSBzZWxmLkpldFdheXBvaW50LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiUHJlcGFyZSBTdWNjZXNzIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAicHJlcGFyZV9zdWNjZXNzIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkcmFmdCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBwcmVwYXJlIHdpdGggd3JpdGUgYWNjZXNzCiAgICAgICAgdHJ5OgogICAgICAgICAgICByZXN1bHQgPSByZWNvcmQud2l0aF91c2VyKHNlbGYubWFuYWdlcikucHJlcGFyZSgpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHByZXBhcmUiKQogICAgICAgICAgICByZWNvcmQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgICAgICAjIFN0YXRlIHNob3VsZCBiZSByZWFkeSAobm8gcGxhbl9jcmVhdGVfaWQpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLnN0YXRlLCAicmVhZHkiLCAiU3RhdGUgc2hvdWxkIGJlIHJlYWR5IikKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHByZXBhcmUgd2hlbiBpbiB0ZW1wbGF0ZSdzIG1hbmFnZXJfaWRzIgogICAgICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9mbHlfdG9fc3VjY2Vzc193aXRoX3dyaXRlX2FjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbiBmbHlfdG8gd2F5cG9pbnQgd2l0aCB3cml0ZSBhY2Nlc3MiIiIKICAgICAgICAjIENyZWF0ZSBqZXQgdGVtcGxhdGUgd2l0aCBtYW5hZ2VyIGluIG1hbmFnZXJfaWRzCiAgICAgICAgamV0X3RlbXBsYXRlID0gc2VsZi5KZXRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJtYW5hZ2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgRW5zdXJlIG1hbmFnZXIgaGFzIHNlcnZlciBhY2Nlc3MKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQoKICAgICAgICAjIENyZWF0ZSBqZXQgZnJvbSB0aGlzIHRlbXBsYXRlIHdpdGggbWFuYWdlciBpbiBtYW5hZ2VyX2lkcwogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgIG5hbWU9IkZseSBUbyBTdWNjZXNzIEpldCIsCiAgICAgICAgICAgIHJlZmVyZW5jZT0iZmx5X3RvX3N1Y2Nlc3NfamV0IiwKICAgICAgICAgICAgdGVtcGxhdGU9amV0X3RlbXBsYXRlLAogICAgICAgICAgICBzZXJ2ZXI9c2VsZi5zZXJ2ZXJfdGVzdF8xLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgd2F5cG9pbnQgdGVtcGxhdGUKICAgICAgICB3YXlwb2ludF90ZW1wbGF0ZSA9IHNlbGYuSmV0V2F5cG9pbnRUZW1wbGF0ZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgV2F5cG9pbnQgVGVtcGxhdGUiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3dheXBvaW50X3RlbXBsYXRlIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBqZXRfdGVtcGxhdGUuaWQsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlY29yZCA9IHNlbGYuSmV0V2F5cG9pbnQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJGbHkgVG8gU3VjY2VzcyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImZseV90b19zdWNjZXNzIiwKICAgICAgICAgICAgICAgICJqZXRfaWQiOiBqZXQuaWQsCiAgICAgICAgICAgICAgICAid2F5cG9pbnRfdGVtcGxhdGVfaWQiOiB3YXlwb2ludF90ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJyZWFkeSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBmbHlfdG8gd2l0aCB3cml0ZSBhY2Nlc3MKICAgICAgICB0cnk6CiAgICAgICAgICAgIHJlc3VsdCA9IHJlY29yZC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5mbHlfdG8oKQogICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LCAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBmbHlfdG8iKQogICAgICAgICAgICByZWNvcmQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgICAgICAjIFN0YXRlIHNob3VsZCBiZSBjdXJyZW50IChubyBwcmV2aW91cyB3YXlwb2ludCwgbm8gcGxhbl9hcnJpdmVfaWQpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLnN0YXRlLCAiY3VycmVudCIsICJTdGF0ZSBzaG91bGQgYmUgY3VycmVudCIpCiAgICAgICAgZXhjZXB0IEFjY2Vzc0Vycm9yOgogICAgICAgICAgICBzZWxmLmZhaWwoIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gZmx5X3RvIHdoZW4gaW4gdGVtcGxhdGUncyBtYW5hZ2VyX2lkcyIpCg==