1 line
21 KiB
Python
1 line
21 KiB
Python
IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBBY2Nlc3NFcnJvcgoKZnJvbSAuY29tbW9uX2pldHMgaW1wb3J0IFRlc3RUb3dlckpldHNDb21tb24KCgpjbGFzcyBUZXN0VG93ZXJKZXRBY2Nlc3MoVGVzdFRvd2VySmV0c0NvbW1vbik6CiAgICAiIiIKICAgIFRlc3QgYWNjZXNzIHJ1bGVzIGZvciBKZXQgbW9kZWwKICAgICIiIgoKICAgIEBjbGFzc21ldGhvZAogICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKICAgICAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQoKICAgICAgICAjIENyZWF0ZSBhZGRpdGlvbmFsIG1hbmFnZXIgZm9yIG11bHRpLW1hbmFnZXIgdGVzdHMKICAgICAgICBjbHMubWFuYWdlcjIgPSBjbHMuVXNlcnMuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IE1hbmFnZXIgMiIsCiAgICAgICAgICAgICAgICAibG9naW4iOiAidGVzdF9tYW5hZ2VyXzIiLAogICAgICAgICAgICAgICAgImVtYWlsIjogInRlc3RfbWFuYWdlcl8yQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgICAgICJncm91cHNfaWQiOiBbKDYsIDAsIFtjbHMuZ3JvdXBfbWFuYWdlci5pZF0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYWRkaXRpb25hbCBzZXJ2ZXIgZm9yIHRlc3RpbmcKICAgICAgICBjbHMuc2VydmVyX3Rlc3RfMiA9IGNscy5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciAyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjEyNy4wLjAuMyIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogInRlc3QiLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJ0ZXN0IiwKICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsoNSwgMCwgMCldLAogICAgICAgICAgICAgICAgIm1hbmFnZXJfaWRzIjogWyg1LCAwLCAwKV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFVzZXIgUmVhZCBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X3VzZXJfcmVhZF9hY2Nlc3NfamV0X3VzZXJfc2VydmVyX3VzZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCBVc2VyOiBSZWFkIHdoZW4gdXNlciBpbiBqZXQgdXNlcl9pZHMgQU5EIHNlcnZlciB1c2VyX2lkcyIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJVc2VyIEpldCIsCiAgICAgICAgICAgICJ1c2VyX2pldCIsCiAgICAgICAgICAgIHVzZXJfaWRzPVsoNCwgc2VsZi51c2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYudXNlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0LndpdGhfdXNlcihzZWxmLnVzZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgamV0LmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0LAogICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAiVXNlciBzaG91bGQgcmVhZCB3aGVuIGluIGpldCB1c2VyX2lkcyBBTkQgc2VydmVyIHVzZXJfaWRzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfdXNlcl9yZWFkX25vX2FjY2Vzc19qZXRfdXNlcl9vbmx5KHNlbGYpOgogICAgICAgICIiIlRlc3QgVXNlcjogTm8gcmVhZCB3aGVuIHVzZXIgaW4gamV0IHVzZXJfaWRzIGJ1dCBOT1QgaW4gc2VydmVyIHVzZXJfaWRzIiIiCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIlVzZXIgSmV0IE5vIFNlcnZlciIsCiAgICAgICAgICAgICJ1c2VyX2pldF9ub19zZXJ2ZXIiLAogICAgICAgICAgICB1c2VyX2lkcz1bKDQsIHNlbGYudXNlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXQud2l0aF91c2VyKHNlbGYudXNlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBqZXQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJVc2VyIHNob3VsZCBub3QgcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF91c2VyX3JlYWRfbm9fYWNjZXNzX3NlcnZlcl91c2VyX29ubHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCBVc2VyOiBObyByZWFkIHdoZW4gdXNlciBpbiBzZXJ2ZXIgdXNlcl9pZHMgYnV0IE5PVCBpbiBqZXQgdXNlcl9pZHMiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiU2VydmVyIFVzZXIgTm8gSmV0IiwKICAgICAgICAgICAgInNlcnZlcl91c2VyX25vX2pldCIsCiAgICAgICAgICAgIHVzZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLnVzZXIuaWQpXSwKICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldC53aXRoX3VzZXIoc2VsZi51c2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGpldC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIlVzZXIgc2hvdWxkIG5vdCByZWFkIHdoZW4gbm90IGluIGpldCB1c2VyX2lkcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VzZXJfd3JpdGVfZm9yYmlkZGVuKHNlbGYpOgogICAgICAgICIiIlRlc3QgVXNlcjogQ2Fubm90IHdyaXRlL2NyZWF0ZS9kZWxldGUgcmVjb3JkcyIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJVc2VyIEpldCIsCiAgICAgICAgICAgICJ1c2VyX2pldCIsCiAgICAgICAgICAgIHVzZXJfaWRzPVsoNCwgc2VsZi51c2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYudXNlci5pZCldLAogICAgICAgICkKCiAgICAgICAgIyBVc2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byB3cml0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBqZXQud2l0aF91c2VyKHNlbGYudXNlcikud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgTmFtZSJ9KQoKICAgICAgICAjIFVzZXIgc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZQogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBzZWxmLkpldC53aXRoX3VzZXIoc2VsZi51c2VyKS5jcmVhdGUoCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmV3IEpldCIsCiAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJuZXdfamV0IiwKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApCgogICAgICAgICMgVXNlciBzaG91bGQgbm90IGJlIGFibGUgdG8gZGVsZXRlCiAgICAgICAgIyBKZXQgaXMgZGVsZXRhYmxlIGJ5IGRlZmF1bHQsIHNvIHRoaXMgdGVzdHMgYWNjZXNzIGNvbnRyb2wKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgamV0LndpdGhfdXNlcihzZWxmLnVzZXIpLnVubGluaygpCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIE1hbmFnZXIgUmVhZCBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3NfamV0X3VzZXJfc2VydmVyX3VzZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBSZWFkIHdoZW4gaW4gamV0IHVzZXJfaWRzIEFORCBzZXJ2ZXIgdXNlcl9pZHMiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiTWFuYWdlciBKZXQgVXNlciIsCiAgICAgICAgICAgICJtYW5hZ2VyX2pldF91c2VyIiwKICAgICAgICAgICAgdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBqZXQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBqZXQsCiAgICAgICAgICAgIHJlY29yZHMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCByZWFkIHdoZW4gaW4gamV0IHVzZXJfaWRzIEFORCBzZXJ2ZXIgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfYWNjZXNzX2pldF9tYW5hZ2VyX3NlcnZlcl9tYW5hZ2VyKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogUmVhZCB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyBBTkQgc2VydmVyIG1hbmFnZXJfaWRzIiIiCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIk1hbmFnZXIgSmV0IE1hbmFnZXIiLAogICAgICAgICAgICAibWFuYWdlcl9qZXRfbWFuYWdlciIsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnNlYXJjaChbKCJpZCIsICI9IiwgamV0LmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgamV0LAogICAgICAgICAgICByZWNvcmRzLAogICAgICAgICAgICAiTWFuYWdlciBzaG91bGQgcmVhZCB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyBBTkQgc2VydmVyIG1hbmFnZXJfaWRzIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl9yZWFkX2FjY2Vzc19qZXRfdXNlcl9zZXJ2ZXJfbWFuYWdlcihzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IFJlYWQgd2hlbiBpbiBqZXQgdXNlcl9pZHMgQU5EIHNlcnZlciBtYW5hZ2VyX2lkcyIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJNYW5hZ2VyIEpldCBVc2VyIFNlcnZlciBNYW5hZ2VyIiwKICAgICAgICAgICAgIm1hbmFnZXJfamV0X3VzZXJfc2VydmVyX21hbmFnZXIiLAogICAgICAgICAgICB1c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGpldC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIGpldCwKICAgICAgICAgICAgcmVjb3JkcywKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIHJlYWQgd2hlbiBpbiBqZXQgdXNlcl9pZHMgQU5EIHNlcnZlciBtYW5hZ2VyX2lkcyIsCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfcmVhZF9hY2Nlc3NfamV0X21hbmFnZXJfc2VydmVyX3VzZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBSZWFkIHdoZW4gaW4gamV0IG1hbmFnZXJfaWRzIEFORCBzZXJ2ZXIgdXNlcl9pZHMiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiTWFuYWdlciBKZXQgTWFuYWdlciBTZXJ2ZXIgVXNlciIsCiAgICAgICAgICAgICJtYW5hZ2VyX2pldF9tYW5hZ2VyX3NlcnZlcl91c2VyIiwKICAgICAgICAgICAgbWFuYWdlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBqZXQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBqZXQsCiAgICAgICAgICAgIHJlY29yZHMsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCByZWFkIHdoZW4gaW4gamV0IG1hbmFnZXJfaWRzIEFORCBzZXJ2ZXIgdXNlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX2pldF9vbmx5KHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gcmVhZCB3aGVuIGluIGpldCBidXQgTk9UIGluIHNlcnZlciIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJNYW5hZ2VyIEpldCBObyBTZXJ2ZXIiLAogICAgICAgICAgICAibWFuYWdlcl9qZXRfbm9fc2VydmVyIiwKICAgICAgICAgICAgdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBzZXJ2ZXJfbWFuYWdlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgKQoKICAgICAgICByZWNvcmRzID0gc2VsZi5KZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuc2VhcmNoKFsoImlkIiwgIj0iLCBqZXQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBub3QgcmVhZCB3aGVuIG5vdCBpbiBzZXJ2ZXIgdXNlcl9pZHMgb3IgbWFuYWdlcl9pZHMiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3JlYWRfbm9fYWNjZXNzX3NlcnZlcl9vbmx5KHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gcmVhZCB3aGVuIGluIHNlcnZlciBidXQgTk9UIGluIGpldCIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJNYW5hZ2VyIFNlcnZlciBObyBKZXQiLAogICAgICAgICAgICAibWFuYWdlcl9zZXJ2ZXJfbm9famV0IiwKICAgICAgICAgICAgdXNlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNSwgMCwgMCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICApCgogICAgICAgIHJlY29yZHMgPSBzZWxmLkpldC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS5zZWFyY2goWygiaWQiLCAiPSIsIGpldC5pZCldKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihyZWNvcmRzKSwKICAgICAgICAgICAgMCwKICAgICAgICAgICAgIk1hbmFnZXIgc2hvdWxkIG5vdCByZWFkIHdoZW4gbm90IGluIGpldCB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcyIsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYW5hZ2VyIFdyaXRlL0NyZWF0ZSBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfd3JpdGVfYWNjZXNzX2pldF9tYW5hZ2VyX3NlcnZlcl91c2VyKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogV3JpdGUgd2hlbiBpbiBqZXQgbWFuYWdlcl9pZHMgQU5EIHNlcnZlciB1c2VyX2lkcyIiIgogICAgICAgIGpldCA9IHNlbGYuX2NyZWF0ZV9qZXQoCiAgICAgICAgICAgICJNYW5hZ2VyIFdyaXRlIEpldCIsCiAgICAgICAgICAgICJtYW5hZ2VyX3dyaXRlX2pldCIsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBqZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQgTmFtZSJ9KQogICAgICAgICAgICBqZXQuaW52YWxpZGF0ZV9yZWNvcmRzZXQoKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgamV0Lm5hbWUsICJVcGRhdGVkIE5hbWUiLCAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byB1cGRhdGUiCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSB3aGVuIGluIGpldCIKICAgICAgICAgICAgICAgICIgbWFuYWdlcl9pZHMgQU5EIHNlcnZlciB1c2VyX2lkcy4iLAogICAgICAgICAgICApCgogICAgZGVmIHRlc3RfbWFuYWdlcl93cml0ZV9hY2Nlc3NfamV0X21hbmFnZXJfc2VydmVyX21hbmFnZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBXcml0ZSB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyBBTkQgc2VydmVyIG1hbmFnZXJfaWRzIiIiCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIk1hbmFnZXIgV3JpdGUgSmV0IE1hbmFnZXIiLAogICAgICAgICAgICAibWFuYWdlcl93cml0ZV9qZXRfbWFuYWdlciIsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl9tYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgdHJ5OgogICAgICAgICAgICBqZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJuYW1lIjogIlVwZGF0ZWQifSkKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgKICAgICAgICAgICAgICAgICJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIHdyaXRlIHdoZW4gaW4gamV0IgogICAgICAgICAgICAgICAgIiBtYW5hZ2VyX2lkcyBBTkQgc2VydmVyIG1hbmFnZXJfaWRzLiIsCiAgICAgICAgICAgICkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3dyaXRlX2ZvcmJpZGRlbl9ub3RfaW5famV0X21hbmFnZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gd3JpdGUgd2hlbiBOT1QgaW4gamV0IG1hbmFnZXJfaWRzIiIiCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIk1hbmFnZXIgTm8gV3JpdGUgSmV0IiwKICAgICAgICAgICAgIm1hbmFnZXJfbm9fd3JpdGVfamV0IiwKICAgICAgICAgICAgdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwgICMgT25seSBpbiB1c2VyX2lkcywgbm90IG1hbmFnZXJfaWRzCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICkKCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBY2Nlc3NFcnJvcik6CiAgICAgICAgICAgIGpldC53aXRoX3VzZXIoc2VsZi5tYW5hZ2VyKS53cml0ZSh7Im5hbWUiOiAiU2hvdWxkIEZhaWwifSkKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX3dyaXRlX2ZvcmJpZGRlbl9ub3RfaW5fc2VydmVyKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogTm8gd3JpdGUgd2hlbiBpbiBqZXQgbWFuYWdlcl9pZHMgYnV0IE5PVCBpbiBzZXJ2ZXIiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiTWFuYWdlciBObyBXcml0ZSBTZXJ2ZXIiLAogICAgICAgICAgICAibWFuYWdlcl9ub193cml0ZV9zZXJ2ZXIiLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgICAgIHNlcnZlcl9tYW5hZ2VyX2lkcz1bKDUsIDAsIDApXSwKICAgICAgICApCgogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBqZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikud3JpdGUoeyJuYW1lIjogIlNob3VsZCBGYWlsIn0pCgogICAgZGVmIHRlc3RfbWFuYWdlcl9jcmVhdGVfYWNjZXNzKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgTWFuYWdlcjoKICAgICAgICBDcmVhdGUgd2hlbiBpbiBqZXQgbWFuYWdlcl9pZHMgQU5EIHNlcnZlciB1c2VyX2lkcyBvciBtYW5hZ2VyX2lkcy4KICAgICAgICAiIiIKICAgICAgICAjIENyZWF0ZSB3aXRoIG1hbmFnZXIgaW4gamV0IG1hbmFnZXJfaWRzIGFuZCBzZXJ2ZXIgdXNlcl9pZHMgLSBzaG91bGQgc3VjY2VlZAogICAgICAgIHRyeToKICAgICAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgICAgICJDcmVhdGUgU3VjY2VzcyIsCiAgICAgICAgICAgICAgICAiY3JlYXRlX3N1Y2Nlc3MiLAogICAgICAgICAgICAgICAgdXNlcl9pZHM9Wyg1LCAwLCAwKV0sCiAgICAgICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICAgICAgc2VydmVyX3VzZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgICAgICB3aXRoX3VzZXI9c2VsZi5tYW5hZ2VyLAogICAgICAgICAgICApCiAgICAgICAgICAgIHJlY29yZHMgPSBzZWxmLkpldC5zZWFyY2goWygiaWQiLCAiPSIsIGpldC5pZCldKQogICAgICAgICAgICBzZWxmLmFzc2VydEluKGpldCwgcmVjb3JkcywgIk1hbmFnZXIgc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIikKICAgICAgICBleGNlcHQgQWNjZXNzRXJyb3I6CiAgICAgICAgICAgIHNlbGYuZmFpbCgiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgd2hlbiBpbiBqZXQgbWFuYWdlcl9pZHMiKQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfY3JlYXRlX2ZvcmJpZGRlbl9ub3RfaW5fbWFuYWdlcl9pZHMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBDYW5ub3QgY3JlYXRlIHdoZW4gbm90IGluIGpldCBtYW5hZ2VyX2lkcyIiIgogICAgICAgICMgQ29uZmlndXJlIHNlcnZlciBhY2Nlc3MgZmlyc3QgKHJlcXVpcmVkLCBidXQgamV0IG1hbmFnZXJfaWRzIGNoZWNrIHdpbGwgZmFpbCkKICAgICAgICBzZWxmLnNlcnZlcl90ZXN0XzEud3JpdGUoeyJ1c2VyX2lkcyI6IFsoNCwgc2VsZi5tYW5hZ2VyLmlkKV19KQoKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgc2VsZi5KZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikuY3JlYXRlKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNyZWF0ZSBGYWlsIiwKICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImNyZWF0ZV9mYWlsIiwKICAgICAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgICAgICJ1c2VyX2lkcyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgKDQsIHNlbGYubWFuYWdlci5pZCkKICAgICAgICAgICAgICAgICAgICBdLCAgIyBPbmx5IHVzZXJfaWRzLCBub3QgbWFuYWdlcl9pZHMKICAgICAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBNYW5hZ2VyIERlbGV0ZSBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X21hbmFnZXJfZGVsZXRlX293bl9yZWNvcmQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBNYW5hZ2VyOiBEZWxldGUgb3duIHJlY29yZCB3aGVuIGluIGpldCBtYW5hZ2VyX2lkcyBBTkQgc2VydmVyIiIiCiAgICAgICAgIyBDcmVhdGUgYXMgbWFuYWdlciB0byBlbnN1cmUgY3JlYXRlX3VpZCBpcyBzZXQgY29ycmVjdGx5CiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIk15IEpldCIsCiAgICAgICAgICAgICJteV9qZXQiLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgd2l0aF91c2VyPXNlbGYubWFuYWdlciwKICAgICAgICApCiAgICAgICAgIyBKZXQgaXMgZGVsZXRhYmxlIGJ5IGRlZmF1bHQsIHNvIG1hbmFnZXIgY2FuIGRlbGV0ZSBpdAogICAgICAgIHRyeToKICAgICAgICAgICAgamV0LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCiAgICAgICAgICAgIHJlY29yZHMgPSBzZWxmLkpldC5zZWFyY2goWygiaWQiLCAiPSIsIGpldC5pZCldKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbGVuKHJlY29yZHMpLCAwLCAiTWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBkZWxldGUgb3duIHJlY29yZCIKICAgICAgICAgICAgKQogICAgICAgIGV4Y2VwdCBBY2Nlc3NFcnJvcjoKICAgICAgICAgICAgc2VsZi5mYWlsKCJNYW5hZ2VyIHNob3VsZCBiZSBhYmxlIHRvIGRlbGV0ZSBvd24gcmVjb3JkIikKCiAgICBkZWYgdGVzdF9tYW5hZ2VyX2RlbGV0ZV9ub3RfY3JlYXRvcihzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBkZWxldGUgcmVjb3JkIGNyZWF0ZWQgYnkgYW5vdGhlciB1c2VyIiIiCiAgICAgICAgamV0ID0gc2VsZi5fY3JlYXRlX2pldCgKICAgICAgICAgICAgIk90aGVyJ3MgSmV0IiwKICAgICAgICAgICAgIm90aGVyc19qZXQiLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCksICg0LCBzZWxmLm1hbmFnZXIyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCksICg0LCBzZWxmLm1hbmFnZXIyLmlkKV0sCiAgICAgICAgICAgIHdpdGhfdXNlcj1zZWxmLm1hbmFnZXIyLAogICAgICAgICkKCiAgICAgICAgIyBNYW5hZ2VyMSBjYW5ub3QgZGVsZXRlIE1hbmFnZXIyJ3MgcmVjb3JkCiAgICAgICAgIyBKZXQgaXMgZGVsZXRhYmxlIGJ5IGRlZmF1bHQsIHNvIHRoaXMgdGVzdHMgYWNjZXNzIGNvbnRyb2wKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgamV0LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9kZWxldGVfbm90X2luX21hbmFnZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgTWFuYWdlcjogQ2Fubm90IGRlbGV0ZSB3aGVuIG5vdCBpbiBqZXQgbWFuYWdlcl9pZHMiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiUmVtb3ZlZCBNYW5hZ2VyIiwKICAgICAgICAgICAgInJlbW92ZWRfbWFuYWdlciIsCiAgICAgICAgICAgIG1hbmFnZXJfaWRzPVsoNCwgc2VsZi5tYW5hZ2VyLmlkKV0sCiAgICAgICAgICAgIHNlcnZlcl91c2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICB3aXRoX3VzZXI9c2VsZi5tYW5hZ2VyLAogICAgICAgICkKICAgICAgICAjIFJlbW92ZSBmcm9tIG1hbmFnZXJfaWRzCiAgICAgICAgamV0LndyaXRlKHsibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXX0pCgogICAgICAgICMgQ2Fubm90IGRlbGV0ZSBhbnltb3JlCiAgICAgICAgIyBKZXQgaXMgZGVsZXRhYmxlIGJ5IGRlZmF1bHQsIHNvIHRoaXMgdGVzdHMgYWNjZXNzIGNvbnRyb2wKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFjY2Vzc0Vycm9yKToKICAgICAgICAgICAgamV0LndpdGhfdXNlcihzZWxmLm1hbmFnZXIpLnVubGluaygpCgogICAgZGVmIHRlc3RfbWFuYWdlcl9kZWxldGVfbm90X2luX3NlcnZlcihzZWxmKToKICAgICAgICAiIiJUZXN0IE1hbmFnZXI6IENhbm5vdCBkZWxldGUgd2hlbiBpbiBqZXQgbWFuYWdlcl9pZHMgYnV0IE5PVCBpbiBzZXJ2ZXIiIiIKICAgICAgICBqZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiTWFuYWdlciBKZXQiLAogICAgICAgICAgICAibWFuYWdlcl9qZXQiLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgd2l0aF91c2VyPXNlbGYubWFuYWdlciwKICAgICAgICApCiAgICAgICAgIyBSZW1vdmUgc2VydmVyIGFjY2VzcwogICAgICAgIHNlbGYuc2VydmVyX3Rlc3RfMS53cml0ZSh7InVzZXJfaWRzIjogWyg1LCAwLCAwKV0sICJtYW5hZ2VyX2lkcyI6IFsoNSwgMCwgMCldfSkKCiAgICAgICAgIyBDYW5ub3QgZGVsZXRlIGFueW1vcmUKICAgICAgICAjIEpldCBpcyBkZWxldGFibGUgYnkgZGVmYXVsdCwgc28gdGhpcyB0ZXN0cyBhY2Nlc3MgY29udHJvbAogICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQWNjZXNzRXJyb3IpOgogICAgICAgICAgICBqZXQud2l0aF91c2VyKHNlbGYubWFuYWdlcikudW5saW5rKCkKCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KICAgICMgUm9vdCBBY2Nlc3MgVGVzdHMKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X3Jvb3RfZnVsbF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBSb290OiBGdWxsIENSVUQgYWNjZXNzIHJlZ2FyZGxlc3Mgb2YgYWNjZXNzIHJlc3RyaWN0aW9ucyIiIgogICAgICAgICMgVGVzdCBSb290IGNhbiBjcmVhdGUKICAgICAgICBqZXQgPSBzZWxmLkpldC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlJvb3QgSmV0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAicm9vdF9qZXQiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VsZi5zZXJ2ZXJfdGVzdF8xLmlkLAogICAgICAgICAgICAgICAgInVzZXJfaWRzIjogWyg1LCAwLCAwKV0sCiAgICAgICAgICAgICAgICAibWFuYWdlcl9pZHMiOiBbKDUsIDAsIDApXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBSb290IGNhbiByZWFkCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0LnNlYXJjaChbKCJpZCIsICI9IiwgamV0LmlkKV0pCiAgICAgICAgc2VsZi5hc3NlcnRJbihqZXQsIHJlY29yZHMsICJSb290IHNob3VsZCBiZSBhYmxlIHRvIHJlYWQiKQoKICAgICAgICAjIFJvb3QgY2FuIHdyaXRlCiAgICAgICAgamV0LndyaXRlKHsibmFtZSI6ICJSb290IFVwZGF0ZWQgSmV0In0pCiAgICAgICAgamV0LmludmFsaWRhdGVfcmVjb3Jkc2V0KCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpldC5uYW1lLCAiUm9vdCBVcGRhdGVkIEpldCIsICJSb290IHNob3VsZCBiZSBhYmxlIHRvIHVwZGF0ZSIpCgogICAgICAgICMgVGVzdCBSb290IGNhbiBkZWxldGUgcmVjb3JkcyBjcmVhdGVkIGJ5IG90aGVyIHVzZXJzCiAgICAgICAgbWFuYWdlcl9qZXQgPSBzZWxmLl9jcmVhdGVfamV0KAogICAgICAgICAgICAiTWFuYWdlcidzIEpldCIsCiAgICAgICAgICAgICJtYW5hZ2Vyc19qZXQiLAogICAgICAgICAgICBtYW5hZ2VyX2lkcz1bKDQsIHNlbGYubWFuYWdlci5pZCldLAogICAgICAgICAgICBzZXJ2ZXJfdXNlcl9pZHM9Wyg0LCBzZWxmLm1hbmFnZXIuaWQpXSwKICAgICAgICAgICAgd2l0aF91c2VyPXNlbGYubWFuYWdlciwKICAgICAgICApCiAgICAgICAgIyBKZXQgaXMgZGVsZXRhYmxlIGJ5IGRlZmF1bHQsIHNvIHJvb3QgY2FuIGRlbGV0ZSBpdAogICAgICAgIG1hbmFnZXJfamV0LnVubGluaygpCiAgICAgICAgcmVjb3JkcyA9IHNlbGYuSmV0LnNlYXJjaChbKCJpZCIsICI9IiwgbWFuYWdlcl9qZXQuaWQpXSkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4ocmVjb3JkcyksIDAsICJSb290IHNob3VsZCBiZSBhYmxlIHRvIGRlbGV0ZSByZWNvcmRzIGZyb20gYW55IGNyZWF0b3IiCiAgICAgICAgKQo= |