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

1 line
87 KiB
Python

IyBDb3B5cmlnaHQgKEMpIDIwMjUgQ2V0bWl4IE/DnAojIExpY2Vuc2UgQUdQTC0zLjAgb3IgbGF0ZXIgKGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsKS4KCmZyb20gdW5pdHRlc3QubW9jayBpbXBvcnQgcGF0Y2gKCmZyb20gb2Rvby5leGNlcHRpb25zIGltcG9ydCBWYWxpZGF0aW9uRXJyb3IKCmZyb20gLmNvbW1vbl9qZXRzIGltcG9ydCBUZXN0VG93ZXJKZXRzQ29tbW9uCgoKY2xhc3MgVGVzdFRvd2VySmV0VGVtcGxhdGVJbnN0YWxsKFRlc3RUb3dlckpldHNDb21tb24pOgogICAgIiIiCiAgICBUZXN0IHRoZSBjeC50b3dlci5qZXQudGVtcGxhdGUuaW5zdGFsbCBtb2RlbCBtZXRob2RzCiAgICAiIiIKCiAgICBAY2xhc3NtZXRob2QKICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CiAgICAgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKCiAgICAgICAgIyBDcmVhdGUgYWRkaXRpb25hbCBzZXJ2ZXJzIGZvciB0ZXN0aW5nCiAgICAgICAgY2xzLnNlcnZlcl90ZXN0XzIgPSBjbHMuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyXzIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgICAgICAib3NfaWQiOiBjbHMub3NfZGViaWFuXzEwLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQogICAgICAgIGNscy5zZXJ2ZXJfdGVzdF8zID0gY2xzLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIDMiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3NlcnZlcl8zIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjE5Mi4xNjguMS4xMDMiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICAgICAgIm9zX2lkIjogY2xzLm9zX2RlYmlhbl8xMC5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICBkZWYgdGVzdF91bmluc3RhbGxfY3JlYXRlc19pbnN0YWxsX3JlY29yZChzZWxmKToKICAgICAgICAiIiJUZXN0IHRoYXQgdW5pbnN0YWxsIGNyZWF0ZXMgYSBuZXcgaW5zdGFsbCByZWNvcmQgd2l0aCBjb3JyZWN0IGRhdGEiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QKCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSByZWNvcmQgdG8gc2F0aXNmeSBlbnN1cmVfb25lKCkKICAgICAgICAjIE5vdGU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBlbnN1cmVfb25lKCkgaW4gQGFwaS5tb2RlbCBtZXRob2QKICAgICAgICBkdW1teV9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgdW5pbnN0YWxsIG9uIHRoZSBkdW1teSByZWNvcmQKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3RlbXBsYXRlX2luc3RhbGwiCiAgICAgICAgICAgICIuQ3hUb3dlckpldFRlbXBsYXRlSW5zdGFsbC5fcHJvY2Vzc19pbnN0YWxsIgogICAgICAgICkgYXMgbW9ja19wcm9jZXNzOgogICAgICAgICAgICBpbnN0YWxsX3JlY29yZCA9IGR1bW15X3JlY29yZC51bmluc3RhbGwoc2VydmVyLCB0ZW1wbGF0ZSkKCiAgICAgICAgICAgICMgVmVyaWZ5IGluc3RhbGwgcmVjb3JkIHdhcyBjcmVhdGVkCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnN0YWxsX3JlY29yZCwgIlNob3VsZCByZXR1cm4gYW4gaW5zdGFsbCByZWNvcmQiKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuamV0X3RlbXBsYXRlX2lkLAogICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAiSW5zdGFsbCByZWNvcmQgc2hvdWxkIHJlZmVyZW5jZSB0aGUgdGVtcGxhdGUiLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlY29yZC5zZXJ2ZXJfaWQsCiAgICAgICAgICAgICAgICBzZXJ2ZXIsCiAgICAgICAgICAgICAgICAiSW5zdGFsbCByZWNvcmQgc2hvdWxkIHJlZmVyZW5jZSB0aGUgc2VydmVyIiwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuYWN0aW9uLAogICAgICAgICAgICAgICAgInVuaW5zdGFsbCIsCiAgICAgICAgICAgICAgICAiSW5zdGFsbCByZWNvcmQgYWN0aW9uIHNob3VsZCBiZSAndW5pbnN0YWxsJyIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLnN0YXRlLAogICAgICAgICAgICAgICAgInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgIkluc3RhbGwgcmVjb3JkIHN0YXRlIHNob3VsZCBiZSAncHJvY2Vzc2luZyciLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIFZlcmlmeSBsaW5lX2lkcyBjb250YWlucyBvbmx5IHRoZSB0ZW1wbGF0ZSAobm8gZGVwZW5kZW5jaWVzKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbGVuKGluc3RhbGxfcmVjb3JkLmxpbmVfaWRzKSwKICAgICAgICAgICAgICAgIDEsCiAgICAgICAgICAgICAgICAiU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgbGluZSBmb3IgdW5pbnN0YWxsIiwKICAgICAgICAgICAgKQogICAgICAgICAgICBsaW5lID0gaW5zdGFsbF9yZWNvcmQubGluZV9pZHNbMF0KICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGxpbmUuamV0X3RlbXBsYXRlX2lkLAogICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAiTGluZSBzaG91bGQgcmVmZXJlbmNlIHRoZSB0ZW1wbGF0ZSIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLm9yZGVyLCAwLCAiTGluZSBvcmRlciBzaG91bGQgYmUgMCIpCgogICAgICAgICAgICAjIFZlcmlmeSBfcHJvY2Vzc19pbnN0YWxsIHdhcyBjYWxsZWQKICAgICAgICAgICAgbW9ja19wcm9jZXNzLmFzc2VydF9jYWxsZWRfb25jZSgpCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2NyZWF0ZXNfbm90aWZpY2F0aW9uKHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCB1bmluc3RhbGwgc2VuZHMgYSBub3RpZmljYXRpb24gdG8gdGhlIHVzZXIiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QKCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSByZWNvcmQgdG8gc2F0aXNmeSBlbnN1cmVfb25lKCkKICAgICAgICBkdW1teV9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIE1vY2sgbm90aWZ5X2luZm8gdG8gdmVyaWZ5IGl0J3MgY2FsbGVkCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3Qoc2VsZi5lbnYudXNlci5fX2NsYXNzX18sICJub3RpZnlfaW5mbyIpIGFzIG1vY2tfbm90aWZ5LCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsIgogICAgICAgICAgICAiLkN4VG93ZXJKZXRUZW1wbGF0ZUluc3RhbGwuX3Byb2Nlc3NfaW5zdGFsbCIKICAgICAgICApOgogICAgICAgICAgICBkdW1teV9yZWNvcmQudW5pbnN0YWxsKHNlcnZlciwgdGVtcGxhdGUpCgogICAgICAgICAgICAjIFZlcmlmeSBub3RpZnlfaW5mbyB3YXMgY2FsbGVkCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19ub3RpZnkuY2FsbF9jb3VudCwgMSwgIlNob3VsZCBjYWxsIG5vdGlmeV9pbmZvIG9uY2UiKQoKICAgICAgICAgICAgIyBWZXJpZnkgbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgY2FsbF9hcmdzID0gbW9ja19ub3RpZnkuY2FsbF9hcmdzCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1lc3NhZ2UiLCBjYWxsX2FyZ3Mua3dhcmdzLCAiU2hvdWxkIGhhdmUgbWVzc2FnZSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInRpdGxlIiwgY2FsbF9hcmdzLmt3YXJncywgIlNob3VsZCBoYXZlIHRpdGxlIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGNhbGxfYXJncy5rd2FyZ3NbInRpdGxlIl0sCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5uYW1lLAogICAgICAgICAgICAgICAgIk5vdGlmaWNhdGlvbiB0aXRsZSBzaG91bGQgYmUgdGVtcGxhdGUgbmFtZSIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGNhbGxfYXJncy5rd2FyZ3NbInN0aWNreSJdLAogICAgICAgICAgICAgICAgRmFsc2UsCiAgICAgICAgICAgICAgICAiTm90aWZpY2F0aW9uIHNob3VsZCBub3QgYmUgc3RpY2t5IiwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhY3Rpb24iLCBjYWxsX2FyZ3Mua3dhcmdzLCAiU2hvdWxkIGhhdmUgYWN0aW9uIikKCiAgICBkZWYgdGVzdF91bmluc3RhbGxfZGlmZmVyZW50X3RlbXBsYXRlKHNlbGYpOgogICAgICAgICIiIlRlc3QgdW5pbnN0YWxsIHdpdGggYSBkaWZmZXJlbnQgdGVtcGxhdGUiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX29kb28KCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSByZWNvcmQgdG8gc2F0aXNmeSBlbnN1cmVfb25lKCkKICAgICAgICBkdW1teV9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAiaW5zdGFsbCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHdpdGggcGF0Y2goCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfdGVtcGxhdGVfaW5zdGFsbCIKICAgICAgICAgICAgIi5DeFRvd2VySmV0VGVtcGxhdGVJbnN0YWxsLl9wcm9jZXNzX2luc3RhbGwiCiAgICAgICAgKToKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBkdW1teV9yZWNvcmQudW5pbnN0YWxsKHNlcnZlciwgdGVtcGxhdGUpCgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuamV0X3RlbXBsYXRlX2lkLAogICAgICAgICAgICAgICAgdGVtcGxhdGUsCiAgICAgICAgICAgICAgICAiU2hvdWxkIHVuaW5zdGFsbCB0aGUgc3BlY2lmaWVkIHRlbXBsYXRlIiwKICAgICAgICAgICAgKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuc2VydmVyX2lkLAogICAgICAgICAgICAgICAgc2VydmVyLAogICAgICAgICAgICAgICAgIlNob3VsZCB1bmluc3RhbGwgb24gdGhlIHNwZWNpZmllZCBzZXJ2ZXIiLAogICAgICAgICAgICApCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2RpZmZlcmVudF9zZXJ2ZXIoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1bmluc3RhbGwgd2l0aCBhIGRpZmZlcmVudCBzZXJ2ZXIiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzIKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QKCiAgICAgICAgIyBDcmVhdGUgYSBkdW1teSByZWNvcmQgdG8gc2F0aXNmeSBlbnN1cmVfb25lKCkKICAgICAgICBkdW1teV9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZWxmLnNlcnZlcl90ZXN0XzEuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3RlbXBsYXRlX2luc3RhbGwiCiAgICAgICAgICAgICIuQ3hUb3dlckpldFRlbXBsYXRlSW5zdGFsbC5fcHJvY2Vzc19pbnN0YWxsIgogICAgICAgICk6CiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkID0gZHVtbXlfcmVjb3JkLnVuaW5zdGFsbChzZXJ2ZXIsIHRlbXBsYXRlKQoKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLnNlcnZlcl9pZCwKICAgICAgICAgICAgICAgIHNlcnZlciwKICAgICAgICAgICAgICAgICJTaG91bGQgdW5pbnN0YWxsIG9uIHRoZSBzcGVjaWZpZWQgc2VydmVyIiwKICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VuaW5zdGFsbF9yZW1vdmVzX3RlbXBsYXRlX2Zyb21fc2VydmVyX2lkcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHRoYXQgc3VjY2Vzc2Z1bCB1bmluc3RhbGxhdGlvbiByZW1vdmVzIHRlbXBsYXRlIGZyb20gc2VydmVyX2lkcyIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIEZpcnN0LCBhZGQgdGVtcGxhdGUgdG8gc2VydmVyX2lkcyB0byBzaW11bGF0ZSBpbnN0YWxsZWQgc3RhdGUKICAgICAgICB0ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKICAgICAgICBzZWxmLmFzc2VydEluKAogICAgICAgICAgICBzZXJ2ZXIuaWQsCiAgICAgICAgICAgIHRlbXBsYXRlLnNlcnZlcl9pZHMuaWRzLAogICAgICAgICAgICAiVGVtcGxhdGUgc2hvdWxkIGJlIGluIHNlcnZlcl9pZHMgYmVmb3JlIHVuaW5zdGFsbCIsCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSB1bmluc3RhbGwgcmVjb3JkCiAgICAgICAgdW5pbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJhY3Rpb24iOiAidW5pbnN0YWxsIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsoMCwgMCwgeyJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwgIm9yZGVyIjogMH0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBQcm9jZXNzIHVuaW5zdGFsbGF0aW9uICh3aXRob3V0IGZsaWdodCBwbGFuIC0gZGlyZWN0IGNvbXBsZXRpb24pCiAgICAgICAgIyBUaGlzIHNpbXVsYXRlcyB0aGUgY2FzZSB3aGVyZSB0aGVyZSdzIG5vIGZsaWdodCBwbGFuCiAgICAgICAgdW5pbnN0YWxsX3JlY29yZC5saW5lX2lkc1swXS53cml0ZSh7InN0YXRlIjogInRvX3Byb2Nlc3MifSkKICAgICAgICB1bmluc3RhbGxfcmVjb3JkLndpdGhfY29udGV4dChjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUpLl9wcm9jZXNzX2luc3RhbGwoKQoKICAgICAgICAjIFZlcmlmeSB0ZW1wbGF0ZSB3YXMgcmVtb3ZlZCBmcm9tIHNlcnZlcl9pZHMKICAgICAgICB0ZW1wbGF0ZS5pbnZhbGlkYXRlX3JlY29yZHNldChbInNlcnZlcl9pZHMiXSkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBzZXJ2ZXIuaWQsCiAgICAgICAgICAgIHRlbXBsYXRlLnNlcnZlcl9pZHMuaWRzLAogICAgICAgICAgICAiVGVtcGxhdGUgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBzZXJ2ZXJfaWRzIGFmdGVyIHN1Y2Nlc3NmdWwgdW5pbnN0YWxsIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2RvZXNfbm90X3JlbW92ZV90ZW1wbGF0ZV9vbl9mYWlsdXJlKHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCB0ZW1wbGF0ZSBpcyBub3QgcmVtb3ZlZCBmcm9tIHNlcnZlcl9pZHMgaWYgdW5pbnN0YWxsYXRpb24gZmFpbHMiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QKCiAgICAgICAgIyBGaXJzdCwgYWRkIHRlbXBsYXRlIHRvIHNlcnZlcl9pZHMgdG8gc2ltdWxhdGUgaW5zdGFsbGVkIHN0YXRlCiAgICAgICAgdGVtcGxhdGUud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWyg0LCBzZXJ2ZXIuaWQpXX0pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VydmVyLmlkLAogICAgICAgICAgICB0ZW1wbGF0ZS5zZXJ2ZXJfaWRzLmlkcywKICAgICAgICAgICAgIlRlbXBsYXRlIHNob3VsZCBiZSBpbiBzZXJ2ZXJfaWRzIGJlZm9yZSB1bmluc3RhbGwiLAogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgdW5pbnN0YWxsIHJlY29yZCB3aXRoIGEgbGluZQogICAgICAgIHVuaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogInVuaW5zdGFsbCIsCiAgICAgICAgICAgICAgICAibGluZV9pZHMiOiBbKDAsIDAsIHsiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsICJvcmRlciI6IDB9KV0sCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgU2V0IGN1cnJlbnRfbGluZV9pZCB0byBzaW11bGF0ZSBmbGlnaHQgcGxhbiBleGVjdXRpb24KICAgICAgICB1bmluc3RhbGxfcmVjb3JkLndyaXRlKHsiY3VycmVudF9saW5lX2lkIjogdW5pbnN0YWxsX3JlY29yZC5saW5lX2lkc1swXS5pZH0pCgogICAgICAgICMgU2ltdWxhdGUgZmxpZ2h0IHBsYW4gZmluaXNoaW5nIHdpdGggZmFpbHVyZSAoZXhpdCBjb2RlICE9IDApCiAgICAgICAgdW5pbnN0YWxsX3JlY29yZC53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKDEpCgogICAgICAgICMgVmVyaWZ5IHRlbXBsYXRlIGlzIHN0aWxsIGluIHNlcnZlcl9pZHMgKG5vdCByZW1vdmVkIG9uIGZhaWx1cmUpCiAgICAgICAgdGVtcGxhdGUuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzZXJ2ZXJfaWRzIl0pCiAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgc2VydmVyLmlkLAogICAgICAgICAgICB0ZW1wbGF0ZS5zZXJ2ZXJfaWRzLmlkcywKICAgICAgICAgICAgIlRlbXBsYXRlIHNob3VsZCByZW1haW4gaW4gc2VydmVyX2lkcyBhZnRlciB1bmluc3RhbGwgZmFpbHVyZSIsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUZXN0cyBmb3IgX2ZsaWdodF9wbGFuX2ZpbmlzaGVkCiAgICAjID09PT09PT09PT09PT09PT09PT09PT0KCiAgICBkZWYgdGVzdF9mbGlnaHRfcGxhbl9maW5pc2hlZF9zdWNjZXNzX2luc3RhbGxfYWRkc190ZW1wbGF0ZV90b19zZXJ2ZXJfaWRzKHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCBzdWNjZXNzZnVsIGluc3RhbGwgZmxpZ2h0IHBsYW4gYWRkcyB0ZW1wbGF0ZSB0byBzZXJ2ZXJfaWRzIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgRW5zdXJlIHRlbXBsYXRlIGlzIG5vdCBpbiBzZXJ2ZXJfaWRzIGluaXRpYWxseQogICAgICAgIHRlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNSwgMCwgMCldfSkKICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICBzZXJ2ZXIuaWQsCiAgICAgICAgICAgIHRlbXBsYXRlLnNlcnZlcl9pZHMuaWRzLAogICAgICAgICAgICAiVGVtcGxhdGUgc2hvdWxkIG5vdCBiZSBpbiBzZXJ2ZXJfaWRzIGJlZm9yZSBpbnN0YWxsIiwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGluc3RhbGwgcmVjb3JkIHdpdGggYSBsaW5lCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWygwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLCAib3JkZXIiOiAwfSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBjdXJyZW50X2xpbmVfaWQgdG8gc2ltdWxhdGUgZmxpZ2h0IHBsYW4gZXhlY3V0aW9uCiAgICAgICAgY3VycmVudF9saW5lID0gaW5zdGFsbF9yZWNvcmQubGluZV9pZHNbMF0KICAgICAgICBpbnN0YWxsX3JlY29yZC53cml0ZSh7ImN1cnJlbnRfbGluZV9pZCI6IGN1cnJlbnRfbGluZS5pZH0pCgogICAgICAgICMgU2ltdWxhdGUgZmxpZ2h0IHBsYW4gZmluaXNoaW5nIHN1Y2Nlc3NmdWxseSAoZXhpdCBjb2RlIDApCiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsIgogICAgICAgICAgICAiLkN4VG93ZXJKZXRUZW1wbGF0ZUluc3RhbGwuX3Byb2Nlc3NfaW5zdGFsbCIKICAgICAgICApIGFzIG1vY2tfcHJvY2VzczoKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKDApCgogICAgICAgICAgICAjIFZlcmlmeSB0ZW1wbGF0ZSB3YXMgYWRkZWQgdG8gc2VydmVyX2lkcwogICAgICAgICAgICB0ZW1wbGF0ZS5pbnZhbGlkYXRlX3JlY29yZHNldChbInNlcnZlcl9pZHMiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigKICAgICAgICAgICAgICAgIHNlcnZlci5pZCwKICAgICAgICAgICAgICAgIHRlbXBsYXRlLnNlcnZlcl9pZHMuaWRzLAogICAgICAgICAgICAgICAgIlRlbXBsYXRlIHNob3VsZCBiZSBhZGRlZCB0byBzZXJ2ZXJfaWRzIGFmdGVyIGluc3RhbGwgc3VjY2VzcyIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmVyaWZ5IGN1cnJlbnQgbGluZSB3YXMgbWFya2VkIGFzIGRvbmUgKGNoZWNrIGJlZm9yZSBjbGVhcmluZykKICAgICAgICAgICAgY3VycmVudF9saW5lLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic3RhdGUiXSkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGN1cnJlbnRfbGluZS5zdGF0ZSwKICAgICAgICAgICAgICAgICJkb25lIiwKICAgICAgICAgICAgICAgICJDdXJyZW50IGxpbmUgc2hvdWxkIGJlIG1hcmtlZCBhcyBkb25lIiwKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBWZXJpZnkgY3VycmVudF9saW5lX2lkIHdhcyBjbGVhcmVkCiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiY3VycmVudF9saW5lX2lkIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgICAgICBpbnN0YWxsX3JlY29yZC5jdXJyZW50X2xpbmVfaWQsCiAgICAgICAgICAgICAgICAiY3VycmVudF9saW5lX2lkIHNob3VsZCBiZSBjbGVhcmVkIGFmdGVyIHN1Y2Nlc3MiLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIFZlcmlmeSBfcHJvY2Vzc19pbnN0YWxsIHdhcyBjYWxsZWQgdG8gY29udGludWUgcHJvY2Vzc2luZwogICAgICAgICAgICBtb2NrX3Byb2Nlc3MuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKCiAgICBkZWYgdGVzdF9mbGlnaHRfcGxhbl9maW5pc2hlZF9zdWNjZXNzX3VuaW5zdGFsbF9yZW1vdmVzX3RlbXBsYXRlX2Zyb21fc2VydmVyX2lkcygKICAgICAgICBzZWxmLAogICAgKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHRoYXQgc3VjY2Vzc2Z1bCB1bmluc3RhbGwgZmxpZ2h0IHBsYW4KICAgICAgICByZW1vdmVzIHRlbXBsYXRlIGZyb20gc2VydmVyX2lkcwogICAgICAgICIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIEFkZCB0ZW1wbGF0ZSB0byBzZXJ2ZXJfaWRzIHRvIHNpbXVsYXRlIGluc3RhbGxlZCBzdGF0ZQogICAgICAgIHRlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNCwgc2VydmVyLmlkKV19KQogICAgICAgIHNlbGYuYXNzZXJ0SW4oCiAgICAgICAgICAgIHNlcnZlci5pZCwKICAgICAgICAgICAgdGVtcGxhdGUuc2VydmVyX2lkcy5pZHMsCiAgICAgICAgICAgICJUZW1wbGF0ZSBzaG91bGQgYmUgaW4gc2VydmVyX2lkcyBiZWZvcmUgdW5pbnN0YWxsIiwKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIHVuaW5zdGFsbCByZWNvcmQgd2l0aCBhIGxpbmUKICAgICAgICB1bmluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJ1bmluc3RhbGwiLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWygwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLCAib3JkZXIiOiAwfSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBjdXJyZW50X2xpbmVfaWQgdG8gc2ltdWxhdGUgZmxpZ2h0IHBsYW4gZXhlY3V0aW9uCiAgICAgICAgY3VycmVudF9saW5lID0gdW5pbnN0YWxsX3JlY29yZC5saW5lX2lkc1swXQogICAgICAgIHVuaW5zdGFsbF9yZWNvcmQud3JpdGUoeyJjdXJyZW50X2xpbmVfaWQiOiBjdXJyZW50X2xpbmUuaWR9KQoKICAgICAgICAjIFNpbXVsYXRlIGZsaWdodCBwbGFuIGZpbmlzaGluZyBzdWNjZXNzZnVsbHkgKGV4aXQgY29kZSAwKQogICAgICAgIHdpdGggcGF0Y2goCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfdGVtcGxhdGVfaW5zdGFsbCIKICAgICAgICAgICAgIi5DeFRvd2VySmV0VGVtcGxhdGVJbnN0YWxsLl9wcm9jZXNzX2luc3RhbGwiCiAgICAgICAgKSBhcyBtb2NrX3Byb2Nlc3M6CiAgICAgICAgICAgIHVuaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKDApCgogICAgICAgICAgICAjIFZlcmlmeSB0ZW1wbGF0ZSB3YXMgcmVtb3ZlZCBmcm9tIHNlcnZlcl9pZHMKICAgICAgICAgICAgdGVtcGxhdGUuaW52YWxpZGF0ZV9yZWNvcmRzZXQoWyJzZXJ2ZXJfaWRzIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oCiAgICAgICAgICAgICAgICBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5zZXJ2ZXJfaWRzLmlkcywKICAgICAgICAgICAgICAgICJUZW1wbGF0ZSBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHNlcnZlcl9pZHMgYWZ0ZXIgdW5pbnN0YWxsIHN1Y2Nlc3MiLAogICAgICAgICAgICApCgogICAgICAgICAgICAjIFZlcmlmeSBjdXJyZW50IGxpbmUgd2FzIG1hcmtlZCBhcyBkb25lIChjaGVjayBiZWZvcmUgY2xlYXJpbmcpCiAgICAgICAgICAgIGN1cnJlbnRfbGluZS5pbnZhbGlkYXRlX3JlY29yZHNldChbInN0YXRlIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICBjdXJyZW50X2xpbmUuc3RhdGUsCiAgICAgICAgICAgICAgICAiZG9uZSIsCiAgICAgICAgICAgICAgICAiQ3VycmVudCBsaW5lIHNob3VsZCBiZSBtYXJrZWQgYXMgZG9uZSIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmVyaWZ5IGN1cnJlbnRfbGluZV9pZCB3YXMgY2xlYXJlZAogICAgICAgICAgICB1bmluc3RhbGxfcmVjb3JkLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsiY3VycmVudF9saW5lX2lkIl0pCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgICAgICB1bmluc3RhbGxfcmVjb3JkLmN1cnJlbnRfbGluZV9pZCwKICAgICAgICAgICAgICAgICJjdXJyZW50X2xpbmVfaWQgc2hvdWxkIGJlIGNsZWFyZWQgYWZ0ZXIgc3VjY2VzcyIsCiAgICAgICAgICAgICkKCiAgICAgICAgICAgICMgVmVyaWZ5IF9wcm9jZXNzX2luc3RhbGwgd2FzIGNhbGxlZCB0byBjb250aW51ZSBwcm9jZXNzaW5nCiAgICAgICAgICAgIG1vY2tfcHJvY2Vzcy5hc3NlcnRfY2FsbGVkX29uY2UoKQoKICAgIGRlZiB0ZXN0X2ZsaWdodF9wbGFuX2ZpbmlzaGVkX2ZhaWx1cmVfbWFya3NfbGluZV9hc19mYWlsZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IGZhaWxlZCBmbGlnaHQgcGxhbiBtYXJrcyBjdXJyZW50IGxpbmUgYXMgZmFpbGVkIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgQ3JlYXRlIGluc3RhbGwgcmVjb3JkIHdpdGggYSBsaW5lCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWygwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLCAib3JkZXIiOiAwfSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBjdXJyZW50X2xpbmVfaWQgdG8gc2ltdWxhdGUgZmxpZ2h0IHBsYW4gZXhlY3V0aW9uCiAgICAgICAgY3VycmVudF9saW5lID0gaW5zdGFsbF9yZWNvcmQubGluZV9pZHNbMF0KICAgICAgICBpbnN0YWxsX3JlY29yZC53cml0ZSh7ImN1cnJlbnRfbGluZV9pZCI6IGN1cnJlbnRfbGluZS5pZH0pCgogICAgICAgICMgU2ltdWxhdGUgZmxpZ2h0IHBsYW4gZmluaXNoaW5nIHdpdGggZmFpbHVyZSAoZXhpdCBjb2RlICE9IDApCiAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZSkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKAogICAgICAgICAgICAxCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSBjdXJyZW50IGxpbmUgd2FzIG1hcmtlZCBhcyBmYWlsZWQKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBjdXJyZW50X2xpbmUuc3RhdGUsCiAgICAgICAgICAgICJmYWlsZWQiLAogICAgICAgICAgICAiQ3VycmVudCBsaW5lIHNob3VsZCBiZSBtYXJrZWQgYXMgZmFpbGVkIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGluc3RhbGwgcmVjb3JkIHN0YXRlIHdhcyBzZXQgdG8gZmFpbGVkCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuc3RhdGUsCiAgICAgICAgICAgICJmYWlsZWQiLAogICAgICAgICAgICAiSW5zdGFsbCByZWNvcmQgc3RhdGUgc2hvdWxkIGJlICdmYWlsZWQnIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGRhdGVfZG9uZSB3YXMgc2V0CiAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC5kYXRlX2RvbmUsCiAgICAgICAgICAgICJkYXRlX2RvbmUgc2hvdWxkIGJlIHNldCBvbiBmYWlsdXJlIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGN1cnJlbnRfbGluZV9pZCB3YXMgY2xlYXJlZAogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLmN1cnJlbnRfbGluZV9pZCwKICAgICAgICAgICAgImN1cnJlbnRfbGluZV9pZCBzaG91bGQgYmUgY2xlYXJlZCBhZnRlciBmYWlsdXJlIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfZmxpZ2h0X3BsYW5fZmluaXNoZWRfZmFpbHVyZV9tYXJrc19hbGxfdG9fcHJvY2Vzc19saW5lc19hc19mYWlsZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IGZhaWxlZCBmbGlnaHQgcGxhbiBtYXJrcyBhbGwgJ3RvX3Byb2Nlc3MnIGxpbmVzIGFzIGZhaWxlZCIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIHJlY29yZCB3aXRoIG11bHRpcGxlIGxpbmVzCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWwogICAgICAgICAgICAgICAgICAgICgwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLCAib3JkZXIiOiAwfSksCiAgICAgICAgICAgICAgICAgICAgKDAsIDAsIHsiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsICJvcmRlciI6IDF9KSwKICAgICAgICAgICAgICAgICAgICAoMCwgMCwgeyJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwgIm9yZGVyIjogMn0pLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgZmlyc3QgbGluZSBhcyBjdXJyZW50IGFuZCBtYXJrIG90aGVycyBhcyB0b19wcm9jZXNzCiAgICAgICAgY3VycmVudF9saW5lID0gaW5zdGFsbF9yZWNvcmQubGluZV9pZHNbMF0KICAgICAgICBvdGhlcl9saW5lcyA9IGluc3RhbGxfcmVjb3JkLmxpbmVfaWRzWzE6XQogICAgICAgIGluc3RhbGxfcmVjb3JkLndyaXRlKHsiY3VycmVudF9saW5lX2lkIjogY3VycmVudF9saW5lLmlkfSkKICAgICAgICBvdGhlcl9saW5lcy53cml0ZSh7InN0YXRlIjogInRvX3Byb2Nlc3MifSkKCiAgICAgICAgIyBTaW11bGF0ZSBmbGlnaHQgcGxhbiBmaW5pc2hpbmcgd2l0aCBmYWlsdXJlCiAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZSkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKAogICAgICAgICAgICAxCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSBhbGwgJ3RvX3Byb2Nlc3MnIGxpbmVzIHdlcmUgbWFya2VkIGFzIGZhaWxlZAogICAgICAgIGZvciBsaW5lIGluIG90aGVyX2xpbmVzOgogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbGluZS5zdGF0ZSwKICAgICAgICAgICAgICAgICJmYWlsZWQiLAogICAgICAgICAgICAgICAgIkFsbCAndG9fcHJvY2VzcycgbGluZXMgc2hvdWxkIGJlIG1hcmtlZCBhcyBmYWlsZWQiLAogICAgICAgICAgICApCgogICAgZGVmIHRlc3RfZmxpZ2h0X3BsYW5fZmluaXNoZWRfZmFpbHVyZV9zZW5kc19ub3RpZmljYXRpb24oc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IGZhaWxlZCBmbGlnaHQgcGxhbiBzZW5kcyBlcnJvciBub3RpZmljYXRpb24gd2hlbiBlbmFibGVkIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgRW5hYmxlIGVycm9yIG5vdGlmaWNhdGlvbnMKICAgICAgICBzZWxmLmVudlsiaXIuY29uZmlnX3BhcmFtZXRlciJdLnN1ZG8oKS5zZXRfcGFyYW0oCiAgICAgICAgICAgICJjZXRtaXhfdG93ZXJfc2VydmVyLm5vdGlmaWNhdGlvbl90eXBlX2Vycm9yIiwgInN0aWNreSIKICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGluc3RhbGwgcmVjb3JkIHdpdGggYSBsaW5lCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIuaWQsCiAgICAgICAgICAgICAgICAiYWN0aW9uIjogImluc3RhbGwiLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICAgICAgImxpbmVfaWRzIjogWygwLCAwLCB7ImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLCAib3JkZXIiOiAwfSldLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNldCBjdXJyZW50X2xpbmVfaWQgdG8gc2ltdWxhdGUgZmxpZ2h0IHBsYW4gZXhlY3V0aW9uCiAgICAgICAgaW5zdGFsbF9yZWNvcmQud3JpdGUoeyJjdXJyZW50X2xpbmVfaWQiOiBpbnN0YWxsX3JlY29yZC5saW5lX2lkc1swXS5pZH0pCgogICAgICAgICMgTW9jayBub3RpZnlfZGFuZ2VyIHRvIHZlcmlmeSBpdCdzIGNhbGxlZAogICAgICAgIHdpdGggcGF0Y2gub2JqZWN0KHNlbGYuZW52LnVzZXIuX19jbGFzc19fLCAibm90aWZ5X2RhbmdlciIpIGFzIG1vY2tfbm90aWZ5OgogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC53aXRoX2NvbnRleHQoCiAgICAgICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICAgICAgKS5fZmxpZ2h0X3BsYW5fZmluaXNoZWQoMSkKCiAgICAgICAgICAgICMgVmVyaWZ5IG5vdGlmeV9kYW5nZXIgd2FzIGNhbGxlZAogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgbW9ja19ub3RpZnkuY2FsbF9jb3VudCwgMSwgIlNob3VsZCBjYWxsIG5vdGlmeV9kYW5nZXIgb25jZSIKICAgICAgICAgICAgKQoKICAgICAgICAgICAgIyBWZXJpZnkgbm90aWZpY2F0aW9uIHBhcmFtZXRlcnMKICAgICAgICAgICAgY2FsbF9hcmdzID0gbW9ja19ub3RpZnkuY2FsbF9hcmdzCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1lc3NhZ2UiLCBjYWxsX2FyZ3Mua3dhcmdzLCAiU2hvdWxkIGhhdmUgbWVzc2FnZSIpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInRpdGxlIiwgY2FsbF9hcmdzLmt3YXJncywgIlNob3VsZCBoYXZlIHRpdGxlIikKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGNhbGxfYXJncy5rd2FyZ3NbInRpdGxlIl0sCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5uYW1lLAogICAgICAgICAgICAgICAgIk5vdGlmaWNhdGlvbiB0aXRsZSBzaG91bGQgYmUgdGVtcGxhdGUgbmFtZSIsCiAgICAgICAgICAgICkKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICAgIGNhbGxfYXJncy5rd2FyZ3NbInN0aWNreSJdLAogICAgICAgICAgICAgICAgVHJ1ZSwKICAgICAgICAgICAgICAgICJOb3RpZmljYXRpb24gc2hvdWxkIGJlIHN0aWNreSB3aGVuIGNvbmZpZ3VyZWQiLAogICAgICAgICAgICApCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oImFjdGlvbiIsIGNhbGxfYXJncy5rd2FyZ3MsICJTaG91bGQgaGF2ZSBhY3Rpb24iKQoKICAgIGRlZiB0ZXN0X2ZsaWdodF9wbGFuX2ZpbmlzaGVkX25vX25vdGlmaWNhdGlvbl93aGVuX2Rpc2FibGVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCBmYWlsZWQgZmxpZ2h0IHBsYW4gZG9lc24ndCBzZW5kIG5vdGlmaWNhdGlvbiB3aGVuIGRpc2FibGVkIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgRGlzYWJsZSBlcnJvciBub3RpZmljYXRpb25zCiAgICAgICAgc2VsZi5lbnZbImlyLmNvbmZpZ19wYXJhbWV0ZXIiXS5zdWRvKCkuc2V0X3BhcmFtKAogICAgICAgICAgICAiY2V0bWl4X3Rvd2VyX3NlcnZlci5ub3RpZmljYXRpb25fdHlwZV9lcnJvciIsIEZhbHNlCiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIHJlY29yZCB3aXRoIGEgbGluZQogICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJpbnN0YWxsIiwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsoMCwgMCwgeyJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwgIm9yZGVyIjogMH0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgY3VycmVudF9saW5lX2lkIHRvIHNpbXVsYXRlIGZsaWdodCBwbGFuIGV4ZWN1dGlvbgogICAgICAgIGluc3RhbGxfcmVjb3JkLndyaXRlKHsiY3VycmVudF9saW5lX2lkIjogaW5zdGFsbF9yZWNvcmQubGluZV9pZHNbMF0uaWR9KQoKICAgICAgICAjIE1vY2sgbm90aWZ5X2RhbmdlciB0byB2ZXJpZnkgaXQncyBOT1QgY2FsbGVkCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3Qoc2VsZi5lbnYudXNlci5fX2NsYXNzX18sICJub3RpZnlfZGFuZ2VyIikgYXMgbW9ja19ub3RpZnk6CiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLndpdGhfY29udGV4dCgKICAgICAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICAgICApLl9mbGlnaHRfcGxhbl9maW5pc2hlZCgxKQoKICAgICAgICAgICAgIyBWZXJpZnkgbm90aWZ5X2RhbmdlciB3YXMgTk9UIGNhbGxlZAogICAgICAgICAgICBtb2NrX25vdGlmeS5hc3NlcnRfbm90X2NhbGxlZCgpCgogICAgZGVmIHRlc3RfZmxpZ2h0X3BsYW5fZmluaXNoZWRfbm9fY3VycmVudF9saW5lX2lkX3JldHVybnNfZWFybHkoc2VsZik6CiAgICAgICAgIiIiVGVzdCB0aGF0IF9mbGlnaHRfcGxhbl9maW5pc2hlZCByZXR1cm5zIGVhcmx5IGlmIG5vIGN1cnJlbnRfbGluZV9pZCIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIHJlY29yZCB3aXRob3V0IGN1cnJlbnRfbGluZV9pZAogICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJpbnN0YWxsIiwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsoMCwgMCwgeyJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwgIm9yZGVyIjogMH0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBFbnN1cmUgY3VycmVudF9saW5lX2lkIGlzIEZhbHNlCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnN0YWxsX3JlY29yZC5jdXJyZW50X2xpbmVfaWQpCgogICAgICAgICMgTW9jayBsb2dnZXIgdG8gdmVyaWZ5IHdhcm5pbmcgaXMgbG9nZ2VkCiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsLl9sb2dnZXIud2FybmluZyIKICAgICAgICApIGFzIG1vY2tfd2FybmluZzoKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKDApCgogICAgICAgICAgICAjIFZlcmlmeSB3YXJuaW5nIHdhcyBsb2dnZWQKICAgICAgICAgICAgbW9ja193YXJuaW5nLmFzc2VydF9jYWxsZWRfb25jZSgpCgogICAgICAgICAgICAjIFZlcmlmeSB0ZW1wbGF0ZSB3YXMgbm90IG1vZGlmaWVkIChlYXJseSByZXR1cm4pCiAgICAgICAgICAgIHRlbXBsYXRlLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic2VydmVyX2lkcyJdKQogICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICAgICAgc2VydmVyLmlkLAogICAgICAgICAgICAgICAgdGVtcGxhdGUuc2VydmVyX2lkcy5pZHMsCiAgICAgICAgICAgICAgICAiVGVtcGxhdGUgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCB3aGVuIG5vIGN1cnJlbnRfbGluZV9pZCIsCiAgICAgICAgICAgICkKCiAgICBkZWYgdGVzdF9mbGlnaHRfcGxhbl9maW5pc2hlZF93cm9uZ19zdGF0ZV9yZXR1cm5zX2Vhcmx5KHNlbGYpOgogICAgICAgICIiIlRlc3QgdGhhdCBfZmxpZ2h0X3BsYW5fZmluaXNoZWQgcmV0dXJucyBlYXJseSBpZiBzdGF0ZSBpcyBub3QgJ3Byb2Nlc3NpbmcnIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgQ3JlYXRlIGluc3RhbGwgcmVjb3JkIGluICdkb25lJyBzdGF0ZQogICAgICAgIGluc3RhbGxfcmVjb3JkID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgImFjdGlvbiI6ICJpbnN0YWxsIiwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJkb25lIiwKICAgICAgICAgICAgICAgICJsaW5lX2lkcyI6IFsoMCwgMCwgeyJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwgIm9yZGVyIjogMH0pXSwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXQgY3VycmVudF9saW5lX2lkCiAgICAgICAgaW5zdGFsbF9yZWNvcmQud3JpdGUoeyJjdXJyZW50X2xpbmVfaWQiOiBpbnN0YWxsX3JlY29yZC5saW5lX2lkc1swXS5pZH0pCgogICAgICAgICMgTW9jayBsb2dnZXIgdG8gdmVyaWZ5IHdhcm5pbmcgaXMgbG9nZ2VkCiAgICAgICAgd2l0aCBwYXRjaCgKICAgICAgICAgICAgIm9kb28uYWRkb25zLmNldG1peF90b3dlcl9zZXJ2ZXIubW9kZWxzLmN4X3Rvd2VyX2pldF90ZW1wbGF0ZV9pbnN0YWxsLl9sb2dnZXIud2FybmluZyIKICAgICAgICApIGFzIG1vY2tfd2FybmluZzoKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQud2l0aF9jb250ZXh0KAogICAgICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgICAgICkuX2ZsaWdodF9wbGFuX2ZpbmlzaGVkKDApCgogICAgICAgICAgICAjIFZlcmlmeSB3YXJuaW5nIHdhcyBsb2dnZWQKICAgICAgICAgICAgbW9ja193YXJuaW5nLmFzc2VydF9jYWxsZWRfb25jZSgpCgogICAgICAgICAgICAjIFZlcmlmeSB0ZW1wbGF0ZSB3YXMgbm90IG1vZGlmaWVkIChlYXJseSByZXR1cm4pCiAgICAgICAgICAgIHRlbXBsYXRlLmludmFsaWRhdGVfcmVjb3Jkc2V0KFsic2VydmVyX2lkcyJdKQogICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKAogICAgICAgICAgICAgICAgc2VydmVyLmlkLAogICAgICAgICAgICAgICAgdGVtcGxhdGUuc2VydmVyX2lkcy5pZHMsCiAgICAgICAgICAgICAgICAiVGVtcGxhdGUgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCB3aGVuIHN0YXRlIGlzIG5vdCAncHJvY2Vzc2luZyciLAogICAgICAgICAgICApCgogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CiAgICAjIFRlc3RzIGZvciBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCAoZnJvbSBKZXRUZW1wbGF0ZSBtb2RlbCkKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfc2VydmVyX2FscmVhZHlfaW5zdGFsbGVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgX2lzX2luc3RhbGxhdGlvbl9uZWVkZWQgd2hlbiBzZXJ2ZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBDcmVhdGUgYSBzZXJ2ZXIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9zZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQWRkIHNlcnZlciB0byB0ZW1wbGF0ZSdzIGluc3RhbGxlZCBzZXJ2ZXJzCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5zZXJ2ZXJfaWRzID0gWyg0LCBzZXJ2ZXIuaWQpXQoKICAgICAgICByZXN1bHQgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0Ll9pc19pbnN0YWxsYXRpb25fbmVlZGVkKHNlcnZlcikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdCwgIlNob3VsZCByZXR1cm4gRmFsc2Ugd2hlbiBzZXJ2ZXIgaXMgYWxyZWFkeSBpbnN0YWxsZWQiKQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfaW5zdGFsbGF0aW9uX2luX3Byb2dyZXNzX3Byb2Nlc3Npbmcoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aGVuIGluc3RhbGxhdGlvbiBpcyBpbiBwcm9jZXNzaW5nIHN0YXRlIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgQ3JlYXRlIGEgc2VydmVyCiAgICAgICAgc2VydmVyID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjE5Mi4xNjguMS4xMDAiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gcmVjb3JkIGluIHByb2Nlc3Npbmcgc3RhdGUKICAgICAgICBpbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmUKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZXN1bHQgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0Ll9pc19pbnN0YWxsYXRpb25fbmVlZGVkKHNlcnZlcikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZXN1bHQsICJTaG91bGQgcmV0dXJuIEZhbHNlIHdoZW4gaW5zdGFsbGF0aW9uIGlzIGluIHByb2Nlc3Npbmcgc3RhdGUiCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfaW5zdGFsbGF0aW9uX2luX3Byb2dyZXNzX3RvX3Byb2Nlc3Moc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aGVuIGluc3RhbGxhdGlvbiBpcyBpbiB0b19wcm9jZXNzIHN0YXRlIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgQ3JlYXRlIGEgc2VydmVyCiAgICAgICAgc2VydmVyID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjE5Mi4xNjguMS4xMDAiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gcmVjb3JkIGluIHRvX3Byb2Nlc3Mgc3RhdGUKICAgICAgICBpbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmUKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInRvX3Byb2Nlc3MiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZXN1bHQgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0Ll9pc19pbnN0YWxsYXRpb25fbmVlZGVkKHNlcnZlcikKICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAogICAgICAgICAgICByZXN1bHQsICJTaG91bGQgcmV0dXJuIEZhbHNlIHdoZW4gaW5zdGFsbGF0aW9uIGlzIGluIHRvX3Byb2Nlc3Mgc3RhdGUiCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfaW5zdGFsbGF0aW9uX2NvbXBsZXRlZChzZWxmKToKICAgICAgICAiIiJUZXN0IF9pc19pbnN0YWxsYXRpb25fbmVlZGVkIHdoZW4gaW5zdGFsbGF0aW9uIGlzIGNvbXBsZXRlZCIiIgogICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKICAgICAgICAjIENyZWF0ZSBhIHNlcnZlcgogICAgICAgIHNlcnZlciA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X3NlcnZlciIsCiAgICAgICAgICAgICAgICAiaXBfdjRfYWRkcmVzcyI6ICIxOTIuMTY4LjEuMTAwIiwKICAgICAgICAgICAgICAgICJzc2hfdXNlcm5hbWUiOiAiYWRtaW4iLAogICAgICAgICAgICAgICAgInNzaF9wYXNzd29yZCI6ICJwYXNzd29yZCIsCiAgICAgICAgICAgICAgICAic3NoX2F1dGhfbW9kZSI6ICJwIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgYW4gaW5zdGFsbGF0aW9uIHJlY29yZCBpbiBpbnN0YWxsZWQgc3RhdGUKICAgICAgICBpbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmUKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICByZXN1bHQgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0Ll9pc19pbnN0YWxsYXRpb25fbmVlZGVkKHNlcnZlcikKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgIlNob3VsZCByZXR1cm4gVHJ1ZSB3aGVuIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZWQgKG5vdCBpbiBwcm9ncmVzcykiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9pc19pbnN0YWxsYXRpb25fbmVlZGVkX2luc3RhbGxhdGlvbl9mYWlsZWQoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aGVuIGluc3RhbGxhdGlvbiBmYWlsZWQiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBDcmVhdGUgYSBzZXJ2ZXIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9zZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiByZWNvcmQgaW4gZmFpbGVkIHN0YXRlCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJmYWlsZWQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmUKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImZhaWxlZCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlc3VsdCA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuX2lzX2luc3RhbGxhdGlvbl9uZWVkZWQoc2VydmVyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUgd2hlbiBpbnN0YWxsYXRpb24gZmFpbGVkIikKCiAgICBkZWYgdGVzdF9pc19pbnN0YWxsYXRpb25fbmVlZGVkX211bHRpcGxlX2luc3RhbGxhdGlvbnMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aXRoIG11bHRpcGxlIGluc3RhbGxhdGlvbiByZWNvcmRzIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgQ3JlYXRlIGEgc2VydmVyCiAgICAgICAgc2VydmVyID0gc2VsZi5TZXJ2ZXIuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IFNlcnZlciIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyIiwKICAgICAgICAgICAgICAgICJpcF92NF9hZGRyZXNzIjogIjE5Mi4xNjguMS4xMDAiLAogICAgICAgICAgICAgICAgInNzaF91c2VybmFtZSI6ICJhZG1pbiIsCiAgICAgICAgICAgICAgICAic3NoX3Bhc3N3b3JkIjogInBhc3N3b3JkIiwKICAgICAgICAgICAgICAgICJzc2hfYXV0aF9tb2RlIjogInAiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBtdWx0aXBsZSBpbnN0YWxsYXRpb24gcmVjb3JkcwogICAgICAgIGluc3RhbGxfcmVjb3JkMSA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBpbnN0YWxsX3JlY29yZDIgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgaW5zdGFsbCBsaW5lcwogICAgICAgIHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsTGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaW5zdGFsbF9pZCI6IGluc3RhbGxfcmVjb3JkMS5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZDIuaWQsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgcmVzdWx0ID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5faXNfaW5zdGFsbGF0aW9uX25lZWRlZChzZXJ2ZXIpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVzdWx0LCAiU2hvdWxkIHJldHVybiBGYWxzZSB3aGVuIGFueSBpbnN0YWxsYXRpb24gaXMgaW4gcHJvZ3Jlc3MiCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfZGlmZmVyZW50X3NlcnZlcnMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aXRoIGRpZmZlcmVudCBzZXJ2ZXJzIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgQ3JlYXRlIHR3byBzZXJ2ZXJzCiAgICAgICAgc2VydmVyMSA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyXzEiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMSIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VydmVyMiA9IHNlbGYuU2VydmVyLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBTZXJ2ZXIgMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogInRlc3Rfc2VydmVyXzIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMiIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQWRkIHNlcnZlcjEgdG8gdGVtcGxhdGUncyBpbnN0YWxsZWQgc2VydmVycwogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Quc2VydmVyX2lkcyA9IFsoNCwgc2VydmVyMS5pZCldCgogICAgICAgICMgQ3JlYXRlIGluc3RhbGxhdGlvbiByZWNvcmQgZm9yIHNlcnZlcjIKICAgICAgICBpbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyMi5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDcmVhdGUgaW5zdGFsbCBsaW5lCiAgICAgICAgc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGxMaW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkIjogaW5zdGFsbF9yZWNvcmQuaWQsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBDaGVjayBzZXJ2ZXIxIChhbHJlYWR5IGluc3RhbGxlZCkKICAgICAgICByZXN1bHQxID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5faXNfaW5zdGFsbGF0aW9uX25lZWRlZChzZXJ2ZXIxKQogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0MSwgIlNob3VsZCByZXR1cm4gRmFsc2UgZm9yIHNlcnZlcjEgKGFscmVhZHkgaW5zdGFsbGVkKSIpCgogICAgICAgICMgQ2hlY2sgc2VydmVyMiAoaW5zdGFsbGF0aW9uIGluIHByb2dyZXNzKQogICAgICAgIHJlc3VsdDIgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0Ll9pc19pbnN0YWxsYXRpb25fbmVlZGVkKHNlcnZlcjIpCiAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgKICAgICAgICAgICAgcmVzdWx0MiwgIlNob3VsZCByZXR1cm4gRmFsc2UgZm9yIHNlcnZlcjIgKGluc3RhbGxhdGlvbiBpbiBwcm9ncmVzcykiCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2lzX2luc3RhbGxhdGlvbl9uZWVkZWRfbm9faW5zdGFsbGF0aW9ucyhzZWxmKToKICAgICAgICAiIiJUZXN0IF9pc19pbnN0YWxsYXRpb25fbmVlZGVkIHdoZW4gbm8gaW5zdGFsbGF0aW9uIHJlY29yZHMgZXhpc3QiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBDcmVhdGUgYSBzZXJ2ZXIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9zZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlc3VsdCA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuX2lzX2luc3RhbGxhdGlvbl9uZWVkZWQoc2VydmVyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQsICJTaG91bGQgcmV0dXJuIFRydWUgd2hlbiBubyBpbnN0YWxsYXRpb24gcmVjb3JkcyBleGlzdCIpCgogICAgZGVmIHRlc3RfaXNfaW5zdGFsbGF0aW9uX25lZWRlZF9taXhlZF9zdGF0ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBfaXNfaW5zdGFsbGF0aW9uX25lZWRlZCB3aXRoIG1peGVkIGluc3RhbGxhdGlvbiBzdGF0ZXMiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBDcmVhdGUgYSBzZXJ2ZXIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLlNlcnZlci5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJuYW1lIjogIlRlc3QgU2VydmVyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9zZXJ2ZXIiLAogICAgICAgICAgICAgICAgImlwX3Y0X2FkZHJlc3MiOiAiMTkyLjE2OC4xLjEwMCIsCiAgICAgICAgICAgICAgICAic3NoX3VzZXJuYW1lIjogImFkbWluIiwKICAgICAgICAgICAgICAgICJzc2hfcGFzc3dvcmQiOiAicGFzc3dvcmQiLAogICAgICAgICAgICAgICAgInNzaF9hdXRoX21vZGUiOiAicCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgICMgQ3JlYXRlIGluc3RhbGxhdGlvbiByZWNvcmRzIHdpdGggZGlmZmVyZW50IHN0YXRlcwogICAgICAgIGluc3RhbGxfcmVjb3JkMSA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImRvbmUiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICBpbnN0YWxsX3JlY29yZDIgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJmYWlsZWQiLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmVzCiAgICAgICAgc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGxMaW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkIjogaW5zdGFsbF9yZWNvcmQxLmlkLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAiZG9uZSIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsTGluZS5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaW5zdGFsbF9pZCI6IGluc3RhbGxfcmVjb3JkMi5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogImZhaWxlZCIsCiAgICAgICAgICAgIH0KICAgICAgICApCgogICAgICAgIHJlc3VsdCA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuX2lzX2luc3RhbGxhdGlvbl9uZWVkZWQoc2VydmVyKQogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgcmVzdWx0LCAiU2hvdWxkIHJldHVybiBUcnVlIHdoZW4gYWxsIGluc3RhbGxhdGlvbnMgYXJlIGNvbXBsZXRlZCBvciBmYWlsZWQiCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUZXN0cyBmb3IgaW5zdGFsbF9vbl9zZXJ2ZXJzIChmcm9tIEpldFRlbXBsYXRlIG1vZGVsKQogICAgIyA9PT09PT09PT09PT09PT09PT09PT09CgogICAgZGVmIHRlc3RfaW5zdGFsbF9vbl9zZXJ2ZXJzX25vX2RlcGVuZGVuY2llcyhzZWxmKToKICAgICAgICAiIiJUZXN0IGluc3RhbGxfb25fc2VydmVycyB3aXRoIHRlbXBsYXRlIHRoYXQgaGFzIG5vIGRlcGVuZGVuY2llcyIiIgogICAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKICAgICAgICAjIFVzZSBleGlzdGluZyBzZXJ2ZXIgZnJvbSBjb21tb24ucHkKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKCiAgICAgICAgIyBDYWxsIGluc3RhbGwgbWV0aG9kIGRpcmVjdGx5IHdpdGggY2V0bWl4X3Rvd2VyX25vX2NvbW1pdCBjb250ZXh0CiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuaW5zdGFsbF9vbl9zZXJ2ZXJzKHNlcnZlcikKCiAgICAgICAgIyBWZXJpZnkgaW5zdGFsbGF0aW9uIHJlY29yZCB3YXMgY3JlYXRlZAogICAgICAgIGluc3RhbGxfcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJqZXRfdGVtcGxhdGVfaWQiLCAiPSIsIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQpLAogICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlcnZlci5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGluc3RhbGxfcmVjb3JkcyksIDEsICJTaG91bGQgY3JlYXRlIGV4YWN0bHkgb25lIGluc3RhbGxhdGlvbiByZWNvcmQiCiAgICAgICAgKQoKICAgIGRlZiB0ZXN0X2luc3RhbGxfb25fc2VydmVyc19hbHJlYWR5X2luc3RhbGxlZChzZWxmKToKICAgICAgICAiIiJUZXN0IGluc3RhbGxfb25fc2VydmVycyB3aGVuIHRlbXBsYXRlIGlzIGFscmVhZHkgaW5zdGFsbGVkIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgVXNlIGV4aXN0aW5nIHNlcnZlciBmcm9tIGNvbW1vbi5weQogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQoKICAgICAgICAjIEFkZCBzZXJ2ZXIgdG8gdGVtcGxhdGUncyBpbnN0YWxsZWQgc2VydmVycwogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Quc2VydmVyX2lkcyA9IFsoNCwgc2VydmVyLmlkKV0KCiAgICAgICAgIyBDYWxsIGluc3RhbGwgbWV0aG9kIC0gc2hvdWxkIHNraXAgc2luY2UgYWxyZWFkeSBpbnN0YWxsZWQKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5pbnN0YWxsX29uX3NlcnZlcnMoc2VydmVyKQoKICAgICAgICAjIFZlcmlmeSBubyBuZXcgaW5zdGFsbGF0aW9uIHJlY29yZCB3YXMgY3JlYXRlZAogICAgICAgIGluc3RhbGxfcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJqZXRfdGVtcGxhdGVfaWQiLCAiPSIsIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQpLAogICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlcnZlci5pZCksCiAgICAgICAgICAgIF0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGluc3RhbGxfcmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJTaG91bGQgbm90IGNyZWF0ZSBpbnN0YWxsYXRpb24gcmVjb3JkIHdoZW4gYWxyZWFkeSBpbnN0YWxsZWQiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9pbnN0YWxsX29uX3NlcnZlcnNfaW5zdGFsbGF0aW9uX2luX3Byb2dyZXNzKHNlbGYpOgogICAgICAgICIiIlRlc3QgaW5zdGFsbF9vbl9zZXJ2ZXJzIHdoZW4gaW5zdGFsbGF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc2VydmVyIGZyb20gY29tbW9uLnB5CiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCgogICAgICAgICMgQ3JlYXRlIGluc3RhbGxhdGlvbiByZWNvcmQgaW4gcHJvZ3Jlc3MKICAgICAgICBpbnN0YWxsX3JlY29yZCA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENyZWF0ZSBpbnN0YWxsIGxpbmUKICAgICAgICBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbExpbmUuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2luc3RhbGxfaWQiOiBpbnN0YWxsX3JlY29yZC5pZCwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInN0YXRlIjogInByb2Nlc3NpbmciLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIENhbGwgaW5zdGFsbCBtZXRob2QgLSBzaG91bGQgc2tpcCBzaW5jZSBpbnN0YWxsYXRpb24gaW4gcHJvZ3Jlc3MKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5pbnN0YWxsX29uX3NlcnZlcnMoc2VydmVyKQoKICAgICAgICAjIFZlcmlmeSBubyBhZGRpdGlvbmFsIGluc3RhbGxhdGlvbiByZWNvcmQgd2FzIGNyZWF0ZWQKICAgICAgICBpbnN0YWxsX3JlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgiamV0X3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZXJ2ZXIuaWQpLAogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihpbnN0YWxsX3JlY29yZHMpLAogICAgICAgICAgICAxLAogICAgICAgICAgICAiU2hvdWxkIG5vdCBjcmVhdGUgYWRkaXRpb25hbCBpbnN0YWxsYXRpb24gcmVjb3JkIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfaW5zdGFsbF9vbl9zZXJ2ZXJzX2RlcGVuZGVuY3lfc2F0aXNmYWN0aW9uKHNlbGYpOgogICAgICAgICIiIlRlc3QgaW5zdGFsbF9vbl9zZXJ2ZXJzIGRlcGVuZGVuY3kgc2F0aXNmYWN0aW9uIGxvZ2ljIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgVXNlIGNsYXNzLWxldmVsIGRlcGVuZGVuY3kgaGllcmFyY2h5CiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc2VydmVyIGZyb20gY29tbW9uLnB5CiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCgogICAgICAgICMgSW5zdGFsbCBUb3dlciBDb3JlIG9uIHNlcnZlcgogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUuc2VydmVyX2lkcyA9IFsoNCwgc2VydmVyLmlkKV0KCiAgICAgICAgIyBDYWxsIGluc3RhbGwgbWV0aG9kIGRpcmVjdGx5CiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmluc3RhbGxfb25fc2VydmVycyhzZXJ2ZXIpCgogICAgICAgICMgVmVyaWZ5IGluc3RhbGxhdGlvbiByZWNvcmQgd2FzIGNyZWF0ZWQKICAgICAgICBpbnN0YWxsX3JlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgiamV0X3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV9wb3N0Z3Jlcy5pZCksCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VydmVyLmlkKSwKICAgICAgICAgICAgXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oaW5zdGFsbF9yZWNvcmRzKSwgMSwgIlNob3VsZCBjcmVhdGUgZXhhY3RseSBvbmUgaW5zdGFsbGF0aW9uIHJlY29yZCIKICAgICAgICApCgogICAgZGVmIHRlc3RfaW5zdGFsbF9vbl9zZXJ2ZXJzX211bHRpcGxlX3NlcnZlcnMoc2VsZik6CiAgICAgICAgIiIiVGVzdCBpbnN0YWxsX29uX3NlcnZlcnMgd2l0aCBtdWx0aXBsZSBzZXJ2ZXJzIiIiCiAgICAgICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwogICAgICAgICMgVXNlIGV4aXN0aW5nIHNlcnZlcnMgZnJvbSBjbGFzcyBzZXR1cAogICAgICAgIHNlcnZlcjEgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICBzZXJ2ZXIyID0gc2VsZi5zZXJ2ZXJfdGVzdF8yCgogICAgICAgICMgQWRkIHNlcnZlcjEgdG8gdGVtcGxhdGUncyBpbnN0YWxsZWQgc2VydmVycwogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Quc2VydmVyX2lkcyA9IFsoNCwgc2VydmVyMS5pZCldCgogICAgICAgICMgQ2FsbCBpbnN0YWxsIG1ldGhvZCBkaXJlY3RseQogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Qud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmluc3RhbGxfb25fc2VydmVycyhbc2VydmVyMSwgc2VydmVyMl0pCgogICAgICAgICMgVmVyaWZ5IGluc3RhbGxhdGlvbiByZWNvcmQgd2FzIGNyZWF0ZWQgb25seSBmb3Igc2VydmVyMgogICAgICAgIGluc3RhbGxfcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJqZXRfdGVtcGxhdGVfaWQiLCAiPSIsIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQpLAogICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlcnZlcjIuaWQpLAogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihpbnN0YWxsX3JlY29yZHMpLCAxLCAiU2hvdWxkIGNyZWF0ZSBpbnN0YWxsYXRpb24gcmVjb3JkIGZvciBzZXJ2ZXIyIgogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgbm8gaW5zdGFsbGF0aW9uIHJlY29yZCBmb3Igc2VydmVyMSAoYWxyZWFkeSBpbnN0YWxsZWQpCiAgICAgICAgaW5zdGFsbF9yZWNvcmRzX3NlcnZlcjEgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgiamV0X3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZXJ2ZXIxLmlkKSwKICAgICAgICAgICAgXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oaW5zdGFsbF9yZWNvcmRzX3NlcnZlcjEpLAogICAgICAgICAgICAwLAogICAgICAgICAgICAiU2hvdWxkIG5vdCBjcmVhdGUgaW5zdGFsbGF0aW9uIHJlY29yZCBmb3Igc2VydmVyMSAoYWxyZWFkeSBpbnN0YWxsZWQpIiwKICAgICAgICApCgogICAgZGVmIHRlc3RfaW5zdGFsbF9vbl9zZXJ2ZXJzX2VtcHR5X3NlcnZlcl9saXN0KHNlbGYpOgogICAgICAgICIiIlRlc3QgaW5zdGFsbF9vbl9zZXJ2ZXJzIHdpdGggZW1wdHkgc2VydmVyIGxpc3QiIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBDYWxsIGluc3RhbGwgbWV0aG9kIHdpdGggZW1wdHkgbGlzdAogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Qud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmluc3RhbGxfb25fc2VydmVycyhbXSkKCiAgICAgICAgIyBWZXJpZnkgbm8gaW5zdGFsbGF0aW9uIHJlY29yZCB3YXMgY3JlYXRlZAogICAgICAgIGluc3RhbGxfcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLnNlYXJjaCgKICAgICAgICAgICAgWygiamV0X3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkKV0KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGluc3RhbGxfcmVjb3JkcyksCiAgICAgICAgICAgIDAsCiAgICAgICAgICAgICJTaG91bGQgbm90IGNyZWF0ZSBpbnN0YWxsYXRpb24gcmVjb3JkIHdpdGggZW1wdHkgc2VydmVyIGxpc3QiLAogICAgICAgICkKCiAgICBkZWYgdGVzdF9pbnN0YWxsX29uX3NlcnZlcnNfbWl4ZWRfc2VydmVyX3N0YXRlcyhzZWxmKToKICAgICAgICAiIiJUZXN0IGluc3RhbGxfb25fc2VydmVycyB3aXRoIG1peGVkIHNlcnZlciBzdGF0ZXMiIiIKICAgICAgICAjIFVzZSBleGlzdGluZyBzZXJ2ZXJzIGZyb20gY2xhc3Mgc2V0dXAKICAgICAgICBzZXJ2ZXIxID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgc2VydmVyMiA9IHNlbGYuc2VydmVyX3Rlc3RfMgogICAgICAgIHNlcnZlcjMgPSBzZWxmLnNlcnZlcl90ZXN0XzMKCiAgICAgICAgIyBTZXJ2ZXIxOiBBbHJlYWR5IGluc3RhbGxlZAogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Quc2VydmVyX2lkcyA9IFsoNCwgc2VydmVyMS5pZCldCgogICAgICAgICMgU2VydmVyMjogSW5zdGFsbGF0aW9uIGluIHByb2dyZXNzCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5jcmVhdGUoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0LmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlcjIuaWQsCiAgICAgICAgICAgICAgICAic3RhdGUiOiAicHJvY2Vzc2luZyIsCiAgICAgICAgICAgIH0KICAgICAgICApCiAgICAgICAgc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGxMaW5lLmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pbnN0YWxsX2lkIjogaW5zdGFsbF9yZWNvcmQuaWQsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogc2VsZi5qZXRfdGVtcGxhdGVfdGVzdC5pZCwKICAgICAgICAgICAgICAgICJzdGF0ZSI6ICJwcm9jZXNzaW5nIiwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTZXJ2ZXIzOiBOb3QgaW5zdGFsbGVkIChzaG91bGQgdHJpZ2dlciBpbnN0YWxsYXRpb24pCgogICAgICAgICMgQ2FsbCBpbnN0YWxsIG1ldGhvZCBkaXJlY3RseQogICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3Qud2l0aF9jb250ZXh0KAogICAgICAgICAgICBjZXRtaXhfdG93ZXJfbm9fY29tbWl0PVRydWUKICAgICAgICApLmluc3RhbGxfb25fc2VydmVycyhbc2VydmVyMSwgc2VydmVyMiwgc2VydmVyM10pCgogICAgICAgICMgVmVyaWZ5IGluc3RhbGxhdGlvbiByZWNvcmQgd2FzIGNyZWF0ZWQgb25seSBmb3Igc2VydmVyMwogICAgICAgIGluc3RhbGxfcmVjb3JkcyA9IHNlbGYuSmV0VGVtcGxhdGVJbnN0YWxsLnNlYXJjaCgKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgKCJqZXRfdGVtcGxhdGVfaWQiLCAiPSIsIHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QuaWQpLAogICAgICAgICAgICAgICAgKCJzZXJ2ZXJfaWQiLCAiPSIsIHNlcnZlcjMuaWQpLAogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihpbnN0YWxsX3JlY29yZHMpLCAxLCAiU2hvdWxkIGNyZWF0ZSBpbnN0YWxsYXRpb24gcmVjb3JkIGZvciBzZXJ2ZXIzIgogICAgICAgICkKCiAgICBkZWYgdGVzdF9pbnN0YWxsX29uX3NlcnZlcnNfb2Rvb19zY2VuYXJpb19jb21wbGV0ZV9pbnN0YWxsYXRpb24oc2VsZik6CiAgICAgICAgIiIiVGVzdCBjb21wbGV0ZSBPZG9vIGluc3RhbGxhdGlvbiBzY2VuYXJpbyIiIgogICAgICAgICMgVXNlIGNsYXNzLWxldmVsIGRlcGVuZGVuY3kgaGllcmFyY2h5CiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc2VydmVyIGZyb20gY29tbW9uLnB5CiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCgogICAgICAgICMgQ2FsbCBpbnN0YWxsIGZvciBPZG9vIHRlbXBsYXRlCiAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfb2Rvby53aXRoX2NvbnRleHQoCiAgICAgICAgICAgIGNldG1peF90b3dlcl9ub19jb21taXQ9VHJ1ZQogICAgICAgICkuaW5zdGFsbF9vbl9zZXJ2ZXJzKHNlcnZlcikKCiAgICAgICAgIyBWZXJpZnkgaW5zdGFsbGF0aW9uIGxvZyBpcyBjcmVhdGVkCiAgICAgICAgaW5zdGFsbF9yZWNvcmRzID0gc2VsZi5KZXRUZW1wbGF0ZUluc3RhbGwuc2VhcmNoKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAoImpldF90ZW1wbGF0ZV9pZCIsICI9Iiwgc2VsZi5qZXRfdGVtcGxhdGVfb2Rvby5pZCksCiAgICAgICAgICAgICAgICAoInNlcnZlcl9pZCIsICI9Iiwgc2VydmVyLmlkKSwKICAgICAgICAgICAgXQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBsZW4oaW5zdGFsbF9yZWNvcmRzKSwgMSwgIlNob3VsZCBjcmVhdGUgZXhhY3RseSBvbmUgaW5zdGFsbGF0aW9uIHJlY29yZCIKICAgICAgICApCgogICAgICAgIGluc3RhbGxfcmVjb3JkID0gaW5zdGFsbF9yZWNvcmRzWzBdCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgaW5zdGFsbF9yZWNvcmQuamV0X3RlbXBsYXRlX2lkLAogICAgICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV9vZG9vLAogICAgICAgICAgICAiSW5zdGFsbGF0aW9uIHNob3VsZCBiZSBmb3IgT2RvbyB0ZW1wbGF0ZSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGluc3RhbGxfcmVjb3JkLnNlcnZlcl9pZCwgc2VydmVyLCAiSW5zdGFsbGF0aW9uIHNob3VsZCBiZSBvbiB0ZXN0IHNlcnZlciIKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IGFsbCBkZXBlbmRlbmNpZXMgYXJlIGluIGluc3RhbGxhdGlvbiBsb2cgbGluZXMKICAgICAgICBpbnN0YWxsX2xpbmVzID0gaW5zdGFsbF9yZWNvcmQubGluZV9pZHMuc29ydGVkKCJvcmRlciIpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGluc3RhbGxfbGluZXMpLAogICAgICAgICAgICA1LAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgNSBpbnN0YWxsYXRpb24gbGluZXMgKE9kb28gKyA0IGRlcGVuZGVuY2llcykiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgYWxsIGV4cGVjdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKICAgICAgICB0ZW1wbGF0ZV9pZHMgPSBpbnN0YWxsX2xpbmVzLm1hcHBlZCgiamV0X3RlbXBsYXRlX2lkLmlkIikKICAgICAgICBleHBlY3RlZF90ZW1wbGF0ZV9pZHMgPSBbCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUuaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX2RvY2tlci5pZCwKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMuaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX25naW54LmlkLAogICAgICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV9vZG9vLmlkLAogICAgICAgIF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBzZXQodGVtcGxhdGVfaWRzKSwKICAgICAgICAgICAgc2V0KGV4cGVjdGVkX3RlbXBsYXRlX2lkcyksCiAgICAgICAgICAgICJBbGwgZXhwZWN0ZWQgdGVtcGxhdGVzIHNob3VsZCBiZSBpbiBpbnN0YWxsYXRpb24gbGluZXMiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgY29ycmVjdCBvcmRlcjogT2RvbyBmaXJzdCwgdGhlbiBOZ2lueC9Qb3N0Z3JlcyAoZWl0aGVyIG9yZGVyKSwKICAgICAgICAjIHRoZW4gRG9ja2VyLCB0aGVuIFRvd2VyIENvcmUuCiAgICAgICAgb2Rvb19saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX29kb28KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZG9vX2xpbmUub3JkZXIsIDAsICJPZG9vIHNob3VsZCBiZSBmaXJzdCAob3JkZXIgMCkiKQoKICAgICAgICAjIFZlcmlmeSBkZXBlbmRlbmN5IHJlbGF0aW9uc2hpcHMgYXJlIGNvcnJlY3QKICAgICAgICAjIE9kb28gc2hvdWxkIGJlIGZpcnN0IChtYWluIHRlbXBsYXRlKQogICAgICAgIG9kb29fbGluZSA9IGluc3RhbGxfbGluZXMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsaW5lOiBsaW5lLmpldF90ZW1wbGF0ZV9pZCA9PSBzZWxmLmpldF90ZW1wbGF0ZV9vZG9vCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kb29fbGluZSksIDEsICJTaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBPZG9vIGxpbmUiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Rvb19saW5lLm9yZGVyLCAwLCAiT2RvbyBzaG91bGQgYmUgZmlyc3QgKG9yZGVyIDApIikKCiAgICAgICAgIyBOZ2lueCBhbmQgUG9zdGdyZXMgc2hvdWxkIGJlIHNlY29uZCBhbmQgdGhpcmQgKGRpcmVjdCBkZXBlbmRlbmNpZXMgb2YgT2RvbykKICAgICAgICBuZ2lueF9saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX25naW54CiAgICAgICAgKQogICAgICAgIHBvc3RncmVzX2xpbmUgPSBpbnN0YWxsX2xpbmVzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbGluZTogbGluZS5qZXRfdGVtcGxhdGVfaWQgPT0gc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmdpbnhfbGluZSksIDEsICJTaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBOZ2lueCBsaW5lIikKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3N0Z3Jlc19saW5lKSwgMSwgIlNob3VsZCBoYXZlIGV4YWN0bHkgb25lIFBvc3RncmVzIGxpbmUiKQogICAgICAgIHNlbGYuYXNzZXJ0SW4obmdpbnhfbGluZS5vcmRlciwgWzEsIDJdLCAiTmdpbnggc2hvdWxkIGJlIG9yZGVyIDEgb3IgMiIpCiAgICAgICAgc2VsZi5hc3NlcnRJbihwb3N0Z3Jlc19saW5lLm9yZGVyLCBbMSwgMl0sICJQb3N0Z3JlcyBzaG91bGQgYmUgb3JkZXIgMSBvciAyIikKICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKAogICAgICAgICAgICBuZ2lueF9saW5lLm9yZGVyLAogICAgICAgICAgICBwb3N0Z3Jlc19saW5lLm9yZGVyLAogICAgICAgICAgICAiTmdpbnggYW5kIFBvc3RncmVzIHNob3VsZCBoYXZlIGRpZmZlcmVudCBvcmRlcnMiLAogICAgICAgICkKCiAgICAgICAgIyBEb2NrZXIgc2hvdWxkIGJlIGZvdXJ0aCAoZGVwZW5kZW5jeSBvZiBib3RoIFBvc3RncmVzIGFuZCBOZ2lueCkKICAgICAgICBkb2NrZXJfbGluZSA9IGluc3RhbGxfbGluZXMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsaW5lOiBsaW5lLmpldF90ZW1wbGF0ZV9pZCA9PSBzZWxmLmpldF90ZW1wbGF0ZV9kb2NrZXIKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZG9ja2VyX2xpbmUpLCAxLCAiU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgRG9ja2VyIGxpbmUiKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9ja2VyX2xpbmUub3JkZXIsIDMsICJEb2NrZXIgc2hvdWxkIGJlIGZvdXJ0aCAob3JkZXIgMykiKQoKICAgICAgICAjIFRvd2VyIENvcmUgc2hvdWxkIGJlIGxhc3QgKGRlcGVuZGVuY3kgb2YgRG9ja2VyKQogICAgICAgIHRvd2VyX2NvcmVfbGluZSA9IGluc3RhbGxfbGluZXMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsaW5lOiBsaW5lLmpldF90ZW1wbGF0ZV9pZCA9PSBzZWxmLmpldF90ZW1wbGF0ZV90b3dlcl9jb3JlCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbih0b3dlcl9jb3JlX2xpbmUpLCAxLCAiU2hvdWxkIGhhdmUgZXhhY3RseSBvbmUgVG93ZXIgQ29yZSBsaW5lIgogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICB0b3dlcl9jb3JlX2xpbmUub3JkZXIsIDQsICJUb3dlciBDb3JlIHNob3VsZCBiZSBsYXN0IChvcmRlciA0KSIKICAgICAgICApCgogICAgZGVmIHRlc3RfaW5zdGFsbF9vbl9zZXJ2ZXJzX3dvb2NvbW1lcmNlX29kb29fc2NlbmFyaW8oc2VsZik6CiAgICAgICAgIiIiVGVzdCBpbnN0YWxsX29uX3NlcnZlcnMgd2l0aCBXb29Db21tZXJjZSB3aXRoIE9kb28gc2NlbmFyaW8iIiIKICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCiAgICAgICAgIyBVc2UgZXhpc3Rpbmcgc2VydmVyIGZyb20gY29tbW9uLnB5CiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCgogICAgICAgICMgQ2FsbCBpbnN0YWxsIGZvciBXb29Db21tZXJjZSB3aXRoIE9kb28gdGVtcGxhdGUKICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV93b29jb21tZXJjZV9vZG9vLndpdGhfY29udGV4dCgKICAgICAgICAgICAgY2V0bWl4X3Rvd2VyX25vX2NvbW1pdD1UcnVlCiAgICAgICAgKS5pbnN0YWxsX29uX3NlcnZlcnMoc2VydmVyKQoKICAgICAgICAjIFZlcmlmeSBpbnN0YWxsYXRpb24gbG9nIGlzIGNyZWF0ZWQKICAgICAgICBpbnN0YWxsX3JlY29yZHMgPSBzZWxmLkpldFRlbXBsYXRlSW5zdGFsbC5zZWFyY2goCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICgiamV0X3RlbXBsYXRlX2lkIiwgIj0iLCBzZWxmLmpldF90ZW1wbGF0ZV93b29jb21tZXJjZV9vZG9vLmlkKSwKICAgICAgICAgICAgICAgICgic2VydmVyX2lkIiwgIj0iLCBzZXJ2ZXIuaWQpLAogICAgICAgICAgICBdCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIGxlbihpbnN0YWxsX3JlY29yZHMpLCAxLCAiU2hvdWxkIGNyZWF0ZSBleGFjdGx5IG9uZSBpbnN0YWxsYXRpb24gcmVjb3JkIgogICAgICAgICkKCiAgICAgICAgaW5zdGFsbF9yZWNvcmQgPSBpbnN0YWxsX3JlY29yZHNbMF0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC5qZXRfdGVtcGxhdGVfaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3dvb2NvbW1lcmNlX29kb28sCiAgICAgICAgICAgICJJbnN0YWxsYXRpb24gc2hvdWxkIGJlIGZvciBXb29Db21tZXJjZSB3aXRoIE9kb28gdGVtcGxhdGUiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICBpbnN0YWxsX3JlY29yZC5zZXJ2ZXJfaWQsIHNlcnZlciwgIkluc3RhbGxhdGlvbiBzaG91bGQgYmUgb24gdGVzdCBzZXJ2ZXIiCiAgICAgICAgKQoKICAgICAgICAjIFZlcmlmeSBhbGwgZGVwZW5kZW5jaWVzIGFyZSBpbiBpbnN0YWxsYXRpb24gbG9nIGxpbmVzCiAgICAgICAgaW5zdGFsbF9saW5lcyA9IGluc3RhbGxfcmVjb3JkLmxpbmVfaWRzLnNvcnRlZCgib3JkZXIiKQogICAgICAgICMgU2hvdWxkIGhhdmUgOCBpbnN0YWxsYXRpb24gbGluZXM6CiAgICAgICAgIyBXb29Db21tZXJjZSArIDcgZGVwZW5kZW5jaWVzCiAgICAgICAgIyBXb3JkUHJlc3MsIE9kb28sIE1hcmlhREIsIFBvc3RncmVzLCBOZ2lueCwgRG9ja2VyLCBUb3dlciBDb3JlCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgbGVuKGluc3RhbGxfbGluZXMpLAogICAgICAgICAgICA4LAogICAgICAgICAgICAiU2hvdWxkIGhhdmUgOCBpbnN0YWxsYXRpb24gbGluZXMgKFdvb0NvbW1lcmNlICsgNyBkZXBlbmRlbmNpZXMpIiwKICAgICAgICApCgogICAgICAgICMgVmVyaWZ5IHRvcG9sb2dpY2FsIGNvbnN0cmFpbnRzOgogICAgICAgICMgV29vQ29tbWVyY2UgZmlyc3QgKHJvb3QpLCBUb3dlciBDb3JlIGxhc3QgKGRlZXBlc3QgbGVhZiksCiAgICAgICAgIyBEb2NrZXIgYmVmb3JlIE5naW54L1Bvc3RncmVzL01hcmlhREIsIGV0Yy4KICAgICAgICB3Y19saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX3dvb2NvbW1lcmNlX29kb28KICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y19saW5lLm9yZGVyLCAwLCAiV29vQ29tbWVyY2Ugc2hvdWxkIGJlIGZpcnN0IChvcmRlciAwKSIpCgogICAgICAgIHRjX2xpbmUgPSBpbnN0YWxsX2xpbmVzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbGluZTogbGluZS5qZXRfdGVtcGxhdGVfaWQgPT0gc2VsZi5qZXRfdGVtcGxhdGVfdG93ZXJfY29yZQogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjX2xpbmUub3JkZXIsIDcsICJUb3dlciBDb3JlIHNob3VsZCBiZSBsYXN0IChvcmRlciA3KSIpCgogICAgICAgIGRvY2tlcl9saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX2RvY2tlcgogICAgICAgICkKICAgICAgICBuZ2lueF9saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX25naW54CiAgICAgICAgKQogICAgICAgIHBvc3RncmVzX2xpbmUgPSBpbnN0YWxsX2xpbmVzLmZpbHRlcmVkKAogICAgICAgICAgICBsYW1iZGEgbGluZTogbGluZS5qZXRfdGVtcGxhdGVfaWQgPT0gc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMKICAgICAgICApCiAgICAgICAgbWFyaWFkYl9saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX21hcmlhZGIKICAgICAgICApCiAgICAgICAgb2Rvb19saW5lID0gaW5zdGFsbF9saW5lcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGxpbmU6IGxpbmUuamV0X3RlbXBsYXRlX2lkID09IHNlbGYuamV0X3RlbXBsYXRlX29kb28KICAgICAgICApCiAgICAgICAgd3BfbGluZSA9IGluc3RhbGxfbGluZXMuZmlsdGVyZWQoCiAgICAgICAgICAgIGxhbWJkYSBsaW5lOiBsaW5lLmpldF90ZW1wbGF0ZV9pZCA9PSBzZWxmLmpldF90ZW1wbGF0ZV93b3JkcHJlc3MKICAgICAgICApCgogICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKICAgICAgICAgICAgdGNfbGluZS5vcmRlciwKICAgICAgICAgICAgZG9ja2VyX2xpbmUub3JkZXIsCiAgICAgICAgICAgICJUb3dlciBDb3JlIG11c3QgaGF2ZSBoaWdoZXIgb3JkZXIgdGhhbiBEb2NrZXIgKGluc3RhbGxlZCBmaXJzdCkiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoCiAgICAgICAgICAgIGRvY2tlcl9saW5lLm9yZGVyLAogICAgICAgICAgICBuZ2lueF9saW5lLm9yZGVyLAogICAgICAgICAgICAiRG9ja2VyIG11c3QgaGF2ZSBoaWdoZXIgb3JkZXIgdGhhbiBOZ2lueCAoaW5zdGFsbGVkIGZpcnN0KSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKICAgICAgICAgICAgZG9ja2VyX2xpbmUub3JkZXIsCiAgICAgICAgICAgIHBvc3RncmVzX2xpbmUub3JkZXIsCiAgICAgICAgICAgICJEb2NrZXIgbXVzdCBoYXZlIGhpZ2hlciBvcmRlciB0aGFuIFBvc3RncmVzIChpbnN0YWxsZWQgZmlyc3QpIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAogICAgICAgICAgICBkb2NrZXJfbGluZS5vcmRlciwKICAgICAgICAgICAgbWFyaWFkYl9saW5lLm9yZGVyLAogICAgICAgICAgICAiRG9ja2VyIG11c3QgaGF2ZSBoaWdoZXIgb3JkZXIgdGhhbiBNYXJpYURCIChpbnN0YWxsZWQgZmlyc3QpIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAogICAgICAgICAgICBuZ2lueF9saW5lLm9yZGVyLAogICAgICAgICAgICBvZG9vX2xpbmUub3JkZXIsCiAgICAgICAgICAgICJOZ2lueCBtdXN0IGhhdmUgaGlnaGVyIG9yZGVyIHRoYW4gT2RvbyAoaW5zdGFsbGVkIGZpcnN0KSIsCiAgICAgICAgKQogICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcigKICAgICAgICAgICAgcG9zdGdyZXNfbGluZS5vcmRlciwKICAgICAgICAgICAgb2Rvb19saW5lLm9yZGVyLAogICAgICAgICAgICAiUG9zdGdyZXMgbXVzdCBoYXZlIGhpZ2hlciBvcmRlciB0aGFuIE9kb28gKGluc3RhbGxlZCBmaXJzdCkiLAogICAgICAgICkKICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoCiAgICAgICAgICAgIG5naW54X2xpbmUub3JkZXIsCiAgICAgICAgICAgIHdwX2xpbmUub3JkZXIsCiAgICAgICAgICAgICJOZ2lueCBtdXN0IGhhdmUgaGlnaGVyIG9yZGVyIHRoYW4gV29yZFByZXNzIChpbnN0YWxsZWQgZmlyc3QpIiwKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKAogICAgICAgICAgICBtYXJpYWRiX2xpbmUub3JkZXIsCiAgICAgICAgICAgIHdwX2xpbmUub3JkZXIsCiAgICAgICAgICAgICJNYXJpYURCIG11c3QgaGF2ZSBoaWdoZXIgb3JkZXIgdGhhbiBXb3JkUHJlc3MgKGluc3RhbGxlZCBmaXJzdCkiLAogICAgICAgICkKCiAgICAgICAgIyBWZXJpZnkgYWxsIGV4cGVjdGVkIHRlbXBsYXRlcyBhcmUgaW5jbHVkZWQKICAgICAgICB0ZW1wbGF0ZV9pZHMgPSBpbnN0YWxsX2xpbmVzLm1hcHBlZCgiamV0X3RlbXBsYXRlX2lkLmlkIikKICAgICAgICBleHBlY3RlZF90ZW1wbGF0ZV9pZHMgPSBbCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3Rvd2VyX2NvcmUuaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX2RvY2tlci5pZCwKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfbWFyaWFkYi5pZCwKICAgICAgICAgICAgc2VsZi5qZXRfdGVtcGxhdGVfcG9zdGdyZXMuaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX25naW54LmlkLAogICAgICAgICAgICBzZWxmLmpldF90ZW1wbGF0ZV93b3JkcHJlc3MuaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX29kb28uaWQsCiAgICAgICAgICAgIHNlbGYuamV0X3RlbXBsYXRlX3dvb2NvbW1lcmNlX29kb28uaWQsCiAgICAgICAgXQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgIHNldCh0ZW1wbGF0ZV9pZHMpLAogICAgICAgICAgICBzZXQoZXhwZWN0ZWRfdGVtcGxhdGVfaWRzKSwKICAgICAgICAgICAgIkFsbCBleHBlY3RlZCB0ZW1wbGF0ZXMgc2hvdWxkIGJlIGluIGluc3RhbGxhdGlvbiBsaW5lcyIsCiAgICAgICAgKQoKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQogICAgIyBUZXN0cyBmb3IgdW5pbnN0YWxsX2Zyb21fc2VydmVycyAoZnJvbSBKZXRUZW1wbGF0ZSBtb2RlbCkKICAgICMgPT09PT09PT09PT09PT09PT09PT09PQoKICAgIGRlZiB0ZXN0X3VuaW5zdGFsbF9mcm9tX3NlcnZlcnNfdGVtcGxhdGVfbm90X2luc3RhbGxlZChzZWxmKToKICAgICAgICAiIiJUZXN0IHVuaW5zdGFsbF9mcm9tX3NlcnZlcnMgd2hlbiB0ZW1wbGF0ZSBpcyBub3QgaW5zdGFsbGVkIiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgRW5zdXJlIHRlbXBsYXRlIGlzIG5vdCBpbnN0YWxsZWQKICAgICAgICB0ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDUsIDAsIDApXX0pCgogICAgICAgICMgU2hvdWxkIHJhaXNlIFZhbGlkYXRpb25FcnJvciB3aGVuIHJhaXNlX2lmX25vdF9wb3NzaWJsZT1UcnVlCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWxpZGF0aW9uRXJyb3IpIGFzIGNvbnRleHQ6CiAgICAgICAgICAgIHRlbXBsYXRlLnVuaW5zdGFsbF9mcm9tX3NlcnZlcnMoc2VydmVyLCByYWlzZV9pZl9ub3RfcG9zc2libGU9VHJ1ZSkKCiAgICAgICAgZXJyb3JfbWVzc2FnZSA9IHN0cihjb250ZXh0LmV4Y2VwdGlvbikKICAgICAgICBzZWxmLmFzc2VydEluKCJub3QgaW5zdGFsbGVkIiwgZXJyb3JfbWVzc2FnZS5sb3dlcigpKQogICAgICAgIHNlbGYuYXNzZXJ0SW4odGVtcGxhdGUubmFtZSwgZXJyb3JfbWVzc2FnZSkKICAgICAgICBzZWxmLmFzc2VydEluKHNlcnZlci5uYW1lLCBlcnJvcl9tZXNzYWdlKQoKICAgIGRlZiB0ZXN0X3VuaW5zdGFsbF9mcm9tX3NlcnZlcnNfdGVtcGxhdGVfbm90X2luc3RhbGxlZF93YXJuaW5nKHNlbGYpOgogICAgICAgICIiIlRlc3QgdW5pbnN0YWxsX2Zyb21fc2VydmVycyBzaG93cyB3YXJuaW5nIHdoZW4gdGVtcGxhdGUgaXMgbm90IGluc3RhbGxlZCIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIEVuc3VyZSB0ZW1wbGF0ZSBpcyBub3QgaW5zdGFsbGVkCiAgICAgICAgdGVtcGxhdGUud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWyg1LCAwLCAwKV19KQoKICAgICAgICAjIE1vY2sgbm90aWZ5X3dhcm5pbmcgdG8gdmVyaWZ5IGl0J3MgY2FsbGVkCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3Qoc2VsZi5lbnYudXNlci5fX2NsYXNzX18sICJub3RpZnlfd2FybmluZyIpIGFzIG1vY2tfbm90aWZ5OgogICAgICAgICAgICB0ZW1wbGF0ZS51bmluc3RhbGxfZnJvbV9zZXJ2ZXJzKHNlcnZlciwgcmFpc2VfaWZfbm90X3Bvc3NpYmxlPUZhbHNlKQoKICAgICAgICAgICAgIyBWZXJpZnkgbm90aWZ5X3dhcm5pbmcgd2FzIGNhbGxlZAogICAgICAgICAgICBtb2NrX25vdGlmeS5hc3NlcnRfY2FsbGVkX29uY2UoKQogICAgICAgICAgICBjYWxsX2FyZ3MgPSBtb2NrX25vdGlmeS5jYWxsX2FyZ3MKICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibWVzc2FnZSIsIGNhbGxfYXJncy5rd2FyZ3MpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm5vdCBpbnN0YWxsZWQiLCBjYWxsX2FyZ3Mua3dhcmdzWyJtZXNzYWdlIl0ubG93ZXIoKSkKCiAgICBkZWYgdGVzdF91bmluc3RhbGxfZnJvbV9zZXJ2ZXJzX2pldHNfc3RpbGxfZXhpc3Qoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1bmluc3RhbGxfZnJvbV9zZXJ2ZXJzIHdoZW4gamV0cyBzdGlsbCBleGlzdCBvbiBzZXJ2ZXIiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICB0ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Rlc3QKCiAgICAgICAgIyBJbnN0YWxsIHRlbXBsYXRlIG9uIHNlcnZlcgogICAgICAgIHRlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNCwgc2VydmVyLmlkKV19KQoKICAgICAgICAjIENyZWF0ZSBhIGpldCBvbiB0aGUgc2VydmVyCiAgICAgICAgc2VsZi5KZXQuY3JlYXRlKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAibmFtZSI6ICJUZXN0IEpldCBVbmluc3RhbGwgU3RpbGwgRXhpc3QiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X2pldF91bmluc3RhbGxfc3RpbGxfZXhpc3QiLAogICAgICAgICAgICAgICAgImpldF90ZW1wbGF0ZV9pZCI6IHRlbXBsYXRlLmlkLAogICAgICAgICAgICAgICAgInNlcnZlcl9pZCI6IHNlcnZlci5pZCwKICAgICAgICAgICAgfQogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yIHdoZW4gcmFpc2VfaWZfbm90X3Bvc3NpYmxlPVRydWUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgdGVtcGxhdGUudW5pbnN0YWxsX2Zyb21fc2VydmVycyhzZXJ2ZXIsIHJhaXNlX2lmX25vdF9wb3NzaWJsZT1UcnVlKQoKICAgICAgICBlcnJvcl9tZXNzYWdlID0gc3RyKGNvbnRleHQuZXhjZXB0aW9uKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0aWxsIGpldHMiLCBlcnJvcl9tZXNzYWdlLmxvd2VyKCkpCiAgICAgICAgc2VsZi5hc3NlcnRJbih0ZW1wbGF0ZS5uYW1lLCBlcnJvcl9tZXNzYWdlKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VydmVyLm5hbWUsIGVycm9yX21lc3NhZ2UpCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2Zyb21fc2VydmVyc19qZXRzX3N0aWxsX2V4aXN0X3dhcm5pbmcoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1bmluc3RhbGxfZnJvbV9zZXJ2ZXJzIHNob3dzIHdhcm5pbmcgd2hlbiBqZXRzIHN0aWxsIGV4aXN0IiIiCiAgICAgICAgc2VydmVyID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgSW5zdGFsbCB0ZW1wbGF0ZSBvbiBzZXJ2ZXIKICAgICAgICB0ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKCiAgICAgICAgIyBDcmVhdGUgYSBqZXQgb24gdGhlIHNlcnZlcgogICAgICAgIHNlbGYuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBKZXQgVW5pbnN0YWxsIFN0aWxsIEV4aXN0IFdhcm5pbmciLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJ0ZXN0X2pldF91bmluc3RhbGxfc3RpbGxfZXhpc3Rfd2FybmluZyIsCiAgICAgICAgICAgICAgICAiamV0X3RlbXBsYXRlX2lkIjogdGVtcGxhdGUuaWQsCiAgICAgICAgICAgICAgICAic2VydmVyX2lkIjogc2VydmVyLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIE1vY2sgbm90aWZ5X3dhcm5pbmcgdG8gdmVyaWZ5IGl0J3MgY2FsbGVkCiAgICAgICAgd2l0aCBwYXRjaC5vYmplY3Qoc2VsZi5lbnYudXNlci5fX2NsYXNzX18sICJub3RpZnlfd2FybmluZyIpIGFzIG1vY2tfbm90aWZ5OgogICAgICAgICAgICB0ZW1wbGF0ZS51bmluc3RhbGxfZnJvbV9zZXJ2ZXJzKHNlcnZlciwgcmFpc2VfaWZfbm90X3Bvc3NpYmxlPUZhbHNlKQoKICAgICAgICAgICAgIyBWZXJpZnkgbm90aWZ5X3dhcm5pbmcgd2FzIGNhbGxlZAogICAgICAgICAgICBtb2NrX25vdGlmeS5hc3NlcnRfY2FsbGVkX29uY2UoKQogICAgICAgICAgICBjYWxsX2FyZ3MgPSBtb2NrX25vdGlmeS5jYWxsX2FyZ3MKICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibWVzc2FnZSIsIGNhbGxfYXJncy5rd2FyZ3MpCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0aWxsIGpldHMiLCBjYWxsX2FyZ3Mua3dhcmdzWyJtZXNzYWdlIl0ubG93ZXIoKSkKCiAgICBkZWYgdGVzdF91bmluc3RhbGxfZnJvbV9zZXJ2ZXJzX2RlcGVuZGVudF90ZW1wbGF0ZXNfaW5zdGFsbGVkKHNlbGYpOgogICAgICAgICIiIlRlc3QgdW5pbnN0YWxsX2Zyb21fc2VydmVycyB3aGVuIGRlcGVuZGVudCB0ZW1wbGF0ZXMgYXJlIGluc3RhbGxlZCIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgICMgVXNlIHBvc3RncmVzIHRlbXBsYXRlIHdoaWNoIGRlcGVuZHMgb24gZG9ja2VyCiAgICAgICAgYmFzZV90ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX2RvY2tlcgogICAgICAgIGRlcGVuZGVudF90ZW1wbGF0ZSA9IHNlbGYuamV0X3RlbXBsYXRlX3Bvc3RncmVzCgogICAgICAgICMgSW5zdGFsbCBib3RoIHRlbXBsYXRlcyBvbiBzZXJ2ZXIKICAgICAgICBiYXNlX3RlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNCwgc2VydmVyLmlkKV19KQogICAgICAgIGRlcGVuZGVudF90ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKCiAgICAgICAgIyBWZXJpZnkgZGVwZW5kZW5jeSBleGlzdHMKICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgIGRlcGVuZGVudF90ZW1wbGF0ZS50ZW1wbGF0ZV9yZXF1aXJlc19pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICBsYW1iZGEgZGVwOiBkZXAudGVtcGxhdGVfcmVxdWlyZWRfaWQgPT0gYmFzZV90ZW1wbGF0ZQogICAgICAgICAgICApLAogICAgICAgICAgICAiUG9zdGdyZXMgc2hvdWxkIGRlcGVuZCBvbiBEb2NrZXIiLAogICAgICAgICkKCiAgICAgICAgIyBTaG91bGQgcmFpc2UgVmFsaWRhdGlvbkVycm9yIHdoZW4gcmFpc2VfaWZfbm90X3Bvc3NpYmxlPVRydWUKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbGlkYXRpb25FcnJvcikgYXMgY29udGV4dDoKICAgICAgICAgICAgYmFzZV90ZW1wbGF0ZS51bmluc3RhbGxfZnJvbV9zZXJ2ZXJzKHNlcnZlciwgcmFpc2VfaWZfbm90X3Bvc3NpYmxlPVRydWUpCgogICAgICAgIGVycm9yX21lc3NhZ2UgPSBzdHIoY29udGV4dC5leGNlcHRpb24pCiAgICAgICAgc2VsZi5hc3NlcnRJbigiZGVwZW5kIiwgZXJyb3JfbWVzc2FnZS5sb3dlcigpKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oYmFzZV90ZW1wbGF0ZS5uYW1lLCBlcnJvcl9tZXNzYWdlKQogICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VydmVyLm5hbWUsIGVycm9yX21lc3NhZ2UpCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2Zyb21fc2VydmVyc19kZXBlbmRlbnRfdGVtcGxhdGVzX2luc3RhbGxlZF93YXJuaW5nKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIFRlc3QgdW5pbnN0YWxsX2Zyb21fc2VydmVycyBzaG93cyB3YXJuaW5nCiAgICAgICAgd2hlbiBkZXBlbmRlbnQgdGVtcGxhdGVzIGFyZSBpbnN0YWxsZWQKICAgICAgICAiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICAjIFVzZSBwb3N0Z3JlcyB0ZW1wbGF0ZSB3aGljaCBkZXBlbmRzIG9uIGRvY2tlcgogICAgICAgIGJhc2VfdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV9kb2NrZXIKICAgICAgICBkZXBlbmRlbnRfdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV9wb3N0Z3JlcwoKICAgICAgICAjIEluc3RhbGwgYm90aCB0ZW1wbGF0ZXMgb24gc2VydmVyCiAgICAgICAgYmFzZV90ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKICAgICAgICBkZXBlbmRlbnRfdGVtcGxhdGUud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWyg0LCBzZXJ2ZXIuaWQpXX0pCgogICAgICAgICMgTW9jayBub3RpZnlfd2FybmluZyB0byB2ZXJpZnkgaXQncyBjYWxsZWQKICAgICAgICB3aXRoIHBhdGNoLm9iamVjdChzZWxmLmVudi51c2VyLl9fY2xhc3NfXywgIm5vdGlmeV93YXJuaW5nIikgYXMgbW9ja19ub3RpZnk6CiAgICAgICAgICAgIGJhc2VfdGVtcGxhdGUudW5pbnN0YWxsX2Zyb21fc2VydmVycyhzZXJ2ZXIsIHJhaXNlX2lmX25vdF9wb3NzaWJsZT1GYWxzZSkKCiAgICAgICAgICAgICMgVmVyaWZ5IG5vdGlmeV93YXJuaW5nIHdhcyBjYWxsZWQKICAgICAgICAgICAgbW9ja19ub3RpZnkuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKICAgICAgICAgICAgY2FsbF9hcmdzID0gbW9ja19ub3RpZnkuY2FsbF9hcmdzCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1lc3NhZ2UiLCBjYWxsX2FyZ3Mua3dhcmdzKQogICAgICAgICAgICBzZWxmLmFzc2VydEluKCJkZXBlbmQiLCBjYWxsX2FyZ3Mua3dhcmdzWyJtZXNzYWdlIl0ubG93ZXIoKSkKCiAgICBkZWYgdGVzdF91bmluc3RhbGxfZnJvbV9zZXJ2ZXJzX2RlcGVuZGVudF90ZW1wbGF0ZXNfbm90X2luc3RhbGxlZChzZWxmKToKICAgICAgICAiIiIKICAgICAgICBUZXN0IHVuaW5zdGFsbF9mcm9tX3NlcnZlcnMgc3VjY2VlZHMKICAgICAgICB3aGVuIGRlcGVuZGVudCB0ZW1wbGF0ZXMgYXJlIG5vdCBpbnN0YWxsZWQKICAgICAgICAiIiIKICAgICAgICBzZXJ2ZXIgPSBzZWxmLnNlcnZlcl90ZXN0XzEKICAgICAgICAjIFVzZSBkb2NrZXIgdGVtcGxhdGUKICAgICAgICBiYXNlX3RlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfZG9ja2VyCgogICAgICAgICMgSW5zdGFsbCBvbmx5IGJhc2UgdGVtcGxhdGUgb24gc2VydmVyIChub3QgdGhlIGRlcGVuZGVudCBvbmUpCiAgICAgICAgYmFzZV90ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKCiAgICAgICAgIyBNb2NrIHVuaW5zdGFsbCB0byB2ZXJpZnkgaXQncyBjYWxsZWQKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3RlbXBsYXRlX2luc3RhbGwiCiAgICAgICAgICAgICIuQ3hUb3dlckpldFRlbXBsYXRlSW5zdGFsbC51bmluc3RhbGwiCiAgICAgICAgKSBhcyBtb2NrX3VuaW5zdGFsbDoKICAgICAgICAgICAgYmFzZV90ZW1wbGF0ZS51bmluc3RhbGxfZnJvbV9zZXJ2ZXJzKHNlcnZlciwgcmFpc2VfaWZfbm90X3Bvc3NpYmxlPVRydWUpCgogICAgICAgICAgICAjIFZlcmlmeSB1bmluc3RhbGwgd2FzIGNhbGxlZAogICAgICAgICAgICBtb2NrX3VuaW5zdGFsbC5hc3NlcnRfY2FsbGVkX29uY2Vfd2l0aCgKICAgICAgICAgICAgICAgIHNlcnZlcj1zZXJ2ZXIsIHRlbXBsYXRlPWJhc2VfdGVtcGxhdGUKICAgICAgICAgICAgKQoKICAgIGRlZiB0ZXN0X3VuaW5zdGFsbF9mcm9tX3NlcnZlcnNfc3VjY2VzcyhzZWxmKToKICAgICAgICAiIiJUZXN0IHN1Y2Nlc3NmdWwgdW5pbnN0YWxsX2Zyb21fc2VydmVycyIiIgogICAgICAgIHNlcnZlciA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIENsZWFuIHVwIGFueSBleGlzdGluZyBqZXRzIGZvciB0aGlzIHRlbXBsYXRlL3NlcnZlciBjb21iaW5hdGlvbgogICAgICAgIGV4aXN0aW5nX2pldHMgPSBzZXJ2ZXIuamV0X2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGpldDogamV0LmpldF90ZW1wbGF0ZV9pZCA9PSB0ZW1wbGF0ZQogICAgICAgICkKICAgICAgICBpZiBleGlzdGluZ19qZXRzOgogICAgICAgICAgICBleGlzdGluZ19qZXRzLnVubGluaygpCgogICAgICAgICMgSW5zdGFsbCB0ZW1wbGF0ZSBvbiBzZXJ2ZXIKICAgICAgICB0ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlci5pZCldfSkKCiAgICAgICAgIyBFbnN1cmUgbm8gamV0cyBleGlzdAogICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoCiAgICAgICAgICAgIHNlcnZlci5qZXRfaWRzLmZpbHRlcmVkKGxhbWJkYSBqZXQ6IGpldC5qZXRfdGVtcGxhdGVfaWQgPT0gdGVtcGxhdGUpLAogICAgICAgICAgICAiTm8gamV0cyBzaG91bGQgZXhpc3QgZm9yIHRoaXMgdGVtcGxhdGUiLAogICAgICAgICkKCiAgICAgICAgIyBNb2NrIHVuaW5zdGFsbCB0byB2ZXJpZnkgaXQncyBjYWxsZWQKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3RlbXBsYXRlX2luc3RhbGwiCiAgICAgICAgICAgICIuQ3hUb3dlckpldFRlbXBsYXRlSW5zdGFsbC51bmluc3RhbGwiCiAgICAgICAgKSBhcyBtb2NrX3VuaW5zdGFsbDoKICAgICAgICAgICAgdGVtcGxhdGUudW5pbnN0YWxsX2Zyb21fc2VydmVycyhzZXJ2ZXIsIHJhaXNlX2lmX25vdF9wb3NzaWJsZT1UcnVlKQoKICAgICAgICAgICAgIyBWZXJpZnkgdW5pbnN0YWxsIHdhcyBjYWxsZWQKICAgICAgICAgICAgbW9ja191bmluc3RhbGwuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgoc2VydmVyPXNlcnZlciwgdGVtcGxhdGU9dGVtcGxhdGUpCgogICAgZGVmIHRlc3RfdW5pbnN0YWxsX2Zyb21fc2VydmVyc19tdWx0aXBsZV9zZXJ2ZXJzKHNlbGYpOgogICAgICAgICIiIlRlc3QgdW5pbnN0YWxsX2Zyb21fc2VydmVycyB3aXRoIG11bHRpcGxlIHNlcnZlcnMiIiIKICAgICAgICBzZXJ2ZXIxID0gc2VsZi5zZXJ2ZXJfdGVzdF8xCiAgICAgICAgc2VydmVyMiA9IHNlbGYuc2VydmVyX3Rlc3RfMgogICAgICAgIHRlbXBsYXRlID0gc2VsZi5qZXRfdGVtcGxhdGVfdGVzdAoKICAgICAgICAjIENsZWFuIHVwIGFueSBleGlzdGluZyBqZXRzIGZvciB0aGlzIHRlbXBsYXRlIG9uIGJvdGggc2VydmVycwogICAgICAgIGV4aXN0aW5nX2pldHNfMSA9IHNlcnZlcjEuamV0X2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGpldDogamV0LmpldF90ZW1wbGF0ZV9pZCA9PSB0ZW1wbGF0ZQogICAgICAgICkKICAgICAgICBpZiBleGlzdGluZ19qZXRzXzE6CiAgICAgICAgICAgIGV4aXN0aW5nX2pldHNfMS51bmxpbmsoKQogICAgICAgIGV4aXN0aW5nX2pldHNfMiA9IHNlcnZlcjIuamV0X2lkcy5maWx0ZXJlZCgKICAgICAgICAgICAgbGFtYmRhIGpldDogamV0LmpldF90ZW1wbGF0ZV9pZCA9PSB0ZW1wbGF0ZQogICAgICAgICkKICAgICAgICBpZiBleGlzdGluZ19qZXRzXzI6CiAgICAgICAgICAgIGV4aXN0aW5nX2pldHNfMi51bmxpbmsoKQoKICAgICAgICAjIEVuc3VyZSBubyBkZXBlbmRlbnQgdGVtcGxhdGVzIGFyZSBpbnN0YWxsZWQgb24gdGhlc2Ugc2VydmVycwogICAgICAgICMgUmVtb3ZlIGFueSB0ZW1wbGF0ZXMgdGhhdCBkZXBlbmQgb24gdGhpcyB0ZW1wbGF0ZSBmcm9tIGJvdGggc2VydmVycwogICAgICAgIGZvciBzZXJ2ZXIgaW4gW3NlcnZlcjEsIHNlcnZlcjJdOgogICAgICAgICAgICBkZXBlbmRlbnRfdGVtcGxhdGVzID0gc2VydmVyLmpldF90ZW1wbGF0ZV9pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICBsYW1iZGEgdDogdC50ZW1wbGF0ZV9yZXF1aXJlc19pZHMuZmlsdGVyZWQoCiAgICAgICAgICAgICAgICAgICAgbGFtYmRhIGRlcDogZGVwLnRlbXBsYXRlX3JlcXVpcmVkX2lkID09IHRlbXBsYXRlCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICAgICAgaWYgZGVwZW5kZW50X3RlbXBsYXRlczoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIHNlcnZlciBmcm9tIGRlcGVuZGVudCB0ZW1wbGF0ZSdzIHNlcnZlcl9pZHMKICAgICAgICAgICAgICAgIGZvciBkZXBfdGVtcGxhdGUgaW4gZGVwZW5kZW50X3RlbXBsYXRlczoKICAgICAgICAgICAgICAgICAgICBkZXBfdGVtcGxhdGUud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWygzLCBzZXJ2ZXIuaWQpXX0pCgogICAgICAgICMgSW5zdGFsbCB0ZW1wbGF0ZSBvbiBib3RoIHNlcnZlcnMKICAgICAgICB0ZW1wbGF0ZS53cml0ZSh7InNlcnZlcl9pZHMiOiBbKDQsIHNlcnZlcjEuaWQpLCAoNCwgc2VydmVyMi5pZCldfSkKCiAgICAgICAgIyBNb2NrIHVuaW5zdGFsbCB0byB2ZXJpZnkgaXQncyBjYWxsZWQgZm9yIGJvdGggc2VydmVycwogICAgICAgIHdpdGggcGF0Y2goCiAgICAgICAgICAgICJvZG9vLmFkZG9ucy5jZXRtaXhfdG93ZXJfc2VydmVyLm1vZGVscy5jeF90b3dlcl9qZXRfdGVtcGxhdGVfaW5zdGFsbCIKICAgICAgICAgICAgIi5DeFRvd2VySmV0VGVtcGxhdGVJbnN0YWxsLnVuaW5zdGFsbCIKICAgICAgICApIGFzIG1vY2tfdW5pbnN0YWxsOgogICAgICAgICAgICB0ZW1wbGF0ZS51bmluc3RhbGxfZnJvbV9zZXJ2ZXJzKAogICAgICAgICAgICAgICAgW3NlcnZlcjEsIHNlcnZlcjJdLCByYWlzZV9pZl9ub3RfcG9zc2libGU9VHJ1ZQogICAgICAgICAgICApCgogICAgICAgICAgICAjIFZlcmlmeSB1bmluc3RhbGwgd2FzIGNhbGxlZCB0d2ljZSAob25jZSBwZXIgc2VydmVyKQogICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfdW5pbnN0YWxsLmNhbGxfY291bnQsIDIpCiAgICAgICAgICAgICMgVmVyaWZ5IGJvdGggc2VydmVycyB3ZXJlIGNhbGxlZAogICAgICAgICAgICBjYWxsX2FyZ3NfbGlzdCA9IG1vY2tfdW5pbnN0YWxsLmNhbGxfYXJnc19saXN0CiAgICAgICAgICAgIHNlcnZlcnNfY2FsbGVkID0gW2NhbGxbMV1bInNlcnZlciJdIGZvciBjYWxsIGluIGNhbGxfYXJnc19saXN0XQogICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlcnZlcjEsIHNlcnZlcnNfY2FsbGVkKQogICAgICAgICAgICBzZWxmLmFzc2VydEluKHNlcnZlcjIsIHNlcnZlcnNfY2FsbGVkKQoKICAgIGRlZiB0ZXN0X3VuaW5zdGFsbF9mcm9tX3NlcnZlcnNfbWl4ZWRfdmFsaWRhdGlvbl9zdGF0ZXMoc2VsZik6CiAgICAgICAgIiIiVGVzdCB1bmluc3RhbGxfZnJvbV9zZXJ2ZXJzIHdpdGggbWl4ZWQgc2VydmVyIHZhbGlkYXRpb24gc3RhdGVzIiIiCiAgICAgICAgc2VydmVyMSA9IHNlbGYuc2VydmVyX3Rlc3RfMQogICAgICAgIHNlcnZlcjIgPSBzZWxmLnNlcnZlcl90ZXN0XzIKICAgICAgICBzZXJ2ZXIzID0gc2VsZi5zZXJ2ZXJfdGVzdF8zCiAgICAgICAgdGVtcGxhdGUgPSBzZWxmLmpldF90ZW1wbGF0ZV90ZXN0CgogICAgICAgICMgU2VydmVyMTogVGVtcGxhdGUgbm90IGluc3RhbGxlZAogICAgICAgIHRlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNSwgMCwgMCldfSkKCiAgICAgICAgIyBTZXJ2ZXIyOiBKZXRzIHN0aWxsIGV4aXN0CiAgICAgICAgdGVtcGxhdGUud3JpdGUoeyJzZXJ2ZXJfaWRzIjogWyg0LCBzZXJ2ZXIyLmlkKV19KQogICAgICAgIHNlbGYuSmV0LmNyZWF0ZSgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIm5hbWUiOiAiVGVzdCBKZXQgTWl4ZWQgVmFsaWRhdGlvbiBTZXJ2ZXIyIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAidGVzdF9qZXRfbWl4ZWRfdmFsaWRhdGlvbl9zZXJ2ZXIyIiwKICAgICAgICAgICAgICAgICJqZXRfdGVtcGxhdGVfaWQiOiB0ZW1wbGF0ZS5pZCwKICAgICAgICAgICAgICAgICJzZXJ2ZXJfaWQiOiBzZXJ2ZXIyLmlkLAogICAgICAgICAgICB9CiAgICAgICAgKQoKICAgICAgICAjIFNlcnZlcjM6IFZhbGlkIGZvciB1bmluc3RhbGxhdGlvbgogICAgICAgIHRlbXBsYXRlLndyaXRlKHsic2VydmVyX2lkcyI6IFsoNCwgc2VydmVyMy5pZCldfSkKCiAgICAgICAgIyBNb2NrIHVuaW5zdGFsbCBhbmQgbm90aWZ5X3dhcm5pbmcKICAgICAgICB3aXRoIHBhdGNoKAogICAgICAgICAgICAib2Rvby5hZGRvbnMuY2V0bWl4X3Rvd2VyX3NlcnZlci5tb2RlbHMuY3hfdG93ZXJfamV0X3RlbXBsYXRlX2luc3RhbGwiCiAgICAgICAgICAgICIuQ3hUb3dlckpldFRlbXBsYXRlSW5zdGFsbC51bmluc3RhbGwiCiAgICAgICAgKSBhcyBtb2NrX3VuaW5zdGFsbCwgcGF0Y2gub2JqZWN0KAogICAgICAgICAgICBzZWxmLmVudi51c2VyLl9fY2xhc3NfXywgIm5vdGlmeV93YXJuaW5nIgogICAgICAgICkgYXMgbW9ja19ub3RpZnk6CiAgICAgICAgICAgIHRlbXBsYXRlLnVuaW5zdGFsbF9mcm9tX3NlcnZlcnMoCiAgICAgICAgICAgICAgICBbc2VydmVyMSwgc2VydmVyMiwgc2VydmVyM10sIHJhaXNlX2lmX25vdF9wb3NzaWJsZT1GYWxzZQogICAgICAgICAgICApCgogICAgICAgICAgICAjIFZlcmlmeSB3YXJuaW5ncyB3ZXJlIHNob3duIGZvciBzZXJ2ZXIxIGFuZCBzZXJ2ZXIyCiAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19ub3RpZnkuY2FsbF9jb3VudCwgMikKCiAgICAgICAgICAgICMgVmVyaWZ5IHVuaW5zdGFsbCB3YXMgY2FsbGVkIG9ubHkgZm9yIHNlcnZlcjMKICAgICAgICAgICAgbW9ja191bmluc3RhbGwuYXNzZXJ0X2NhbGxlZF9vbmNlX3dpdGgoc2VydmVyPXNlcnZlcjMsIHRlbXBsYXRlPXRlbXBsYXRlKQo=