LyoKICogKEMpIENvcHlyaWdodCAyMDA4LTIwMTEKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgPGRhbmllbEBvbWljcm9uLnNlPgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL2ludGVycnVwdC5oPgojaW5jbHVkZSA8YXNtL2ljL3NjNTIwLmg+Cgp2b2lkIHNjNTIwX3RpbWVyX2lzcih2b2lkKQp7CgkvKiBBY2sgdGhlIEdQIFRpbWVyIEludGVycnVwdCAqLwoJd3JpdGViKDB4MDIsICZzYzUyMF9tbWNyLT5ncHRtcnN0YSk7Cn0KCmludCB0aW1lcl9pbml0KHZvaWQpCnsKCS8qIFJlZ2lzdGVyIHRoZSBTQzUyMCBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlciAqLwoJcmVnaXN0ZXJfdGltZXJfaXNyIChzYzUyMF90aW1lcl9pc3IpOwoKCS8qIEluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgZm9yIEdQIFRpbWVyIDEgKi8KCWlycV9pbnN0YWxsX2hhbmRsZXIgKDAsIHRpbWVyX2lzciwgTlVMTCk7CgoJLyogTWFwIEdQIFRpbWVyIDEgdG8gTWFzdGVyIFBJQyBJUjAgICovCgl3cml0ZWIoMHgwMSwgJnNjNTIwX21tY3ItPmdwX3Rtcl9pbnRfbWFwWzFdKTsKCgkvKiBEaXNhYmxlIEdQIFRpbWVycyAxICYgMiAtIEFsbG93IGNvbmZpZ3VyYXRpb24gd3JpdGVzICovCgl3cml0ZXcoMHg0MDAwLCAmc2M1MjBfbW1jci0+Z3B0bXIxY3RsKTsKCXdyaXRldygweDQwMDAsICZzYzUyMF9tbWNyLT5ncHRtcjJjdGwpOwoKCS8qIFJlc2V0IEdQIFRpbWVycyAxICYgMiAqLwoJd3JpdGV3KDB4MDAwMCwgJnNjNTIwX21tY3ItPmdwdG1yMWNudCk7Cgl3cml0ZXcoMHgwMDAwLCAmc2M1MjBfbW1jci0+Z3B0bXIyY250KTsKCgkvKiBTZXR1cCBHUCBUaW1lciAyIGFzIGEgMTAwa0h6ICgxMHVzKSBwcmVzY2FsZXIgKi8KCXdyaXRldyg4MywgJnNjNTIwX21tY3ItPmdwdG1yMm1heGNtcGEpOwoJd3JpdGV3KDB4YzAwMSwgJnNjNTIwX21tY3ItPmdwdG1yMmN0bCk7CgoJLyogU2V0dXAgR1AgVGltZXIgMSBhcyBhIDEwMDAgSHogKDFtcykgaW50ZXJydXB0IGdlbmVyYXRvciAqLwoJd3JpdGV3KDEwMCwgJnNjNTIwX21tY3ItPmdwdG1yMW1heGNtcGEpOwoJd3JpdGV3KDB4ZTAwOSwgJnNjNTIwX21tY3ItPmdwdG1yMWN0bCk7CgoJdW5tYXNrX2lycSAoMCk7CgoJLyogQ2xlYXIgdGhlIEdQIFRpbWVyIDEgc3RhdHVzIHJlZ2lzdGVyIHRvIGdldCB0aGUgc2hvdyByb2xsaW5nKi8KCXdyaXRlYigweDAyLCAmc2M1MjBfbW1jci0+Z3B0bXJzdGEpOwoKCXJldHVybiAwOwp9CgovKiBBbGxvdyBib2FyZHMgdG8gb3ZlcnJpZGUgdWRlbGF5IGltcGxlbWVudGF0aW9uICovCnZvaWQgX191ZGVsYXkodW5zaWduZWQgbG9uZyB1c2VjKQoJX19hdHRyaWJ1dGVfXygod2VhaywgYWxpYXMoInNjNTIwX3VkZWxheSIpKSk7Cgp2b2lkIHNjNTIwX3VkZWxheSh1bnNpZ25lZCBsb25nIHVzZWMpCnsKCWludCBtID0gMDsKCWxvbmcgdTsKCWxvbmcgdGVtcDsKCgl0ZW1wID0gcmVhZHcoJnNjNTIwX21tY3ItPnN3dG1ybWlsbGkpOwoJdGVtcCA9IHJlYWR3KCZzYzUyMF9tbWNyLT5zd3Rtcm1pY3JvKTsKCglkbyB7CgkJbSArPSByZWFkdygmc2M1MjBfbW1jci0+c3d0bXJtaWxsaSk7CgkJdSA9IHJlYWR3KCZzYzUyMF9tbWNyLT5zd3Rtcm1pY3JvKSArIChtICogMTAwMCk7Cgl9IHdoaWxlICh1IDwgdXNlYyk7Cn0K