LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpZmRlZiBIQVZFX1BUSFJFQURfSAoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NTUFOX0gKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgImtlcm5lbF9wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL3B0aHJlYWQuaCIKCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpCiAqIGFsc286IGFzc3VtZSB0aGF0IHN0YXRpYyBpbml0aWFsaXplciBzZXRzIHBvaW50ZXIgdG8gTlVMTAogKi8KdHlwZWRlZiBzdHJ1Y3QKewojaWZkZWYgX19HTElCQ19fCiAgaW50IHJlc2VydmVkOwojZW5kaWYKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdAp7CiAgICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKICAgIHZvaWQqIGFyZzsKfTsKCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBwdGhyZWFkX3RocmVhZF9zdGFydChMUFZPSUQgZGF0YSkKewogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0IGluaXQgPSAqKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KilkYXRhOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKICByZXR1cm4gKERXT1JEKWluaXQuc3RhcnRfcm91dGluZShpbml0LmFyZyk7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIHRocmVhZCwgY29uc3QgcHRocmVhZF9hdHRyX3QqIGF0dHIsIHZvaWQqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQgKiksIHZvaWQqIGFyZykKewogIEhBTkRMRSBoVGhyZWFkOwogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KiBpZGF0YSA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2Yoc3RydWN0IHB0aHJlYWRfdGhyZWFkX2luaXQpKTsKCiAgaWRhdGEtPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOwogIGlkYXRhLT5hcmcgPSBhcmc7CiAgaFRocmVhZCA9IENyZWF0ZVRocmVhZCggTlVMTCwgMCwgcHRocmVhZF90aHJlYWRfc3RhcnQsIGlkYXRhLCAwLCAoTFBEV09SRCl0aHJlYWQpOwoKICBpZihoVGhyZWFkKQogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgZWxzZQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxpZGF0YSk7IC8qIGZyZWUgaWRhdGEgc3RydWN0IG9uIGZhaWx1cmUgKi8KICAgIHJldHVybiBFQUdBSU47CiAgfQoKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY2FuY2VsKHB0aHJlYWRfdCB0aHJlYWQpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgaWYoIVRlcm1pbmF0ZVRocmVhZChoVGhyZWFkLCAwKSkKICB7CiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICAgIHJldHVybiBFSU5WQUw7ICAgICAgLyogcmV0dXJuIGVycm9yICovCiAgfQoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKCiAgcmV0dXJuIDA7ICAgICAgICAgICAgIC8qIHJldHVybiBzdWNjZXNzICovCn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2pvaW4ocHRocmVhZF90IHRocmVhZCwgdm9pZCAqKnZhbHVlX3B0cikKewogIEhBTkRMRSBoVGhyZWFkID0gT3BlblRocmVhZChUSFJFQURfQUxMX0FDQ0VTUywgRkFMU0UsIChEV09SRCl0aHJlYWQpOwoKICBXYWl0Rm9yU2luZ2xlT2JqZWN0KGhUaHJlYWQsIElORklOSVRFKTsKICBpZighR2V0RXhpdENvZGVUaHJlYWQoaFRocmVhZCwgKExQRFdPUkQpdmFsdWVfcHRyKSkKICB7CiAgICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICAgIHJldHVybiBFSU5WQUw7IC8qIEZJWE1FOiBtYWtlIHRoaXMgbW9yZSBjb3JyZWN0bHkgbWF0Y2ggKi8KICB9ICAgICAgICAgICAgICAgIC8qIHdpbmRvd3MgZXJyb3JzICovCgogIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIHJldHVybiAwOwp9CgovKkZJWE1FOiBub3Qgc3VyZSB3aGF0IHRvIGRvIHdpdGggdGhpcyBvbmUuLi4gKi8Kc3RhdGljIGludCB3aW5lX3B0aHJlYWRfZGV0YWNoKHB0aHJlYWRfdCB0aHJlYWQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9kZXRhY2hcbiIpOwogIHJldHVybiAwOwp9CgovKioqKiogTVVURVhFUyAqKioqKi8KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIG11dGV4X3JlYWxfaW5pdCggcHRocmVhZF9tdXRleF90ICptdXRleCApCnsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoQ1JJVElDQUxfU0VDVElPTikpOwogIFJ0bEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCksY3JpdHNlY3QsTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oY3JpdHNlY3QpOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3JpdHNlY3QpOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KQogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBpZiAoIVJ0bFRyeUVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSkgcmV0dXJuIEVCVVNZOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF91bmxvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogICAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdCA9ICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0OwoKICAgIGlmICghY3JpdCkgcmV0dXJuIDA7CiAgICBpZiAoY3JpdC0+T3duaW5nVGhyZWFkICE9IChIQU5ETEUpR2V0Q3VycmVudFRocmVhZElkKCkpIHJldHVybiBFUEVSTTsKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uKCBjcml0ICk7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgaWYgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkgewojaWYgMCAvKiB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJjNiB0aGF0IG1ha2VzIHRoaXMgYSBiYWQgaWRlYSAqLwogICAgcmV0dXJuIEVCVVNZOwojZWxzZQogICAgd2hpbGUgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkKICAgICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwojZW5kaWYKICB9CiAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CgovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCnN0YXRpYyB2b2lkIHJ3bG9ja19yZWFsX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUlRMX1JXTE9DSyAqbG9jayA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoUlRMX1JXTE9DSykpOwogIFJ0bEluaXRpYWxpemVSZXNvdXJjZShsb2NrKTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSxsb2NrLE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlUmVzb3VyY2UobG9jayk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBsb2NrKTsKICB9Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja19pbml0KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaywgY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKnJ3bG9ja19hdHRyKQp7CiAgKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrID0gTlVMTDsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spIHJldHVybiAwOwogIFJ0bERlbGV0ZVJlc291cmNlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jayk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3JkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZVNoYXJlZCgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICBpZiAoIVJ0bEFjcXVpcmVSZXNvdXJjZVNoYXJlZCgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIEZBTFNFKSkgcmV0dXJuIEVCVVNZOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfd3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlRXhjbHVzaXZlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlRXhjbHVzaXZlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSByZXR1cm4gRUJVU1k7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja191bmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spIHJldHVybiAwOwogIFJ0bFJlbGVhc2VSZXNvdXJjZSggKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrICk7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBDT05ESVRJT05TICoqKioqLwoKLyogVGhlIGNvbmRpdGlvbiBjb2RlIGlzIGJhc2ljYWxseSBjdXQtYW5kLXBhc3RlZCBmcm9tIERvdWdsYXMKICogU2NobWlkdCdzIHBhcGVyOgogKiAgICJTdHJhdGVnaWVzIGZvciBJbXBsZW1lbnRpbmcgUE9TSVggQ29uZGl0aW9uIFZhcmlhYmxlcyBvbiBXaW4zMiIsCiAqIGF0IGh0dHA6Ly93d3cuY3Mud3VzdGwuZWR1L35zY2htaWR0L3dpbjMyLWN2LTEuaHRtbCBhbmQKICogaHR0cDovL3d3dy5jcy53dXN0bC5lZHUvfnNjaG1pZHQvd2luMzItY3YtMi5odG1sLgogKiBUaGlzIHBhcGVyIGZvcm1lZCB0aGUgYmFzaXMgZm9yIHRoZSBjb25kaXRpb24gdmFyaWFibGUKICogaW1wZW1lbnRhdGlvbiB1c2VkIGluIHRoZSBBQ0UgbGlicmFyeS4KICovCgovKiBQb3NzaWJsZSBwcm9ibGVtcyB3aXRoIEFDRToKICogLSB1bmltcGxlbWVudGVkIHB0aHJlYWRfbXV0ZXhhdHRyX2luaXQKICovCnR5cGVkZWYgc3RydWN0IHsKICAvKiBOdW1iZXIgb2Ygd2FpdGluZyB0aHJlYWRzLiAqLwogIGludCB3YWl0ZXJzX2NvdW50OwoKICAvKiBTZXJpYWxpemUgYWNjZXNzIHRvIDx3YWl0ZXJzX2NvdW50Pi4gKi8KICBDUklUSUNBTF9TRUNUSU9OIHdhaXRlcnNfY291bnRfbG9jazsKCiAgLyoKICAgKiBTZW1hcGhvcmUgdXNlZCB0byBxdWV1ZSB1cCB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBjb25kaXRpb24gdG8KICAgKiBiZWNvbWUgc2lnbmFsZWQuCiAgICovCiAgSEFORExFIHNlbWE7CgogIC8qCiAgICogQW4gYXV0by1yZXNldCBldmVudCB1c2VkIGJ5IHRoZSBicm9hZGNhc3Qvc2lnbmFsIHRocmVhZCB0byB3YWl0CiAgICogZm9yIGFsbCB0aGUgd2FpdGluZyB0aHJlYWQocykgdG8gd2FrZSB1cCBhbmQgYmUgcmVsZWFzZWQgZnJvbSB0aGUKICAgKiBzZW1hcGhvcmUuCiAgICovCiAgSEFORExFIHdhaXRlcnNfZG9uZTsKCiAgLyoKICAgKiBLZWVwcyB0cmFjayBvZiB3aGV0aGVyIHdlIHdlcmUgYnJvYWRjYXN0aW5nIG9yIHNpZ25hbGluZy4gIFRoaXMKICAgKiBhbGxvd3MgdXMgdG8gb3B0aW1pemUgdGhlIGNvZGUgaWYgd2UncmUganVzdCBzaWduYWxpbmcuCiAgICovCiAgc2l6ZV90IHdhc19icm9hZGNhc3Q7Cn0gd2luZV9jb25kX2RldGFpbDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgd2luZV9jb25kX2RldGFpbCAqY29uZDsKfSAqd2luZV9jb25kOwoKc3RhdGljIHZvaWQgd2luZV9jb25kX3JlYWxfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2Yod2luZV9jb25kX2RldGFpbCkpOwogIGRldGFpbC0+d2FpdGVyc19jb3VudCA9IDA7CiAgZGV0YWlsLT53YXNfYnJvYWRjYXN0ID0gMDsKICBkZXRhaWwtPnNlbWEgPSBDcmVhdGVTZW1hcGhvcmVXKCBOVUxMLCAwLCAweDdmZmZmZmZmLCBOVUxMICk7CiAgZGV0YWlsLT53YWl0ZXJzX2RvbmUgPSBDcmVhdGVFdmVudFcoIE5VTEwsIEZBTFNFLCBGQUxTRSwgTlVMTCApOwogIFJ0bEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZVBvaW50ZXIoKHZvaWQqKikmKCgod2luZV9jb25kKWNvbmQpLT5jb25kKSwgZGV0YWlsLCBOVUxMKSAhPSBOVUxMKQogIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9pbml0OmV4cGVjdCB0cm91Ymxlcy4uLlxuIik7CiAgICBDbG9zZUhhbmRsZShkZXRhaWwtPnNlbWEpOwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgICBDbG9zZUhhbmRsZShkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXRhaWwpOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kLCBjb25zdCBwdGhyZWFkX2NvbmRhdHRyX3QgKmNvbmRfYXR0cikKewogIC8qIFRoZSBzYW1lIGFzIGZvciB3aW5lX3B0aHJlYWRfbXV0ZXhfaW5pdCwgd2UgcG9zdHBvbmUgaW5pdGlhbGl6YXRpb24KICAgICB1bnRpbCBjb25kaXRpb24gaXMgcmVhbGx5IHVzZWQuKi8KICAoKHdpbmVfY29uZCljb25kKS0+Y29uZCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICBpZiAoIWRldGFpbCkgcmV0dXJuIDA7CiAgQ2xvc2VIYW5kbGUoZGV0YWlsLT5zZW1hKTsKICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBDbG9zZUhhbmRsZShkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGV0YWlsKTsKICAoKHdpbmVfY29uZCljb25kKS0+Y29uZCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgaW50IGhhdmVfd2FpdGVyczsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgaGF2ZV93YWl0ZXJzID0gZGV0YWlsLT53YWl0ZXJzX2NvdW50ID4gMDsKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogSWYgdGhlcmUgYXJlbid0IGFueSB3YWl0ZXJzLCB0aGVuIHRoaXMgaXMgYSBuby1vcC4gKi8KICBpZiAoaGF2ZV93YWl0ZXJzKQogICAgUmVsZWFzZVNlbWFwaG9yZShkZXRhaWwtPnNlbWEsIDEsIE5VTEwpOwoKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBpbnQgaGF2ZV93YWl0ZXJzID0gMDsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgLyoKICAgKiBUaGlzIGlzIG5lZWRlZCB0byBlbnN1cmUgdGhhdCA8d2FpdGVyc19jb3VudD4gYW5kIDx3YXNfYnJvYWRjYXN0PiBhcmUKICAgKiBjb25zaXN0ZW50IHJlbGF0aXZlIHRvIGVhY2ggb3RoZXIuCiAgICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIGlmIChkZXRhaWwtPndhaXRlcnNfY291bnQgPiAwKSB7CiAgICAvKgogICAgICogV2UgYXJlIGJyb2FkY2FzdGluZywgZXZlbiBpZiB0aGVyZSBpcyBqdXN0IG9uZSB3YWl0ZXIuLi4KICAgICAqIFJlY29yZCB0aGF0IHdlIGFyZSBicm9hZGNhc3RpbmcsIHdoaWNoIGhlbHBzIG9wdGltaXplCiAgICAgKiA8cHRocmVhZF9jb25kX3dhaXQ+IGZvciB0aGUgbm9uLWJyb2FkY2FzdCBjYXNlLgogICAgICovCiAgICBkZXRhaWwtPndhc19icm9hZGNhc3QgPSAxOwogICAgaGF2ZV93YWl0ZXJzID0gMTsKICB9CgogIGlmIChoYXZlX3dhaXRlcnMpIHsKICAgIC8qIFdha2UgdXAgYWxsIHRoZSB3YWl0ZXJzIGF0b21pY2FsbHkuICovCiAgICBSZWxlYXNlU2VtYXBob3JlKGRldGFpbC0+c2VtYSwgZGV0YWlsLT53YWl0ZXJzX2NvdW50LCBOVUxMKTsKCiAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgICAvKiBXYWl0IGZvciBhbGwgdGhlIGF3YWtlbmVkIHRocmVhZHMgdG8gYWNxdWlyZSB0aGUgY291bnRpbmcgc2VtYXBob3JlLiAqLwogICAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT53YWl0ZXJzX2RvbmUsIElORklOSVRFKTsKCiAgICAvKgogICAgICogVGhpcyBhc3NpZ25tZW50IGlzIG9rYXksIGV2ZW4gd2l0aG91dCB0aGUgPHdhaXRlcnNfY291bnRfbG9jaz4gaGVsZAogICAgICogYmVjYXVzZSBubyBvdGhlciB3YWl0ZXIgdGhyZWFkcyBjYW4gd2FrZSB1cCB0byBhY2Nlc3MgaXQuCiAgICAgKi8KICAgIGRldGFpbC0+d2FzX2Jyb2FkY2FzdCA9IDA7CiAgfQogIGVsc2UKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICB3aW5lX2NvbmRfZGV0YWlsICpkZXRhaWw7CiAgaW50IGxhc3Rfd2FpdGVyOwoKICBpZiAoICEoKHdpbmVfY29uZCljb25kKS0+Y29uZCApIHdpbmVfY29uZF9yZWFsX2luaXQoY29uZCk7CiAgZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBkZXRhaWwtPndhaXRlcnNfY291bnQrKzsKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCApOwogIFdhaXRGb3JTaW5nbGVPYmplY3QoZGV0YWlsLT5zZW1hLCBJTkZJTklURSk7CgogIC8qIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogV2UncmUgbm8gbG9uZ2VyIHdhaXRpbmcuLi4gKi8KICBkZXRhaWwtPndhaXRlcnNfY291bnQtLTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciBhZnRlciA8cHRocmVhZF9jb25kX2Jyb2FkY2FzdD4uICovCiAgbGFzdF93YWl0ZXIgPSBkZXRhaWwtPndhc19icm9hZGNhc3QgJiYgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID09IDA7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKgogICAqIElmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0aHJlYWQgZHVyaW5nIHRoaXMgcGFydGljdWxhciBicm9hZGNhc3QKICAgKiB0aGVuIGxldCBhbGwgdGhlIG90aGVyIHRocmVhZHMgcHJvY2VlZC4KICAgKi8KICBpZiAobGFzdF93YWl0ZXIpIFNldEV2ZW50KGRldGFpbC0+d2FpdGVyc19kb25lKTsKICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX3RpbWVkd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQp7CiAgRFdPUkQgbXMgPSBhYnN0aW1lLT50dl9zZWMgKiAxMDAwICsgYWJzdGltZS0+dHZfbnNlYyAvIDEwMDAwMDA7CiAgaW50IGxhc3Rfd2FpdGVyOwogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKCiAgaWYgKCAhKCh3aW5lX2NvbmQpY29uZCktPmNvbmQgKSB3aW5lX2NvbmRfcmVhbF9pbml0KGNvbmQpOwogIGRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICAvKiBBdm9pZCByYWNlIGNvbmRpdGlvbnMuICovCiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgZGV0YWlsLT53YWl0ZXJzX2NvdW50Kys7CiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgV2FpdEZvclNpbmdsZU9iamVjdCAoZGV0YWlsLT5zZW1hLCBtcyk7CgogIC8qIFJlYWNxdWlyZSBsb2NrIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgLyogV2UncmUgbm8gbG9uZ2VyIHdhaXRpbmcuLi4gKi8KICBkZXRhaWwtPndhaXRlcnNfY291bnQtLTsKCiAgLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciBhZnRlciA8cHRocmVhZF9jb25kX2Jyb2FkY2FzdD4uICovCiAgbGFzdF93YWl0ZXIgPSBkZXRhaWwtPndhc19icm9hZGNhc3QgJiYgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID09IDA7CgogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKgogICAqIElmIHdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0aHJlYWQgZHVyaW5nIHRoaXMgcGFydGljdWxhciBicm9hZGNhc3QKICAgKiB0aGVuIGxldCBhbGwgdGhlIG90aGVyIHRocmVhZHMgcHJvY2VlZC4KICAgKi8KICBpZiAobGFzdF93YWl0ZXIpIFNldEV2ZW50IChkZXRhaWwtPndhaXRlcnNfZG9uZSk7CiAgUnRsRW50ZXJDcml0aWNhbFNlY3Rpb24gKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1JU0MgKioqKiovCgpzdGF0aWMgcHRocmVhZF90IHdpbmVfcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9CgpzdGF0aWMgdm9pZCB3aW5lX3B0aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwsIGNoYXIgKmN1cnJlbnRmcmFtZSkKewogICAgRXhpdFRocmVhZCgoRFdPUkQpcmV0dmFsKTsKfQoKc3RhdGljIHZvaWQgKndpbmVfZ2V0X3RocmVhZF9kYXRhKHZvaWQpCnsKICAgIHJldHVybiBrZXJuZWxfZ2V0X3RocmVhZF9kYXRhKCktPnB0aHJlYWRfZGF0YTsKfQoKc3RhdGljIHZvaWQgd2luZV9zZXRfdGhyZWFkX2RhdGEoIHZvaWQgKmRhdGEgKQp7CiAgICBrZXJuZWxfZ2V0X3RocmVhZF9kYXRhKCktPnB0aHJlYWRfZGF0YSA9IGRhdGE7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2NhbGxiYWNrcyBjYWxsYmFja3MgPQp7CiAgICB3aW5lX2dldF90aHJlYWRfZGF0YSwgICAgICAgICAgIC8qIHB0cl9nZXRfdGhyZWFkX2RhdGEgKi8KICAgIHdpbmVfc2V0X3RocmVhZF9kYXRhLCAgICAgICAgICAgLyogcHRyX3NldF90aHJlYWRfZGF0YSAqLwogICAgd2luZV9wdGhyZWFkX3NlbGYsICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZWxmICovCiAgICB3aW5lX3B0aHJlYWRfZXF1YWwsICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2VxdWFsICovCiAgICB3aW5lX3B0aHJlYWRfY3JlYXRlLCAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NyZWF0ZSAqLwogICAgd2luZV9wdGhyZWFkX2NhbmNlbCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9jYW5jZWwgKi8KICAgIHdpbmVfcHRocmVhZF9qb2luLCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfam9pbiAqLwogICAgd2luZV9wdGhyZWFkX2RldGFjaCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9kZXRhY2ggKi8KICAgIHdpbmVfcHRocmVhZF9leGl0LCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXhpdCAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X2luaXQsICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfbG9jaywgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2xvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF90cnlsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF91bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95LCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19pbml0LCAgICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfaW5pdCAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19kZXN0cm95LCAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19yZGxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfcmRsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3VubG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja191bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX2luaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfY29uZF9kZXN0cm95LCAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfc2lnbmFsLCAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3NpZ25hbCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCAgICAvKiBwdHJfcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfd2FpdCwgICAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3dhaXQgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX3RpbWVkd2FpdCAgICAgLyogcHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQgKi8KfTsKCnN0YXRpYyBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2Z1bmN0aW9ucyBwdGhyZWFkX2Z1bmN0aW9uczsKCnZvaWQgUFRIUkVBRF9Jbml0KHZvaWQpCnsKICAgIHdpbmVfcHRocmVhZF9nZXRfZnVuY3Rpb25zKCAmcHRocmVhZF9mdW5jdGlvbnMsIHNpemVvZihwdGhyZWFkX2Z1bmN0aW9ucykgKTsKICAgIHB0aHJlYWRfZnVuY3Rpb25zLmluaXRfcHJvY2VzcyggJmNhbGxiYWNrcywgc2l6ZW9mKGNhbGxiYWNrcykgKTsKfQoKI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9IICovCg==