LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogTW9kdWxlIE5hbWU6IFNpSUhMVklJQwogKgogKiBNb2R1bGUgRGVzY3JpcHRpb246ICBoaWdoIGxldmVsIGkyYyByb3V0aW5lcwogKgogKiBDb3B5cmlnaHQgqSAyMDAyLTIwMDUsIFNpbGljb24gSW1hZ2UsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIE5vIHBhcnQgb2YgdGhpcyB3b3JrIG1heSBiZSByZXByb2R1Y2VkLCBtb2RpZmllZCwgZGlzdHJpYnV0ZWQsIHRyYW5zbWl0dGVkLAogKiB0cmFuc2NyaWJlZCwgb3IgdHJhbnNsYXRlZCBpbnRvIGFueSBsYW5ndWFnZSBvciBjb21wdXRlciBmb3JtYXQsIGluIGFueSBmb3JtCiAqIG9yIGJ5IGFueSBtZWFucyB3aXRob3V0IHdyaXR0ZW4gcGVybWlzc2lvbiBvZjogU2lsaWNvbiBJbWFnZSwgSW5jLiwKICogMTA2MCBFYXN0IEFycXVlcyBBdmVudWUsIFN1bm55dmFsZSwgQ2FsaWZvcm5pYSA5NDA4NQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCiNpbmNsdWRlICJTaUlITFZJSUMuaCIKLyogI2luY2x1ZGUgIlNpSVNXX0lJQy5oIiAqLwojaW5jbHVkZSAiU2lJSUlDRGVmcy5oIgojaW5jbHVkZSAiU2lJSEFMLmgiCiNpbmNsdWRlICIuLi9wbGF0Zm9ybV9pZmFjZS5oIgoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkJPT0wgaGxXYWl0Rm9yQWNrKEJZVEUgYlNsdkFkZHIsIFdPUkQgd1RpbWVPdXQpCnsKI2lmIDAKCUJPT0wgYlJlc3VsdCA9IEZBTFNFOwoJaW50IHJldCA9IDA7CgljaGFyIHZhbHVlID0gMHgwMDsKCglyZXQgPSBfX3BsYXRfaTJjX3dyaXRlX2Jsb2NrKChiU2x2QWRkciA+PiAxKSwgMHgwMCwgJnZhbHVlLCAxKTsKCWlmIChyZXQgPT0gMCkKCQliUmVzdWx0ID0gVFJVRTsKCglyZXR1cm4gYlJlc3VsdDsKI2Vsc2UKCXJldHVybiBUUlVFOwojZW5kaWYKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQllURSBobEJsb2NrUmVhZF84QkFTKHN0cnVjdCBJMkNTaG9ydENvbW1hbmRUeXBlX3MgKklJQywgQllURSAqRGF0YSkKewoJaW50IHJldCA9IDA7CgoJcmV0ID0gX19wbGF0X2kyY19yZWFkX2Jsb2NrKChJSUMtPlNsYXZlQWRkciA+PiAxKSwKCQlJSUMtPlJlZ0FkZHJMLCBEYXRhLCBJSUMtPk5CeXRlcyk7CgoJcmV0ID0gKHJldCA+PSAwID8gSUlDX09LIDogSUlDX0VSUk9SKTsKCXJldHVybiByZXQ7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpCWVRFIGhsQmxvY2tXcml0ZV84QkFTKHN0cnVjdCBJMkNTaG9ydENvbW1hbmRUeXBlX3MgKklJQywgQllURSAqRGF0YSkKewoJaW50IHJldCA9IDA7CgoJcmV0ID0gX19wbGF0X2kyY193cml0ZV9ibG9jaygoSUlDLT5TbGF2ZUFkZHIgPj4gMSksCgkJSUlDLT5SZWdBZGRyTCwgRGF0YSwgSUlDLT5OQnl0ZXMpOwoKCXJldCA9IChyZXQgPj0gMCA/IElJQ19PSyA6IElJQ19FUlJPUik7CglyZXR1cm4gcmV0OwoKfQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQllURSBobFJlYWRCeXRlXzhCQShCWVRFIFNsYXZlQWRkciwgQllURSBSZWdBZGRyKQp7CglpbnQgcmV0ID0gMDsKCXVuc2lnbmVkIGNoYXIgZGF0YSA9IDA7CgoJcmV0ID0gX19wbGF0X2kyY19yZWFkX2Jsb2NrKChTbGF2ZUFkZHIgPj4gMSksIFJlZ0FkZHIsICZkYXRhLCAxKTsKCWlmIChyZXQgPj0gMCkKCQlyZXR1cm4gZGF0YTsKCglyZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKV09SRCBobFJlYWRXb3JkXzhCQShCWVRFIFNsYXZlQWRkciwgQllURSBSZWdBZGRyKQp7CglpbnQgcmV0ID0gMDsKCXVuc2lnbmVkIGNoYXIgZGF0YVsyXSA9IHswLCAwfTsKCVdPUkQgdG1wOwoKCXJldCA9IF9fcGxhdF9pMmNfcmVhZF9ibG9jaygoU2xhdmVBZGRyID4+IDEpLAoJCVJlZ0FkZHIsIChjaGFyICopJmRhdGEsIDIpOwoJaWYgKHJldCA+PSAwKSB7CgkJdG1wID0gKChkYXRhWzFdIDw8IDgpIHwgZGF0YVswXSk7CgkJcmV0dXJuIHRtcDsKCX0KCglyZXR1cm4gMDsKfQoKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwp2b2lkIGhsV3JpdGVCeXRlXzhCQShCWVRFIFNsYXZlQWRkciwgQllURSBSZWdBZGRyLCBCWVRFIERhdGEpCnsKCWludCByZXQgPSAwOwoKCXJldCA9IF9fcGxhdF9pMmNfd3JpdGVfYmxvY2soKFNsYXZlQWRkciA+PiAxKSwgUmVnQWRkciwgJkRhdGEsIDEpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKdm9pZCBobFdyaXRlV29yZF84QkEoQllURSBTbGF2ZUFkZHIsIEJZVEUgUmVnQWRkciwgV09SRCBEYXRhKQp7CglpbnQgcmV0ID0gMDsKCXVuc2lnbmVkIGNoYXIgYnVmWzJdID0gezAsIDB9OwoKCWJ1ZlswXSA9IERhdGEgJiAweGZmOwoJYnVmWzFdID0gRGF0YSA+PiA4OwoKCXJldCA9IF9fcGxhdF9pMmNfd3JpdGVfYmxvY2soKFNsYXZlQWRkciA+PiAxKSwgUmVnQWRkciwgYnVmLCAyKTsKfQoKCg==