LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENPUFlSSUdIVDogCiAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxLCBJbnRlcm5hdGlvbmFsIEJ1c2luZXNzIE1hY2hpbmVzIENvcnBvcmF0aW9uIGFuZAogKiBvdGhlcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJsb2N0ZXN0LmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjc3RyaW5nLmg+CgojaW5jbHVkZSAidW5pY29kZS9kZWNpbWZtdC5oIgovLyNpbmNsdWRlICJ1bmljb2RlL2RhdGVmbXQuaCIKI2luY2x1ZGUgInVuaWNvZGUvc21wZHRmbXQuaCIKCmNvbnN0IGNoYXIqIHJhd0RhdGFbMjddWzddID0gewoKICAgICAgICAvLyBsYW5ndWFnZSBjb2RlCiAgICAgICAgeyAgICJlbiIsICAgImZyIiwgICAiaHIiLCAgICJlbCIsICAgIm5vIiwgICAiaXQiLCAgICJ4eCIgICAgfSwKICAgICAgICAvLyBjb3VudHJ5IGNvZGUKICAgICAgICB7ICAgIlVTIiwgICAiRlIiLCAgICJIUiIsICAgIkdSIiwgICAiTk8iLCAgICIiLCAgICAgIllZIiAgICB9LAogICAgICAgIC8vIHZhcmlhbnQgY29kZQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIiAgICB9LAogICAgICAgIC8vIGZ1bGwgbmFtZQogICAgICAgIHsgICAiZW5fVVMiLCAgICAiZnJfRlIiLCAgICAiaHJfSFIiLCAgICAiZWxfR1IiLCAgICAibm9fTk9fTlkiLCAiaXQiLCAgICJ4eF9ZWSIgIH0sCiAgICAgICAgLy8gSVNPLTMgbGFuZ3VhZ2UKICAgICAgICB7ICAgImVuZyIsICAiZnJhIiwgICJocnYiLCAgImVsbCIsICAibm9yIiwgICJpdGEiLCAgIiIgICB9LAogICAgICAgIC8vIElTTy0zIGNvdW50cnkKICAgICAgICB7ICAgIlVTQSIsICAiRlJBIiwgICJIUlYiLCAgIkdSQyIsICAiTk9SIiwgICIiLCAgICAgIiIgICB9LAogICAgICAgIC8vIExDSUQgKG5vdCBjdXJyZW50bHkgcHVibGljKQogICAgICAgIHsgICAiNDA5IiwgIjQwYyIsICI0MWEiLCAiNDA4IiwgIjgxNCIsICIiLCAgICAgIiIgIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoRW5nbGlzaCkKICAgICAgICB7ICAgIkVuZ2xpc2giLCAgIkZyZW5jaCIsICAgIkNyb2F0aWFuIiwgIkdyZWVrIiwgICAgIk5vcndlZ2lhbiIsICAgICJJdGFsaWFuIiwgICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKEVuZ2xpc2gpCiAgICAgICAgeyAgICJVbml0ZWQgU3RhdGVzIiwgICAgIkZyYW5jZSIsICAgIkNyb2F0aWEiLCAgIkdyZWVjZSIsICAgIk5vcndheSIsICAgIiIsICAgICAiWVkiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChFbmdsaXNoKQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvL3sgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOWSIsICAgIiIsICAgICAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChFbmdsaXNoKQogICAgICAgIC8vIFVwZGF0ZWQgbm9fTk9fTlkgRW5nbGlzaCBkaXNwbGF5IG5hbWUgZm9yIG5ldyBwYXR0ZXJuLWJhc2VkIGFsZ29yaXRobQogICAgICAgIC8vIChwYXJ0IG9mIEV1cm8gc3VwcG9ydCkuCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LCBOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgLy97ICAgIkVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIiwgIkZyZW5jaCAoRnJhbmNlKSIsICJDcm9hdGlhbiAoQ3JvYXRpYSkiLCAiR3JlZWsgKEdyZWVjZSkiLCAiTm9yd2VnaWFuIChOb3J3YXksTlkpIiwgIkl0YWxpYW4iLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChGcmVuY2gpCiAgICAgICAgeyAgICJhbmdsYWlzIiwgICJmcmFuXFx1MDBFN2FpcyIsICAgImNyb2F0ZSIsICJncmVjIiwgICAgIm5vcnZcXHUwMEU5Z2llbiIsICAgICJpdGFsaWVuIiwgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoRnJlbmNoKQogICAgICAgIHsgICAiXFx1MDBDOXRhdHMtVW5pcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGllIiwgICJHclxcdTAwRThjZSIsICAgIk5vcnZcXHUwMEU4Z2UiLCAiIiwgICAgICJZWSIgfSwKICAgICAgICAvLyBkaXNwbGF5IHZhcmlhbnQgKEZyZW5jaCkKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiTnlub3JzayIsICAgICAiIiwgICAgICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChGcmVuY2gpCiAgICAgICAgLy97ICAgImFuZ2xhaXMgKMl0YXRzLVVuaXMpIiwgImZyYW7nYWlzIChGcmFuY2UpIiwgImNyb2F0ZSAoQ3JvYXRpZSkiLCAiZ3JlYyAoR3LoY2UpIiwgIm5vcnbpZ2llbiAoTm9yduhnZSxOeW5vcnNrKSIsICJpdGFsaWVuIiwgInh4IChZWSkiIH0sCiAgICAgICAgeyAgICJhbmdsYWlzIChcXHUwMEM5dGF0cy1VbmlzKSIsICJmcmFuXFx1MDBFN2FpcyAoRnJhbmNlKSIsICJjcm9hdGUgKENyb2F0aWUpIiwgImdyZWMgKEdyXFx1MDBFOGNlKSIsICJub3J2XFx1MDBFOWdpZW4gKE5vcnZcXHUwMEU4Z2UsIE55bm9yc2spIiwgIml0YWxpZW4iLCAieHggKFlZKSIgfSwgLy8gU1RJTEwgbm90IHJpZ2h0CgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgIiIsICJocnZhdHNraSIsICIiLCAgICAiIiwgIiIsICJ4eCIgfSwKICAgICAgICAvLyBkaXNwbGF5IGNvdW50cnkgKENyb2F0aWFuKQogICAgICAgIHsgICAiIiwgICAgIiIsICAgIkhydmF0c2thIiwgICIiLCAgICIiLCAiIiwgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoQ3JvYXRpYW4pCiAgICAgICAgeyAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICIiLCAiIn0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChDcm9hdGlhbikKICAgICAgICB7ICAgIiIsICIiLCAiaHJ2YXRza2kgKEhydmF0c2thKSIsICIiLCAiIiwgICIiLCAieHggKFlZKSIgfSwKCiAgICAgICAgLy8gZGlzcGxheSBsYW5nYWdlIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBjb3VudHJ5IChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSB2YXJpYW50IChHcmVlaykKICAgICAgICB7ICAgIiIsICAgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgIiIsICIiIH0sCiAgICAgICAgLy8gZGlzcGxheSBuYW1lIChHcmVlaylbYWN0dWFsIHZhbHVlcyBsaXN0ZWQgYmVsb3ddCiAgICB7ICAgIiIsICAiIiwgIiIsICIiLCAgICAiIiwgIiIsICIiIH0sCgogICAgICAgIC8vIGRpc3BsYXkgbGFuZ2FnZSAoPHJvb3Q+KQogICAgICAgIHsgICAiRW5nbGlzaCIsICAiRnJlbmNoIiwgICAiQ3JvYXRpYW4iLCAiR3JlZWsiLCAgICAiTm9yd2VnaWFuIiwgICAgIkl0YWxpYW4iLCAgInh4IiB9LAogICAgICAgIC8vIGRpc3BsYXkgY291bnRyeSAoPHJvb3Q+KQogICAgICAgIHsgICAiVW5pdGVkIFN0YXRlcyIsICAgICJGcmFuY2UiLCAgICJDcm9hdGlhIiwgICJHcmVlY2UiLCAgICJOb3J3YXkiLCAgICIiLCAgICAgIllZIiB9LAogICAgICAgIC8vIGRpc3BsYXkgdmFyaWFudCAoPHJvb3Q+KQogICAgICAgIHsgICAiIiwgICAgICIiLCAgICAgIiIsICAgICAiIiwgICAgICJOeW5vcnNrIiwgICAiIiwgICAgICIifSwKICAgICAgICAvLyBkaXNwbGF5IG5hbWUgKDxyb290PikKICAgICAgICAvL3sgICAiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykiLCAiRnJlbmNoIChGcmFuY2UpIiwgIkNyb2F0aWFuIChDcm9hdGlhKSIsICJHcmVlayAoR3JlZWNlKSIsICJOb3J3ZWdpYW4gKE5vcndheSxOeW5vcnNrKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0sCiAgICAgICAgeyAgICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIsICJGcmVuY2ggKEZyYW5jZSkiLCAiQ3JvYXRpYW4gKENyb2F0aWEpIiwgIkdyZWVrIChHcmVlY2UpIiwgIk5vcndlZ2lhbiAoTm9yd2F5LE5ZKSIsICJJdGFsaWFuIiwgInh4IChZWSkiIH0KfTsKCi8vICogdGVzdCBtYWNyb3MKLyoKIFVzYWdlOgogICAgdGVzdF9jb21wYXJlKCAgICBGdW5jdGlvbiB0byBiZSBwZXJmb3JtZWQsCiAgICAgICAgICAgICAgICAgICAgICAgVGVzdCBvZiB0aGUgZnVuY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgcmVzdWx0IG9mIHRoZSB0ZXN0LAogICAgICAgICAgICAgICAgICAgICAgIHByaW50YWJsZSByZXN1bHQKICAgICAgICAgICAgICAgICAgKQoKICAgRXhhbXBsZToKICAgICAgIHRlc3RfY29tcGFyZShpPTMsaSwzLCBzb21lTnVtYmVyRm9ybWF0dGVyKGkpKTsKICAgICAgIHRlc3RfY29tcGFyZSgwLDErMSwyLHNvbWVOdW1iZXJGb3JtYXR0ZXIoMSsxKSk7IAoKICAgTm90ZSB0aGF0IGluIHRoZSBzZWNvbmQgZXhhbXBsZSB0aGUgZXhwcmVzc2lvbiBpcyAwLCBiZWNhdXNlIHRoZSBmY24gcHJvZHVjZXMgaXQncyBvd24gcmVzdWx0LgoKICAgTWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9jb21wYXJlKGV4cHJlc3Npb24sdGVzdCxleHBlY3RlZCxwcmludGFibGVSZXN1bHQpIFwKICAgIHsgXAogICAgICAgIGV4cHJlc3Npb247IFwKICAgICAgICBcCiAgICAgICAgaWYoKHRlc3QpICE9IChleHBlY3RlZCkpIFwKICAgICAgICAgICAgZXJybG4oIkZBSUw6ICIgKyBVbmljb2RlU3RyaW5nKCNleHByZXNzaW9uKSArICI7IC0+ICIgKyBwcmludGFibGVSZXN1bHQgKyAiXG4iICsgXAogICAgICAgICAgICAgICAgICAgICIgICAoIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiAhPSAiICsgVW5pY29kZVN0cmluZygjZXhwZWN0ZWQpICsgIikiICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oVW5pY29kZVN0cmluZygjZXhwcmVzc2lvbikgKyAiIC0+ICIgKyBwcmludGFibGVSZXN1bHQgKyAiICgiICsgVW5pY29kZVN0cmluZygjdGVzdCkgKyAiKSIpOyBcCiAgICB9CgoKCgovKgogVXNhZ2U6CiAgICB0ZXN0X2Fzc2VydF9wcmludCggICAgVGVzdCAoc2hvdWxkIGJlIFRSVUUpLCAgcHJpbnRhYmxlICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9hc3NlcnQoaT09MywgdG9TdHJpbmcoaSkpOwoKICAgdGhlIG1hY3JvIGlzIHVnbHkgYnV0IG1ha2VzIHRoZSB0ZXN0cyBwcmV0dHkuCiovCgojZGVmaW5lIHRlc3RfYXNzZXJ0X3ByaW50KHRlc3QscHJpbnQpIFwKICAgIHsgXAogICAgICAgIGlmKCEodGVzdCkpIFwKICAgICAgICAgICAgZXJybG4oIkZBSUw6ICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICIgd2FzIG5vdCB0cnVlLiIgKyAiLT4gIiArIFVuaWNvZGVTdHJpbmcocHJpbnQpICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSArICItPiAiICsgVW5pY29kZVN0cmluZyhwcmludCkpOyBcCiAgICB9CgoKI2RlZmluZSB0ZXN0X2R1bXBMb2NhbGUobCkgeyBVbmljb2RlU3RyaW5nIHMobC5nZXROYW1lKCksIiIpOyBsb2dsbigjbCArIFVuaWNvZGVTdHJpbmcoIiA9ICIpICsgcyk7IH0KCkxvY2FsZVRlc3Q6OkxvY2FsZVRlc3QoKQo6IGRhdGFUYWJsZShOVUxMKQp7CiAgICBzZXRVcERhdGFUYWJsZSgpOwp9CgpMb2NhbGVUZXN0Ojp+TG9jYWxlVGVzdCgpCnsKICAgIGlmIChkYXRhVGFibGUgIT0gMCkgewogICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDI3OyBpKyspIHsKICAgICAgICAgICAgZGVsZXRlIFtdZGF0YVRhYmxlW2ldOwogICAgICAgIH0KICAgICAgICBkZWxldGUgW11kYXRhVGFibGU7CiAgICAgICAgZGF0YVRhYmxlID0gMDsKICAgIH0KfQoKI2RlZmluZSBDQVNFKGlkLHRlc3QpIGNhc2UgaWQ6IG5hbWUgPSAjdGVzdDsgaWYgKGV4ZWMpIHsgbG9nbG4oI3Rlc3QgIi0tLSIpOyBsb2dsbigoVW5pY29kZVN0cmluZykiIik7IHRlc3QoKTsgfSBicmVhazsKCnZvaWQgTG9jYWxlVGVzdDo6cnVuSW5kZXhlZFRlc3QoIGludDMyX3QgaW5kZXgsIFVCb29sIGV4ZWMsIGNvbnN0IGNoYXIqICZuYW1lLCBjaGFyKiAvKnBhciovICkKewogICAgaWYgKGV4ZWMpIGxvZ2xuKCJUZXN0U3VpdGUgTG9jYWxlVGVzdDogIik7CiAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOiBuYW1lID0gIlRlc3RCYXNpY0dldHRlcnMiOyBpZiAoZXhlYykgVGVzdEJhc2ljR2V0dGVycygpOyBicmVhazsKICAgICAgICBjYXNlIDE6IG5hbWUgPSAiVGVzdFNpbXBsZVJlc291cmNlSW5mbyI7IGlmIChleGVjKSBUZXN0U2ltcGxlUmVzb3VyY2VJbmZvKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMjogbmFtZSA9ICJUZXN0RGlzcGxheU5hbWVzIjsgaWYgKGV4ZWMpIFRlc3REaXNwbGF5TmFtZXMoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAzOiBuYW1lID0gIlRlc3RTaW1wbGVPYmplY3RTdHVmZiI7IGlmIChleGVjKSBUZXN0U2ltcGxlT2JqZWN0U3R1ZmYoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA0OiBuYW1lID0gIlRlc3RQT1NJWFBhcnNpbmciOyBpZiAoZXhlYykgVGVzdFBPU0lYUGFyc2luZygpOyBicmVhazsKICAgICAgICBjYXNlIDU6IG5hbWUgPSAiVGVzdEdldEF2YWlsYWJsZUxvY2FsZXMiOyBpZiAoZXhlYykgVGVzdEdldEF2YWlsYWJsZUxvY2FsZXMoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA2OiBuYW1lID0gIlRlc3REYXRhRGlyZWN0b3J5IjsgaWYgKGV4ZWMpIFRlc3REYXRhRGlyZWN0b3J5KCk7IGJyZWFrOwoKICAgICAgICBDQVNFKDcsIFRlc3RJU08zRmFsbGJhY2spCiAgICAgICAgQ0FTRSg4LCBUZXN0R2V0TGFuZ3NBbmRDb3VudHJpZXMpCiAgICAgICAgQ0FTRSg5LCBUZXN0NDEyNjg4MCkKICAgICAgICBDQVNFKDEwLCBUZXN0QnVnNDEzNTMxNikKICAgICAgICBDQVNFKDExLCBUZXN0U2ltcGxlRGlzcGxheU5hbWVzKQogICAgICAgIENBU0UoMTIsIFRlc3RVbmluc3RhbGxlZElTTzNOYW1lcykKICAgICAgICBDQVNFKDEzLCBUZXN0QXR5cGljYWxMb2NhbGVzKQogICAgICAgIENBU0UoMTQsIFRlc3RUaGFpQ3VycmVuY3lGb3JtYXQpCiAgICAgICAgQ0FTRSgxNSwgVGVzdEV1cm9TdXBwb3J0KQogICAgICAgIENBU0UoMTYsIFRlc3RUb1N0cmluZykKICAgICAgICBDQVNFKDE3LCBUZXN0NDEzOTk0MCkKICAgICAgICBDQVNFKDE4LCBUZXN0NDE0Mzk1MSkKICAgICAgICBDQVNFKDE5LCBUZXN0NDE0NzMxNSkKICAgICAgICBDQVNFKDIwLCBUZXN0NDE0NzMxNykKICAgICAgICBDQVNFKDIxLCBUZXN0NDE0NzU1MikKICAgICAgICBDQVNFKDIyLCBUZXN0VmFyaWFudFBhcnNpbmcpCiAgICAgICAgQ0FTRSgyMywgVGVzdDQxMDU4MjgpCgogICAgICAgIGRlZmF1bHQ6IG5hbWUgPSAiIjsgYnJlYWs7IC8vbmVlZGVkIHRvIGVuZCBsb29wCiAgICB9Cn0KCnZvaWQgTG9jYWxlVGVzdDo6VGVzdEJhc2ljR2V0dGVycygpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwoKICAgIGludDMyX3QgaTsKICAgIGZvciAoaSA9IDA7IGkgPD0gTUFYX0xPQ0FMRVM7IGkrKykgewogICAgICAgIExvY2FsZSB0ZXN0TG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0sIHJhd0RhdGFbVkFSXVtpXSk7CiAgICAgICAgbG9nbG4oIlRlc3RpbmcgIiArIChVbmljb2RlU3RyaW5nKXRlc3RMb2NhbGUuZ2V0TmFtZSgpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0VmFyaWFudCgpKSAhPSAoZGF0YVRhYmxlW1ZBUl1baV0pKQogICAgICAgICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtWQVJdW2ldKTsKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TmFtZSgpKSAhPSAoZGF0YVRhYmxlW05BTUVdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTG9jYWxlIG5hbWUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtOQU1FXVtpXSk7CiAgICB9CgogICAgbG9nbG4oIlNhbWUgdGhpbmcgd2l0aG91dCB2YXJpYW50IGNvZGVzLi4uIik7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZShyYXdEYXRhW0xBTkddW2ldLCByYXdEYXRhW0NUUlldW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwoKICAgICAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0TGFuZ3VhZ2UoKSkgIT0gKGRhdGFUYWJsZVtMQU5HXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExhbmd1YWdlIGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtMQU5HXVtpXSk7CiAgICAgICAgaWYgKCAodGVtcD10ZXN0TG9jYWxlLmdldENvdW50cnkoKSkgIT0gKGRhdGFUYWJsZVtDVFJZXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIENvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0NUUlldW2ldKTsKICAgICAgICBpZiAodGVzdExvY2FsZS5nZXRWYXJpYW50KClbMF0gIT0gMCkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiBzb21ldGhpbmcgdmVyc3VzIFwiXCIiKTsKICAgIH0KICAgIAogICAgLyp0ZXN0cyBmb3IgdGhlIGRlcHJhY3RlZCBBUEkqLwojaWZkZWYgSUNVX0xPQ0lEX1VTRV9ERVBSRUNBVEVTCiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZSgoVW5pY29kZVN0cmluZylyYXdEYXRhW0xBTkddW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW0NUUlldW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW1ZBUl1baV0pOwogICAgICAgIGxvZ2xuKCJUZXN0aW5nICIgKyAoVW5pY29kZVN0cmluZyl0ZXN0TG9jYWxlLmdldE5hbWUoKSArICIuLi4iKTsKCiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldExhbmd1YWdlKHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbTEFOR11baV0pKQogICAgICAgICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTEFOR11baV0pOwogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRDb3VudHJ5KHRlbXApICE9IChVbmljb2RlU3RyaW5nKShkYXRhVGFibGVbQ1RSWV1baV0pKQogICAgICAgICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiB2ZXJzdXMgIgogICAgICAgICAgICAgICAgICAgICAgICArIGRhdGFUYWJsZVtDVFJZXVtpXSk7CiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldFZhcmlhbnQodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtWQVJdW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgVmFyaWFudCBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbVkFSXVtpXSk7CiAgICAgICAgaWYgKCB0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtOQU1FXVtpXSkpCiAgICAgICAgICAgIGVycmxuKCIgIExvY2FsZSBuYW1lIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbTkFNRV1baV0pOwogICAgfQogICAgbG9nbG4oIlNhbWUgdGhpbmcgd2l0aG91dCB2YXJpYW50IGNvZGVzLi4uIik7CiAgICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgICAgICBMb2NhbGUgdGVzdExvY2FsZSgoVW5pY29kZVN0cmluZylyYXdEYXRhW0xBTkddW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW0NUUlldW2ldKTsKICAgICAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlc3RMb2NhbGUuZ2V0TmFtZSh0ZW1wKSkgKyAiLi4uIik7CgogICAgICAgIGlmICggdGVzdExvY2FsZS5nZXRMYW5ndWFnZSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0xBTkddW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgTGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAgKyAiIHZlcnN1cyAiCiAgICAgICAgICAgICAgICAgICAgICAgICsgZGF0YVRhYmxlW0xBTkddW2ldKTsKICAgICAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0Q291bnRyeSh0ZW1wKSAhPSAoVW5pY29kZVN0cmluZykoZGF0YVRhYmxlW0NUUlldW2ldKSkKICAgICAgICAgICAgZXJybG4oIiAgQ291bnRyeSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgdmVyc3VzICIKICAgICAgICAgICAgICAgICAgICAgICAgKyBkYXRhVGFibGVbQ1RSWV1baV0pOwogICAgICAgIGlmICh0ZXN0TG9jYWxlLmdldFZhcmlhbnQodGVtcCkubGVuZ3RoKCkgIT0gMCApCiAgICAgICAgICAgIGVycmxuKCIgIFZhcmlhbnQgY29kZSBtaXNtYXRjaDogc29tZXRoaW5nIHZlcnN1cyBcIlwiIik7CiAgICB9CgojZW5kaWYKCiAgICBsb2dsbigiVGVzdGluZyBsb25nIGxhbmd1YWdlIG5hbWVzIGFuZCBnZXR0ZXJzIik7CiAgICBMb2NhbGUgIHRlc3Q4ID0gTG9jYWxlOjpjcmVhdGVGcm9tTmFtZSgieC1rbGluZ29uLXp4LnV0ZjMyYmVAc3BlY2lhbCIpOwoKICAgIHRlbXAgPSB0ZXN0OC5nZXRMYW5ndWFnZSgpOwogICAgaWYgKHRlbXAgIT0gVW5pY29kZVN0cmluZygieC1rbGluZ29uIikgKQogICAgICBlcnJsbigiICBMYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcCArICIgIHZlcnN1cyBcIngta2xpbmdvblwiIik7CgogICAgdGVtcCA9IHRlc3Q4LmdldENvdW50cnkoKTsKICAgIGlmICh0ZW1wICE9IFVuaWNvZGVTdHJpbmcoIlpYIikgKQogICAgICBlcnJsbigiICBDb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiAgdmVyc3VzIFwiWlhcIiIpOwoKICAgIHRlbXAgPSB0ZXN0OC5nZXRWYXJpYW50KCk7CiAgICBpZiAodGVtcCAhPSBVbmljb2RlU3RyaW5nKCJTUEVDSUFMIikgKQogICAgICBlcnJsbigiICBWYXJpYW50IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wICsgIiAgdmVyc3VzIFwiU1BFQ0lBTFwiIik7CgogICAgaWYgKExvY2FsZTo6Z2V0RGVmYXVsdCgpICE9IExvY2FsZTo6Y3JlYXRlRnJvbU5hbWUoTlVMTCkpCiAgICAgIGVycmxuKCJMb2NhbGU6OmdldERlZmF1bHQoKSA9PSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKE5VTEwpIik7CgogICAgLyotLS0tLS0tLS0tKi8KICAgIC8vIE5PVEU6IFRoZXJlIHVzZWQgdG8gYmUgYSBzcGVjaWFsIHRlc3QgZm9yIGxvY2FsZSBuYW1lcyB0aGF0IGhhZCBsYW5ndWFnZSBvcgogICAgLy8gY291bnRyeSBjb2RlcyB0aGF0IHdlcmUgbG9uZ2VyIHRoYW4gdHdvIGxldHRlcnMuICBUaGUgbmV3IHZlcnNpb24gb2YgTG9jYWxlCiAgICAvLyBkb2Vzbid0IHN1cHBvcnQgYW55dGhpbmcgdGhhdCBpc24ndCBhbiBvZmZpY2lhbGx5IHJlY29nbml6ZWQgbGFuZ3VhZ2Ugb3IKICAgIC8vIGNvdW50cnkgY29kZSwgc28gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgdGhpcyBmZWF0dXJlLgp9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVSZXNvdXJjZUluZm8oKSB7CiAgVW5pY29kZVN0cmluZyAgIHRlbXA7CiAgY2hhciAgICAgICAgICAgIHRlbXAyWzIwXTsKICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKICBpbnQzMl90IGkgPSAwOwoKICBmb3IgKGkgPSAwOyBpIDw9IE1BWF9MT0NBTEVTOyBpKyspIHsKICAgIExvY2FsZSB0ZXN0TG9jYWxlKHJhd0RhdGFbTEFOR11baV0sIHJhd0RhdGFbQ1RSWV1baV0sIHJhd0RhdGFbVkFSXVtpXSk7CiAgICBsb2dsbigiVGVzdGluZyAiICsgKHRlbXA9dGVzdExvY2FsZS5nZXROYW1lKCkpICsgIi4uLiIpOwogICAgCiAgICBpZiAoICh0ZW1wPXRlc3RMb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkpICE9IChkYXRhVGFibGVbTEFORzNdW2ldKSkKICAgICAgZXJybG4oIiAgSVNPLTMgbGFuZ3VhZ2UgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbTEFORzNdW2ldKTsKICAgIGlmICggKHRlbXA9dGVzdExvY2FsZS5nZXRJU08zQ291bnRyeSgpKSAhPSAoZGF0YVRhYmxlW0NUUlkzXVtpXSkpCiAgICAgIGVycmxuKCIgIElTTy0zIGNvdW50cnkgY29kZSBtaXNtYXRjaDogIiArIHRlbXAKICAgICAgICArICIgdmVyc3VzICIgKyBkYXRhVGFibGVbQ1RSWTNdW2ldKTsKICAgIAogICAgc3ByaW50Zih0ZW1wMiwgIiV4IiwgdGVzdExvY2FsZS5nZXRMQ0lEKCkpOwogICAgaWYgKFVuaWNvZGVTdHJpbmcodGVtcDIpICE9IGRhdGFUYWJsZVtMQ0lEXVtpXSkKICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIiAgTENJRCBtaXNtYXRjaDogIiArIHRlbXAyICsgIiB2ZXJzdXMgIgogICAgICAgICsgZGF0YVRhYmxlW0xDSURdW2ldKTsKCiAgICBpZihVX0ZBSUxVUkUoZXJyKSkKICAgICAgewogICAgICAgIGVycmxuKChVbmljb2RlU3RyaW5nKSJTb21lIGVycm9yIG9uIG51bWJlciAiICsgaSArIHVfZXJyb3JOYW1lKGVycikpOwogICAgICB9CiAgICBlcnIgPSBVX1pFUk9fRVJST1I7CiAgfQoKICAvKnRlc3RzIGZvciB0aGUgZGVwcmVjYXRlZCBBUEkqLwojaWZkZWYgSUNVX0xPQ0lEX1VTRV9ERVBSRUNBVEVTCiAgZm9yIChpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICBMb2NhbGUgdGVzdExvY2FsZSgoVW5pY29kZVN0cmluZylyYXdEYXRhW0xBTkddW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW0NUUlldW2ldLCAoVW5pY29kZVN0cmluZylyYXdEYXRhW1ZBUl1baV0pOwogICAgbG9nbG4oIlRlc3RpbmcgIiArICh0ZXN0TG9jYWxlLmdldE5hbWUodGVtcCkpICsgIi4uLiIpOwogICAgCiAgICBpZiAoIHRlc3RMb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKHRlbXAsIGVycikgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtMQU5HM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBsYW5ndWFnZSBjb2RlIG1pc21hdGNoOiAiICsgdGVtcAogICAgICAgICsgIiB2ZXJzdXMgIiArIGRhdGFUYWJsZVtMQU5HM11baV0pOwogICAgaWYgKCB0ZXN0TG9jYWxlLmdldElTTzNDb3VudHJ5KHRlbXAsIGVycikgIT0gKFVuaWNvZGVTdHJpbmcpKGRhdGFUYWJsZVtDVFJZM11baV0pKQogICAgICBlcnJsbigiICBJU08tMyBjb3VudHJ5IGNvZGUgbWlzbWF0Y2g6ICIgKyB0ZW1wCiAgICAgICAgKyAiIHZlcnN1cyAiICsgZGF0YVRhYmxlW0NUUlkzXVtpXSk7CiAgICAKICAgIGlmKFVfRkFJTFVSRShlcnIpKQogICAgICB7CiAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIlNvbWUgZXJyb3Igb24gbnVtYmVyICIgKyBpICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICAgIH0KICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgfQojZW5kaWYKCiAgIExvY2FsZSBsb2NhbGUoImVuIik7CiAgIGlmKHN0cmNtcChsb2NhbGUuZ2V0TmFtZSgpLCAiZW4iKSAhPSAwfHwKICAgICAgIHN0cmNtcChsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSwgImVuIikgIT0gMCkgewogICAgICAgZXJybG4oImNvbnN0cnVjdGlvbiBvZiBMb2NhbGUoZW4pIGZhaWxlZFxuIik7CiAgIH0KICAgLyotLS0tLSovCgp9Cgp2b2lkIApMb2NhbGVUZXN0OjpUZXN0RGlzcGxheU5hbWVzKCkgCnsKICAgIExvY2FsZSAgc2F2ZURlZmF1bHQgPSBMb2NhbGU6OmdldERlZmF1bHQoKTsKICAgIExvY2FsZSAgZW1wdHkoIiIsICIiKTsKICAgIExvY2FsZSAgZW5nbGlzaCgiZW4iLCAiVVMiKTsKICAgIExvY2FsZSAgZnJlbmNoKCJmciIsICJGUiIpOwogICAgTG9jYWxlICBjcm9hdGlhbigiaHIiLCAiSFIiKTsKICAgIExvY2FsZSAgZ3JlZWsoImVsIiwgIkdSIik7CiAgICBVRXJyb3JDb2RlIGVyciA9IFVfWkVST19FUlJPUjsKCiAgICBMb2NhbGU6OnNldERlZmF1bHQoZW5nbGlzaCwgZXJyKTsKICAgIGlmIChVX0ZBSUxVUkUoZXJyKSkgewogICAgICAgIGVycmxuKCJMb2NhbGU6OnNldERlZmF1bHQgcmV0dXJuZWQgZXJyb3IgY29kZSAiICsgKGludCllcnIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBsb2dsbigiV2l0aCBkZWZhdWx0ID0gZW5fVVMuLi4iKTsKICAgIGxvZ2xuKCIgIEluIGRlZmF1bHQgbG9jYWxlLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZW1wdHksIERMQU5HX0VOLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbl9VUy4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVuZ2xpc2gsIERMQU5HX0VOLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBmcl9GUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGZyZW5jaCwgRExBTkdfRlIsIEZBTFNFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGhyX0hSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoY3JvYXRpYW4sIERMQU5HX0hSLCBGQUxTRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbF9HUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGdyZWVrLCBETEFOR19FTCwgRkFMU0UpOwoKICAgIExvY2FsZTo6c2V0RGVmYXVsdChmcmVuY2gsIGVycik7CiAgICBpZiAoVV9GQUlMVVJFKGVycikpIHsKICAgICAgICBlcnJsbigiTG9jYWxlOjpzZXREZWZhdWx0IHJldHVybmVkIGVycm9yIGNvZGUgIiArIChpbnQpZXJyKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbG9nbG4oIldpdGggZGVmYXVsdCA9IGZyX0ZSLi4uIik7CiAgICBsb2dsbigiICBJbiBkZWZhdWx0IGxvY2FsZS4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVtcHR5LCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbl9VUy4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGVuZ2xpc2gsIERMQU5HX0VOLCBUUlVFKTsKICAgIGxvZ2xuKCIgIEluIGxvY2FsZSA9IGZyX0ZSLi4uIik7CiAgICBkb1Rlc3REaXNwbGF5TmFtZXMoZnJlbmNoLCBETEFOR19GUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBocl9IUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGNyb2F0aWFuLCBETEFOR19IUiwgVFJVRSk7CiAgICBsb2dsbigiICBJbiBsb2NhbGUgPSBlbF9HUi4uLiIpOwogICAgZG9UZXN0RGlzcGxheU5hbWVzKGdyZWVrLCBETEFOR19FTCwgVFJVRSk7CgogICAgTG9jYWxlOjpzZXREZWZhdWx0KHNhdmVEZWZhdWx0LCBlcnIpOwogICAgaWYgKFVfRkFJTFVSRShlcnIpKSB7CiAgICAgICAgZXJybG4oIkxvY2FsZTo6c2V0RGVmYXVsdCByZXR1cm5lZCBlcnJvciBjb2RlICIgKyAoaW50KWVycik7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgovKgogVXNhZ2U6CiAgICB0ZXN0X2Fzc2VydCggICAgVGVzdCAoc2hvdWxkIGJlIFRSVUUpICApCgogICBFeGFtcGxlOgogICAgICAgdGVzdF9hc3NlcnQoaT09Myk7CgogICB0aGUgbWFjcm8gaXMgdWdseSBidXQgbWFrZXMgdGhlIHRlc3RzIHByZXR0eS4KKi8KCiNkZWZpbmUgdGVzdF9hc3NlcnQodGVzdCkgXAogICAgeyBcCiAgICAgICAgaWYoISh0ZXN0KSkgXAogICAgICAgICAgICBlcnJsbigiRkFJTDogIiArIFVuaWNvZGVTdHJpbmcoI3Rlc3QpICsgIiB3YXMgbm90IHRydWUuICIgKyBVbmljb2RlU3RyaW5nKF9fRklMRV9fICIgbGluZSAiKSArIF9fTElORV9fICk7IFwKICAgICAgICBlbHNlIFwKICAgICAgICAgICAgbG9nbG4oIlBBU1M6IGFzc2VydGVkICIgKyBVbmljb2RlU3RyaW5nKCN0ZXN0KSApOyBcCiAgICB9Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RTaW1wbGVPYmplY3RTdHVmZigpIHsKICAgIExvY2FsZSAgdGVzdDEoImFhIiwgIkFBIik7CiAgICBMb2NhbGUgIHRlc3QyKCJhYSIsICJBQSIpOwogICAgTG9jYWxlICB0ZXN0Myh0ZXN0MSk7CiAgICBMb2NhbGUgIHRlc3Q0KCJ6eiIsICJaWiIpOwogICAgTG9jYWxlICB0ZXN0NSgiYWEiLCAiQUEiLCAiIik7IAogICAgTG9jYWxlICB0ZXN0NigiYWEiLCAiQUEiLCAiQU5UQVJFUyIpOyAKICAgIExvY2FsZSAgdGVzdDcoImFhIiwgIkFBIiwgIkpVUElURVIiKTsKICAgIExvY2FsZSAgdGVzdDggPSBMb2NhbGU6OmNyZWF0ZUZyb21OYW1lKCJhYS1hYS51dGY4QGp1cGl0ZXIiKTsKCiAgICAvLyBub3cgbGlzdCB0aGVtIGFsbCBmb3IgZGVidWdnaW5nIHVzYWdlLgogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QxKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Mik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDMpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q0KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDYpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q3KTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0OCk7CgogICAgLy8gTWFrZSBzdXJlIHRoaW5ncyBjb21wYXJlIHRvIHRoZW1zZWx2ZXMhCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MiA9PSB0ZXN0Mik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0MyA9PSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NCA9PSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSA9PSB0ZXN0NSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NyA9PSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0OCA9PSB0ZXN0OCk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyBhcmUgbm90IGVxdWFsIHRvIHRoZW1zZWx2ZXMuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxICE9IHRlc3QxKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyICE9IHRlc3QyKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzICE9IHRlc3QzKSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q0ICE9IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q1ICE9IHRlc3Q1KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q2ICE9IHRlc3Q2KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q3ICE9IHRlc3Q3KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3Q4ICE9IHRlc3Q4KSk7CgogICAgLy8gbWFrZSBzdXJlIHRoaW5ncyB0aGF0IGFyZSBlcXVhbCB0byBlYWNoIG90aGVyIGRvbid0IHNob3cgdXAgYXMgdW5lcXVhbC4KICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDIpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDEpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDMpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3QxKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3QyKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ICE9IHRlc3Q1KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CgogICAgLy8gdGVzdCBmb3IgdGhpbmdzIHRoYXQgc2hvdWxkbid0IGNvbXBhcmUgZXF1YWwuCiAgICB0ZXN0X2Fzc2VydCghKHRlc3QxID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QyID09IHRlc3Q0KSk7CiAgICB0ZXN0X2Fzc2VydCghKHRlc3QzID09IHRlc3Q0KSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDgpOwoKICAgIC8vIHRlc3QgZm9yIGhhc2ggY29kZXMgdG8gYmUgdGhlIHNhbWUuCiAgICBpbnQzMl90IGhhc2gxID0gdGVzdDEuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDIgPSB0ZXN0Mi5oYXNoQ29kZSgpOwogICAgaW50MzJfdCBoYXNoMyA9IHRlc3QzLmhhc2hDb2RlKCk7CgogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDIpOwogICAgdGVzdF9hc3NlcnQoaGFzaDEgPT0gaGFzaDMpOwogICAgdGVzdF9hc3NlcnQoaGFzaDIgPT0gaGFzaDMpOwoKICAgIC8vIHRlc3QgdGhhdCB0aGUgYXNzaWdubWVudCBvcGVyYXRvciB3b3Jrcy4KICAgIHRlc3Q0ID0gdGVzdDE7CiAgICBsb2dsbigidGVzdDQ9dGVzdDE7Iik7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDQpOwogICAgdGVzdF9hc3NlcnQodGVzdDQgPT0gdGVzdDQpOwoKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDEgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDIgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KCEodGVzdDMgIT0gdGVzdDQpKTsKICAgIHRlc3RfYXNzZXJ0KHRlc3QxID09IHRlc3Q0KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3QxKTsKICAgIAogICAgLy8gdGVzdCBhc3NpZ25tZW50cyB3aXRoIGEgdmFyaWFudAogICAgbG9nbG4oInRlc3Q3ID0gdGVzdDYiKTsKICAgIHRlc3Q3ID0gdGVzdDY7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDcpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgPT0gdGVzdDYpOwogICAgdGVzdF9hc3NlcnQodGVzdDcgIT0gdGVzdDUpOwoKICAgIGxvZ2xuKCJ0ZXN0NiA9IHRlc3QxIik7CiAgICB0ZXN0Nj10ZXN0MTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0Nik7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiAhPSB0ZXN0Nyk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0MSk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NiA9PSB0ZXN0Nik7Cn0KCi8vIEEgY2xhc3Mgd2hpY2ggZXhwb3NlcyBjb25zdHJ1Y3RvcnMgdGhhdCBhcmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFBPU0lYIHBhcnNpbmcgY29kZS4KY2xhc3MgUE9TSVhMb2NhbGUgOiBwdWJsaWMgTG9jYWxlCnsKcHVibGljOgogICAgUE9TSVhMb2NhbGUoY29uc3QgVW5pY29kZVN0cmluZyYgbCkKICAgICAgICA6TG9jYWxlKCkKICAgIHsKICAgICAgY2hhciAqY2g7CiAgICAgIGNoID0gbmV3IGNoYXJbbC5sZW5ndGgoKSArIDFdOwogICAgICBjaFtsLmV4dHJhY3QoMCwgMHg3ZmZmZmZmZiwgY2gsICIiKV0gPSAwOwogICAgICBzZXRGcm9tUE9TSVhJRChjaCk7CiAgICAgIGRlbGV0ZSBbXSBjaDsKICAgIH0KICAgIFBPU0lYTG9jYWxlKGNvbnN0IGNoYXIgKmwpCiAgICAgICAgOkxvY2FsZSgpCiAgICB7CiAgICAgICAgc2V0RnJvbVBPU0lYSUQobCk7CiAgICB9Cn07Cgp2b2lkIExvY2FsZVRlc3Q6OlRlc3RQT1NJWFBhcnNpbmcoKQp7CiAgICBQT1NJWExvY2FsZSAgdGVzdDEoImFiX0FCIik7CiAgICBQT1NJWExvY2FsZSAgdGVzdDIoVW5pY29kZVN0cmluZygiYWJfQUIiKSk7CiAgICBMb2NhbGUgIHRlc3QzKCJhYiIsIkFCIik7CgogICAgUE9TSVhMb2NhbGUgdGVzdDQoImFiX0FCX0FudGFyZXMiKTsKICAgIFBPU0lYTG9jYWxlIHRlc3Q1KFVuaWNvZGVTdHJpbmcoImFiX0FCX0FudGFyZXMiKSk7CiAgICBMb2NhbGUgIHRlc3Q2KCJhYiIsICJBQiIsICJBbnRhcmVzIik7IAoKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0MSk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDIpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3QzKTsKICAgIHRlc3RfZHVtcExvY2FsZSh0ZXN0NCk7CiAgICB0ZXN0X2R1bXBMb2NhbGUodGVzdDUpOwogICAgdGVzdF9kdW1wTG9jYWxlKHRlc3Q2KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSA9PSB0ZXN0MSk7CgogICAgdGVzdF9hc3NlcnQodGVzdDEgPT0gdGVzdDIpOwogICAgdGVzdF9hc3NlcnQodGVzdDIgPT0gdGVzdDMpOwogICAgdGVzdF9hc3NlcnQodGVzdDMgPT0gdGVzdDEpOwoKICAgIHRlc3RfYXNzZXJ0KHRlc3Q0ID09IHRlc3Q1KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q1ID09IHRlc3Q2KTsKICAgIHRlc3RfYXNzZXJ0KHRlc3Q2ID09IHRlc3Q0KTsKCiAgICB0ZXN0X2Fzc2VydCh0ZXN0MSAhPSB0ZXN0NCk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Myk7CiAgICB0ZXN0X2Fzc2VydCh0ZXN0NSAhPSB0ZXN0Mik7CgogICAgaW50MzJfdCBoYXNoMSA9IHRlc3QxLmhhc2hDb2RlKCk7CiAgICBpbnQzMl90IGhhc2gyID0gdGVzdDIuaGFzaENvZGUoKTsKICAgIGludDMyX3QgaGFzaDMgPSB0ZXN0My5oYXNoQ29kZSgpOwoKICAgIHRlc3RfYXNzZXJ0KGhhc2gxID09IGhhc2gyKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gyID09IGhhc2gzKTsKICAgIHRlc3RfYXNzZXJ0KGhhc2gzID09IGhhc2gxKTsKfQoKdm9pZCBMb2NhbGVUZXN0OjpUZXN0R2V0QXZhaWxhYmxlTG9jYWxlcygpCnsKICAgIGludDMyX3QgbG9jQ291bnQgPSAwOwogICAgY29uc3QgTG9jYWxlKiBsb2NMaXN0ID0gTG9jYWxlOjpnZXRBdmFpbGFibGVMb2NhbGVzKGxvY0NvdW50KTsKCiAgICBpZiAobG9jQ291bnQgPT0gMCkKICAgICAgICBlcnJsbigiZ2V0QXZhaWxhYmxlTG9jYWxlcygpIHJldHVybmVkIGFuIGVtcHR5IGxpc3QhIik7CiAgICBlbHNlIHsKICAgICAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJOdW1iZXIgb2YgbG9jYWxlcyByZXR1cm5lZCA9ICIpICsgbG9jQ291bnQpOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBmb3IoaW50MzJfdCBpID0gMDsgaSA8IGxvY0NvdW50OyArK2kpCiAgICAgICAgICAgIGxvZ2xuKGxvY0xpc3RbaV0uZ2V0TmFtZSgpKTsKICAgIH0KICAgIC8vIEkgaGF2ZSBubyBpZGVhIGhvdyB0byB0ZXN0IHRoaXMgZnVuY3Rpb24uLi4KfQoKLy8gVGhpcyB0ZXN0IGlzbid0IGFwcGxpY2FibGUgYW55bW9yZSAtIGdldElTTzNMYW5ndWFnZSBpcwovLyBpbmRlcGVuZGVudCBvZiB0aGUgZGF0YSBkaXJlY3RvcnkKdm9pZCBMb2NhbGVUZXN0OjpUZXN0RGF0YURpcmVjdG9yeSgpCnsKLyoKICAgIGNoYXIgICAgICAgICAgICBvbGREaXJlY3RvcnlbODBdOwogICAgY29uc3QgY2hhciogICAgIHRlbXA7CiAgICBVRXJyb3JDb2RlICAgICAgIGVyciA9IFVfWkVST19FUlJPUjsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0VmFsdWU7CgogICAgdGVtcCA9IExvY2FsZTo6Z2V0RGF0YURpcmVjdG9yeSgpOwogICAgc3RyY3B5KG9sZERpcmVjdG9yeSwgdGVtcCk7CiAgICBsb2dsbihVbmljb2RlU3RyaW5nKCJvbGREaXJlY3RvcnkgPSAiKSArIG9sZERpcmVjdG9yeSk7CgogICAgTG9jYWxlICB0ZXN0KExvY2FsZTo6VVMpOwogICAgdGVzdC5nZXRJU08zTGFuZ3VhZ2UodGVzdFZhbHVlKTsKICAgIGxvZ2xuKCJmaXJzdCBmZXRjaCBvZiBsYW5ndWFnZSByZXRyaWV2ZWQgIiArIHRlc3RWYWx1ZSk7CiAgICBpZiAodGVzdFZhbHVlICE9ICJlbmciKQogICAgICAgIGVycmxuKCJJbml0aWFsIGNoZWNrIG9mIElTTzMgbGFuZ3VhZ2UgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CgogICAgewogICAgICAgIGNoYXIgKnBhdGg7CiAgICAgICAgcGF0aD1JbnRsVGVzdDo6Z2V0VGVzdERpcmVjdG9yeSgpOwogICAgICAgIExvY2FsZTo6c2V0RGF0YURpcmVjdG9yeSggcGF0aCApOwogICAgfQoKICAgIHRlc3QuZ2V0SVNPM0xhbmd1YWdlKHRlc3RWYWx1ZSk7CiAgICBsb2dsbigic2Vjb25kIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gInh4eCIpCiAgICAgICAgZXJybG4oInNldERhdGFEaXJlY3RvcnkoKSBmYWlsZWQ6IGV4cGVjdGVkIFwieHh4XCIsIGdvdCBcIiIgKyB0ZXN0VmFsdWUgKyAiXCIiKTsKICAgIAogICAgTG9jYWxlOjpzZXREYXRhRGlyZWN0b3J5KG9sZERpcmVjdG9yeSk7CiAgICB0ZXN0LmdldElTTzNMYW5ndWFnZSh0ZXN0VmFsdWUpOwogICAgbG9nbG4oInRoaXJkIGZldGNoIG9mIGxhbmd1YWdlIHJldHJpZXZlZCAiICsgdGVzdFZhbHVlKTsKICAgIGlmICh0ZXN0VmFsdWUgIT0gImVuZyIpCiAgICAgICAgZXJybG4oImdldC9zZXREYXRhRGlyZWN0b3J5KCkgZmFpbGVkOiBleHBlY3RlZCBcImVuZ1wiLCBnb3QgXCIiICsgdGVzdFZhbHVlICsgIlwiIik7CiovCn0KCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnZvaWQgTG9jYWxlVGVzdDo6ZG9UZXN0RGlzcGxheU5hbWVzKExvY2FsZSYgaW5Mb2NhbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY29tcGFyZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVQm9vbCBkZWZhdWx0SXNGcmVuY2gpIHsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZW1wOwogICAgCiAgICBpZiAoZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJmciIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBGcmVuY2gsIGJ1dCBpdCdzIHJlYWxseSAiICsgdGVtcCk7CiAgICBlbHNlIGlmICghZGVmYXVsdElzRnJlbmNoICYmICh0ZW1wPUxvY2FsZTo6Z2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCkpICE9ICJlbiIpCiAgICAgICAgZXJybG4oIkRlZmF1bHQgbG9jYWxlIHNob3VsZCBiZSBFbmdsaXNoLCBidXQgaXQncyByZWFsbHkgIiArIHRlbXApOwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8PSBNQVhfTE9DQUxFUzsgaSsrKSB7CiAgICAgICAgTG9jYWxlIHRlc3RMb2NhbGUocmF3RGF0YVtMQU5HXVtpXSwgcmF3RGF0YVtDVFJZXVtpXSwgcmF3RGF0YVtWQVJdW2ldKTsKICAgICAgICBsb2dsbigiICBUZXN0aW5nICIgKyAodGVtcD10ZXN0TG9jYWxlLmdldE5hbWUoKSkgKyAiLi4uIik7CgogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RMYW5nOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIHRlc3RWYXI7CiAgICAgICAgVW5pY29kZVN0cmluZyAgdGVzdE5hbWU7CgogICAgICAgIGlmIChpbkxvY2FsZSA9PSBMb2NhbGUoIiIsICIiLCAiIikpIHsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TGFuZ3VhZ2UodGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KHRlc3RDdHJ5KTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5VmFyaWFudCh0ZXN0VmFyKTsKICAgICAgICAgICAgdGVzdExvY2FsZS5nZXREaXNwbGF5TmFtZSh0ZXN0TmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlMYW5ndWFnZShpbkxvY2FsZSwgdGVzdExhbmcpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlDb3VudHJ5KGluTG9jYWxlLCB0ZXN0Q3RyeSk7CiAgICAgICAgICAgIHRlc3RMb2NhbGUuZ2V0RGlzcGxheVZhcmlhbnQoaW5Mb2NhbGUsIHRlc3RWYXIpOwogICAgICAgICAgICB0ZXN0TG9jYWxlLmdldERpc3BsYXlOYW1lKGluTG9jYWxlLCB0ZXN0TmFtZSk7CiAgICAgICAgfQoKICAgICAgICBVbmljb2RlU3RyaW5nICBleHBlY3RlZExhbmc7CiAgICAgICAgVW5pY29kZVN0cmluZyAgZXhwZWN0ZWRDdHJ5OwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkVmFyOwogICAgICAgIFVuaWNvZGVTdHJpbmcgIGV4cGVjdGVkTmFtZTsKCiAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleF1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTGFuZy5sZW5ndGgoKSA9PSAwICYmIGRlZmF1bHRJc0ZyZW5jaCkKICAgICAgICAgICAgZXhwZWN0ZWRMYW5nID0gZGF0YVRhYmxlW0RMQU5HX0ZSXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRMYW5nLmxlbmd0aCgpID09IDApCiAgICAgICAgICAgIGV4cGVjdGVkTGFuZyA9IGRhdGFUYWJsZVtETEFOR19FTl1baV07CgogICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAxXVtpXTsKICAgICAgICBpZiAoKGV4cGVjdGVkQ3RyeS5sZW5ndGgoKSA9PSAwKSAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkQ3RyeSA9IGRhdGFUYWJsZVtEQ1RSWV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkQ3RyeS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZEN0cnkgPSBkYXRhVGFibGVbRENUUllfRU5dW2ldOwoKICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtjb21wYXJlSW5kZXggKyAyXVtpXTsKICAgICAgICBpZiAoZXhwZWN0ZWRWYXIubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkVmFyID0gZGF0YVRhYmxlW0RWQVJfRlJdW2ldOwogICAgICAgIGlmIChleHBlY3RlZFZhci5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZFZhciA9IGRhdGFUYWJsZVtEVkFSX0VOXVtpXTsKCiAgICAgICAgZXhwZWN0ZWROYW1lID0gZGF0YVRhYmxlW2NvbXBhcmVJbmRleCArIDNdW2ldOwogICAgICAgIGlmIChleHBlY3RlZE5hbWUubGVuZ3RoKCkgPT0gMCAmJiBkZWZhdWx0SXNGcmVuY2gpCiAgICAgICAgICAgIGV4cGVjdGVkTmFtZSA9IGRhdGFUYWJsZVtETkFNRV9GUl1baV07CiAgICAgICAgaWYgKGV4cGVjdGVkTmFtZS5sZW5ndGgoKSA9PSAwKQogICAgICAgICAgICBleHBlY3RlZE5hbWUgPSBkYXRhVGFibGVbRE5BTUVfRU5dW2ldOwoKICAgICAgICBpZiAodGVzdExhbmcgIT0gZXhwZWN0ZWRMYW5nKQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBsYW5ndWFnZSAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdExhbmcgKyAiIHZlcnN1cyAiICsgZXhwZWN0ZWRMYW5nKTsKICAgICAgICBpZiAodGVzdEN0cnkgIT0gZXhwZWN0ZWRDdHJ5KQogICAgICAgICAgICBlcnJsbigiRGlzcGxheSBjb3VudHJ5ICgiICsgVW5pY29kZVN0cmluZyhpbkxvY2FsZS5nZXROYW1lKCkpICsgIikgbWlzbWF0Y2g6ICIgKyB0ZXN0Q3RyeSArICIgdmVyc3VzICIgKyBleHBlY3RlZEN0cnkgKyAoZGVmYXVsdElzRnJlbmNoP1VuaWNvZGVTdHJpbmcoIkZyZW5jaCIpOlVuaWNvZGVTdHJpbmcoIl8iKSkgKTsKICAgICAgICBpZiAodGVzdFZhciAhPSBleHBlY3RlZFZhcikKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgdmFyaWFudCAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdFZhciArICIgdmVyc3VzICIgKyBleHBlY3RlZFZhcik7CiAgICAgICAgaWYgKHRlc3ROYW1lICE9IGV4cGVjdGVkTmFtZSkKICAgICAgICAgICAgZXJybG4oIkRpc3BsYXkgbmFtZSAoIiArIFVuaWNvZGVTdHJpbmcoaW5Mb2NhbGUuZ2V0TmFtZSgpKSArICIpIG1pc21hdGNoOiAiICsgdGVzdE5hbWUgKyAiIHZlcnN1cyAiICsgZXhwZWN0ZWROYW1lKTsKICAgIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGFibGUgb2YgdmFsaWQgZGF0YQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKClVDaGFyIGdyZWVrRGlzcGxheUxhbmd1YWdlW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwgMHgwM2FjLCAwIH07ClVDaGFyIGdyZWVrRGlzcGxheUNvdW50cnlbXSA9IHsgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMCB9OwpVQ2hhciBncmVla0Rpc3BsYXlOYW1lW10gPSB7IDB4MDNiNSwgMHgwM2JiLCAweDAzYmIsIDB4MDNiNywgMHgwM2JkLCAweDAzYjksIDB4MDNiYSwKICAgIDB4MDNhYywgMHgyMCwgMHgyOCwgMHgwMzk1LCAweDAzYmIsIDB4MDNiYiwgMHgwM2FjLCAweDAzYjQsIDB4MDNiMSwgMHgyOSwgMCB9OwogICAgCnZvaWQgTG9jYWxlVGVzdDo6c2V0VXBEYXRhVGFibGUoKQp7CiAgICBpZiAoZGF0YVRhYmxlID09IDApIHsKICAgICAgICBkYXRhVGFibGUgPSBuZXcgVW5pY29kZVN0cmluZypbMjddOwoKICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCAyNzsgaSsrKSB7CiAgICAgICAgICAgIGRhdGFUYWJsZVtpXSA9IG5ldyBVbmljb2RlU3RyaW5nWzddOwogICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCA3OyBqKyspIHsKICAgICAgICAgICAgICAgIGRhdGFUYWJsZVtpXVtqXSA9IENoYXJzVG9Vbmljb2RlU3RyaW5nKHJhd0RhdGFbaV1bal0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRhdGFUYWJsZVtETEFOR19FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TGFuZ3VhZ2U7CiAgICAgICAgZGF0YVRhYmxlW0RDVFJZX0VMXVtHUkVFS10gPSBncmVla0Rpc3BsYXlDb3VudHJ5OwogICAgICAgIGRhdGFUYWJsZVtETkFNRV9FTF1bR1JFRUtdID0gZ3JlZWtEaXNwbGF5TmFtZTsKICAgIH0KfQoKLy8gPT09PT09PT09PT09PT09PT09PT0KCgovKioKICogQGJ1ZyA0MDExNzU2IDQwMTEzODAKICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RJU08zRmFsbGJhY2soKSAKewogICAgTG9jYWxlIHRlc3QoInh4IiwgIllZIik7CgogICAgY29uc3QgY2hhciAqIHJlc3VsdDsKCiAgICByZXN1bHQgPSB0ZXN0LmdldElTTzNMYW5ndWFnZSgpOwoKICAgIC8vIENvbmZvcm0gdG8gQyBBUEkgdXNhZ2UgCgogICAgaWYgKCFyZXN1bHQgfHwgKHJlc3VsdFswXSAhPSAwKSkKICAgICAgICBlcnJsbigiZ2V0SVNPM0xhbmd1YWdlKCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7CgogICAgcmVzdWx0ID0gdGVzdC5nZXRJU08zQ291bnRyeSgpOwoKICAgIGlmICghcmVzdWx0IHx8IChyZXN1bHRbMF0gIT0gMCkpCiAgICAgICAgZXJybG4oImdldElTTzNDb3VudHJ5KCkgb24geHhfWVkgcmV0dXJuZWQgIiArIFVuaWNvZGVTdHJpbmcocmVzdWx0KSArICIgaW5zdGVhZCBvZiBcIlwiIik7Cn0KCi8qKgogKiBAYnVnIDQxMDYxNTUgNDExODU4NwogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEdldExhbmdzQW5kQ291bnRyaWVzKCkgCnsKICAgIC8vIEl0IGRpZG4ndCBzZWVtIHJpZ2h0IHRvIGp1c3QgZG8gYW4gZXhoYXVzdGl2ZSB0ZXN0IG9mIGV2ZXJ5dGhpbmcgaGVyZSwgc28gSSBjaGVjawogICAgLy8gZm9yIHRoZSBmb2xsb3dpbmcgdGhpbmdzOgogICAgLy8gMSkgRG9lcyBlYWNoIGxpc3QgaGF2ZSB0aGUgcmlnaHQgdG90YWwgbnVtYmVyIG9mIGVudHJpZXM/CiAgICAvLyAyKSBEb2VzIGVhY2ggbGlzdCBjb250YWluIGNlcnRhaW4gbGFuZ3VhZ2UgYW5kIGNvdW50cnkgY29kZXMgd2UgdGhpbmsgYXJlIGltcG9ydGFudAogICAgLy8gICAgICh0aGUgRzcgY291bnRyaWVzLCBwbHVzIGEgY291cGxlIG90aGVycyk/CiAgICAvLyAzKSBEb2VzIGVhY2ggbGlzdCBoYXZlIGV2ZXJ5IGVudHJ5IGZvcm1hdHRlZCBjb3JyZWN0bHk/IChpLmUuLCB0d28gY2hhcmFjdGVycywKICAgIC8vICAgICBhbGwgbG93ZXIgY2FzZSBmb3IgdGhlIGxhbmd1YWdlIGNvZGVzLCBhbGwgdXBwZXIgY2FzZSBmb3IgdGhlIGNvdW50cnkgY29kZXMpCiAgICAvLyA0KSBJcyBlYWNoIGxpc3QgaW4gc29ydGVkIG9yZGVyPwogICAgaW50MzJfdCB0ZXN0Q291bnQgPSAwOwogICAgY29uc3QgY2hhciAqIGNvbnN0ICogdGVzdCA9IExvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKCk7CiAgICBjb25zdCBjaGFyIHNwb3RDaGVjazFbIF1bNF0gPSB7ICJlbiIsICJlcyIsICJmciIsICJkZSIsICJpdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamEiLCAia28iLCAiemgiLCAidGgiLCAiaGUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiwgIml1IiwgInVnIiwgInlpIiwgInphIiB9OwoKICAgIGludDMyX3QgaTsKICAgIAogICAgZm9yKHRlc3RDb3VudCA9IDA7dGVzdFt0ZXN0Q291bnRdO3Rlc3RDb3VudCsrKQogICAgICA7CgogICAgaWYgKHRlc3RDb3VudCAhPSA0MzcpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcygpIHRvIHJldHVybiA0MzcgbGFuZ3VhZ2VzOyBpdCByZXR1cm5lZCAlZCIsIHRlc3RDb3VudCk7CiAgICBlbHNlIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTU7IGkrKykgewogICAgICAgICAgICBpbnQzMl90IGo7CiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCB0ZXN0Q291bnQ7IGorKykKICAgICAgICAgICAgICBpZiAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKT09IDApCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGlmIChqID09IHRlc3RDb3VudCB8fCAodXBydl9zdHJjbXAodGVzdFtqXSxzcG90Q2hlY2sxW2ldKSE9MCkpCiAgICAgICAgICAgICAgICBlcnJsbigiQ291bGRuJ3QgZmluZCAiICsgKFVuaWNvZGVTdHJpbmcpc3BvdENoZWNrMVtpXSArICIgaW4gbGFuZ3VhZ2UgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2ldLCIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIGxjKHRlc3RbaV0sIiIpOwogICAgICAgIGlmICh0ZXN0ZWUgIT0gbGMudG9Mb3dlcigpKQogICAgICAgICAgICBlcnJsbihsYyArICIgaXMgbm90IGFsbCBsb3dlciBjYXNlLiIpOwogICAgICAgIGlmICggKHRlc3RlZS5sZW5ndGgoKSAhPSAyKSAmJiAodGVzdGVlLmxlbmd0aCgpICE9IDMpKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCB0d28gb3IgdGhyZWUgY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0ZWUuY29tcGFyZSh0ZXN0W2kgLSAxXSkgPD0gMCkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KCiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09Db3VudHJpZXMoKTsKICAgIFVuaWNvZGVTdHJpbmcgc3BvdENoZWNrMiBbXSA9IHsgIlVTIiwgIkNBIiwgIkdCIiwgIkZSIiwgIkRFIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJVCIsICJKUCIsICJLUiIsICJDTiIsICJUVyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEgiIH07CiAgICBpbnQzMl90IHNwb3QyTGVuID0gMTE7CiAgICBmb3IodGVzdENvdW50PTA7dGVzdFt0ZXN0Q291bnRdO3Rlc3RDb3VudCsrKQogICAgICA7CgogICAgaWYgKHRlc3RDb3VudCAhPSAyMzkpCiAgICAgICAgZXJybG4oIkV4cGVjdGVkIGdldElTT0xhbmd1YWdlcyB0byByZXR1cm4gMjM4IGxhbmd1YWdlczsgaXQgcmV0dXJuZWQiICsgdGVzdENvdW50KTsKICAgIGVsc2UgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBzcG90MkxlbjsgaSsrKSB7CiAgICAgICAgICAgIGludDMyX3QgajsKICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IHRlc3RDb3VudDsgaisrKQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdGVlKHRlc3Rbal0sIiIpOwoKICAgICAgICAgICAgICAgIGlmICh0ZXN0ZWUgPT0gc3BvdENoZWNrMltpXSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3RlZSh0ZXN0W2pdLCIiKTsKICAgICAgICAgICAgaWYgKGogPT0gdGVzdENvdW50IHx8IHRlc3RlZSAhPSBzcG90Q2hlY2syW2ldKQogICAgICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGZpbmQgIiArIHNwb3RDaGVjazJbaV0gKyAiIGluIGNvdW50cnkgbGlzdC4iKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgKGkgPSAwOyBpIDwgdGVzdENvdW50OyBpKyspIHsKICAgICAgVW5pY29kZVN0cmluZyB0ZXN0ZWUodGVzdFtpXSwiIik7CiAgICAgICAgVW5pY29kZVN0cmluZyB1Yyh0ZXN0W2ldLCIiKTsKICAgICAgICBpZiAodGVzdGVlICE9IHVjLnRvVXBwZXIoKSkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBpcyBub3QgYWxsIHVwcGVyIGNhc2UuIik7CiAgICAgICAgaWYgKHRlc3RlZS5sZW5ndGgoKSAhPSAyKQogICAgICAgICAgICBlcnJsbih0ZXN0ZWUgKyAiIGlzIG5vdCB0d28gY2hhcmFjdGVycyBsb25nLiIpOwogICAgICAgIGlmIChpID4gMCAmJiB0ZXN0ZWUuY29tcGFyZSh0ZXN0W2kgLSAxXSkgPD0gMCkKICAgICAgICAgICAgZXJybG4odGVzdGVlICsgIiBhcHBlYXJzIGluIGFuIG91dC1vZi1vcmRlciBwb3NpdGlvbiBpbiB0aGUgbGlzdC4iKTsKICAgIH0KfQoKLyoqCiAqIEBidWcgNDEyNjg4MAogKi8KLy8gc2luY2UgdGhpcyByZXR1cm5zIGNvbnN0IFVuaWNvZGVTdHJpbmcqIGluIEMrKywgaXMgdGhpcyB0ZXN0IGFwcGxpY2FibGU/CnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTI2ODgwKCkgCnsKI2lmZGVmIElDVV9MT0NJRF9VU0VfREVQUkVDQVRFUwogICAgCiAgICBjb25zdCBVbmljb2RlU3RyaW5nICp0ZXN0OwogICAgaW50MzJfdCB0ZXN0Q291bnQ9MDsKCiAgICAvKnRlc3QgPSBMb2NhbGU6OmdldElTT0NvdW50cmllcyh0ZXN0Q291bnQpOwogICAgdGVzdFswXSA9ICJTVUNLRVIhISEiOwogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICBpZiAodGVzdFswXSA9PSAiU1VDS0VSISEhIikKICAgICAgICBlcnJsbigiQ2hhbmdlZCBpbnRlcm5hbCBjb3VudHJ5IGNvZGUgbGlzdCEiKTsKCiAgICB0ZXN0ID0gTG9jYWxlOjpnZXRJU09MYW5ndWFnZXModGVzdENvdW50KTsKICAgIHRlc3RbMF0gPSAiSEFIQUhBSEEhISEiOwogICAgdGVzdCA9IExvY2FsZTo6Z2V0SVNPTGFuZ3VhZ2VzKHRlc3RDb3VudCk7CiAgICBpZiAodGVzdFswXSA9PSAiSEFIQUhBSEEhISEiKSAvLyBGaXhlZCB0eXBvCiAgICAgICAgZXJybG4oIkNoYW5nZXMgaW50ZXJuYWwgbGFuZ3VhZ2UgY29kZSBsaXN0ISIpOwogICAgICovICAgCiAgICAvKnRlc3RzIGZvciBkZXByZWNhdGVkIEFQSSovCiAgICB0ZXN0PUxvY2FsZTo6Z2V0SVNPQ291bnRyaWVzKHRlc3RDb3VudCk7CiAgICBpZih0ZXN0Q291bnQgIT0gMjM5KXsKICAgICAgICBlcnJsbigoVW5pY29kZVN0cmluZykiVGhlcmUgaXMgYW4gZXJyb3IgaW4gZ2V0SVNPQ291bnRyaWVzICIgKyB0ZXN0Q291bnQpOwogICAgfQogICAgdGVzdD1Mb2NhbGU6OmdldElTT0xhbmd1YWdlcyh0ZXN0Q291bnQpOwogICAgaWYodGVzdENvdW50ICE9IDQzNyl7CiAgICAgICAgZXJybG4oKFVuaWNvZGVTdHJpbmcpIlRoZXJlIGlzIGFuIGVycm9yIGluIGdldElTT0xhbmd1YWdlcyAiICsgdGVzdENvdW50KTsKICAgIH0KLyotLS0tLS0tLS0tKi8KI2Vsc2UKICAgIGxvZ2xuKCJTa2lwcGluZyBUZXN0NDEyNjg4MCBmb3IgZGVwcmVjYXRlZCBBUEkiKTsKI2VuZGlmICAgICAgICAKfQoKLyoqCiAqIEBidWcgNDEzNTMxNgogKi8KLy8gbm90IGFwcGxpY2FibGUgaW4gQysrIC0gY29uc3QgTG9jYWxlKgp2b2lkIApMb2NhbGVUZXN0OjpUZXN0QnVnNDEzNTMxNigpIAp7Ci8qCiAgICBMb2NhbGVbXSBsb2NhbGVzMSA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBMb2NhbGVbXSBsb2NhbGVzMiA9IExvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICBpZiAobG9jYWxlczEgPT0gbG9jYWxlczIpCiAgICAgICAgZXJybG4oIkxvY2FsZS5nZXRBdmFpbGFibGVMb2NhbGVzKCkgZG9lc24ndCBjbG9uZSBpdHMgaW50ZXJuYWwgc3RvcmFnZSEiKTsKKi8KfQoKLyoqCiAqIEBidWcgNDEwNzk1MwogKi8KLyoKdGVzdCBjb21tZW50ZWQgb3V0IHBlbmRpbmcgQVBJLWNoYW5nZSBhcHByb3ZhbApwdWJsaWMgdm9pZCBUZXN0R2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgpIHsKICAgIFVuaWNvZGVTdHJpbmdbXSBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiVVMiKTsKCiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJlbiIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgZW4gYXMgYSBsYW5ndWFnZSBmb3IgVVMiKTsKCiAgICBsYW5ndWFnZXMgPSBMb2NhbGUuZ2V0TGFuZ3VhZ2VzRm9yQ291bnRyeSgiRlIiKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImZyIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBmciBhcyBhIGxhbmd1YWdlIGZvciBGUiIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJDSCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiZnIiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGZyIGFzIGEgbGFuZ3VhZ2UgZm9yIENIIik7CiAgICBpZiAoIXNlYXJjaFN0cmluZ0FycmF5Rm9yKCJpdCIsIGxhbmd1YWdlcykpCiAgICAgICAgZXJybG4oIkRpZG4ndCBnZXQgaXQgYXMgYSBsYW5ndWFnZSBmb3IgQ0giKTsKICAgIGlmICghc2VhcmNoU3RyaW5nQXJyYXlGb3IoImRlIiwgbGFuZ3VhZ2VzKSkKICAgICAgICBlcnJsbigiRGlkbid0IGdldCBkZSBhcyBhIGxhbmd1YWdlIGZvciBDSCIpOwoKICAgIGxhbmd1YWdlcyA9IExvY2FsZS5nZXRMYW5ndWFnZXNGb3JDb3VudHJ5KCJKUCIpOwogICAgaWYgKCFzZWFyY2hTdHJpbmdBcnJheUZvcigiamEiLCBsYW5ndWFnZXMpKQogICAgICAgIGVycmxuKCJEaWRuJ3QgZ2V0IGphIGFzIGEgbGFuZ3VhZ2UgZm9yIEpQIik7Cn0KKi8KCi8qCnByaXZhdGUgVUJvb2wgc2VhcmNoU3RyaW5nQXJyYXlGb3IoVW5pY29kZVN0cmluZyBzLCBVbmljb2RlU3RyaW5nW10gYXJyYXkpIHsKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChzLmVxdWFscyhhcnJheVtpXSkpCiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgcmV0dXJuIEZBTFNFOwp9CiovCgovKioKICogQGJ1ZyA0MTEwNjEzCiAqLwovLyBub3QgYXBwbGljYWJsZSBpbiBDKysKIC8qCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE9wdGlvbmFsRGF0YUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uLCBTdHJlYW1Db3JydXB0ZWRFeGNlcHRpb24KewogICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9zdHJlYW07CiAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb2JzdHJlYW07CiAgICBieXRlW10gYnl0ZXMgPSBudWxsOwoKICAgIG9ic3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgb3N0cmVhbSA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob2JzdHJlYW0pOwoKICAgIExvY2FsZSB0ZXN0MSA9IG5ldyBMb2NhbGUoInpoIiwgIlRXIiwgIiIpOwogICAgaW50MzJfdCBkdW1teSA9IHRlc3QxLmhhc2hDb2RlKCk7ICAgLy8gZmlsbCBpbiB0aGUgY2FjaGVkIGhhc2gtY29kZSB2YWx1ZQogICAgb3N0cmVhbS53cml0ZU9iamVjdCh0ZXN0MSk7CgogICAgYnl0ZXMgPSBvYnN0cmVhbS50b0J5dGVBcnJheSgpOwoKICAgIE9iamVjdElucHV0U3RyZWFtIGlzdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSk7CgogICAgTG9jYWxlIHRlc3QyID0gKExvY2FsZSkoaXN0cmVhbS5yZWFkT2JqZWN0KCkpOwoKICAgIGlmICghdGVzdDEuZXF1YWxzKHRlc3QyKSB8fCB0ZXN0MS5oYXNoQ29kZSgpICE9IHRlc3QyLmhhc2hDb2RlKCkpCiAgICAgICAgZXJybG4oIkxvY2FsZSBmYWlsZWQgdG8gZGVzZXJpYWxpemUgY29ycmVjdGx5LiIpOwp9CiovCgovKioKICogQGJ1ZyA0MTE4NTg3CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0U2ltcGxlRGlzcGxheU5hbWVzKCkgCnsKICAgIC8vIFRoaXMgdGVzdCBpcyBkaWZmZXJlbnQgZnJvbSBUZXN0RGlzcGxheU5hbWVzIGJlY2F1c2UgVGVzdERpc3BsYXlOYW1lcyBjaGVja3MKICAgIC8vIGZhbGxiYWNrIGJlaGF2aW9yLCBjb21iaW5hdGlvbiBvZiBsYW5ndWFnZSBhbmQgY291bnRyeSBuYW1lcyB0byBmb3JtIGxvY2FsZQogICAgLy8gbmFtZXMsIGFuZCBvdGhlciBzdHVmZiBsaWtlIHRoYXQuICBUaGlzIHRlc3QganVzdCBjaGVja3Mgc3BlY2lmaWMgbGFuZ3VhZ2UKICAgIC8vIGFuZCBjb3VudHJ5IGNvZGVzIHRvIG1ha2Ugc3VyZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IG5hbWVzIGZvciB0aGVtLgogICAgY2hhciBsYW5ndWFnZUNvZGVzW10gWzRdID0geyAiaGUiLCAiaWQiLCAiaXUiLCAidWciLCAieWkiLCAiemEiIH07CiAgICBVbmljb2RlU3RyaW5nIGxhbmd1YWdlTmFtZXMgW10gPSB7ICJIZWJyZXciLCAiSW5kb25lc2lhbiIsICJJbnVraXR1dCIsICJVaWdodXIiLCAiWWlkZGlzaCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmh1YW5nIiB9OwoKICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IDY7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVzdDsKICAgICAgICBMb2NhbGUgbChsYW5ndWFnZUNvZGVzW2ldLCAiIiwgIiIpOwogICAgICAgIGwuZ2V0RGlzcGxheUxhbmd1YWdlKExvY2FsZTo6VVMsIHRlc3QpOwogICAgICAgIGlmICh0ZXN0ICE9IGxhbmd1YWdlTmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJHb3Qgd3JvbmcgZGlzcGxheSBuYW1lIGZvciAiICsgVW5pY29kZVN0cmluZyhsYW5ndWFnZUNvZGVzW2ldKSArICI6IEV4cGVjdGVkIFwiIiArCiAgICAgICAgICAgICAgICAgIGxhbmd1YWdlTmFtZXNbaV0gKyAiXCIsIGdvdCBcIiIgKyB0ZXN0ICsgIlwiLiIpOwogICAgfQp9CgovKioKICogQGJ1ZyA0MTE4NTk1CiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VW5pbnN0YWxsZWRJU08zTmFtZXMoKSAKewogICAgLy8gVGhpcyB0ZXN0IGNoZWNrcyB0byBtYWtlIHN1cmUgZ2V0SVNPM0xhbmd1YWdlIGFuZCBnZXRJU08zQ291bnRyeSB3b3JrIHJpZ2h0CiAgICAvLyBldmVuIGZvciBsb2NhbGVzIHRoYXQgYXJlIG5vdCBpbnN0YWxsZWQuCiAgICBjb25zdCBjaGFyIGlzbzJMYW5ndWFnZXMgW11bNF0gPSB7ICAgICAiYW0iLCAiYmEiLCAiZnkiLCAibXIiLCAicm4iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcyIsICJ0dyIsICJ6dSIgfTsKICAgIGNvbnN0IGNoYXIgaXNvM0xhbmd1YWdlcyBbXVs1XSA9IHsgICAgICJhbWgiLCAiYmFrIiwgImZyeSIsICJtYXIiLCAicnVuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3N3IiwgInR3aSIsICJ6dWwiIH07CgogICAgaW50MzJfdCBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CgogICAgICBVbmljb2RlU3RyaW5nIHRlc3Q7CiAgICAgICAgTG9jYWxlIGwoaXNvMkxhbmd1YWdlc1tpXSwgIiIsICIiKTsKICAgICAgICB0ZXN0ID0gbC5nZXRJU08zTGFuZ3VhZ2UoKTsKICAgICAgICBpZigodGVzdCAhPSBpc28zTGFuZ3VhZ2VzW2ldKSB8fCBVX0ZBSUxVUkUoZXJyKSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJMYW5ndWFnZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBpc28zTGFuZ3VhZ2VzW2ldICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgVW5pY29kZVN0cmluZyh1X2Vycm9yTmFtZShlcnIpKSk7CiAgICB9CgogICAgY2hhciBpc28yQ291bnRyaWVzIFtdWzRdID0geyAgICAgIkFGIiwgIkJXIiwgIktaIiwgIk1PIiwgIk1OIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0IiLCAiVEMiLCAiWlciIH07CiAgICBjaGFyIGlzbzNDb3VudHJpZXMgW11bNF0gPSB7ICAgICAiQUZHIiwgIkJXQSIsICJLQVoiLCAiTUFDIiwgIk1ORyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNMQiIsICJUQ0EiLCAiWldFIiB9OwoKICAgIGZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgVUVycm9yQ29kZSBlcnIgPSBVX1pFUk9fRVJST1I7CiAgICAgICAgTG9jYWxlIGwoIiIsIGlzbzJDb3VudHJpZXNbaV0sICIiKTsKICAgICAgICBVbmljb2RlU3RyaW5nIHRlc3QobC5nZXRJU08zQ291bnRyeSgpLCAiIik7CiAgICAgICAgaWYgKHRlc3QgIT0gaXNvM0NvdW50cmllc1tpXSkKICAgICAgICAgICAgZXJybG4oIkdvdCB3cm9uZyBJU08zIGNvZGUgZm9yICIgKyBVbmljb2RlU3RyaW5nKGlzbzJDb3VudHJpZXNbaV0pICsgIjogRXhwZWN0ZWQgXCIiICsKICAgICAgICAgICAgICAgICAgICBVbmljb2RlU3RyaW5nKGlzbzNDb3VudHJpZXNbaV0pICsgIlwiLCBnb3QgXCIiICsgdGVzdCArICJcIi4iICsgdV9lcnJvck5hbWUoZXJyKSk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQwOTI0NzUKICogSSBjb3VsZCBub3QgcmVwcm9kdWNlIHRoaXMgYnVnLiAgSSdtIHByZXR0eSBjb252aW5jZWQgaXQgd2FzIGZpeGVkIHdpdGggdGhlCiAqIGJpZyBsb2NhbGUtZGF0YSByZW9yZyBvZiAxMC8yOC85Ny4gIFRoZSBsb29rdXAgbG9naWMgZm9yIGxhbmd1YWdlIGFuZCBjb3VudHJ5CiAqIGRpc3BsYXkgbmFtZXMgd2FzIGFsc28gY2hhbmdlZCBhdCB0aGF0IHRpbWUgaW4gdGhhdCBjaGVjay1pbi4gICAgLS1ydGcgMy8yMC85OAogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdEF0eXBpY2FsTG9jYWxlcygpIAp7CiAgICBMb2NhbGUgbG9jYWxlc1RvVGVzdCBbXSA9IHsgTG9jYWxlKCJkZSIsICJDQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJqYSIsICJaQSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgicnUiLCAiTVgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoImVuIiwgIkZSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCJlcyIsICJERSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkhSIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxlKCIiLCAiU0UiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIiIsICJETyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiIiwgIkJFIikgfTsKCiAgICBVbmljb2RlU3RyaW5nIGVuZ2xpc2hEaXNwbGF5TmFtZXMgW10gPSB7ICJHZXJtYW4gKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkphcGFuZXNlIChTb3V0aCBBZnJpY2EpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdXNzaWFuIChNZXhpY28pIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmdsaXNoIChGcmFuY2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTcGFuaXNoIChHZXJtYW55KSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3JvYXRpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3dlZGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEb21pbmljYW4gUmVwdWJsaWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpdW0iIH07CiAgICBVbmljb2RlU3RyaW5nIGZyZW5jaERpc3BsYXlOYW1lcyBbXT0geyAiYWxsZW1hbmQgKENhbmFkYSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFwb25haXMgKEFmcmlxdWUgZHUgU3VkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJydXNzZSAoTWV4aXF1ZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZ2xhaXMgKEZyYW5jZSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVzcGFnbm9sIChBbGxlbWFnbmUpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiU3VcXHUwMEU4ZGUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoIlJcXHUwMEU5cHVibGlxdWUgRG9taW5pY2FpbmUiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJlbGdpcXVlIiB9OwogICAgVW5pY29kZVN0cmluZyBzcGFuaXNoRGlzcGxheU5hbWVzIFtdID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImFsZW1cXHUwMEUxbiAoQ2FuYWRcXHUwMEUxKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImphcG9uXFx1MDBFOXMgKFN1ZFxcdTAwRTFmcmljYSkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJydXNvIChNXFx1MDBFOXhpY28pIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiaW5nbFxcdTAwRTlzIChGcmFuY2lhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNUb1VuaWNvZGVTdHJpbmcoImVzcGFcXHUwMEYxb2wgKEFsZW1hbmlhKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2FjaWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1ZWNpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFyc1RvVW5pY29kZVN0cmluZygiUmVwXFx1MDBGQWJsaWNhIERvbWluaWNhbmEiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzVG9Vbmljb2RlU3RyaW5nKCJCXFx1MDBFOWxnaWNhIikgfTsKICAgIFVuaWNvZGVTdHJpbmcgYXJhYmljRGlzcGxheU5hbWVzIFtdID0geyAiR2VybWFuIChDYW5hZGEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKYXBhbmVzZSAoU291dGggQWZyaWNhKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUnVzc2lhbiAoTWV4aWNvKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5nbGlzaCAoRnJhbmNlKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3BhbmlzaCAoR2VybWFueSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyb2F0aWEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN3ZWRlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9taW5pY2FuIFJlcHVibGljIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCZWxnaXVtIiB9OwoKCiAgICBpbnQzMl90IGk7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIExvY2FsZTo6c2V0RGVmYXVsdChMb2NhbGU6OlVTLCBzdGF0dXMpOwogICAgZm9yIChpID0gMDsgaSA8IDk7ICsraSkgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6VVMsIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IGVuZ2xpc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgewogICAgICAgICAgICBlcnJsbigiTG9va3VwIGluIEVuZ2xpc2ggZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBlbmdsaXNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgICAgICAgICBsb2dsbigiTG9jYWxlIG5hbWUgd2FzLT4gIiArIChuYW1lPWxvY2FsZXNUb1Rlc3RbaV0uZ2V0TmFtZSgpKSk7CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImVzIiwgIkVTIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUpOwogICAgICAgIGlmIChuYW1lICE9IHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gU3BhbmlzaCBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIHNwYW5pc2hEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9CgogICAgZm9yIChpID0gMDsgaSA8IDk7IGkrKykgewogICAgICAgIFVuaWNvZGVTdHJpbmcgbmFtZTsKICAgICAgICBsb2NhbGVzVG9UZXN0W2ldLmdldERpc3BsYXlOYW1lKExvY2FsZTo6RlJBTkNFLCBuYW1lKTsKICAgICAgICBsb2dsbihuYW1lKTsKICAgICAgICBpZiAobmFtZSAhPSBmcmVuY2hEaXNwbGF5TmFtZXNbaV0pCiAgICAgICAgICAgIGVycmxuKCJMb29rdXAgaW4gRnJlbmNoIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZnJlbmNoRGlzcGxheU5hbWVzW2ldCiAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiLCBnb3QgXCIiICsgbmFtZSArICJcIiIpOwogICAgfQoKICAgIGZvciAoaSA9IDA7IGkgPCA5OyBpKyspIHsKICAgICAgICBVbmljb2RlU3RyaW5nIG5hbWU7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImFyIiwgIkVTIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUgKyAiIExvY2FsZSBmYWxsYmFjayB0byBhciwgYW5kIGRhdGEgZmFsbGJhY2sgdG8gcm9vdCIpOwogICAgICAgIGlmIChuYW1lICE9IGFyYWJpY0Rpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBBcmFiaWMgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBhcmFiaWNEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICAgICAgbG9jYWxlc1RvVGVzdFtpXS5nZXREaXNwbGF5TmFtZShMb2NhbGUoImFyIiwgIkVHIiksIG5hbWUpOwogICAgICAgIGxvZ2xuKG5hbWUgKyAiIERhdGEgZmFsbGJhY2sgdG8gcm9vdCIpOwogICAgICAgIGlmIChuYW1lICE9IGFyYWJpY0Rpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICAgZXJybG4oIkxvb2t1cCBpbiBBcmFiaWMgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBhcmFiaWNEaXNwbGF5TmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIsIGdvdCBcIiIgKyBuYW1lICsgIlwiIik7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMjYzNzEKICovCi8vIG5vdCBhcHBsaWNhYmxlIGluIEMrKywgc2V0RGVmYXVsdCgpIHRha2VzIGEgcmVmZXJlbmNlCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3ROdWxsRGVmYXVsdCgpIAp7Ci8qCiAgICAvLyB3aHkgb24gZWFydGggYW55b25lIHdvdWxkIGV2ZXIgdHJ5IHRvIGRvIHRoaXMgaXMgYmV5b25kIG1lLCBidXQgd2Ugc2hvdWxkCiAgICAvLyBkZWZpbml0ZWx5IG1ha2Ugc3VyZSB3ZSBkb24ndCBsZXQgdGhlbQogICAgVUJvb2wgZ290RXhjZXB0aW9uID0gRkFMU0U7CiAgICB0cnkgewogICAgICAgIExvY2FsZS5zZXREZWZhdWx0KG51bGwpOwogICAgfQogICAgY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKICAgICAgICAvLyBhbGwgb3RoZXIgZXhjZXB0aW9uIHR5cGVzIHByb3BhZ2F0ZSB0aHJvdWdoIGhlcmUgYmFjayB0byB0aGUgdGVzdCBoYXJuZXNzCiAgICAgICAgZ290RXhjZXB0aW9uID0gVFJVRTsKICAgIH0KICAgIGlmIChMb2NhbGUuZ2V0RGVmYXVsdCgpID09IG51bGwpCiAgICAgICAgZXJybG4oIkxvY2FsZS5nZXREZWZhdWx0KCkgYWxsb3dlZCB1cyB0byBzZXQgZGVmYXVsdCB0byBOVUxMISIpOwogICAgaWYgKCFnb3RFeGNlcHRpb24pCiAgICAgICAgZXJybG4oIlRyeWluZyB0byBzZXQgZGVmYXVsdCBsb2NhbGUgdG8gTlVMTCBkaWRuJ3QgdGhyb3cgZXhjZXB0aW9uISIpOwoqLwp9CgovKioKICogQGJ1ZyA0MTM1NzUyCiAqIFRoaXMgd291bGQgYmUgYmV0dGVyIHRlc3RlZCBieSB0aGUgTG9jYWxlRGF0YVRlc3QuICBXaWxsIG1vdmUgaXQgd2hlbiBJCiAqIGdldCB0aGUgTG9jYWxlRGF0YVRlc3Qgd29ya2luZyBhZ2Fpbi4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RUaGFpQ3VycmVuY3lGb3JtYXQoKSAKewogICAgVUVycm9yQ29kZSBzdGF0dXMgPSBVX1pFUk9fRVJST1I7CiAgICBEZWNpbWFsRm9ybWF0ICp0aGFpQ3VycmVuY3kgPSAoRGVjaW1hbEZvcm1hdCopTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKAogICAgICAgICAgICAgICAgICAgIExvY2FsZSgidGgiLCAiVEgiKSwgc3RhdHVzKTsKICAgIFVDaGFyIHBvc1ByZWZpeCA9IDB4MGUzZjsKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKCiAgICBpZihVX0ZBSUxVUkUoc3RhdHVzKSB8fCAhdGhhaUN1cnJlbmN5KQogICAgewogICAgICAgIGVycmxuKCJDb3VsZG4ndCBnZXQgdGhfVEggY3VycmVuY3kgLT4gIiArIFVuaWNvZGVTdHJpbmcodV9lcnJvck5hbWUoc3RhdHVzKSkpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICE9IFVuaWNvZGVTdHJpbmcoJnBvc1ByZWZpeCwgMSwgMSkpCiAgICAgICAgZXJybG4oIlRoYWkgY3VycmVuY3kgcHJlZml4IHdyb25nOiBleHBlY3RlZCAweDBlM2YsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlUHJlZml4KHRlbXApICsgIlwiIik7CiAgICBpZiAodGhhaUN1cnJlbmN5LT5nZXRQb3NpdGl2ZVN1ZmZpeCh0ZW1wKSAhPSAiIikKICAgICAgICBlcnJsbigiVGhhaSBjdXJyZW5jeSBzdWZmaXggd3Jvbmc6IGV4cGVjdGVkIFwiXCIsIGdvdCBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICB0aGFpQ3VycmVuY3ktPmdldFBvc2l0aXZlU3VmZml4KHRlbXApICsgIlwiIik7CgogICAgZGVsZXRlIHRoYWlDdXJyZW5jeTsKfQoKLyoqCiAqIEBidWcgNDEyMjM3MQogKiBDb25maXJtIHRoYXQgRXVybyBzdXBwb3J0IHdvcmtzLiAgVGhpcyB0ZXN0IGlzIHByZXR0eSBydWRpbWVudGFyeTsgYWxsIGl0IGRvZXMKICogaXMgY2hlY2sgdGhhdCBhbnkgbG9jYWxlcyB3aXRoIHRoZSBFVVJPIHZhcmlhbnQgZm9ybWF0IGEgbnVtYmVyIHVzaW5nIHRoZQogKiBFdXJvIGN1cnJlbmN5IHN5bWJvbC4KICoKICogQVNTVU1FOiBBbGwgbG9jYWxlcyBlbmNvZGUgdGhlIEV1cm8gY2hhcmFjdGVyICJcdTIwQUMiLgogKiBJZiB0aGlzIGlzIGNoYW5nZWQgdG8gdXNlIHRoZSBzaW5nbGUtY2hhcmFjdGVyIEV1cm8gc3ltYm9sLCB0aGlzCiAqIHRlc3QgbXVzdCBiZSB1cGRhdGVkLgogKgogKiBET04nVCBBU1NVTUU6IEFueSBzcGVjaWZpYyBjb3VudHJpZXMgc3VwcG9ydCB0aGUgRXVyby4gIEluc3RlYWQsCiAqIGl0ZXJhdGUgdGhyb3VnaCBhbGwgbG9jYWxlcy4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3RFdXJvU3VwcG9ydCgpIAp7CiAgICBjb25zdCBVbmljb2RlU3RyaW5nIEVVUk9fVkFSSUFOVCgiRVVSTyIpOwogICAgVUNoYXIgZXVybyA9IDB4MjBhYzsKICAgIGNvbnN0IFVuaWNvZGVTdHJpbmcgRVVST19DVVJSRU5DWSgmZXVybywgMSwgMSk7IC8vIExvb2sgZm9yIHRoaXMgVW5pY29kZVN0cmluZyBpbiBmb3JtYXR0ZWQgRXVybyBjdXJyZW5jeQoKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwoKICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKCiAgICBpbnQzMl90IGxvY0NvdW50ID0gMDsKICAgIGNvbnN0IExvY2FsZSAqbG9jYWxlcyA9IE51bWJlckZvcm1hdDo6Z2V0QXZhaWxhYmxlTG9jYWxlcyhsb2NDb3VudCk7ICAgICAgCiAgICBmb3IgKGludDMyX3QgaT0wOyBpIDwgbG9jQ291bnQ7ICsraSkgewogICAgICAgIExvY2FsZSBsb2MgPSBsb2NhbGVzW2ldOwogICAgICAgIFVuaWNvZGVTdHJpbmcgdGVtcDsKICAgICAgICBpZiAoICAodGVtcD1sb2MuZ2V0VmFyaWFudCgpKS5pbmRleE9mKEVVUk9fVkFSSUFOVCkgPj0gMCkgewogICAgICAgICAgICBOdW1iZXJGb3JtYXQgKm5mID0gTnVtYmVyRm9ybWF0OjpjcmVhdGVDdXJyZW5jeUluc3RhbmNlKGxvYywgc3RhdHVzKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBwb3M7CiAgICAgICAgICAgIG5mLT5mb3JtYXQoMjcxODI4LjE4Mjg0NSwgcG9zKTsKICAgICAgICAgICAgVW5pY29kZVN0cmluZyBuZWc7CiAgICAgICAgICAgIG5mLT5mb3JtYXQoLTI3MTgyOC4xODI4NDUsIG5lZyk7CiAgICAgICAgICAgIGlmIChwb3MuaW5kZXhPZihFVVJPX0NVUlJFTkNZKSA+PSAwICYmCiAgICAgICAgICAgICAgICBuZWcuaW5kZXhPZihFVVJPX0NVUlJFTkNZKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBsb2dsbigiT2s6ICIgKyAodGVtcD1sb2MuZ2V0TmFtZSgpKSArCiAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgcG9zICsgIiAvICIgKyBuZWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZXJybG4oIkZhaWw6ICIgKyAodGVtcD1sb2MuZ2V0TmFtZSgpKSArCiAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdHMgd2l0aG91dCAiICsgRVVST19DVVJSRU5DWSArCiAgICAgICAgICAgICAgICAgICAgICAiOiAiICsgcG9zICsgIiAvICIgKyBuZWcgKwogICAgICAgICAgICAgICAgICAgICAgIlxuKioqIFRISVMgRkFJTFVSRSBNQVkgT05MWSBNRUFOIFRIQVQgTE9DQUxFIERBVEEgSEFTIENIQU5HRUQgKioqIik7CiAgICAgICAgICAgIH0KICAgICAgICAKICAgICAgICAgICAgZGVsZXRlIG5mOwogICAgICAgIH0KICAgIH0KfQoKLyoqCiAqIEBidWcgNDEzOTUwNAogKiB0b1N0cmluZygpIGRvZXNuJ3Qgd29yayB3aXRoIGxhbmd1YWdlX1ZBUklBTlQuCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0VG9TdHJpbmcoKSB7CiAgICBMb2NhbGUgREFUQSBbXSA9IHsKICAgICAgICBMb2NhbGUoInh4IiwgIiIsICIiKSwKICAgICAgICBMb2NhbGUoIiIsICJZWSIsICIiKSwKICAgICAgICBMb2NhbGUoIiIsICIiLCAiWloiKSwKICAgICAgICBMb2NhbGUoInh4IiwgIllZIiwgIiIpLAogICAgICAgIExvY2FsZSgieHgiLCAiIiwgIlpaIiksCiAgICAgICAgTG9jYWxlKCIiLCAiWVkiLCAiWloiKSwKICAgICAgICBMb2NhbGUoInh4IiwgIllZIiwgIlpaIiksCiAgICB9OwoKICAgIGNvbnN0IGNoYXIgREFUQV9TIFtdWzIwXSA9IHsKICAgICAgICAieHgiLAogICAgICAgICJfWVkiLAogICAgICAgICJfX1paIiwKICAgICAgICAieHhfWVkiLAogICAgICAgICJ4eF9fWloiLAogICAgICAgICJfWVlfWloiLAogICAgICAgICJ4eF9ZWV9aWiIsCiAgICB9OwogICAgCiAgICBmb3IgKGludDMyX3QgaT0wOyBpIDwgNzsgKytpKSB7CiAgICAgIGNvbnN0IGNoYXIgKm5hbWU7CiAgICAgIG5hbWUgPSBEQVRBW2ldLmdldE5hbWUoKTsKCiAgICAgIGlmIChzdHJjbXAobmFtZSwgREFUQV9TW2ldKSAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgZXJybG4oIkZhaWw6IExvY2FsZS5nZXROYW1lKCksIGdvdDoiICsgVW5pY29kZVN0cmluZyhuYW1lKSArICIsIGV4cGVjdGVkOiAiICsgREFUQV9TW2ldKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb2dsbigiUGFzczogTG9jYWxlLmdldE5hbWUoKSwgZ290OiIgKyBVbmljb2RlU3RyaW5nKG5hbWUpICk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMzk5NDAKICogQ291bGRuJ3QgcmVwcm9kdWNlIHRoaXMgYnVnIC0tIHByb2JhYmx5IHdhcyBmaXhlZCBlYXJsaWVyLgogKgogKiBPUklHSU5BTCBCVUcgUkVQT1JUOgogKiAtLSBiYXNpY2FsbHksIGh1bmdhcmlhbiBmb3IgbW9uZGF5IHNob3VsZG4ndCBoYXZlIGFuIFx1MDBmNCAKICogKG8gY2lyY3VtZmxleClpbiBpdCBpbnN0ZWFkIGl0IHNob3VsZCBiZSBhbiBvIHdpdGggMiBpbmNsaW5lZCAKICogKHJpZ2h0KSBsaW5lcyBvdmVyIGl0Li4KICoKICogWW91IG1heSB3b25kZXIgLS0gd2h5IGRvIGFsbCB0aGlzIC0tIHdoeSBub3QganVzdCBhZGQgYSBsaW5lIHRvCiAqIExvY2FsZURhdGE/ICBXZWxsLCBJIGNvdWxkIHNlZSBieSBpbnNwZWN0aW9uIHRoYXQgdGhlIGxvY2FsZSBmaWxlIGhhZCB0aGUKICogcmlnaHQgY2hhcmFjdGVyIGluIGl0LCBzbyBJIHdhbnRlZCB0byBjaGVjayB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUgLS0gYQogKiB2ZXJ5IHJlbW90ZSBwb3NzaWJpbGl0eSwgYnV0IEkgd2FudGVkIHRvIGJlIHN1cmUuICBUaGUgb3RoZXIgcG9zc2liaWxpdHkKICogaXMgdGhhdCBzb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB0aGUgZm9udCBtYXBwaW5nIHN1YnN5c3RlbSwgYnV0IHdlIGNhbid0CiAqIHRlc3QgdGhhdCBoZXJlLgogKi8Kdm9pZCAKTG9jYWxlVGVzdDo6VGVzdDQxMzk5NDAoKSAKewogICAgTG9jYWxlIG15bG9jYWxlKCJodSIsICIiLCAiIik7ICAgICAgIAogICAgVURhdGUgbXlkYXRlID0gZGF0ZSg5OCwzLDEzKTsgLy8gQSBNb25kYXkKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgU2ltcGxlRGF0ZUZvcm1hdCBkZl9mdWxsKCJFRUVFIiwgbXlsb2NhbGUsIHN0YXR1cyk7CiAgICBVbmljb2RlU3RyaW5nIHN0cjsKICAgIEZpZWxkUG9zaXRpb24gcG9zKEZpZWxkUG9zaXRpb246OkRPTlRfQ0FSRSk7CiAgICBkZl9mdWxsLmZvcm1hdChteWRhdGUsIHN0ciwgcG9zKTsKICAgIC8vIE1ha2Ugc3VyZSB0aGF0IG8gY2lyY3VtZmxleCAoXHUwMEY0KSBpcyBOT1QgdGhlcmUsIGFuZAogICAgLy8gbyBkb3VibGUgYWN1dGUgKFx1MDE1MSkgSVMuCiAgICBVQ2hhciBvY2YgPSAweDAwZjQ7CiAgICBVQ2hhciBvZGEgPSAweDAxNTE7CiAgICBpZiAoc3RyLmluZGV4T2Yob2RhKSA8IDAgfHwgc3RyLmluZGV4T2Yob2NmKSA+PSAwKQogICAgICAgIGVycmxuKCJGYWlsOiBNb25kYXkgaW4gSHVuZ2FyaWFuIGlzIHdyb25nIik7Cn0KClVEYXRlCkxvY2FsZVRlc3Q6OmRhdGUoaW50MzJfdCB5LCBpbnQzMl90IG0sIGludDMyX3QgZCwgaW50MzJfdCBociwgaW50MzJfdCBtaW4sIGludDMyX3Qgc2VjKQp7CiAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJPUjsKICAgIENhbGVuZGFyICpjYWwgPSBDYWxlbmRhcjo6Y3JlYXRlSW5zdGFuY2Uoc3RhdHVzKTsKICAgIGlmIChjYWwgPT0gMCkgCiAgICAgICAgcmV0dXJuIDAuMDsKICAgIGNhbC0+Y2xlYXIoKTsKICAgIGNhbC0+c2V0KDE5MDAgKyB5LCBtLCBkLCBociwgbWluLCBzZWMpOyAvLyBBZGQgMTkwMCB0byBmb2xsb3cgamF2YS51dGlsLkRhdGUgcHJvdG9jb2wKICAgIFVEYXRlIGR0ID0gY2FsLT5nZXRUaW1lKHN0YXR1cyk7CiAgICBpZiAoVV9GQUlMVVJFKHN0YXR1cykpCiAgICAgICAgcmV0dXJuIDAuMDsKICAgIAogICAgZGVsZXRlIGNhbDsKICAgIHJldHVybiBkdDsKfQoKLyoqCiAqIEBidWcgNDE0Mzk1MQogKiBSdXNzaWFuIGZpcnN0IGRheSBvZiB3ZWVrIHNob3VsZCBiZSBNb25kYXkuIENvbmZpcm1lZC4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTQzOTUxKCkgCnsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgQ2FsZW5kYXIgKmNhbCA9IENhbGVuZGFyOjpjcmVhdGVJbnN0YW5jZShMb2NhbGUoInJ1IiwgIiIsICIiKSwgc3RhdHVzKTsKICAgIGlmIChjYWwtPmdldEZpcnN0RGF5T2ZXZWVrKCkgIT0gQ2FsZW5kYXI6Ok1PTkRBWSkgewogICAgICAgIGVycmxuKCJGYWlsOiBGaXJzdCBkYXkgb2Ygd2VlayBpbiBSdXNzaWEgc2hvdWxkIGJlIE1vbmRheSIpOwogICAgfQogICAgZGVsZXRlIGNhbDsKfQoKLyoqCiAqIEBidWcgNDE0NzMxNQogKiBqYXZhLnV0aWwuTG9jYWxlLmdldElTTzNDb3VudHJ5KCkgd29ya3Mgd3JvbmcgZm9yIG5vbiBJU08tMzE2NiBjb2Rlcy4KICogU2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdW5rbm93biBsb2NhbGVzCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDE0NzMxNSgpIAp7CiAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgLy8gVHJ5IHdpdGggY29kZXMgdGhhdCBhcmUgdGhlIHdyb25nIGxlbmd0aCBidXQgaGFwcGVuIHRvIG1hdGNoIHRleHQKICAgIC8vIGF0IGEgdmFsaWQgb2Zmc2V0IGluIHRoZSBtYXBwaW5nIHRhYmxlCiAgICBMb2NhbGUgbG9jYWxlKCJhYWEiLCAiQ0NDIik7CiAgICAKICAgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IGxvY2FsZS5nZXRJU08zQ291bnRyeSgpOwoKICAgIC8vIENoYW5nZSB0byBjb25mb3JtIHRvIEMgYXBpIHVzYWdlCiAgICBpZigocmVzdWx0PT1OVUxMKXx8KHJlc3VsdFswXSAhPSAwKSkKICAgICAgZXJybG4oIkVSUk9SOiBnZXRJU08zQ291bnRyeSgpIHJldHVybnM6ICIgKyBVbmljb2RlU3RyaW5nKHJlc3VsdCwiIikgKyAKICAgICAgICAgICAgICAgICIgZm9yIGxvY2FsZSAnIiArICh0ZW1wPWxvY2FsZS5nZXROYW1lKCkpICsgIicgcmF0aGVyIHRoYW4gZXhjZXB0aW9uIiApOwp9CgovKioKICogQGJ1ZyA0MTQ3MzE3CiAqIGphdmEudXRpbC5Mb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkgd29ya3Mgd3JvbmcgZm9yIG5vbiBJU08tMzE2NiBjb2Rlcy4KICogU2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBmb3IgdW5rbm93biBsb2NhbGVzCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDE0NzMxNygpIAp7CiAgICBVbmljb2RlU3RyaW5nIHRlbXA7CiAgICAvLyBUcnkgd2l0aCBjb2RlcyB0aGF0IGFyZSB0aGUgd3JvbmcgbGVuZ3RoIGJ1dCBoYXBwZW4gdG8gbWF0Y2ggdGV4dAogICAgLy8gYXQgYSB2YWxpZCBvZmZzZXQgaW4gdGhlIG1hcHBpbmcgdGFibGUKICAgIExvY2FsZSBsb2NhbGUoImFhYSIsICJDQ0MiKTsKICAgIAogICAgY29uc3QgY2hhciAqcmVzdWx0ID0gbG9jYWxlLmdldElTTzNMYW5ndWFnZSgpOwoKICAgIC8vIENoYW5nZSB0byBjb25mb3JtIHRvIEMgYXBpIHVzYWdlCiAgICBpZigocmVzdWx0PT1OVUxMKXx8KHJlc3VsdFswXSAhPSAwKSkKICAgICAgZXJybG4oIkVSUk9SOiBnZXRJU08zTGFuZ3VhZ2UoKSByZXR1cm5zOiAiICsgVW5pY29kZVN0cmluZyhyZXN1bHQsIiIpICsgCiAgICAgICAgICAgICAgICAiIGZvciBsb2NhbGUgJyIgKyAodGVtcD1sb2NhbGUuZ2V0TmFtZSgpKSArICInIHJhdGhlciB0aGFuIGV4Y2VwdGlvbiIgKTsKfQoKLyoKICogQGJ1ZyA0MTQ3NTUyCiAqLwp2b2lkIApMb2NhbGVUZXN0OjpUZXN0NDE0NzU1MigpIAp7CiAgICBMb2NhbGUgbG9jYWxlcyBbXSA9IHsgICAgIExvY2FsZSgibm8iLCAiTk8iKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIm5vIiwgIk5PIiwgIkIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGUoIm5vIiwgIk5PIiwgIk5ZIikgCiAgICB9OwogICAgCiAgICBVbmljb2RlU3RyaW5nIGVkbigiTm9yd2VnaWFuIChOb3J3YXksIEJva20iKTsKICAgIGVkbiArPSAoVUNoYXIzMikweDAwZTU7CiAgICBlZG4gKz0gImwpIjsKICAgIFVuaWNvZGVTdHJpbmcgZW5nbGlzaERpc3BsYXlOYW1lcyBbXSA9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3J3ZWdpYW4gKE5vcndheSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIk5vcndlZ2lhbiAoTm9yd2F5LEIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIk5vcndlZ2lhbiAoTm9yd2F5LE5ZKSIgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9yd2VnaWFuIChOb3J3YXksIE55bm9yc2spIiAKICAgIH07CiAgICBVbmljb2RlU3RyaW5nIG5kbigibm9yc2sgKE5vcmdlLCBCb2ttIik7CiAgICBuZG4gKz0gKFVDaGFyMzIpMHgwMGU1OwogICAgbmRuICs9ICJsKSI7CiAgICBVbmljb2RlU3RyaW5nIG5vcndlZ2lhbkRpc3BsYXlOYW1lcyBbXSA9IHsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JzayAoTm9yZ2UpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ibm9yc2sgKE5vcmdlLEIpIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyJub3JzayAoTm9yZ2UsTlkpIiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3JzayAoTm9yZWcsIE55bm9yc2spIiAKICAgIH07CgogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgMzsgKytpKSB7CiAgICAgICAgTG9jYWxlIGxvYyA9IGxvY2FsZXNbaV07CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGlmIChsb2MuZ2V0RGlzcGxheU5hbWUodGVtcCkgIT0gZW5nbGlzaERpc3BsYXlOYW1lc1tpXSkKICAgICAgICAgICBlcnJsbigiRW5nbGlzaCBkaXNwbGF5LW5hbWUgbWlzbWF0Y2g6IGV4cGVjdGVkICIgKwogICAgICAgICAgICAgICAgICAgZW5nbGlzaERpc3BsYXlOYW1lc1tpXSArICIsIGdvdCAiICsgbG9jLmdldERpc3BsYXlOYW1lKHRlbXApKTsKICAgICAgICBpZiAobG9jLmdldERpc3BsYXlOYW1lKGxvYywgdGVtcCkgIT0gbm9yd2VnaWFuRGlzcGxheU5hbWVzW2ldKQogICAgICAgICAgICBlcnJsbigiTm9yd2VnaWFuIGRpc3BsYXktbmFtZSBtaXNtYXRjaDogZXhwZWN0ZWQgIiArCiAgICAgICAgICAgICAgICAgICBub3J3ZWdpYW5EaXNwbGF5TmFtZXNbaV0gKyAiLCBnb3QgIiArCiAgICAgICAgICAgICAgICAgICBsb2MuZ2V0RGlzcGxheU5hbWUobG9jLCB0ZW1wKSk7CiAgICB9Cn0KCnZvaWQKTG9jYWxlVGVzdDo6VGVzdFZhcmlhbnRQYXJzaW5nKCkKewogICAgTG9jYWxlIGVuX1VTX2N1c3RvbSgiZW4iLCAiVVMiLCAiRGUgQW56YV9DdXBlcnRpbm9fQ2FsaWZvcm5pYV9Vbml0ZWQgU3RhdGVzX0VhcnRoIik7CgogICAgVW5pY29kZVN0cmluZyBkaXNwTmFtZSgiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcywgREUgQU5aQV9DVVBFUlRJTk9fQ0FMSUZPUk5JQV9VTklURUQgU1RBVEVTX0VBUlRIKSIpOwogICAgVW5pY29kZVN0cmluZyBkaXNwVmFyKCJERSBBTlpBX0NVUEVSVElOT19DQUxJRk9STklBX1VOSVRFRCBTVEFURVNfRUFSVEgiKTsKICAgIAogICAgVW5pY29kZVN0cmluZyBnb3Q7CiAgICAKICAgIGVuX1VTX2N1c3RvbS5nZXREaXNwbGF5VmFyaWFudChMb2NhbGU6OlVTLCBnb3QpOwogICAgaWYoZ290ICE9IGRpc3BWYXIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6ICIgKyBkaXNwVmFyKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBlbl9VU19jdXN0b20uZ2V0RGlzcGxheU5hbWUoTG9jYWxlOjpVUywgZ290KTsKICAgIGlmKGdvdCAhPSBkaXNwTmFtZSkgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5TmFtZSgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogIiArIGRpc3BOYW1lKTsKICAgICAgICBlcnJsbigiR290ICAgOiAiICsgZ290KTsKICAgIH0KCiAgICBMb2NhbGUgc2hvcnRWYXJpYW50KCJmciIsICJGUiIsICJmb28iKTsKICAgIHNob3J0VmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQoImZyIiwgIkZSIiwgIl9mb28iKTsKICAgIGJvZ3VzVmFyaWFudC5nZXREaXNwbGF5VmFyaWFudChnb3QpOwogICAgCiAgICBpZihnb3QgIT0gIkZPTyIpIHsKICAgICAgICBlcnJsbigiRkFJTDogZ2V0RGlzcGxheVZhcmlhbnQoKSIpOwogICAgICAgIGVycmxuKCJXYW50ZWQ6IGZvbyIpOwogICAgICAgIGVycmxuKCJHb3QgICA6ICIgKyBnb3QpOwogICAgfQoKICAgIExvY2FsZSBib2d1c1ZhcmlhbnQyKCJmciIsICJGUiIsICJmb29fIik7CiAgICBib2d1c1ZhcmlhbnQyLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9CgogICAgTG9jYWxlIGJvZ3VzVmFyaWFudDMoImZyIiwgIkZSIiwgIl9mb29fIik7CiAgICBib2d1c1ZhcmlhbnQzLmdldERpc3BsYXlWYXJpYW50KGdvdCk7CiAgICAKICAgIGlmKGdvdCAhPSAiRk9PIikgewogICAgICAgIGVycmxuKCJGQUlMOiBnZXREaXNwbGF5VmFyaWFudCgpIik7CiAgICAgICAgZXJybG4oIldhbnRlZDogZm9vIik7CiAgICAgICAgZXJybG4oIkdvdCAgIDogIiArIGdvdCk7CiAgICB9Cn0KCi8qKgogKiBAYnVnIDQxMDU4MjgKICogQ3VycmVuY3kgc3ltYm9sIGluIHpoIGlzIHdyb25nLiAgV2Ugd2lsbCB0ZXN0IHRoaXMgYXQgdGhlIE51bWJlckZvcm1hdAogKiBlbmQgdG8gdGVzdCB0aGUgd2hvbGUgcGlwZS4KICovCnZvaWQgCkxvY2FsZVRlc3Q6OlRlc3Q0MTA1ODI4KCkgCnsKICAgIExvY2FsZSBMT0MgW10gPSB7IExvY2FsZTo6Q0hJTkVTRSwgIExvY2FsZSgiemgiLCAiQ04iLCAiIiksCiAgICAgICAgICAgICAgICAgICAgIExvY2FsZSgiemgiLCAiVFciLCAiIiksIExvY2FsZSgiemgiLCAiSEsiLCAiIikgfTsKICAgIFVFcnJvckNvZGUgc3RhdHVzID0gVV9aRVJPX0VSUk9SOwogICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgTnVtYmVyRm9ybWF0ICpmbXQgPSBOdW1iZXJGb3JtYXQ6OmNyZWF0ZVBlcmNlbnRJbnN0YW5jZShMT0NbaV0sIHN0YXR1cyk7CiAgICAgICAgaWYoVV9GQUlMVVJFKHN0YXR1cykpIHsKICAgICAgICAgICAgZXJybG4oIkNvdWxkbid0IGNyZWF0ZSBOdW1iZXJGb3JtYXQiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBVbmljb2RlU3RyaW5nIHJlc3VsdDsKICAgICAgICBGaWVsZFBvc2l0aW9uIHBvcygwKTsKICAgICAgICBmbXQtPmZvcm1hdCgoaW50MzJfdCkxLCByZXN1bHQsIHBvcyk7CiAgICAgICAgVW5pY29kZVN0cmluZyB0ZW1wOwogICAgICAgIGlmKHJlc3VsdCAhPSAiMTAwJSIpIHsKICAgICAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygiUGVyY2VudCBmb3IgIikgKyBMT0NbaV0uZ2V0RGlzcGxheU5hbWUodGVtcCkgKyAiIHNob3VsZCBiZSAxMDAlLCBnb3QgIiArIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGRlbGV0ZSBmbXQ7CiAgICB9Cn0K