LyoKICogbGludXgvYXJjaC9hcm0vbWFjaC1vbWFwMi90aW1lci1ncC5jCiAqCiAqIE9NQVAyIEdQIHRpbWVyIHN1cHBvcnQuCiAqCiAqIENvcHlyaWdodCAoQykgMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgogKiBBdXRob3I6IFBhdWwgTXVuZHQgPHBhdWwubXVuZHRAbm9raWEuY29tPgogKiAgICAgICAgIEp1aGEgWXJq9mzkIDxqdWhhLnlyam9sYUBub2tpYS5jb20+CiAqCiAqIFNvbWUgcGFydHMgYmFzZWQgb2ZmIG9mIFRJJ3MgMjR4eCBjb2RlOgogKgogKiAgIENvcHlyaWdodCAoQykgMjAwNCBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgogKgogKiBSb3VnaGx5IG1vZGVsbGVkIGFmdGVyIHRoZSBPTUFQMSBNUFUgdGltZXIgY29kZS4KICoKICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZS4gU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCiAqIGZvciBtb3JlIGRldGFpbHMuCiAqLwojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvdGltZS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9lcnIuaD4KI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KI2luY2x1ZGUgPGFzbS9kZWxheS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaGFyZHdhcmUvY2xvY2suaD4KCiNkZWZpbmUgT01BUDJfR1BfVElNRVIxX0JBU0UJMHg0ODAyODAwMAojZGVmaW5lIE9NQVAyX0dQX1RJTUVSMl9CQVNFCTB4NDgwMmEwMDAKI2RlZmluZSBPTUFQMl9HUF9USU1FUjNfQkFTRQkweDQ4MDc4MDAwCiNkZWZpbmUgT01BUDJfR1BfVElNRVI0X0JBU0UJMHg0ODA3YTAwMAoKI2RlZmluZSBHUF9USU1FUl9USURSCQkweDAwCiNkZWZpbmUgR1BfVElNRVJfVElTUgkJMHgxOAojZGVmaW5lIEdQX1RJTUVSX1RJRVIJCTB4MWMKI2RlZmluZSBHUF9USU1FUl9UQ0xSCQkweDI0CiNkZWZpbmUgR1BfVElNRVJfVENSUgkJMHgyOAojZGVmaW5lIEdQX1RJTUVSX1RMRFIJCTB4MmMKI2RlZmluZSBHUF9USU1FUl9UU0lDUgkJMHg0MAoKI2RlZmluZSBPU19USU1FUl9OUgkJMSAgLyogR1AgdGltZXIgMiAqLwoKc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfYmFzZVtdID0gewoJSU9fQUREUkVTUyhPTUFQMl9HUF9USU1FUjFfQkFTRSksCglJT19BRERSRVNTKE9NQVAyX0dQX1RJTUVSMl9CQVNFKSwKCUlPX0FERFJFU1MoT01BUDJfR1BfVElNRVIzX0JBU0UpLAoJSU9fQUREUkVTUyhPTUFQMl9HUF9USU1FUjRfQkFTRSksCn07CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0aW1lcl9yZWFkX3JlZyhpbnQgbnIsIHVuc2lnbmVkIGludCByZWcpCnsKCXJldHVybiBfX3Jhd19yZWFkbCh0aW1lcl9iYXNlW25yXSArIHJlZyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl93cml0ZV9yZWcoaW50IG5yLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQp7CglfX3Jhd193cml0ZWwodmFsLCB0aW1lcl9iYXNlW25yXSArIHJlZyk7Cn0KCi8qIE5vdGUgdGhhdCB3ZSBhbHdheXMgZW5hYmxlIHRoZSBjbG9jayBwcmVzY2FsZSBkaXZpZGVyIGJpdCAqLwpzdGF0aWMgaW5saW5lIHZvaWQgb21hcDJfZ3BfdGltZXJfc3RhcnQoaW50IG5yLCB1bnNpZ25lZCBsb25nIGxvYWRfdmFsKQp7Cgl1bnNpZ25lZCBpbnQgdG1wOwoKCXRtcCA9IDB4ZmZmZmZmZmYgLSBsb2FkX3ZhbDsKCgl0aW1lcl93cml0ZV9yZWcobnIsIEdQX1RJTUVSX1RMRFIsIHRtcCk7Cgl0aW1lcl93cml0ZV9yZWcobnIsIEdQX1RJTUVSX1RDUlIsIHRtcCk7Cgl0aW1lcl93cml0ZV9yZWcobnIsIEdQX1RJTUVSX1RJRVIsIDEgPDwgMSk7Cgl0aW1lcl93cml0ZV9yZWcobnIsIEdQX1RJTUVSX1RDTFIsICgxIDw8IDUpIHwgKDEgPDwgMSkgfCAxKTsKfQoKc3RhdGljIGlycXJldHVybl90IG9tYXAyX2dwX3RpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsCgkJCQkJICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQp7Cgl3cml0ZV9zZXFsb2NrKCZ4dGltZV9sb2NrKTsKCgl0aW1lcl93cml0ZV9yZWcoT1NfVElNRVJfTlIsIEdQX1RJTUVSX1RJU1IsIDEgPDwgMSk7Cgl0aW1lcl90aWNrKHJlZ3MpOwoKCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CgoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgpzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBvbWFwMl9ncF90aW1lcl9pcnEgPSB7CgkubmFtZQkJPSAiZ3AgdGltZXIiLAoJLmZsYWdzCQk9IFNBX0lOVEVSUlVQVCwKCS5oYW5kbGVyCT0gb21hcDJfZ3BfdGltZXJfaW50ZXJydXB0LAp9OwoKc3RhdGljIHZvaWQgX19pbml0IG9tYXAyX2dwX3RpbWVyX2luaXQodm9pZCkKewoJc3RydWN0IGNsayAqIHN5c19jazsKCXUzMiB0aWNrX3BlcmlvZCA9IDEyMDAwMDsKCXUzMiBsOwoKCS8qIFJlc2V0IGNsb2NrIGFuZCBwcmVzY2FsZSB2YWx1ZSAqLwoJdGltZXJfd3JpdGVfcmVnKE9TX1RJTUVSX05SLCBHUF9USU1FUl9UQ0xSLCAwKTsKCglzeXNfY2sgPSBjbGtfZ2V0KE5VTEwsICJzeXNfY2siKTsKCWlmIChJU19FUlIoc3lzX2NrKSkKCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBnZXQgc3lzX2NrXG4iKTsKCWVsc2UgewoJCWNsa191c2Uoc3lzX2NrKTsKCQl0aWNrX3BlcmlvZCA9IGNsa19nZXRfcmF0ZShzeXNfY2spIC8gMTAwOwoJCWNsa19wdXQoc3lzX2NrKTsKCX0KCgl0aWNrX3BlcmlvZCAvPSAyOwkvKiBNaW5pbXVtIHByZXNjYWxlIGRpdmlkZXIgaXMgMiAqLwoJdGlja19wZXJpb2QgLT0gMTsKCglsID0gdGltZXJfcmVhZF9yZWcoT1NfVElNRVJfTlIsIEdQX1RJTUVSX1RJRFIpOwoJcHJpbnRrKEtFUk5fSU5GTyAiT01BUDIgR1AgdGltZXIgKEhXIHZlcnNpb24gJWQuJWQpXG4iLAoJICAgICAgIChsID4+IDQpICYgMHgwZiwgbCAmIDB4MGYpOwoKCXNldHVwX2lycSgzOCwgJm9tYXAyX2dwX3RpbWVyX2lycSk7CgoJb21hcDJfZ3BfdGltZXJfc3RhcnQoT1NfVElNRVJfTlIsIHRpY2tfcGVyaW9kKTsKfQoKc3RydWN0IHN5c190aW1lciBvbWFwX3RpbWVyID0gewoJLmluaXQJPSBvbWFwMl9ncF90aW1lcl9pbml0LAp9OwoK