I2luY2x1ZGUgImxvY2FsZV90ZXN0LmgiCgojaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9VU0VfTk9fSU9TVFJFQU1TKQojICBpbmNsdWRlIDxsb2NhbGU+CiMgIGluY2x1ZGUgPHN0ZGV4Y2VwdD4KIyAgaW5jbHVkZSA8YWxnb3JpdGhtPgojICBpbmNsdWRlIDx2ZWN0b3I+CgojICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgZGVmaW5lZChfU1RMUF9VU0VfTkFNRVNQQUNFUykKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIyAgZW5kaWYKCi8vCi8vIHRlc3RzIGltcGxlbWVudGF0aW9uCi8vCnZvaWQgTG9jYWxlVGVzdDo6Y29sbGF0ZV9mYWNldCgpCnsKICB7CiAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2NhbGU6OmNsYXNzaWMoKSkgKTsKICAgIGNvbGxhdGU8Y2hhcj4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jYWxlOjpjbGFzc2ljKCkpOwoKICAgIGNoYXIgY29uc3Qgc3RyMVtdID0gImFiY2RlZjEiOwogICAgY2hhciBjb25zdCBzdHIyW10gPSAiYWJjZGVmMiI7CiAgICBjb25zdCBzaXplX3Qgc2l6ZTEgPSBzaXplb2Yoc3RyMSkgLyBzaXplb2Yoc3RyMVswXSkgLSAxOwogICAgY29uc3Qgc2l6ZV90IHNpemUyID0gc2l6ZW9mKHN0cjIpIC8gc2l6ZW9mKHN0cjJbMF0pIC0gMTsKCiAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMSwgc3RyMiwgc3RyMiArIHNpemUyIC0gMSkgPT0gMCApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSwgc3RyMiwgc3RyMiArIHNpemUyKSA9PSAtMSApOwoKICAgIC8vU21hbGxlc3Qgc3RyaW5nIHNob3VsZCBiZSBiZWZvcmUgbGFyZ2VzdCBvbmU6CiAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMiwgc3RyMiwgc3RyMiArIHNpemUyIC0gMSkgPT0gLTEgKTsKICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAyKSA9PSAxICk7CiAgfQoKIyAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8IGRlZmluZWQgKF9TVExQX1VTRV9FWENFUFRJT05TKQogIHRyeSB7CiAgICBsb2NhbGUgbG9jKCJmcl9GUiIpOwogICAgewogICAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpICk7CiAgICAgIGNvbGxhdGU8Y2hhcj4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jKTsKCiAgICAgIGNoYXIgY29uc3Qgc3RyMVtdID0gImFiY2RlZjEiOwogICAgICBjaGFyIGNvbnN0IHN0cjJbXSA9ICJhYmNkZWYyIjsKICAgICAgY29uc3Qgc2l6ZV90IHNpemUxID0gc2l6ZW9mKHN0cjEpIC8gc2l6ZW9mKHN0cjFbMF0pIC0gMTsKICAgICAgY29uc3Qgc2l6ZV90IHNpemUyID0gc2l6ZW9mKHN0cjIpIC8gc2l6ZW9mKHN0cjJbMF0pIC0gMTsKCiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PSAwICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEsIHN0cjIsIHN0cjIgKyBzaXplMikgPT0gLTEgKTsKCiAgICAgIC8vU21hbGxlc3Qgc3RyaW5nIHNob3VsZCBiZSBiZWZvcmUgbGFyZ2VzdCBvbmU6CiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAyLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PSAtMSApOwogICAgICBDUFBVTklUX0FTU0VSVCggY29sLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMSwgc3RyMiwgc3RyMiArIHNpemUyIC0gMikgPT0gMSApOwogICAgfQogICAgewogICAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpICk7CiAgICAgIGNvbGxhdGU8Y2hhcj4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPGNoYXI+ID4obG9jKTsKCiAgICAgIHN0cmluZyBzdHJzW10gPSB7ImFiZGQiLCAiYWLnZCIsICJhYmJkIiwgImFiY2QifTsKCiAgICAgIHN0cmluZyB0cmFuc2Zvcm1lZFs0XTsKICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICB0cmFuc2Zvcm1lZFtpXSA9IGNvbC50cmFuc2Zvcm0oc3Ryc1tpXS5kYXRhKCksIHN0cnNbaV0uZGF0YSgpICsgc3Ryc1tpXS5zaXplKCkpOwogICAgICB9CgogICAgICBzb3J0KHN0cnMsIHN0cnMgKyA0LCBsb2MpOwogICAgICBDUFBVTklUX0FTU0VSVCggc3Ryc1swXSA9PSAiYWJiZCIgKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMV0gPT0gImFiY2QiICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJzWzJdID09ICJhYudkIiApOwogICAgICBDUFBVTklUX0FTU0VSVCggc3Ryc1szXSA9PSAiYWJkZCIgKTsKCiAgICAgIHNvcnQodHJhbnNmb3JtZWQsIHRyYW5zZm9ybWVkICsgNCk7CgogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzBdLmRhdGEoKSwgc3Ryc1swXS5kYXRhKCkgKyBzdHJzWzBdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbMF0gKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1sxXS5kYXRhKCksIHN0cnNbMV0uZGF0YSgpICsgc3Ryc1sxXS5zaXplKCkpID09IHRyYW5zZm9ybWVkWzFdICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbMl0uZGF0YSgpLCBzdHJzWzJdLmRhdGEoKSArIHN0cnNbMl0uc2l6ZSgpKSA9PSB0cmFuc2Zvcm1lZFsyXSApOwogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzNdLmRhdGEoKSwgc3Ryc1szXS5kYXRhKCkgKyBzdHJzWzNdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbM10gKTsKCiAgICAgIC8vIENoZWNrIGVtcHR5IHN0cmluZyByZXN1bHQgaW4gZW1wdHkga2V5LgogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzBdLmRhdGEoKSwgc3Ryc1swXS5kYXRhKCkpLmVtcHR5KCkgKTsKCiAgICAgIC8vIENoZWNrIHRoYXQgb25seSBjaGFyYWN0ZXJzIHRoYXQgbWF0dGVyIGFyZSB0YWtlbiBpbnRvIGFjY291dCB0byBidWlsZCB0aGUga2V5LgogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzBdLmRhdGEoKSwgc3Ryc1swXS5kYXRhKCkgKyAyKSA9PSBjb2wudHJhbnNmb3JtKHN0cnNbMV0uZGF0YSgpLCBzdHJzWzFdLmRhdGEoKSArIDIpICk7CiAgICB9CiMgICAgaWYgIWRlZmluZWQgKFNUTFBPUlQpIHx8ICFkZWZpbmVkIChfU1RMUF9OT19XQ0hBUl9UKQogICAgewogICAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihsb2MpICk7CiAgICAgIGNvbGxhdGU8d2NoYXJfdD4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4obG9jKTsKCiAgICAgIHdjaGFyX3QgY29uc3Qgc3RyMVtdID0gTCJhYmNkZWYxIjsKICAgICAgd2NoYXJfdCBjb25zdCBzdHIyW10gPSBMImFiY2RlZjIiOwogICAgICBjb25zdCBzaXplX3Qgc2l6ZTEgPSBzaXplb2Yoc3RyMSkgLyBzaXplb2Yoc3RyMVswXSkgLSAxOwogICAgICBjb25zdCBzaXplX3Qgc2l6ZTIgPSBzaXplb2Yoc3RyMikgLyBzaXplb2Yoc3RyMlswXSkgLSAxOwoKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDEsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpID09IDAgKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSwgc3RyMiwgc3RyMiArIHNpemUyKSA9PSAtMSApOwoKICAgICAgLy9TbWFsbGVzdCBzdHJpbmcgc2hvdWxkIGJlIGJlZm9yZSBsYXJnZXN0IG9uZToKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDIsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpID09IC0xICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAyKSA9PSAxICk7CiAgICB9CiAgICB7CiAgICAgIHNpemVfdCBpOwogICAgICBDUFBVTklUX0FTU0VSVCggaGFzX2ZhY2V0PGNvbGxhdGU8d2NoYXJfdD4gPihsb2MpICk7CiAgICAgIGNvbGxhdGU8d2NoYXJfdD4gY29uc3QmIGNvbCA9IHVzZV9mYWNldDxjb2xsYXRlPHdjaGFyX3Q+ID4obG9jKTsKCiAgICAgIC8vIEhlcmUgd2Ugd291bGQgbGlrZSB0byB1c2UgTCJhYudkIiBidXQgaXQgbG9va3MgbGlrZSBhbGwgY29tcGlsZXJzCiAgICAgIC8vIGRvIG5vdCBzdXBwb3J0IHN0b3JhZ2Ugb2YgdW5pY29kZSBjaGFyYWN0ZXJzIGluIGV4ZSByZXN1bHRpbmcgaW4KICAgICAgLy8gY29tcGlsYXRpb24gZXJyb3IuIFdlIGF2b2lkIHRoaXMgdGVzdCBmb3IgdGhlIG1vbWVudC4KICAgICAgd3N0cmluZyBzdHJzW10gPSB7TCJhYmRkIiwgTCJhYmNkIiwgTCJhYmJkIiwgTCJhYmNkIn07CgogICAgICB3c3RyaW5nIHRyYW5zZm9ybWVkWzRdOwogICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgdHJhbnNmb3JtZWRbaV0gPSBjb2wudHJhbnNmb3JtKHN0cnNbaV0uZGF0YSgpLCBzdHJzW2ldLmRhdGEoKSArIHN0cnNbaV0uc2l6ZSgpKTsKICAgICAgfQoKICAgICAgc29ydChzdHJzLCBzdHJzICsgNCwgbG9jKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbMF0gPT0gTCJhYmJkIiApOwogICAgICBDUFBVTklUX0FTU0VSVCggc3Ryc1sxXSA9PSBMImFiY2QiICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBzdHJzWzJdID09IEwiYWJjZCIgKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIHN0cnNbM10gPT0gTCJhYmRkIiApOwoKICAgICAgc29ydCh0cmFuc2Zvcm1lZCwgdHJhbnNmb3JtZWQgKyA0KTsKCiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbMF0uZGF0YSgpLCBzdHJzWzBdLmRhdGEoKSArIHN0cnNbMF0uc2l6ZSgpKSA9PSB0cmFuc2Zvcm1lZFswXSApOwogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzFdLmRhdGEoKSwgc3Ryc1sxXS5kYXRhKCkgKyBzdHJzWzFdLnNpemUoKSkgPT0gdHJhbnNmb3JtZWRbMV0gKTsKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1syXS5kYXRhKCksIHN0cnNbMl0uZGF0YSgpICsgc3Ryc1syXS5zaXplKCkpID09IHRyYW5zZm9ybWVkWzJdICk7CiAgICAgIENQUFVOSVRfQVNTRVJUKCBjb2wudHJhbnNmb3JtKHN0cnNbM10uZGF0YSgpLCBzdHJzWzNdLmRhdGEoKSArIHN0cnNbM10uc2l6ZSgpKSA9PSB0cmFuc2Zvcm1lZFszXSApOwoKICAgICAgQ1BQVU5JVF9BU1NFUlQoIGNvbC50cmFuc2Zvcm0oc3Ryc1swXS5kYXRhKCksIHN0cnNbMF0uZGF0YSgpKS5lbXB0eSgpICk7CgogICAgICBDUFBVTklUX0FTU0VSVCggY29sLnRyYW5zZm9ybShzdHJzWzBdLmRhdGEoKSwgc3Ryc1swXS5kYXRhKCkgKyAyKSA9PSBjb2wudHJhbnNmb3JtKHN0cnNbMV0uZGF0YSgpLCBzdHJzWzFdLmRhdGEoKSArIDIpICk7CiAgICB9CiMgICAgZW5kaWYKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CiAgICBDUFBVTklUX01FU1NBR0UoIk5vIGZyZW5jaCBsb2NhbGUgdG8gY2hlY2sgY29sbGF0ZSBmYWNldCIpOwogIH0KIyAgZW5kaWYKfQoKdm9pZCBMb2NhbGVUZXN0Ojpjb2xsYXRlX2J5X25hbWUoKQp7CiAgLyoKICAgKiBDaGVjayBvZiB0aGUgMjIuMS4xLjIuNyBzdGFuZGFyZCBwb2ludC4gQ29uc3RydWN0aW9uIG9mIGEgbG9jYWxlCiAgICogaW5zdGFuY2UgZnJvbSBhIG51bGwgcG9pbnRlciBvciBhbiB1bmtub3duIG5hbWUgc2hvdWxkIHJlc3VsdCBpbgogICAqIGEgcnVudGltZV9lcnJvciBleGNlcHRpb24uCiAgICovCiMgIGlmICFkZWZpbmVkIChTVExQT1JUKSB8fCBkZWZpbmVkIChfU1RMUF9VU0VfRVhDRVBUSU9OUykKIyAgICBpZiBkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX19HTlVDX18pCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2xsYXRlX2J5bmFtZTxjaGFyPihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oMCkpKTsKICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOwogIH0KICBjYXRjaCAoLi4uKSB7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQojICAgIGVuZGlmCgogIHRyeSB7CiAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCBuZXcgY29sbGF0ZV9ieW5hbWU8Y2hhcj4oInlhc2xpX2xhbmd1YWdlIikpOwogICAgQ1BQVU5JVF9GQUlMOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLy9DUFBVTklUX01FU1NBR0UoIGUud2hhdCgpICk7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CgogIHRyeSB7CiAgICBzdHJpbmcgdmVyeUxvbmdGYWNldE5hbWUoIkxDX0NPTExBVEU9Iik7CiAgICB2ZXJ5TG9uZ0ZhY2V0TmFtZS5hcHBlbmQoNTEyLCAnPycpOwogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvbGxhdGVfYnluYW1lPGNoYXI+KHZlcnlMb25nRmFjZXROYW1lLmNfc3RyKCkpKTsKICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIC8qIGUgKi8pIHsKICAgIC8vQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOwogIH0KICBjYXRjaCAoLi4uKSB7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQoKICB0cnkgewogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgIkMiLCBsb2NhbGU6OmNvbGxhdGUpOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgZSkgewogICAgQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOwogICAgQ1BQVU5JVF9GQUlMOwogIH0KICBjYXRjaCAoLi4uKSB7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQoKICB0cnkgewogICAgLy8gT24gcGxhdGZvcm0gd2l0aG91dCByZWFsIGxvY2FsaXphdGlvbiBzdXBwb3J0IHdlIHNob3VsZCByZWx5IG9uIHRoZSAiQyIgZmFjZXQuCiAgICBsb2NhbGUgbG9jKGxvY2FsZTo6Y2xhc3NpYygpLCAiIiwgbG9jYWxlOjpjb2xsYXRlKTsKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmIGUpIHsKICAgIENQUFVOSVRfTUVTU0FHRSggZS53aGF0KCkgKTsKICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKC4uLikgewogICAgQ1BQVU5JVF9GQUlMOwogIH0KCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2xsYXRlX2J5bmFtZTxjaGFyPigiQyIpKTsKCiAgICAvL1dlIGNoZWNrIHRoYXQgdGhlIEMgbG9jYWxlIGdpdmVzIGEgbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb246CiAgICBjb2xsYXRlPGNoYXI+IGNvbnN0JiBjZmFjZXRfYnluYW1lID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2MpOwogICAgY29sbGF0ZTxjaGFyPiBjb25zdCYgY2ZhY2V0ID0gdXNlX2ZhY2V0PGNvbGxhdGU8Y2hhcj4gPihsb2NhbGU6OmNsYXNzaWMoKSk7CgogICAgY2hhciBjb25zdCBzdHIxW10gPSAiYWJjZGVmMSI7CiAgICBjaGFyIGNvbnN0IHN0cjJbXSA9ICJhYmNkZWYyIjsKICAgIGNvbnN0IHNpemVfdCBzaXplMSA9IHNpemVvZihzdHIxKSAvIHNpemVvZihzdHIxWzBdKSAtIDE7CiAgICBjb25zdCBzaXplX3Qgc2l6ZTIgPSBzaXplb2Yoc3RyMikgLyBzaXplb2Yoc3RyMlswXSkgLSAxOwoKICAgIENQUFVOSVRfQVNTRVJUKCBjZmFjZXRfYnluYW1lLmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMSwgc3RyMiwgc3RyMiArIHNpemUyIC0gMSkgPT0KICAgICAgICAgICAgICAgICAgICBjZmFjZXQuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAxLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSApOwogICAgQ1BQVU5JVF9BU1NFUlQoIGNmYWNldF9ieW5hbWUuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEsIHN0cjIsIHN0cjIgKyBzaXplMikgPT0KICAgICAgICAgICAgICAgICAgICBjZmFjZXQuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEsIHN0cjIsIHN0cjIgKyBzaXplMikgKTsKCiAgICAvL1NtYWxsZXN0IHN0cmluZyBzaG91bGQgYmUgYmVmb3JlIGxhcmdlc3Qgb25lOgogICAgQ1BQVU5JVF9BU1NFUlQoIGNmYWNldF9ieW5hbWUuY29tcGFyZShzdHIxLCBzdHIxICsgc2l6ZTEgLSAyLCBzdHIyLCBzdHIyICsgc2l6ZTIgLSAxKSA9PQogICAgICAgICAgICAgICAgICAgIGNmYWNldC5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDIsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDEpICk7CiAgICBDUFBVTklUX0FTU0VSVCggY2ZhY2V0X2J5bmFtZS5jb21wYXJlKHN0cjEsIHN0cjEgKyBzaXplMSAtIDEsIHN0cjIsIHN0cjIgKyBzaXplMiAtIDIpID09CiAgICAgICAgICAgICAgICAgICAgY2ZhY2V0LmNvbXBhcmUoc3RyMSwgc3RyMSArIHNpemUxIC0gMSwgc3RyMiwgc3RyMiArIHNpemUyIC0gMikgKTsKCiAgICAvLyBXZSBjYW5ub3QgcGxheSB3aXRoICfnJyBjaGFyIGhlcmUgYmVjYXVzZSBkb2luZyBzbyB3b3VsZCBtYWtlIHRlc3QgcmVzdWx0CiAgICAvLyBkZXBlbmRhbnQgb24gY2hhciBiZWluZyBjb25zaWRlciBhcyBzaWduZWQgb3Igbm90Li4uCiAgICBzdHJpbmcgc3Ryc1tdID0geyJhYmRkIiwgLyogImFi52QiLCovICJhYmJkIiwgImFiY2QifTsKCiAgICB2ZWN0b3I8c3RyaW5nPiB2MShzdHJzLCBzdHJzICsgc2l6ZW9mKHN0cnMpIC8gc2l6ZW9mKHN0cnNbMF0pKTsKICAgIHNvcnQodjEuYmVnaW4oKSwgdjEuZW5kKCksIGxvYyk7CiAgICB2ZWN0b3I8c3RyaW5nPiB2MihzdHJzLCBzdHJzICsgc2l6ZW9mKHN0cnMpIC8gc2l6ZW9mKHN0cnNbMF0pKTsKICAgIHNvcnQodjIuYmVnaW4oKSwgdjIuZW5kKCksIGxvY2FsZTo6Y2xhc3NpYygpKTsKICAgIENQUFVOSVRfQVNTRVJUKCB2MSA9PSB2MiApOwoKICAgIENQUFVOSVRfQVNTRVJUKCAoY2ZhY2V0X2J5bmFtZS50cmFuc2Zvcm0odjFbMF0uZGF0YSgpLCB2MVswXS5kYXRhKCkgKyB2MVswXS5zaXplKCkpLmNvbXBhcmUoY2ZhY2V0X2J5bmFtZS50cmFuc2Zvcm0odjFbMV0uZGF0YSgpLCB2MVsxXS5kYXRhKCkgKyB2MVsxXS5zaXplKCkpKSA9PQogICAgICAgICAgICAgICAgICAgIHYxWzBdLmNvbXBhcmUodjFbMV0pKSApOwogIH0KICBjYXRjaCAocnVudGltZV9lcnJvciBjb25zdCYgLyogZSAqLykgewogICAgLyogQ1BQVU5JVF9NRVNTQUdFKCBlLndoYXQoKSApOyAqLwogICAgQ1BQVU5JVF9GQUlMOwogIH0KICBjYXRjaCAoLi4uKSB7CiAgICBDUFBVTklUX0ZBSUw7CiAgfQoKIyAgICBpZiAhZGVmaW5lZCAoU1RMUE9SVCkgfHwgIWRlZmluZWQgKF9TVExQX05PX1dDSEFSX1QpCiMgICAgICBpZiBkZWZpbmVkIChTVExQT1JUKSB8fCAhZGVmaW5lZCAoX19HTlVDX18pCiAgdHJ5IHsKICAgIGxvY2FsZSBsb2MobG9jYWxlOjpjbGFzc2ljKCksIG5ldyBjb2xsYXRlX2J5bmFtZTx3Y2hhcl90PihzdGF0aWNfY2FzdDxjaGFyIGNvbnN0Kj4oMCkpKTsKICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CiMgICAgICBlbmRpZgoKICB0cnkgewogICAgbG9jYWxlIGxvYyhsb2NhbGU6OmNsYXNzaWMoKSwgbmV3IGNvbGxhdGVfYnluYW1lPHdjaGFyX3Q+KCJ5YXNsaV9sYW5ndWFnZSIpKTsKICAgIENQUFVOSVRfRkFJTDsKICB9CiAgY2F0Y2ggKHJ1bnRpbWVfZXJyb3IgY29uc3QmKSB7CiAgfQogIGNhdGNoICguLi4pIHsKICAgIENQUFVOSVRfRkFJTDsKICB9CiMgICAgZW5kaWYKIyAgZW5kaWYKfQoKI2VuZGlmCg==