PG1ldGEgY2hhcnNldD0ia29pOC1yIj4KPGJvZHk+CjxwPlRlc3QgdGhhdCBpc28tODg1OS0xIGFsaWFzZXMgdGhhdCBhcmVuJ3Qga25vd24gdG8gRmlyZWZveCBhbmQgSUUgYXJlbid0IHN1cHBvcnRlZAood2Ugc2hvdWxkIGZhbGwgYmFjayB0byBwYXJlbnQgZnJhbWUgY2hhcnNldCkuPC9wPgo8cCBpZD1yZXN1bHQ+VGVzdGluZy4uLjwvcD4KPHNjcmlwdD4KaWYgKHdpbmRvdy50ZXN0UnVubmVyKSB7CiAgICB0ZXN0UnVubmVyLndhaXRVbnRpbERvbmUoKTsKICAgIHRlc3RSdW5uZXIuZHVtcEFzVGV4dCgpOwp9Cgp2YXIgYWxpYXNlcyA9IFsKICAgICJmb29iYXIiLCAvLyBEZWZpbml0ZWx5IHVua25vd24sIHZlcmlmeSB0aGF0IGNoYXJzZXQgaW5oZXJpdGFuY2Ugd29ya3MuCiAgICAiODg1OV8xIiwgLy8gPHJkYXI6Ly9wcm9ibGVtLzc4NTkwNjg+CiAgICAiSVNPODg1OV8xIiwgLy8gPHJkYXI6Ly9wcm9ibGVtLzc4NjMzOTk+CiAgICAiODg1OS0xIiwgLy8gV2ViS2l0IHVzZWQgdG8gc3BlY2lmaWNhbGx5IGFkZCB0aGlzIGFsaWFzIG5hbWUsIGJ1dCBvdGhlciBicm93c2VycyBkb24ndCBzdXBwb3J0IGl0LgogICAgIklTT18yMDIyLGxvY2FsZT1qYSx2ZXJzaW9uPTAiLCAvLyBXZSBuZXZlciB3YW50IHZlcnNpb25lZCBhbGlhcyBuYW1lcywgb3RoZXIgYnJvd3NlcnMgZG9uJ3Qgc3VwcG9ydCB0aGVzZS4KICAgICJ1dGYgOCIsIC8vIE90aGVyIHdlaXJkIHZhcmlhdGlvbnMKICAgICJ1dGZfOCIsCiAgICAiODg1OSAxIiwKICAgICI4ODU5KjEiLAogICAgIjg4NTk6MSIsCiAgICAiODg1OTEiLAogICAgIklTT184ODU5MSIsCiAgICAiSVNPLTg4NTkxIiwKICAgICJJU08tODgtNTktMSIsCiAgICAibGF0aW4tMSIgLy8gWWVzLCBpdCdzICJsYXRpbjEiIHdpdGhvdXQgYSBkYXNoIC0gbmVpdGhlciBJRSBub3IgRmlyZWZveCBzdXBwb3J0ICJsYXRpbi0xIi4KXTsKICAgIApmb3IgKGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7ICsraSkgewogICAgdmFyIGlmciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpOwogICAgaWZyLnNldEF0dHJpYnV0ZSgic3JjIiwgInJlc291cmNlcy9iYWQtY2hhcnNldC1hbGlhcy5waHA/Y2hhcnNldD0iICsgYWxpYXNlc1tpXSk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGlmcik7Cn0KCnZhciBmcmFtZXNMZWZ0ID0gYWxpYXNlcy5sZW5ndGg7CmZ1bmN0aW9uIGZyYW1lTG9hZGVkKCkKewogICAgaWYgKCEtLWZyYW1lc0xlZnQpIHsKICAgICAgICB2YXIgZmFpbHVyZXMgPSAiIjsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYWxpYXNlcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICB2YXIgaWZyID0gZnJhbWVzW2ldOwogICAgICAgICAgICBpZiAoaWZyLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0IikuaW5uZXJIVE1MICE9ICJTVfPz5VNTIikKICAgICAgICAgICAgICAgIGZhaWx1cmVzICs9IGlmci5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hhcnNldCIpLmlubmVySFRNTCArICIgIjsKICAgICAgICB9CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLmlubmVySFRNTCA9ICFmYWlsdXJlcy5sZW5ndGggPyAiU1VDQ0VTUyIgOiAKICAgICAgICAgICAgKCJGQUlMOiAiICsgZmFpbHVyZXMpOwogICAgICAgIGlmICh3aW5kb3cudGVzdFJ1bm5lcikKICAgICAgICAgICAgdGVzdFJ1bm5lci5ub3RpZnlEb25lKCk7CiAgICB9Cn0KPC9zY3JpcHQ+CjwvYm9keT4K