LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAzIEFsZXhhbmRyZSBKdWxsaWFyZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlICJ3aW5lL3BvcnQuaCIKCiNpZmRlZiBIQVZFX1BUSFJFQURfSAoKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaWZkZWYgSEFWRV9VTklTVERfSAojIGluY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19NTUFOX0gKI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiNlbmRpZgoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKI2luY2x1ZGUgImtlcm5lbF9wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL3B0aHJlYWQuaCIKCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpCiAqIGFsc286IGFzc3VtZSB0aGF0IHN0YXRpYyBpbml0aWFsaXplciBzZXRzIHBvaW50ZXIgdG8gTlVMTAogKi8KdHlwZWRlZiBzdHJ1Y3QKewojaWZkZWYgX19HTElCQ19fCiAgaW50IHJlc2VydmVkOwojZW5kaWYKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7CgpzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdAp7CiAgICB2b2lkKiAoKnN0YXJ0X3JvdXRpbmUpKHZvaWQqKTsKICAgIHZvaWQqIGFyZzsKfTsKCnN0YXRpYyBEV09SRCBDQUxMQkFDSyBwdGhyZWFkX3RocmVhZF9zdGFydChMUFZPSUQgZGF0YSkKewogIHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0IGluaXQgPSAqKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KilkYXRhOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxkYXRhKTsKICByZXR1cm4gKERXT1JEX1BUUilpbml0LnN0YXJ0X3JvdXRpbmUoaW5pdC5hcmcpOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jcmVhdGUocHRocmVhZF90KiB0aHJlYWQsIGNvbnN0IHB0aHJlYWRfYXR0cl90KiBhdHRyLCB2b2lkKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpzdGFydF9yb3V0aW5lKSh2b2lkICopLCB2b2lkKiBhcmcpCnsKICBIQU5ETEUgaFRocmVhZDsKICBzdHJ1Y3QgcHRocmVhZF90aHJlYWRfaW5pdCogaWRhdGEgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKHN0cnVjdCBwdGhyZWFkX3RocmVhZF9pbml0KSk7CgogIGlkYXRhLT5zdGFydF9yb3V0aW5lID0gc3RhcnRfcm91dGluZTsKICBpZGF0YS0+YXJnID0gYXJnOwogIGhUaHJlYWQgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIDAsIHB0aHJlYWRfdGhyZWFkX3N0YXJ0LCBpZGF0YSwgMCwgKExQRFdPUkQpdGhyZWFkKTsKCiAgaWYoaFRocmVhZCkKICAgIENsb3NlSGFuZGxlKGhUaHJlYWQpOwogIGVsc2UKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsaWRhdGEpOyAvKiBmcmVlIGlkYXRhIHN0cnVjdCBvbiBmYWlsdXJlICovCiAgICByZXR1cm4gRUFHQUlOOwogIH0KCiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NhbmNlbChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgSEFORExFIGhUaHJlYWQgPSBPcGVuVGhyZWFkKFRIUkVBRF9BTExfQUNDRVNTLCBGQUxTRSwgKERXT1JEKXRocmVhZCk7CgogIGlmKCFUZXJtaW5hdGVUaHJlYWQoaFRocmVhZCwgMCkpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAgICAgIC8qIHJldHVybiBlcnJvciAqLwogIH0KCiAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CgogIHJldHVybiAwOyAgICAgICAgICAgICAvKiByZXR1cm4gc3VjY2VzcyAqLwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQgKip2YWx1ZV9wdHIpCnsKICBIQU5ETEUgaFRocmVhZCA9IE9wZW5UaHJlYWQoVEhSRUFEX0FMTF9BQ0NFU1MsIEZBTFNFLCAoRFdPUkQpdGhyZWFkKTsKCiAgV2FpdEZvclNpbmdsZU9iamVjdChoVGhyZWFkLCBJTkZJTklURSk7CiAgaWYoIUdldEV4aXRDb2RlVGhyZWFkKGhUaHJlYWQsIChMUERXT1JEKXZhbHVlX3B0cikpCiAgewogICAgQ2xvc2VIYW5kbGUoaFRocmVhZCk7CiAgICByZXR1cm4gRUlOVkFMOyAvKiBGSVhNRTogbWFrZSB0aGlzIG1vcmUgY29ycmVjdGx5IG1hdGNoICovCiAgfSAgICAgICAgICAgICAgICAvKiB3aW5kb3dzIGVycm9ycyAqLwoKICBDbG9zZUhhbmRsZShoVGhyZWFkKTsKICByZXR1cm4gMDsKfQoKLypGSVhNRTogbm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHRoaXMgb25lLi4uICovCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2RldGFjaChwdGhyZWFkX3QgdGhyZWFkKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfZGV0YWNoXG4iKTsKICByZXR1cm4gMDsKfQoKLyoqKioqIE1VVEVYRVMgKioqKiovCgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHRocmVhZF9tdXRleGF0dHJfdCAqbXV0ZXhhdHRyKQp7CiAgLyogZ2xpYmMgaGFzIGEgdGVuZGVuY3kgdG8gaW5pdGlhbGl6ZSBtdXRleGVzIHZlcnkgb2Z0ZW4sIGV2ZW4KICAgICBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZXkgYXJlIG5vdCByZWFsbHkgdXNlZCBsYXRlciBvbi4KCiAgICAgQXMgZm9yIHVzLCBpbml0aWFsaXppbmcgYSBtdXRleCBpcyB2ZXJ5IGV4cGVuc2l2ZSwgd2UgcG9zdHBvbmUKICAgICB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiB1bnRpbCB0aGUgdGltZSB0aGUgbXV0ZXggaXMgZmlyc3QgdXNlZC4gKi8KCiAgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBtdXRleF9yZWFsX2luaXQoIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggKQp7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKICBSdGxJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNyaXRzZWN0KTsKICB9Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFSdGxUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICAgIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXQgPSAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdDsKCiAgICBpZiAoIWNyaXQpIHJldHVybiAwOwogICAgaWYgKGNyaXQtPk93bmluZ1RocmVhZCAhPSBVTG9uZ1RvSGFuZGxlKEdldEN1cnJlbnRUaHJlYWRJZCgpKSkgcmV0dXJuIEVQRVJNOwogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24oIGNyaXQgKTsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBpZiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KSB7CiNpZiAwIC8qIHRoZXJlIHNlZW1zIHRvIGJlIGEgYnVnIGluIGxpYmM2IHRoYXQgbWFrZXMgdGhpcyBhIGJhZCBpZGVhICovCiAgICByZXR1cm4gRUJVU1k7CiNlbHNlCiAgICB3aGlsZSAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QtPlJlY3Vyc2lvbkNvdW50KQogICAgICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiNlbmRpZgogIH0KICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwoKc3RhdGljIHZvaWQgcndsb2NrX3JlYWxfaW5pdChwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBSVExfUldMT0NLICpsb2NrID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZihSVExfUldMT0NLKSk7CiAgUnRsSW5pdGlhbGl6ZVJlc291cmNlKGxvY2spOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2VQb2ludGVyKCh2b2lkKiopJigoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spLGxvY2ssTlVMTCkgIT0gTlVMTCkgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBSdGxEZWxldGVSZXNvdXJjZShsb2NrKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGxvY2spOwogIH0KfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSByZXR1cm4gRUJVU1k7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgd2hpbGUoVFJVRSkKICAgIGlmIChSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBUUlVFKSkKICAgICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHJldHVybiBFQlVTWTsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsUmVsZWFzZVJlc291cmNlKCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgKTsKICByZXR1cm4gMDsKfQoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCgovKiBUaGUgY29uZGl0aW9uIGNvZGUgaXMgYmFzaWNhbGx5IGN1dC1hbmQtcGFzdGVkIGZyb20gRG91Z2xhcwogKiBTY2htaWR0J3MgcGFwZXI6CiAqICAgIlN0cmF0ZWdpZXMgZm9yIEltcGxlbWVudGluZyBQT1NJWCBDb25kaXRpb24gVmFyaWFibGVzIG9uIFdpbjMyIiwKICogYXQgaHR0cDovL3d3dy5jcy53dXN0bC5lZHUvfnNjaG1pZHQvd2luMzItY3YtMS5odG1sIGFuZAogKiBodHRwOi8vd3d3LmNzLnd1c3RsLmVkdS9+c2NobWlkdC93aW4zMi1jdi0yLmh0bWwuCiAqIFRoaXMgcGFwZXIgZm9ybWVkIHRoZSBiYXNpcyBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQogKiBpbXBlbWVudGF0aW9uIHVzZWQgaW4gdGhlIEFDRSBsaWJyYXJ5LgogKi8KCi8qIFBvc3NpYmxlIHByb2JsZW1zIHdpdGggQUNFOgogKiAtIHVuaW1wbGVtZW50ZWQgcHRocmVhZF9tdXRleGF0dHJfaW5pdAogKi8KdHlwZWRlZiBzdHJ1Y3QgewogIC8qIE51bWJlciBvZiB3YWl0aW5nIHRocmVhZHMuICovCiAgaW50IHdhaXRlcnNfY291bnQ7CgogIC8qIFNlcmlhbGl6ZSBhY2Nlc3MgdG8gPHdhaXRlcnNfY291bnQ+LiAqLwogIENSSVRJQ0FMX1NFQ1RJT04gd2FpdGVyc19jb3VudF9sb2NrOwoKICAvKgogICAqIFNlbWFwaG9yZSB1c2VkIHRvIHF1ZXVlIHVwIHRocmVhZHMgd2FpdGluZyBmb3IgdGhlIGNvbmRpdGlvbiB0bwogICAqIGJlY29tZSBzaWduYWxlZC4KICAgKi8KICBIQU5ETEUgc2VtYTsKCiAgLyoKICAgKiBBbiBhdXRvLXJlc2V0IGV2ZW50IHVzZWQgYnkgdGhlIGJyb2FkY2FzdC9zaWduYWwgdGhyZWFkIHRvIHdhaXQKICAgKiBmb3IgYWxsIHRoZSB3YWl0aW5nIHRocmVhZChzKSB0byB3YWtlIHVwIGFuZCBiZSByZWxlYXNlZCBmcm9tIHRoZQogICAqIHNlbWFwaG9yZS4KICAgKi8KICBIQU5ETEUgd2FpdGVyc19kb25lOwoKICAvKgogICAqIEtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgd2Ugd2VyZSBicm9hZGNhc3Rpbmcgb3Igc2lnbmFsaW5nLiAgVGhpcwogICAqIGFsbG93cyB1cyB0byBvcHRpbWl6ZSB0aGUgY29kZSBpZiB3ZSdyZSBqdXN0IHNpZ25hbGluZy4KICAgKi8KICBzaXplX3Qgd2FzX2Jyb2FkY2FzdDsKfSB3aW5lX2NvbmRfZGV0YWlsOwoKLyogc2VlIHdpbmVfbXV0ZXggYWJvdmUgZm9yIGNvbW1lbnRzICovCnR5cGVkZWYgc3RydWN0IHsKICB3aW5lX2NvbmRfZGV0YWlsICpjb25kOwp9ICp3aW5lX2NvbmQ7CgpzdGF0aWMgdm9pZCB3aW5lX2NvbmRfcmVhbF9pbml0KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgd2luZV9jb25kX2RldGFpbCAqZGV0YWlsID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZih3aW5lX2NvbmRfZGV0YWlsKSk7CiAgZGV0YWlsLT53YWl0ZXJzX2NvdW50ID0gMDsKICBkZXRhaWwtPndhc19icm9hZGNhc3QgPSAwOwogIGRldGFpbC0+c2VtYSA9IENyZWF0ZVNlbWFwaG9yZVcoIE5VTEwsIDAsIDB4N2ZmZmZmZmYsIE5VTEwgKTsKICBkZXRhaWwtPndhaXRlcnNfZG9uZSA9IENyZWF0ZUV2ZW50VyggTlVMTCwgRkFMU0UsIEZBTFNFLCBOVUxMICk7CiAgUnRsSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX2NvbmQpY29uZCktPmNvbmQpLCBkZXRhaWwsIE5VTEwpICE9IE5VTEwpCiAgewogICAgLyogdG9vIGxhdGUsIHNvbWUgb3RoZXIgdGhyZWFkIGFscmVhZHkgZGlkIGl0ICovCiAgICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXQ6ZXhwZWN0IHRyb3VibGVzLi4uXG4iKTsKICAgIENsb3NlSGFuZGxlKGRldGFpbC0+c2VtYSk7CiAgICBSdGxEZWxldGVDcml0aWNhbFNlY3Rpb24oJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICAgIENsb3NlSGFuZGxlKGRldGFpbC0+d2FpdGVyc19kb25lKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRldGFpbCk7CiAgfQp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqY29uZF9hdHRyKQp7CiAgLyogVGhlIHNhbWUgYXMgZm9yIHdpbmVfcHRocmVhZF9tdXRleF9pbml0LCB3ZSBwb3N0cG9uZSBpbml0aWFsaXphdGlvbgogICAgIHVudGlsIGNvbmRpdGlvbiBpcyByZWFsbHkgdXNlZC4qLwogICgod2luZV9jb25kKWNvbmQpLT5jb25kID0gTlVMTDsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgd2luZV9jb25kX2RldGFpbCAqZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIGlmICghZGV0YWlsKSByZXR1cm4gMDsKICBDbG9zZUhhbmRsZShkZXRhaWwtPnNlbWEpOwogIFJ0bERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIENsb3NlSGFuZGxlKGRldGFpbC0+d2FpdGVyc19kb25lKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkZXRhaWwpOwogICgod2luZV9jb25kKWNvbmQpLT5jb25kID0gTlVMTDsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludCB3aW5lX3B0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBpbnQgaGF2ZV93YWl0ZXJzOwogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKCiAgaWYgKCAhKCh3aW5lX2NvbmQpY29uZCktPmNvbmQgKSB3aW5lX2NvbmRfcmVhbF9pbml0KGNvbmQpOwogIGRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBoYXZlX3dhaXRlcnMgPSBkZXRhaWwtPndhaXRlcnNfY291bnQgPiAwOwogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKiBJZiB0aGVyZSBhcmVuJ3QgYW55IHdhaXRlcnMsIHRoZW4gdGhpcyBpcyBhIG5vLW9wLiAqLwogIGlmIChoYXZlX3dhaXRlcnMpCiAgICBSZWxlYXNlU2VtYXBob3JlKGRldGFpbC0+c2VtYSwgMSwgTlVMTCk7CgogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9jb25kX2Jyb2FkY2FzdChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIGludCBoYXZlX3dhaXRlcnMgPSAwOwogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKCiAgaWYgKCAhKCh3aW5lX2NvbmQpY29uZCktPmNvbmQgKSB3aW5lX2NvbmRfcmVhbF9pbml0KGNvbmQpOwogIGRldGFpbCA9ICgod2luZV9jb25kKWNvbmQpLT5jb25kOwoKICAvKgogICAqIFRoaXMgaXMgbmVlZGVkIHRvIGVuc3VyZSB0aGF0IDx3YWl0ZXJzX2NvdW50PiBhbmQgPHdhc19icm9hZGNhc3Q+IGFyZQogICAqIGNvbnNpc3RlbnQgcmVsYXRpdmUgdG8gZWFjaCBvdGhlci4KICAgKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgaWYgKGRldGFpbC0+d2FpdGVyc19jb3VudCA+IDApIHsKICAgIC8qCiAgICAgKiBXZSBhcmUgYnJvYWRjYXN0aW5nLCBldmVuIGlmIHRoZXJlIGlzIGp1c3Qgb25lIHdhaXRlci4uLgogICAgICogUmVjb3JkIHRoYXQgd2UgYXJlIGJyb2FkY2FzdGluZywgd2hpY2ggaGVscHMgb3B0aW1pemUKICAgICAqIDxwdGhyZWFkX2NvbmRfd2FpdD4gZm9yIHRoZSBub24tYnJvYWRjYXN0IGNhc2UuCiAgICAgKi8KICAgIGRldGFpbC0+d2FzX2Jyb2FkY2FzdCA9IDE7CiAgICBoYXZlX3dhaXRlcnMgPSAxOwogIH0KCiAgaWYgKGhhdmVfd2FpdGVycykgewogICAgLyogV2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMgYXRvbWljYWxseS4gKi8KICAgIFJlbGVhc2VTZW1hcGhvcmUoZGV0YWlsLT5zZW1hLCBkZXRhaWwtPndhaXRlcnNfY291bnQsIE5VTEwpOwoKICAgIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAgIC8qIFdhaXQgZm9yIGFsbCB0aGUgYXdha2VuZWQgdGhyZWFkcyB0byBhY3F1aXJlIHRoZSBjb3VudGluZyBzZW1hcGhvcmUuICovCiAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0IChkZXRhaWwtPndhaXRlcnNfZG9uZSwgSU5GSU5JVEUpOwoKICAgIC8qCiAgICAgKiBUaGlzIGFzc2lnbm1lbnQgaXMgb2theSwgZXZlbiB3aXRob3V0IHRoZSA8d2FpdGVyc19jb3VudF9sb2NrPiBoZWxkCiAgICAgKiBiZWNhdXNlIG5vIG90aGVyIHdhaXRlciB0aHJlYWRzIGNhbiB3YWtlIHVwIHRvIGFjY2VzcyBpdC4KICAgICAqLwogICAgZGV0YWlsLT53YXNfYnJvYWRjYXN0ID0gMDsKICB9CiAgZWxzZQogICAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIHdpbmVfY29uZF9kZXRhaWwgKmRldGFpbDsKICBpbnQgbGFzdF93YWl0ZXI7CgogIGlmICggISgod2luZV9jb25kKWNvbmQpLT5jb25kICkgd2luZV9jb25kX3JlYWxfaW5pdChjb25kKTsKICBkZXRhaWwgPSAoKHdpbmVfY29uZCljb25kKS0+Y29uZDsKCiAgLyogQXZvaWQgcmFjZSBjb25kaXRpb25zLiAqLwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwogIGRldGFpbC0+d2FpdGVyc19jb3VudCsrOwogIFJ0bExlYXZlQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ICk7CiAgV2FpdEZvclNpbmdsZU9iamVjdChkZXRhaWwtPnNlbWEsIElORklOSVRFKTsKCiAgLyogUmVhY3F1aXJlIGxvY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLiAqLwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKiBXZSdyZSBubyBsb25nZXIgd2FpdGluZy4uLiAqLwogIGRldGFpbC0+d2FpdGVyc19jb3VudC0tOwoKICAvKiBDaGVjayB0byBzZWUgaWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIGFmdGVyIDxwdGhyZWFkX2NvbmRfYnJvYWRjYXN0Pi4gKi8KICBsYXN0X3dhaXRlciA9IGRldGFpbC0+d2FzX2Jyb2FkY2FzdCAmJiBkZXRhaWwtPndhaXRlcnNfY291bnQgPT0gMDsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIC8qCiAgICogSWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRocmVhZCBkdXJpbmcgdGhpcyBwYXJ0aWN1bGFyIGJyb2FkY2FzdAogICAqIHRoZW4gbGV0IGFsbCB0aGUgb3RoZXIgdGhyZWFkcyBwcm9jZWVkLgogICAqLwogIGlmIChsYXN0X3dhaXRlcikgU2V0RXZlbnQoZGV0YWlsLT53YWl0ZXJzX2RvbmUpOwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgd2luZV9wdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBEV09SRCBtcyA9IGFic3RpbWUtPnR2X3NlYyAqIDEwMDAgKyBhYnN0aW1lLT50dl9uc2VjIC8gMTAwMDAwMDsKICBpbnQgbGFzdF93YWl0ZXI7CiAgd2luZV9jb25kX2RldGFpbCAqZGV0YWlsOwoKICBpZiAoICEoKHdpbmVfY29uZCljb25kKS0+Y29uZCApIHdpbmVfY29uZF9yZWFsX2luaXQoY29uZCk7CiAgZGV0YWlsID0gKCh3aW5lX2NvbmQpY29uZCktPmNvbmQ7CgogIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucy4gKi8KICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKICBkZXRhaWwtPndhaXRlcnNfY291bnQrKzsKICBSdGxMZWF2ZUNyaXRpY2FsU2VjdGlvbiAoJmRldGFpbC0+d2FpdGVyc19jb3VudF9sb2NrKTsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBXYWl0Rm9yU2luZ2xlT2JqZWN0IChkZXRhaWwtPnNlbWEsIG1zKTsKCiAgLyogUmVhY3F1aXJlIGxvY2sgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zLiAqLwogIFJ0bEVudGVyQ3JpdGljYWxTZWN0aW9uICgmZGV0YWlsLT53YWl0ZXJzX2NvdW50X2xvY2spOwoKICAvKiBXZSdyZSBubyBsb25nZXIgd2FpdGluZy4uLiAqLwogIGRldGFpbC0+d2FpdGVyc19jb3VudC0tOwoKICAvKiBDaGVjayB0byBzZWUgaWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIGFmdGVyIDxwdGhyZWFkX2NvbmRfYnJvYWRjYXN0Pi4gKi8KICBsYXN0X3dhaXRlciA9IGRldGFpbC0+d2FzX2Jyb2FkY2FzdCAmJiBkZXRhaWwtPndhaXRlcnNfY291bnQgPT0gMDsKCiAgUnRsTGVhdmVDcml0aWNhbFNlY3Rpb24gKCZkZXRhaWwtPndhaXRlcnNfY291bnRfbG9jayk7CgogIC8qCiAgICogSWYgd2UncmUgdGhlIGxhc3Qgd2FpdGVyIHRocmVhZCBkdXJpbmcgdGhpcyBwYXJ0aWN1bGFyIGJyb2FkY2FzdAogICAqIHRoZW4gbGV0IGFsbCB0aGUgb3RoZXIgdGhyZWFkcyBwcm9jZWVkLgogICAqLwogIGlmIChsYXN0X3dhaXRlcikgU2V0RXZlbnQgKGRldGFpbC0+d2FpdGVyc19kb25lKTsKICBSdGxFbnRlckNyaXRpY2FsU2VjdGlvbiAoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CgovKioqKiogTUlTQyAqKioqKi8KCnN0YXRpYyBwdGhyZWFkX3Qgd2luZV9wdGhyZWFkX3NlbGYodm9pZCkKewogIHJldHVybiAocHRocmVhZF90KUdldEN1cnJlbnRUaHJlYWRJZCgpOwp9CgpzdGF0aWMgaW50IHdpbmVfcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICByZXR1cm4gKERXT1JEKXRocmVhZDEgPT0gKERXT1JEKXRocmVhZDI7Cn0KCnN0YXRpYyB2b2lkIHdpbmVfcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCwgY2hhciAqY3VycmVudGZyYW1lKQp7CiAgICBFeGl0VGhyZWFkKChEV09SRF9QVFIpcmV0dmFsKTsKfQoKc3RhdGljIHZvaWQgKndpbmVfZ2V0X3RocmVhZF9kYXRhKHZvaWQpCnsKICAgIHJldHVybiBrZXJuZWxfZ2V0X3RocmVhZF9kYXRhKCktPnB0aHJlYWRfZGF0YTsKfQoKc3RhdGljIHZvaWQgd2luZV9zZXRfdGhyZWFkX2RhdGEoIHZvaWQgKmRhdGEgKQp7CiAgICBrZXJuZWxfZ2V0X3RocmVhZF9kYXRhKCktPnB0aHJlYWRfZGF0YSA9IGRhdGE7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2NhbGxiYWNrcyBjYWxsYmFja3MgPQp7CiAgICB3aW5lX2dldF90aHJlYWRfZGF0YSwgICAgICAgICAgIC8qIHB0cl9nZXRfdGhyZWFkX2RhdGEgKi8KICAgIHdpbmVfc2V0X3RocmVhZF9kYXRhLCAgICAgICAgICAgLyogcHRyX3NldF90aHJlYWRfZGF0YSAqLwogICAgd2luZV9wdGhyZWFkX3NlbGYsICAgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9zZWxmICovCiAgICB3aW5lX3B0aHJlYWRfZXF1YWwsICAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2VxdWFsICovCiAgICB3aW5lX3B0aHJlYWRfY3JlYXRlLCAgICAgICAgICAgIC8qIHB0cl9wdGhyZWFkX2NyZWF0ZSAqLwogICAgd2luZV9wdGhyZWFkX2NhbmNlbCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9jYW5jZWwgKi8KICAgIHdpbmVfcHRocmVhZF9qb2luLCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfam9pbiAqLwogICAgd2luZV9wdGhyZWFkX2RldGFjaCwgICAgICAgICAgICAvKiBwdHJfcHRocmVhZF9kZXRhY2ggKi8KICAgIHdpbmVfcHRocmVhZF9leGl0LCAgICAgICAgICAgICAgLyogcHRyX3B0aHJlYWRfZXhpdCAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X2luaXQsICAgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfbXV0ZXhfbG9jaywgICAgICAgIC8qIHB0cl9wdGhyZWFkX211dGV4X2xvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF90cnlsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayAqLwogICAgd2luZV9wdGhyZWFkX211dGV4X3VubG9jaywgICAgICAvKiBwdHJfcHRocmVhZF9tdXRleF91bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9tdXRleF9kZXN0cm95LCAgICAgLyogcHRyX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19pbml0LCAgICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfaW5pdCAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19kZXN0cm95LCAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja19yZGxvY2ssICAgICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfcmRsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja190cnlyZGxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9yd2xvY2tfd3Jsb2NrLCAgICAgLyogcHRyX3B0aHJlYWRfcndsb2NrX3dybG9jayAqLwogICAgd2luZV9wdGhyZWFkX3J3bG9ja190cnl3cmxvY2ssICAvKiBwdHJfcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrICovCiAgICB3aW5lX3B0aHJlYWRfcndsb2NrX3VubG9jaywgICAgIC8qIHB0cl9wdGhyZWFkX3J3bG9ja191bmxvY2sgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX2luaXQsICAgICAgICAgLyogcHRyX3B0aHJlYWRfY29uZF9pbml0ICovCiAgICB3aW5lX3B0aHJlYWRfY29uZF9kZXN0cm95LCAgICAgIC8qIHB0cl9wdGhyZWFkX2NvbmRfZGVzdHJveSAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfc2lnbmFsLCAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3NpZ25hbCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfYnJvYWRjYXN0LCAgICAvKiBwdHJfcHRocmVhZF9jb25kX2Jyb2FkY2FzdCAqLwogICAgd2luZV9wdGhyZWFkX2NvbmRfd2FpdCwgICAgICAgICAvKiBwdHJfcHRocmVhZF9jb25kX3dhaXQgKi8KICAgIHdpbmVfcHRocmVhZF9jb25kX3RpbWVkd2FpdCAgICAgLyogcHRyX3B0aHJlYWRfY29uZF90aW1lZHdhaXQgKi8KfTsKCnN0YXRpYyBzdHJ1Y3Qgd2luZV9wdGhyZWFkX2Z1bmN0aW9ucyBwdGhyZWFkX2Z1bmN0aW9uczsKCnZvaWQgUFRIUkVBRF9Jbml0KHZvaWQpCnsKICAgIHdpbmVfcHRocmVhZF9nZXRfZnVuY3Rpb25zKCAmcHRocmVhZF9mdW5jdGlvbnMsIHNpemVvZihwdGhyZWFkX2Z1bmN0aW9ucykgKTsKICAgIHB0aHJlYWRfZnVuY3Rpb25zLmluaXRfcHJvY2VzcyggJmNhbGxiYWNrcywgc2l6ZW9mKGNhbGxiYWNrcykgKTsKfQoKI2VuZGlmIC8qIEhBVkVfUFRIUkVBRF9IICovCg==