Ly8gIFVuaXQgdGVzdCBmb3IgYm9vc3Q6OmxleGljYWxfY2FzdC4KLy8KLy8gIFNlZSBodHRwOi8vd3d3LmJvb3N0Lm9yZyBmb3IgbW9zdCByZWNlbnQgdmVyc2lvbiwgaW5jbHVkaW5nIGRvY3VtZW50YXRpb24uCi8vCi8vICBDb3B5cmlnaHQgVGVyamUgU2xldHRlYvggYW5kIEtldmxpbiBIZW5uZXksIDIwMDUuCi8vICBDb3B5cmlnaHQgQWxleGFuZGVyIE5hc29ub3YsIDIwMDYuCi8vCi8vICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QKLy8gIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZyBmaWxlCi8vICBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpLgovLwovLyBOb3RlOiBUaGUgdW5pdCB0ZXN0IG5vIGxvbmdlciBjb21waWxlIG9uIE1TVkMgNiwgYnV0IGxleGljYWxfY2FzdCBpdHNlbGYgd29ya3MgZm9yIGl0LgoKI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CgojaWYgZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogMTkzIDM4MyA0ODggOTgxIDE0MTggMTQxOSkKI2VsaWYgZGVmaW5lZChCT09TVF9NU1ZDKQojcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA5NyA0MTAwIDQxMjEgNDEyNyA0MTQ2IDQyNDQgNDI0NSA0NTExIDQ1MTIgNDcwMSA0ODAwKQojZW5kaWYKCiNpbmNsdWRlIDxib29zdC9sZXhpY2FsX2Nhc3QuaHBwPgoKI2luY2x1ZGUgPGJvb3N0L2NzdGRpbnQuaHBwPgojaW5jbHVkZSA8Ym9vc3QvdGVzdC91bml0X3Rlc3QuaHBwPgojaW5jbHVkZSA8Ym9vc3QvdGVzdC9mbG9hdGluZ19wb2ludF9jb21wYXJpc29uLmhwcD4KCiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxtZW1vcnk+CgojaWYgKGRlZmluZWQoQk9PU1RfSEFTX0xPTkdfTE9ORykgfHwgZGVmaW5lZChCT09TVF9IQVNfTVNfSU5UNjQpKSBcCiAgICAmJiAhKGRlZmluZWQoQk9PU1RfTVNWQykgJiYgQk9PU1RfTVNWQyA8IDEzMDApCiNkZWZpbmUgTENBU1RfVEVTVF9MT05HTE9ORwojZW5kaWYKCnRlbXBsYXRlPGNsYXNzIENoYXJUPgpzdHJ1Y3QgbXlfdHJhaXRzIDogc3RkOjpjaGFyX3RyYWl0czxDaGFyVD4Kewp9OwoKdGVtcGxhdGU8Y2xhc3MgQ2hhclQ+CnN0cnVjdCBteV9hbGxvY2F0b3IgOiBzdGQ6OmFsbG9jYXRvcjxDaGFyVD4Kewp9OwoKLy8gVGVzdCBhbGwgNjU1MzYgdmFsdWVzIGlmIHRydWU6CmJvb2wgY29uc3QgbGNhc3RfdGVzdF9zbWFsbF9pbnRlZ3JhbF90eXBlc19jb21wbGV0ZWx5ID0gZmFsc2U7CgovLyBsY2FzdF9pbnRlZ3JhbF90ZXN0X2NvdW50ZXI6IHVzZSB3aGVuIHRlc3RpbmcgYWxsIHZhbHVlcyBvZiBhbiBpbnRlZ3JhbAovLyB0eXBlcyBpcyBub3QgcG9zc2libGUuIE1heC4gcG9ydGFibGUgdmFsdWUgaXMgMzI3NjcuCmludCBjb25zdCBsY2FzdF9pbnRlZ3JhbF90ZXN0X2NvdW50ZXI9MTAwMDsKCnVzaW5nIG5hbWVzcGFjZSBib29zdDsKCnZvaWQgdGVzdF9jb252ZXJzaW9uX3RvX2NoYXIoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9faW50KCk7CnZvaWQgdGVzdF9jb252ZXJzaW9uX3RvX2RvdWJsZSgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl90b19ib29sKCk7CnZvaWQgdGVzdF9jb252ZXJzaW9uX3RvX3N0cmluZygpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3djaGFyX3RfYWxpYXMoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fcG9pbnRlcigpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3djaGFyX3QoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fd2NoYXJfdCgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3dzdHJpbmcoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fd3N0cmluZygpOwp2b2lkIHRlc3RfYmFkX2xleGljYWxfY2FzdCgpOwp2b2lkIHRlc3Rfbm9fd2hpdGVzcGFjZV9zdHJpcHBpbmcoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19zaG9ydCgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3VzaG9ydCgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludCgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3VpbnQoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19sb25nKCk7CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWxvbmcoKTsKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRtYXhfdCgpOwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3VpbnRtYXhfdCgpOwojaWZkZWYgTENBU1RfVEVTVF9MT05HTE9ORwp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2xvbmdsb25nKCk7CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWxvbmdsb25nKCk7CiNlbmRpZgojaWZuZGVmIEJPT1NUX05PX1RFTVBMQVRFX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04Kdm9pZCB0ZXN0X3RyYWl0cygpOwp2b2lkIHRlc3Rfd3RyYWl0cygpOwp2b2lkIHRlc3RfYWxsb2NhdG9yKCk7CnZvaWQgdGVzdF93YWxsb2NhdG9yKCk7CiNlbmRpZgoKdW5pdF90ZXN0Ojp0ZXN0X3N1aXRlICppbml0X3VuaXRfdGVzdF9zdWl0ZShpbnQsIGNoYXIgKltdKQp7CiAgICB1bml0X3Rlc3RfZnJhbWV3b3JrOjp0ZXN0X3N1aXRlICpzdWl0ZSA9CiAgICAgICAgQk9PU1RfVEVTVF9TVUlURSgibGV4aWNhbF9jYXN0IHVuaXQgdGVzdCIpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9jb252ZXJzaW9uX3RvX2NoYXIpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfY29udmVyc2lvbl90b19pbnQpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfY29udmVyc2lvbl90b19kb3VibGUpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfY29udmVyc2lvbl90b19ib29sKSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X2NvbnZlcnNpb25fZnJvbV90b193Y2hhcl90X2FsaWFzKSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X2NvbnZlcnNpb25fdG9fcG9pbnRlcikpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9jb252ZXJzaW9uX3RvX3N0cmluZykpOwojaWZuZGVmIEJPT1NUX0xDQVNUX05PX1dDSEFSX1QKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfY29udmVyc2lvbl9mcm9tX3djaGFyX3QpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfY29udmVyc2lvbl90b193Y2hhcl90KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X2NvbnZlcnNpb25fZnJvbV93c3RyaW5nKSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSh0ZXN0X2NvbnZlcnNpb25fdG9fd3N0cmluZykpOwojZW5kaWYKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKHRlc3RfYmFkX2xleGljYWxfY2FzdCkpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UodGVzdF9ub193aGl0ZXNwYWNlX3N0cmlwcGluZykpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UoJnRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3Nob3J0KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdXNob3J0KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWludCkpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UoJnRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2xvbmcpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKCZ0ZXN0X2NvbnZlcnNpb25fZnJvbV90b191bG9uZykpOwogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UoJnRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludG1heF90KSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWludG1heF90KSk7CiNpZmRlZiBMQ0FTVF9URVNUX0xPTkdMT05HCiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fbG9uZ2xvbmcpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKCZ0ZXN0X2NvbnZlcnNpb25fZnJvbV90b191bG9uZ2xvbmcpKTsKI2VuZGlmCiNpZm5kZWYgQk9PU1RfTk9fVEVNUExBVEVfUEFSVElBTF9TUEVDSUFMSVpBVElPTgogICAgc3VpdGUtPmFkZChCT09TVF9URVNUX0NBU0UoJnRlc3RfdHJhaXRzKSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF93dHJhaXRzKSk7CiAgICBzdWl0ZS0+YWRkKEJPT1NUX1RFU1RfQ0FTRSgmdGVzdF9hbGxvY2F0b3IpKTsKICAgIHN1aXRlLT5hZGQoQk9PU1RfVEVTVF9DQVNFKCZ0ZXN0X3dhbGxvY2F0b3IpKTsKI2VuZGlmCgogICAgcmV0dXJuIHN1aXRlOwp9Cgp2b2lkIHRlc3RfY29udmVyc2lvbl90b19jaGFyKCkKewogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoJ0EnLCBsZXhpY2FsX2Nhc3Q8Y2hhcj4oJ0EnKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCgnICcsIGxleGljYWxfY2FzdDxjaGFyPignICcpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCcxJywgbGV4aWNhbF9jYXN0PGNoYXI+KDEpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCcwJywgbGV4aWNhbF9jYXN0PGNoYXI+KDApKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxjaGFyPigxMjMpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCcxJywgbGV4aWNhbF9jYXN0PGNoYXI+KDEuMCkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoJzEnLCBsZXhpY2FsX2Nhc3Q8Y2hhcj4odHJ1ZSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoJzAnLCBsZXhpY2FsX2Nhc3Q8Y2hhcj4oZmFsc2UpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCdBJywgbGV4aWNhbF9jYXN0PGNoYXI+KCJBIikpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoJyAnLCBsZXhpY2FsX2Nhc3Q8Y2hhcj4oIiAiKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8Y2hhcj4oIiIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxjaGFyPigiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCdBJywgbGV4aWNhbF9jYXN0PGNoYXI+KHN0ZDo6c3RyaW5nKCJBIikpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCcgJywgbGV4aWNhbF9jYXN0PGNoYXI+KHN0ZDo6c3RyaW5nKCIgIikpKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDxjaGFyPihzdGQ6OnN0cmluZygiIikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDxjaGFyPihzdGQ6OnN0cmluZygiVGVzdCIpKSwgYmFkX2xleGljYWxfY2FzdCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX3RvX2ludCgpCnsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGxleGljYWxfY2FzdDxpbnQ+KCcxJykpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMCwgbGV4aWNhbF9jYXN0PGludD4oJzAnKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8aW50PignQScpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGxleGljYWxfY2FzdDxpbnQ+KDEpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGxleGljYWxfY2FzdDxpbnQ+KDEuMCkpOwoKICAgIEJPT1NUX0NIRUNLX0VRVUFMKAogICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCkoKSwKICAgICAgICBsZXhpY2FsX2Nhc3Q8aW50Pigoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgpKCkpKTsKCiAgICBCT09TVF9DSEVDS19FUVVBTCgKICAgICAgICAoc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptaW4pKCksCiAgICAgICAgbGV4aWNhbF9jYXN0PGludD4oKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWluKSgpKSk7CgogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGludD4oMS4yMyksIGJhZF9sZXhpY2FsX2Nhc3QpOwoKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxpbnQ+KDFlMjApLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEsIGxleGljYWxfY2FzdDxpbnQ+KHRydWUpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDAsIGxleGljYWxfY2FzdDxpbnQ+KGZhbHNlKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCgxMjMsIGxleGljYWxfY2FzdDxpbnQ+KCIxMjMiKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8aW50PigiIDEyMyIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxpbnQ+KCIiKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8aW50PigiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEyMywgbGV4aWNhbF9jYXN0PGludD4oIjEyMyIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEyMywgbGV4aWNhbF9jYXN0PGludD4oc3RkOjpzdHJpbmcoIjEyMyIpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8aW50PihzdGQ6OnN0cmluZygiIDEyMyIpKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8aW50PihzdGQ6OnN0cmluZygiIikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDxpbnQ+KHN0ZDo6c3RyaW5nKCJUZXN0IikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fZG91YmxlKCkKewogICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMS4wLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPignMScpLCAoc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjplcHNpbG9uKCkpKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxkb3VibGU+KCdBJyksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMS4wLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPigxKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSk7CiAgICBCT09TVF9DSEVDS19DTE9TRSgxLjIzLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPigxLjIzKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSk7CiAgICBCT09TVF9DSEVDS19DTE9TRSgxLjIzNDU2Nzg5MCwgMS4yMzQ1Njc4OTAsIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKTsKICAgIEJPT1NUX0NIRUNLX0NMT1NFKDEuMCwgbGV4aWNhbF9jYXN0PGRvdWJsZT4odHJ1ZSksIChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSkpOwogICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMC4wLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPihmYWxzZSksIChzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmVwc2lsb24oKSkpOwogICAgQk9PU1RfQ0hFQ0tfQ0xPU0UoMS4yMywgbGV4aWNhbF9jYXN0PGRvdWJsZT4oIjEuMjMiKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8ZG91YmxlPigiIiksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGRvdWJsZT4oIlRlc3QiKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19DTE9TRSgxLjIzLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdGQ6OnN0cmluZygiMS4yMyIpKSwgKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6ZXBzaWxvbigpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8ZG91YmxlPihzdGQ6OnN0cmluZygiIikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDxkb3VibGU+KHN0ZDo6c3RyaW5nKCJUZXN0IikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fYm9vbCgpCnsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRydWUsIGxleGljYWxfY2FzdDxib29sPignMScpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oJzAnKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8Ym9vbD4oJ0EnKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19FUVVBTCh0cnVlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oMSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFsc2UsIGxleGljYWxfY2FzdDxib29sPigwKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8Ym9vbD4oMTIzKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19FUVVBTCh0cnVlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oMS4wKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChmYWxzZSwgbGV4aWNhbF9jYXN0PGJvb2w+KDAuMCkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwodHJ1ZSwgbGV4aWNhbF9jYXN0PGJvb2w+KHRydWUpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oZmFsc2UpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRydWUsIGxleGljYWxfY2FzdDxib29sPigiMSIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oIjAiKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8Ym9vbD4oIiIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxib29sPigiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRydWUsIGxleGljYWxfY2FzdDxib29sPigiMSIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oIjAiKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCh0cnVlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oc3RkOjpzdHJpbmcoIjEiKSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFsc2UsIGxleGljYWxfY2FzdDxib29sPihzdGQ6OnN0cmluZygiMCIpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8Ym9vbD4oc3RkOjpzdHJpbmcoIiIpKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8Ym9vbD4oc3RkOjpzdHJpbmcoIlRlc3QiKSksIGJhZF9sZXhpY2FsX2Nhc3QpOwp9Cgp2b2lkIHRlc3RfY29udmVyc2lvbl90b19zdHJpbmcoKQp7CiAgICBjaGFyIGJ1ZltdID0gImhlbGxvIjsKICAgIGNoYXIqIHN0ciA9IGJ1ZjsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0ciwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihzdHIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCJBIiwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPignQScpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIgIiwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPignICcpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIxMjMiLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KDEyMykpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIjEuMjMiLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KDEuMjMpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIxLjExMTExMTExMSIsIGxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oMS4xMTExMTExMTEpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIxIiwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPih0cnVlKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCgiMCIsIGxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oZmFsc2UpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCJUZXN0IiwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPigiVGVzdCIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIgIiwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPigiICIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIiLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KCIiKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCgiVGVzdCIsIGxleGljYWxfY2FzdDxzdGQ6OnN0cmluZz4oc3RkOjpzdHJpbmcoIlRlc3QiKSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoIiAiLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0ZDo6c3RyaW5nKCIgIikpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKCIiLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHN0ZDo6c3RyaW5nKCIiKSkpOwp9Cgp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX3djaGFyX3RfYWxpYXMoKQp7CiAgICBCT09TVF9DSEVDS19FUVVBTCgxMjN1LCBsZXhpY2FsX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KCIxMjMiKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTCgxMjN1LCBsZXhpY2FsX2Nhc3Q8dW5zaWduZWQgaW50PigiMTIzIikpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoMTIzdSwgbGV4aWNhbF9jYXN0PHVuc2lnbmVkIGxvbmc+KCIxMjMiKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChzdGQ6OnN0cmluZygiMTIzIiksCiAgICAgICAgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oMTIzKSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoc3RkOjpzdHJpbmcoIjEyMyIpLCBsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KDEyM3UpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHN0ZDo6c3RyaW5nKCIxMjMiKSwgbGV4aWNhbF9jYXN0PHN0ZDo6c3RyaW5nPigxMjN1bCkpOwp9Cgp2b2lkIHRlc3RfY29udmVyc2lvbl90b19wb2ludGVyKCkKewogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGNoYXIgKj4oIlRlc3QiKSwgYmFkX2xleGljYWxfY2FzdCk7CiNpZm5kZWYgQk9PU1RfTENBU1RfTk9fV0NIQVJfVAogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PHdjaGFyX3QgKj4oIlRlc3QiKSwgYmFkX2xleGljYWxfY2FzdCk7CiNlbmRpZgp9Cgp2b2lkIHRlc3RfY29udmVyc2lvbl9mcm9tX3djaGFyX3QoKQp7CiNpZm5kZWYgQk9PU1RfTENBU1RfTk9fV0NIQVJfVAojaWYgIWRlZmluZWQoQk9PU1RfTk9fSU5UUklOU0lDX1dDSEFSX1QpCiAgICBCT09TVF9DSEVDS19FUVVBTCgxLCBsZXhpY2FsX2Nhc3Q8aW50PihMJzEnKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8aW50PihMJ0EnKSwgYmFkX2xleGljYWxfY2FzdCk7CiNlbmRpZgoKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEyMywgbGV4aWNhbF9jYXN0PGludD4oTCIxMjMiKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8aW50PihMIiIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxpbnQ+KEwiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKCiNpZiAhZGVmaW5lZChCT09TVF9OT19JTlRSSU5TSUNfV0NIQVJfVCkKICAgIEJPT1NUX0NIRUNLX0VRVUFMKDEuMCwgbGV4aWNhbF9jYXN0PGRvdWJsZT4oTCcxJykpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGRvdWJsZT4oTCdBJyksIGJhZF9sZXhpY2FsX2Nhc3QpOwojZW5kaWYKCiAgICBCT09TVF9DSEVDS19FUVVBTCgxLjIzLCBsZXhpY2FsX2Nhc3Q8ZG91YmxlPihMIjEuMjMiKSk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8ZG91YmxlPihMIiIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxkb3VibGU+KEwiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKCiNpZiAhZGVmaW5lZChCT09TVF9OT19JTlRSSU5TSUNfV0NIQVJfVCkKICAgIEJPT1NUX0NIRUNLX0VRVUFMKHRydWUsIGxleGljYWxfY2FzdDxib29sPihMJzEnKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChmYWxzZSwgbGV4aWNhbF9jYXN0PGJvb2w+KEwnMCcpKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxib29sPihMJ0EnKSwgYmFkX2xleGljYWxfY2FzdCk7CiNlbmRpZgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwodHJ1ZSwgbGV4aWNhbF9jYXN0PGJvb2w+KEwiMSIpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGZhbHNlLCBsZXhpY2FsX2Nhc3Q8Ym9vbD4oTCIwIikpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGJvb2w+KEwiIiksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGJvb2w+KEwiVGVzdCIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKI2VuZGlmCn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX3RvX3djaGFyX3QoKQp7CiNpZiAhZGVmaW5lZChCT09TVF9MQ0FTVF9OT19XQ0hBUl9UKSAmJiAhZGVmaW5lZChCT09TVF9OT19JTlRSSU5TSUNfV0NIQVJfVCkKICAgIEJPT1NUX0NIRUNLX0VRVUFMKEwnMScsIGxleGljYWxfY2FzdDx3Y2hhcl90PigxKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChMJzAnLCBsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4oMCkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcxJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KCcxJykpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcwJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KCcwJykpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PHdjaGFyX3Q+KDEyMyksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcxJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KDEuMCkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcwJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KDAuMCkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcxJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KHRydWUpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKEwnMCcsIGxleGljYWxfY2FzdDx3Y2hhcl90PihmYWxzZSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCdBJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KEwnQScpKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKEwnICcsIGxleGljYWxfY2FzdDx3Y2hhcl90PihMJyAnKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChMJ0EnLCBsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4oTCJBIikpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoTCcgJywgbGV4aWNhbF9jYXN0PHdjaGFyX3Q+KEwiICIpKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDx3Y2hhcl90PihMIiIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDx3Y2hhcl90PihMIlRlc3QiKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19FUVVBTChMJ0EnLCBsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4oc3RkOjp3c3RyaW5nKEwiQSIpKSk7CiAgICBCT09TVF9DSEVDS19FUVVBTChMJyAnLCBsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4oc3RkOjp3c3RyaW5nKEwiICIpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4oc3RkOjp3c3RyaW5nKEwiIikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDx3Y2hhcl90PihzdGQ6OndzdHJpbmcoTCJUZXN0IikpLCBiYWRfbGV4aWNhbF9jYXN0KTsKI2VuZGlmCn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fd3N0cmluZygpCnsKI2lmbmRlZiBCT09TVF9MQ0FTVF9OT19XQ0hBUl9UCiAgICBCT09TVF9DSEVDS19FUVVBTCgxMjMsIGxleGljYWxfY2FzdDxpbnQ+KHN0ZDo6d3N0cmluZyhMIjEyMyIpKSk7CiAgICBCT09TVF9DSEVDS19USFJPVygKICAgICAgICBsZXhpY2FsX2Nhc3Q8aW50PihzdGQ6OndzdHJpbmcoTCIiKSksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1coCiAgICAgICAgbGV4aWNhbF9jYXN0PGludD4oc3RkOjp3c3RyaW5nKEwiVGVzdCIpKSwgYmFkX2xleGljYWxfY2FzdCk7CgogICAgQk9PU1RfQ0hFQ0tfRVFVQUwodHJ1ZSwgbGV4aWNhbF9jYXN0PGJvb2w+KHN0ZDo6d3N0cmluZyhMIjEiKSkpOwogICAgQk9PU1RfQ0hFQ0tfRVFVQUwoZmFsc2UsIGxleGljYWxfY2FzdDxib29sPihzdGQ6OndzdHJpbmcoTCIwIikpKTsKICAgIEJPT1NUX0NIRUNLX1RIUk9XKAogICAgICAgIGxleGljYWxfY2FzdDxib29sPihzdGQ6OndzdHJpbmcoTCIiKSksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1coCiAgICAgICAgbGV4aWNhbF9jYXN0PGJvb2w+KHN0ZDo6d3N0cmluZyhMIlRlc3QiKSksIGJhZF9sZXhpY2FsX2Nhc3QpOwojZW5kaWYKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fdG9fd3N0cmluZygpCnsKI2lmbmRlZiBCT09TVF9MQ0FTVF9OT19XQ0hBUl9UCiAgICB3Y2hhcl90IGJ1ZltdID0gTCJoZWxsbyI7CiAgICB3Y2hhcl90KiBzdHIgPSBidWY7CiAgICBCT09TVF9DSEVDSyhzdHIgPT0gbGV4aWNhbF9jYXN0PHN0ZDo6d3N0cmluZz4oc3RyKSk7CiAgICBCT09TVF9DSEVDSyhMIjEyMyIgPT0gbGV4aWNhbF9jYXN0PHN0ZDo6d3N0cmluZz4oMTIzKSk7CiAgICBCT09TVF9DSEVDSyhMIjEuMjMiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KDEuMjMpKTsKICAgIEJPT1NUX0NIRUNLKEwiMS4xMTExMTExMTEiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KDEuMTExMTExMTExKSk7CiAgICBCT09TVF9DSEVDSyhMIjEiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KHRydWUpKTsKICAgIEJPT1NUX0NIRUNLKEwiMCIgPT0gbGV4aWNhbF9jYXN0PHN0ZDo6d3N0cmluZz4oZmFsc2UpKTsKI2lmICFkZWZpbmVkKEJPT1NUX05PX0lOVFJJTlNJQ19XQ0hBUl9UKQogICAgQk9PU1RfQ0hFQ0soTCJBIiA9PSBsZXhpY2FsX2Nhc3Q8c3RkOjp3c3RyaW5nPihMJ0EnKSk7CiAgICBCT09TVF9DSEVDSyhMIiAiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KEwnICcpKTsKICAgIEJPT1NUX0NIRUNLKEwiQSIgPT0gbGV4aWNhbF9jYXN0PHN0ZDo6d3N0cmluZz4oJ0EnKSk7CiNlbmRpZgogICAgQk9PU1RfQ0hFQ0soTCJUZXN0IiA9PSBsZXhpY2FsX2Nhc3Q8c3RkOjp3c3RyaW5nPihMIlRlc3QiKSk7CiAgICBCT09TVF9DSEVDSyhMIiAiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KEwiICIpKTsKICAgIEJPT1NUX0NIRUNLKEwiIiA9PSBsZXhpY2FsX2Nhc3Q8c3RkOjp3c3RyaW5nPihMIiIpKTsKICAgIEJPT1NUX0NIRUNLKEwiVGVzdCIgPT0gbGV4aWNhbF9jYXN0PHN0ZDo6d3N0cmluZz4oc3RkOjp3c3RyaW5nKEwiVGVzdCIpKSk7CiAgICBCT09TVF9DSEVDSyhMIiAiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KHN0ZDo6d3N0cmluZyhMIiAiKSkpOwogICAgQk9PU1RfQ0hFQ0soTCIiID09IGxleGljYWxfY2FzdDxzdGQ6OndzdHJpbmc+KHN0ZDo6d3N0cmluZyhMIiIpKSk7CiNlbmRpZgp9Cgp2b2lkIHRlc3RfYmFkX2xleGljYWxfY2FzdCgpCnsKICAgIHRyeQogICAgewogICAgICAgIGxleGljYWxfY2FzdDxpbnQ+KHN0ZDo6c3RyaW5nKCJUZXN0IikpOwoKICAgICAgICBCT09TVF9DSEVDSyhmYWxzZSk7IC8vIEV4Y2VwdGlvbiBleHBlY3RlZAogICAgfQogICAgY2F0Y2goY29uc3QgYmFkX2xleGljYWxfY2FzdCAmZSkKICAgIHsKICAgICAgICBCT09TVF9DSEVDSyhlLnNvdXJjZV90eXBlKCkgPT0gdHlwZWlkKHN0ZDo6c3RyaW5nKSk7CiAgICAgICAgQk9PU1RfQ0hFQ0soZS50YXJnZXRfdHlwZSgpID09IHR5cGVpZChpbnQpKTsKICAgIH0KfQoKdm9pZCB0ZXN0X25vX3doaXRlc3BhY2Vfc3RyaXBwaW5nKCkKewogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PGludD4oIiAxMjMiKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICBCT09TVF9DSEVDS19USFJPVyhsZXhpY2FsX2Nhc3Q8aW50PigiMTIzICIpLCBiYWRfbGV4aWNhbF9jYXN0KTsKfQoKLy8gUmVwbGFjZSAiLSw5OTkiIHdpdGggIi05OTkiLgp0ZW1wbGF0ZTxjbGFzcyBDaGFyVD4Kc3RkOjpiYXNpY19zdHJpbmc8Q2hhclQ+IHRvX3N0cl9nY2Nfd29ya2Fyb3VuZChzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVD4gc3RyKQp7CiAgICBzdGQ6OmxvY2FsZSBsb2M7CiAgICBzdGQ6Om51bXB1bmN0PENoYXJUPiBjb25zdCYgbnAgPSBCT09TVF9VU0VfRkFDRVQoc3RkOjpudW1wdW5jdDxDaGFyVD4sIGxvYyk7CiAgICBzdGQ6OmN0eXBlPENoYXJUPiBjb25zdCYgY3QgPSBCT09TVF9VU0VfRkFDRVQoc3RkOjpjdHlwZTxDaGFyVD4sIGxvYyk7CgogICAgaWYobnAuZ3JvdXBpbmcoKS5lbXB0eSgpKQogICAgICAgIHJldHVybiBzdHI7CgogICAgQ2hhclQgcHJlZml4WzNdID0geyBjdC53aWRlbignLScpLCBucC50aG91c2FuZHNfc2VwKCksIENoYXJUKCkgfTsKCiAgICBpZihzdHIuZmluZChwcmVmaXgpICE9IDApCiAgICAgICAgcmV0dXJuIHN0cjsKCiAgICBwcmVmaXhbMV0gPSBDaGFyVCgpOwogICAgc3RyLnJlcGxhY2UoMCwgMiwgcHJlZml4KTsKICAgIHJldHVybiBzdHI7Cn0KCnRlbXBsYXRlPGNsYXNzIENoYXJULCBjbGFzcyBUPgpzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVD4gdG9fc3RyKFQgdCkKewogICAgc3RkOjpiYXNpY19vc3RyaW5nc3RyZWFtPENoYXJUPiBvOwogICAgbyA8PCB0OwogICAgcmV0dXJuIHRvX3N0cl9nY2Nfd29ya2Fyb3VuZChvLnN0cigpKTsKfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQ2hhclQ+CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21faW50ZWdyYWxfdG9fY2hhcihDaGFyVCB6ZXJvKQp7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDApKSA9PSB6ZXJvICsgMCk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDEpKSA9PSB6ZXJvICsgMSk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDIpKSA9PSB6ZXJvICsgMik7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDMpKSA9PSB6ZXJvICsgMyk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDQpKSA9PSB6ZXJvICsgNCk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDUpKSA9PSB6ZXJvICsgNSk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDYpKSA9PSB6ZXJvICsgNik7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDcpKSA9PSB6ZXJvICsgNyk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDgpKSA9PSB6ZXJvICsgOCk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8Q2hhclQ+KHN0YXRpY19jYXN0PFQ+KDkpKSA9PSB6ZXJvICsgOSk7CgogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PENoYXJUPihzdGF0aWNfY2FzdDxUPigxMCkpLCBiYWRfbGV4aWNhbF9jYXN0KTsKCiAgICBUIHQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KSgpOwogICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PENoYXJUPih0KSwgYmFkX2xleGljYWxfY2FzdCk7Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21faW50ZWdyYWxfdG9faW50ZWdyYWwoKQp7CiAgICBUIHQgPSAwOwogICAgQk9PU1RfQ0hFQ0sobGV4aWNhbF9jYXN0PFQ+KHQpID09IHQpOwoKICAgIC8vIE5leHQgdHdvIHZhcmlhYmxlcyBhcmUgdXNlZCB0byBzdXByZXNzIHdhcm5pbmdzLgogICAgaW50IHN0ID0gMzI3Njc7IHVuc2lnbmVkIGludCB1dCA9IHN0OwogICAgdCA9IHN0OwogICAgQk9PU1RfQ0hFQ0sobGV4aWNhbF9jYXN0PHNob3J0Pih0KSA9PSBzdCk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KHQpID09IHV0KTsKICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxpbnQ+KHQpID09IHN0KTsKICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDx1bnNpZ25lZCBpbnQ+KHQpID09IHV0KTsKICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxsb25nPih0KSA9PSBzdCk7CiAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8dW5zaWduZWQgbG9uZz4odCkgPT0gdXQpOwoKICAgIHQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KSgpOwogICAgQk9PU1RfQ0hFQ0sobGV4aWNhbF9jYXN0PFQ+KHQpID09IHQpOwoKICAgIHQgPSAoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKSgpOwogICAgQk9PU1RfQ0hFQ0sobGV4aWNhbF9jYXN0PFQ+KHQpID09IHQpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBDaGFyVD4Kdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV9pbnRlZ3JhbF90b19zdHJpbmcoQ2hhclQpCnsKICAgIHR5cGVkZWYgc3RkOjpudW1lcmljX2xpbWl0czxUPiBsaW1pdHM7CiAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPENoYXJUPiBzdHJpbmdfdHlwZTsKCiAgICBUIHQ7CgogICAgdCA9IChsaW1pdHM6Om1pbikoKTsKICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxzdHJpbmdfdHlwZT4odCkgPT0gdG9fc3RyPENoYXJUPih0KSk7CgogICAgdCA9IChsaW1pdHM6Om1heCkoKTsKICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxzdHJpbmdfdHlwZT4odCkgPT0gdG9fc3RyPENoYXJUPih0KSk7CgogICAgaWYobGltaXRzOjpkaWdpdHMgPD0gMTYgJiYgbGNhc3RfdGVzdF9zbWFsbF9pbnRlZ3JhbF90eXBlc19jb21wbGV0ZWx5KQogICAgICAgIC8vIG1pbiBhbmQgbWF4IGhhdmUgYWxyZWFkeSBiZWVuIHRlc3RlZC4KICAgICAgICBmb3IodCA9IDEgKyAobGltaXRzOjptaW4pKCk7IHQgIT0gKGxpbWl0czo6bWF4KSgpOyArK3QpCiAgICAgICAgICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxzdHJpbmdfdHlwZT4odCkgPT0gdG9fc3RyPENoYXJUPih0KSk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgVCBjb25zdCBtaW5fdmFsID0gKGxpbWl0czo6bWluKSgpOwogICAgICAgIFQgY29uc3QgbWF4X3ZhbCA9IChsaW1pdHM6Om1heCkoKTsKICAgICAgICBUIGNvbnN0IGhhbGZfbWF4X3ZhbCA9IG1heF92YWwgLyAyOwogICAgICAgIFQgY29uc3QgY250ID0gbGNhc3RfaW50ZWdyYWxfdGVzdF9jb3VudGVyOyAvLyB0byBzdXByZXNzIHdhcm5pbmdzCiAgICAgICAgdW5zaWduZWQgaW50IGNvbnN0IGNvdW50ZXIgPSBjbnQgPCBoYWxmX21heF92YWwgPyBjbnQgOiBoYWxmX21heF92YWw7CgogICAgICAgIHVuc2lnbmVkIGludCBpOwoKICAgICAgICAvLyBUZXN0IHZhbHVlcyBhcm91bmQgbWluOgogICAgICAgIHQgPSBtaW5fdmFsOwogICAgICAgIGZvcihpID0gMDsgaSA8IGNvdW50ZXI7ICsraSwgKyt0KQogICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8c3RyaW5nX3R5cGU+KHQpID09IHRvX3N0cjxDaGFyVD4odCkpOwoKICAgICAgICAvLyBUZXN0IHZhbHVlcyBhcm91bmQgbWF4OgogICAgICAgIHQgPSBtYXhfdmFsOwogICAgICAgIGZvcihpID0gMDsgaSA8IGNvdW50ZXI7ICsraSwgLS10KQogICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8c3RyaW5nX3R5cGU+KHQpID09IHRvX3N0cjxDaGFyVD4odCkpOwoKICAgICAgICAvLyBUZXN0IHZhbHVlcyBhcm91bmQgemVybzoKICAgICAgICBpZihsaW1pdHM6OmlzX3NpZ25lZCkKICAgICAgICAgICAgZm9yKHQgPSAtY291bnRlcjsgdCA8IHN0YXRpY19jYXN0PFQ+KGNvdW50ZXIpOyArK3QpCiAgICAgICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8c3RyaW5nX3R5cGU+KHQpID09IHRvX3N0cjxDaGFyVD4odCkpOwoKICAgICAgICAvLyBUZXN0IHZhbHVlcyBhcm91bmQgMTAwLCAxMDAwLCAxMDAwMCwgLi4uCiAgICAgICAgVCB0ZW5fcG93ZXIgPSAxMDA7CiAgICAgICAgZm9yKGludCBlID0gMjsgZSA8PSBsaW1pdHM6OmRpZ2l0czEwOyArK2UsIHRlbl9wb3dlciAqPSAxMCkKICAgICAgICB7CiAgICAgICAgICAgIC8vIHRlbl9wb3dlciArIDEwMCBwcm9iYWJseSBuZXZlciBvdmVyZmxvd3MKICAgICAgICAgICAgZm9yKHQgPSB0ZW5fcG93ZXIgLSAxMDA7IHQgIT0gdGVuX3Bvd2VyICsgMTAwOyArK3QpCiAgICAgICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8c3RyaW5nX3R5cGU+KHQpID09IHRvX3N0cjxDaGFyVD4odCkpOwogICAgICAgIH0KICAgIH0KfQoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQ2hhclQ+CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fc3RyaW5nX3RvX2ludGVncmFsKENoYXJUKQp7CiAgICB0eXBlZGVmIHN0ZDo6bnVtZXJpY19saW1pdHM8VD4gbGltaXRzOwogICAgdHlwZWRlZiBzdGQ6OmJhc2ljX3N0cmluZzxDaGFyVD4gc3RyaW5nX3R5cGU7CgogICAgc3RyaW5nX3R5cGUgczsKICAgIHN0cmluZ190eXBlIGNvbnN0IHplcm8gPSB0b19zdHI8Q2hhclQ+KDApOwogICAgc3RyaW5nX3R5cGUgY29uc3QgbmluZSA9IHRvX3N0cjxDaGFyVD4oOSk7CiAgICBUIGNvbnN0IG1pbl92YWwgPSAobGltaXRzOjptaW4pKCk7CiAgICBUIGNvbnN0IG1heF92YWwgPSAobGltaXRzOjptYXgpKCk7CgogICAgcyA9IHRvX3N0cjxDaGFyVD4obWluX3ZhbCk7CiAgICBCT09TVF9DSEVDS19FUVVBTChsZXhpY2FsX2Nhc3Q8VD4ocyksIG1pbl92YWwpOwogICAgaWYobGltaXRzOjppc19zaWduZWQpCiAgICB7CiNpZiBkZWZpbmVkKEJPT1NUX01TVkMpICYmIEJPT1NUX01TVkMgPT0gMTQwMAogICAgICAgIC8vIFZDKysgOC4wIGJ1Zywgc2VlIGxpYnMvY29udmVyc2lvbi90ZXN0L2xleGljYWxfY2FzdF92YzhfYnVnX3Rlc3QuY3BwCiAgICAgICAgaWYoc2l6ZW9mKFQpIDwgc2l6ZW9mKGJvb3N0OjppbnRtYXhfdCkpCiNlbmRpZgogICAgICAgIHsKICAgICAgICAgICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PFQ+KHMgKyB6ZXJvKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICAgICAgICAgIEJPT1NUX0NIRUNLX1RIUk9XKGxleGljYWxfY2FzdDxUPihzICsgbmluZSksIGJhZF9sZXhpY2FsX2Nhc3QpOwogICAgICAgIH0KICAgIH0KCiAgICBzID0gdG9fc3RyPENoYXJUPihtYXhfdmFsKTsKICAgIEJPT1NUX0NIRUNLX0VRVUFMKGxleGljYWxfY2FzdDxUPihzKSwgbWF4X3ZhbCk7CiNpZiBkZWZpbmVkKEJPT1NUX01TVkMpICYmIEJPT1NUX01TVkMgPT0gMTQwMAogICAgLy8gVkMrKyA4LjAgYnVnLCBzZWUgbGlicy9jb252ZXJzaW9uL3Rlc3QvbGV4aWNhbF9jYXN0X3ZjOF9idWdfdGVzdC5jcHAKICAgIGlmKHNpemVvZihUKSAhPSBzaXplb2YoYm9vc3Q6OmludG1heF90KSkKI2VuZGlmCiAgICB7CiAgICAgICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PFQ+KHMgKyB6ZXJvKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICAgICAgQk9PU1RfQ0hFQ0tfVEhST1cobGV4aWNhbF9jYXN0PFQ+KHMgKyBuaW5lKSwgYmFkX2xleGljYWxfY2FzdCk7CiAgICB9CgogICAgaWYobGltaXRzOjpkaWdpdHMgPD0gMTYgJiYgbGNhc3RfdGVzdF9zbWFsbF9pbnRlZ3JhbF90eXBlc19jb21wbGV0ZWx5KQogICAgICAgIC8vIG1pbiBhbmQgbWF4IGhhdmUgYWxyZWFkeSBiZWVuIHRlc3RlZC4KICAgICAgICBmb3IoVCB0ID0gMSArIG1pbl92YWw7IHQgIT0gbWF4X3ZhbDsgKyt0KQogICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8VD4odG9fc3RyPENoYXJUPih0KSkgPT0gdCk7CiAgICBlbHNlCiAgICB7CiAgICAgICAgVCBjb25zdCBoYWxmX21heF92YWwgPSBtYXhfdmFsIC8gMjsKICAgICAgICBUIGNvbnN0IGNudCA9IGxjYXN0X2ludGVncmFsX3Rlc3RfY291bnRlcjsgLy8gdG8gc3VwcmVzcyB3YXJuaW5ncwogICAgICAgIHVuc2lnbmVkIGludCBjb25zdCBjb3VudGVyID0gY250IDwgaGFsZl9tYXhfdmFsID8gY250IDogaGFsZl9tYXhfdmFsOwoKICAgICAgICBUIHQ7CiAgICAgICAgdW5zaWduZWQgaW50IGk7CgogICAgICAgIC8vIFRlc3QgdmFsdWVzIGFyb3VuZCBtaW46CiAgICAgICAgdCA9IG1pbl92YWw7CiAgICAgICAgZm9yKGkgPSAwOyBpIDwgY291bnRlcjsgKytpLCArK3QpCiAgICAgICAgICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxUPih0b19zdHI8Q2hhclQ+KHQpKSA9PSB0KTsKCiAgICAgICAgLy8gVGVzdCB2YWx1ZXMgYXJvdW5kIG1heDoKICAgICAgICB0ID0gbWF4X3ZhbDsKICAgICAgICBmb3IoaSA9IDA7IGkgPCBjb3VudGVyOyArK2ksIC0tdCkKICAgICAgICAgICAgQk9PU1RfQ0hFQ0sobGV4aWNhbF9jYXN0PFQ+KHRvX3N0cjxDaGFyVD4odCkpID09IHQpOwoKICAgICAgICAvLyBUZXN0IHZhbHVlcyBhcm91bmQgemVybzoKICAgICAgICBpZihsaW1pdHM6OmlzX3NpZ25lZCkKICAgICAgICAgICAgZm9yKHQgPSAtY291bnRlcjsgdCA8IHN0YXRpY19jYXN0PFQ+KGNvdW50ZXIpOyArK3QpCiAgICAgICAgICAgICAgICBCT09TVF9DSEVDSyhsZXhpY2FsX2Nhc3Q8VD4odG9fc3RyPENoYXJUPih0KSkgPT0gdCk7CgogICAgICAgIC8vIFRlc3QgdmFsdWVzIGFyb3VuZCAxMDAsIDEwMDAsIDEwMDAwLCAuLi4KICAgICAgICBUIHRlbl9wb3dlciA9IDEwMDsKICAgICAgICBmb3IoaW50IGUgPSAyOyBlIDw9IGxpbWl0czo6ZGlnaXRzMTA7ICsrZSwgdGVuX3Bvd2VyICo9IDEwKQogICAgICAgIHsKICAgICAgICAgICAgLy8gdGVuX3Bvd2VyICsgMTAwIHByb2JhYmx5IG5ldmVyIG92ZXJmbG93cwogICAgICAgICAgICBmb3IodCA9IHRlbl9wb3dlciAtIDEwMDsgdCAhPSB0ZW5fcG93ZXIgKyAxMDA7ICsrdCkKICAgICAgICAgICAgICAgIEJPT1NUX0NIRUNLKGxleGljYWxfY2FzdDxUPih0b19zdHI8Q2hhclQ+KHQpKSA9PSB0KTsKICAgICAgICB9CiAgICB9Cn0KCnRlbXBsYXRlPGNsYXNzIFQ+CnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50ZWdyYWxfZm9yX2xvY2FsZSgpCnsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX2ludGVncmFsX3RvX2ludGVncmFsPFQ+KCk7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV9pbnRlZ3JhbF90b19zdHJpbmc8VD4oJzAnKTsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3N0cmluZ190b19pbnRlZ3JhbDxUPignMCcpOwojaWYgIWRlZmluZWQoQk9PU1RfTENBU1RfTk9fV0NIQVJfVCkKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX2ludGVncmFsX3RvX3N0cmluZzxUPihMJzAnKTsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3N0cmluZ190b19pbnRlZ3JhbDxUPihMJzAnKTsKI2VuZGlmCn0KCnN0cnVjdCByZXN0b3JlX29sZGxvYwp7CiAgICBzdGQ6OmxvY2FsZSBvbGRsb2M7CiAgICB+cmVzdG9yZV9vbGRsb2MoKSB7IHN0ZDo6bG9jYWxlOjpnbG9iYWwob2xkbG9jKTsgfQp9OwoKdGVtcGxhdGU8Y2xhc3MgVD4Kdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbCgpCnsKICAgIGNoYXIgY29uc3QgemVybyA9ICcwJzsKICAgIHNpZ25lZCBjaGFyIGNvbnN0IHN6ZXJvID0gJzAnOwogICAgdW5zaWduZWQgY2hhciBjb25zdCB1emVybyA9ICcwJzsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX2ludGVncmFsX3RvX2NoYXI8VD4oemVybyk7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV9pbnRlZ3JhbF90b19jaGFyPFQ+KHN6ZXJvKTsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX2ludGVncmFsX3RvX2NoYXI8VD4odXplcm8pOwojaWYgIWRlZmluZWQoQk9PU1RfTENBU1RfTk9fV0NIQVJfVCkgJiYgIWRlZmluZWQoQk9PU1RfTk9fSU5UUklOU0lDX1dDSEFSX1QpCiAgICB3Y2hhcl90IGNvbnN0IHd6ZXJvID0gTCcwJzsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX2ludGVncmFsX3RvX2NoYXI8VD4od3plcm8pOwojZW5kaWYKCiAgICAvLyB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbF9mb3JfbG9jYWxlCgogICAgdHlwZWRlZiBzdGQ6Om51bXB1bmN0PGNoYXI+IG51bXB1bmN0OwoKICAgIHJlc3RvcmVfb2xkbG9jIGd1YXJkOwogICAgc3RkOjpsb2NhbGUgY29uc3QmIG9sZGxvYyA9IGd1YXJkLm9sZGxvYzsKCiAgICBzdGQ6OnN0cmluZyBncm91cGluZzEgPSBCT09TVF9VU0VfRkFDRVQobnVtcHVuY3QsIG9sZGxvYykuZ3JvdXBpbmcoKTsKICAgIHN0ZDo6c3RyaW5nIGdyb3VwaW5nMihncm91cGluZzEpOwoKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludGVncmFsX2Zvcl9sb2NhbGU8VD4oKTsKCiAgICB0cnkKICAgIHsKICAgICAgICBzdGQ6OmxvY2FsZSBuZXdsb2MoIiIpOwogICAgICAgIHN0ZDo6bG9jYWxlOjpnbG9iYWwobmV3bG9jKTsKCiAgICAgICAgZ3JvdXBpbmcyID0gQk9PU1RfVVNFX0ZBQ0VUKG51bXB1bmN0LCBuZXdsb2MpLmdyb3VwaW5nKCk7CiAgICB9CiAgICBjYXRjaChzdGQ6OmV4Y2VwdGlvbiBjb25zdCYgZXgpCiAgICB7CiAgICAgICAgc3RkOjpzdHJpbmcgbXNnKCJGYWlsZWQgdG8gc2V0IHN5c3RlbSBsb2NhbGU6ICIpOwogICAgICAgIG1zZyArPSBleC53aGF0KCk7CiAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKG1zZyk7CiAgICB9CgogICAgaWYoZ3JvdXBpbmcxICE9IGdyb3VwaW5nMikKICAgICAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbF9mb3JfbG9jYWxlPFQ+KCk7CgogICAgaWYoZ3JvdXBpbmcxLmVtcHR5KCkgJiYgZ3JvdXBpbmcyLmVtcHR5KCkpCiAgICAgICAgQk9PU1RfVEVTVF9NRVNTQUdFKCJGb3JtYXR0aW5nIHdpdGggdGhvdXNhbmRzX3NlcCBoYXMgbm90IGJlZW4gdGVzdGVkIik7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fc2hvcnQoKQp7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbDxzaG9ydD4oKTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b191c2hvcnQoKQp7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbDx1bnNpZ25lZCBzaG9ydD4oKTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnQoKQp7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbDxpbnQ+KCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWludCgpCnsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludGVncmFsPHVuc2lnbmVkIGludD4oKTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19sb25nKCkKewogICAgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50ZWdyYWw8bG9uZz4oKTsKfQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b191bG9uZygpCnsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludGVncmFsPHVuc2lnbmVkIGxvbmc+KCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50bWF4X3QoKQp7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbDxib29zdDo6aW50bWF4X3Q+KCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWludG1heF90KCkKewogICAgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50ZWdyYWw8Ym9vc3Q6OnVpbnRtYXhfdD4oKTsKfQoKI2lmIGRlZmluZWQoQk9PU1RfSEFTX0xPTkdfTE9ORykKCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fbG9uZ2xvbmcoKQp7CiAgICB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19pbnRlZ3JhbDxib29zdDo6bG9uZ19sb25nX3R5cGU+KCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWxvbmdsb25nKCkKewogICAgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50ZWdyYWw8Ym9vc3Q6OnVsb25nX2xvbmdfdHlwZT4oKTsKfQoKI2VsaWYgZGVmaW5lZChMQ0FTVF9URVNUX0xPTkdMT05HKQoKdm9pZCB0ZXN0X2NvbnZlcnNpb25fZnJvbV90b19sb25nbG9uZygpCnsKICAgIHRlc3RfY29udmVyc2lvbl9mcm9tX3RvX2ludGVncmFsPF9faW50NjQ+KCk7Cn0KCnZvaWQgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9fdWxvbmdsb25nKCkKewogICAgdGVzdF9jb252ZXJzaW9uX2Zyb21fdG9faW50ZWdyYWw8dW5zaWduZWQgX19pbnQ2ND4oKTsKfQoKI2VuZGlmCgojaWZuZGVmIEJPT1NUX05PX1RFTVBMQVRFX1BBUlRJQUxfU1BFQ0lBTElaQVRJT04Kdm9pZCB0ZXN0X3RyYWl0cygpCnsKICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8Y2hhciwgbXlfdHJhaXRzPGNoYXI+ID4gbXlfc3RyaW5nOwoKICAgIG15X3N0cmluZyBjb25zdCBzKCJzIik7CiAgICBCT09TVF9DSEVDSyhib29zdDo6bGV4aWNhbF9jYXN0PGNoYXI+KHMpID09IHNbMF0pOwogICAgQk9PU1RfQ0hFQ0soYm9vc3Q6OmxleGljYWxfY2FzdDxteV9zdHJpbmc+KHMpID09IHMpOwogICAgQk9PU1RfQ0hFQ0soYm9vc3Q6OmxleGljYWxfY2FzdDxteV9zdHJpbmc+KC0xKSA9PSAiLTEiKTsKfQoKdm9pZCB0ZXN0X3d0cmFpdHMoKQp7CiAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPHdjaGFyX3QsIG15X3RyYWl0czx3Y2hhcl90PiA+IG15X3N0cmluZzsKCiAgICBteV9zdHJpbmcgY29uc3QgcyhMInMiKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8d2NoYXJfdD4ocykgPT0gc1swXSk7CiAgICBCT09TVF9DSEVDSyhib29zdDo6bGV4aWNhbF9jYXN0PG15X3N0cmluZz4ocykgPT0gcyk7CiAgICAvL0JPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPigtMSkgPT0gTCItMSIpOwogICAgLy8gQ29tbWVudGVkIG91dCBiZWNhdXNlIGdjYyAzLjMgZG9lc24ndCBzdXBwb3J0IHRoaXM6CiAgICAvLyBiYXNpY19vc3RyZWFtPHdjaGFyX3QsIG15X3RyYWl0czx3Y2hhcl90PiA+IG87IG8gPDwgLTE7Cn0KCnZvaWQgdGVzdF9hbGxvY2F0b3IoKQp7CiAgICB0eXBlZGVmIHN0ZDo6YmFzaWNfc3RyaW5nPCBjaGFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBteV9hbGxvY2F0b3I8Y2hhcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+IG15X3N0cmluZzsKCiAgICBteV9zdHJpbmcgcygicyIpOwogICAgQk9PU1RfQ0hFQ0soYm9vc3Q6OmxleGljYWxfY2FzdDxjaGFyPihzKSA9PSBzWzBdKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjpzdHJpbmc+KHMpID09ICJzIik7CiAgICBCT09TVF9DSEVDSyhib29zdDo6bGV4aWNhbF9jYXN0PG15X3N0cmluZz4ocykgPT0gcyk7CiAgICBCT09TVF9DSEVDSyhib29zdDo6bGV4aWNhbF9jYXN0PG15X3N0cmluZz4oMSkgPT0gIjEiKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPigicyIpID09IHMpOwogICAgQk9PU1RfQ0hFQ0soYm9vc3Q6OmxleGljYWxfY2FzdDxteV9zdHJpbmc+KHN0ZDo6c3RyaW5nKCJzIikpID09IHMpOwp9Cgp2b2lkIHRlc3Rfd2FsbG9jYXRvcigpCnsKICAgIHR5cGVkZWYgc3RkOjpiYXNpY19zdHJpbmc8IHdjaGFyX3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHN0ZDo6Y2hhcl90cmFpdHM8d2NoYXJfdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIG15X2FsbG9jYXRvcjx3Y2hhcl90PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgID4gbXlfc3RyaW5nOwoKICAgIG15X3N0cmluZyBzKEwicyIpOwogICAgQk9PU1RfQ0hFQ0soYm9vc3Q6OmxleGljYWxfY2FzdDx3Y2hhcl90PihzKSA9PSBzWzBdKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8c3RkOjp3c3RyaW5nPihzKSA9PSBMInMiKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPihzKSA9PSBzKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPigxKSA9PSBMIjEiKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPihMInMiKSA9PSBzKTsKICAgIEJPT1NUX0NIRUNLKGJvb3N0OjpsZXhpY2FsX2Nhc3Q8bXlfc3RyaW5nPihzdGQ6OndzdHJpbmcoTCJzIikpID09IHMpOwp9CgojZW5kaWYKCg==