LyogRmlsZSAiRmFzdFRpbWVzLmMiIC0gT3JpZ2luYWwgY29kZSBieSBNYXR0IFNsb3QgPGZwcmVmZWN0QGFtYnJvc2lhc3cuY29tPiAgKi8KLyogQ3JlYXRlZCA0LzI0Lzk5ICAgIC0gVGhpcyBmaWxlIGlzIGhlcmVieSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4gICAgICAgKi8KLyogVXBkYXRlZCA1LzIxLzk5ICAgIC0gQ2FsaWJyYXRlIHRvIFZJQSwgYWRkIFRCUiBzdXBwb3J0LCByZW5hbWVkIGZ1bmN0aW9ucyAgKi8KLyogVXBkYXRlZCAxMC80Lzk5ICAgIC0gVXNlIEFic29sdXRlVG9OYW5vc2Vjb25kcygpIGluIGNhc2UgQWJzb2x1dGUgPSBkb3VibGUgKi8KLyogVXBkYXRlZCAyLzE1LzAwICAgIC0gQ2hlY2sgZm9yIG5hdGl2ZSBUaW1lIE1hbmFnZXIsIG5vIG5lZWQgdG8gY2FsaWJyYXRlICAgKi8KLyogVXBkYXRlZCAyLzE5LzAwICAgIC0gRml4ZWQgZGVmYXVsdCB2YWx1ZSBmb3IgZ1NjYWxlIHVuZGVyIG5hdGl2ZSBUaW1lIE1nciAgKi8KLyogVXBkYXRlZCAzLzIxLzAwICAgIC0gRml4ZWQgbnMgY29udmVyc2lvbiwgY3JlYXRlIDIgZGlmZmVyZW50IHNjYWxlIGZhY3RvcnMgKi8KLyogVXBkYXRlZCA1LzAzLzAwICAgIC0gQWRkZWQgY29weXJpZ2h0IGFuZCBwbGFjZWQgaW50byBQRC4gTm8gY29kZSBjaGFuZ2VzICAgKi8KLyogVXBkYXRlZCA4LzAxLzAwICAgIC0gTWFkZSAiQ2FyYm9uLWNvbXBhdGlibGUiIGJ5IHJlcGxhY2luZyBMTUdldFRpY2tzKCkgICAgKi8KCi8qIFRoaXMgZmlsZSBpcyBDb3B5cmlnaHQgKEMpIE1hdHQgU2xvdCwgMTk5OS0yMDEyLiBJdCBpcyBoZXJlYnkgcGxhY2VkIGludG8gCiAgIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgYXV0aG9yIG1ha2VzIG5vIHdhcnJhbnR5IGFzIHRvIGZpdG5lc3Mgb3Igc3RhYmlsaXR5ICovCgojaW5jbHVkZSA8R2VzdGFsdC5oPgojaW5jbHVkZSA8TG93TWVtLmg+CiNpbmNsdWRlIDxDb2RlRnJhZ21lbnRzLmg+CiNpbmNsdWRlIDxEcml2ZXJTZXJ2aWNlcy5oPgojaW5jbHVkZSA8VGltZXIuaD4KCiNpbmNsdWRlICJGYXN0VGltZXMuaCIKCiNpZmRlZiBUQVJHRVRfQ1BVX1BQQwojdW5kZWYgR0VORVJBVElOR1BPV0VSUEMgLyogc3RvcCB3aGluaW5nICovCiNkZWZpbmUgR0VORVJBVElOR1BPV0VSUEMgVEFSR0VUX0NQVV9QUEMKI2VuZGlmCgovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwovKgoJT24gNjgweDAgbWFjaGluZXMsIHdlIGp1c3QgdXNlIE1pY3Jvc2Vjb25kcygpLgoJCglPbiBQb3dlclBDIG1hY2hpbmVzLCB3ZSB0cnkgc2V2ZXJhbCBtZXRob2RzOgoJICAqIERyaXZlclNlcnZpY2VzTGliIGlzIGF2YWlsYWJsZSBvbiBhbGwgUENJIFBvd2VyTWFjcywgYW5kIHBlcmhhcHMKCSAgICBzb21lIE51QnVzIFBvd2VyTWFjcy4gSWYgaXQgaXMsIHdlIHVzZSBVcFRpbWUoKSA6IE92ZXJoZWFkID0gMi4xILVzZWMuCgkgICogVGhlIFBvd2VyUEMgNjAxIGhhcyBhIGJ1aWx0LWluICJyZWFsIHRpbWUgY2xvY2siIFJUQywgYW5kIHdlIGZhbGwKCSAgICBiYWNrIHRvIHRoYXQsIGFjY2Vzc2luZyBpdCBkaXJlY3RseSBmcm9tIGFzbS4gT3ZlcmhlYWQgPSAxLjMgtXNlYy4KCSAgKiBMYXRlciBQb3dlclBDcyBoYXZlIGFuIGFjY3VyYXRlICJ0aW1lIGJhc2UgcmVnaXN0ZXIiIFRCUiwgYW5kIHdlIAoJICAgIGZhbGwgYmFjayB0byB0aGF0LCBhY2Nlc3MgaXQgZnJvbSBQb3dlclBDIGFzbS4gT3ZlcmhlYWQgPSAxLjMgtXNlYy4KCSAgKiBXZSBjYW4gYWxzbyB0cnkgTWljcm9zZWNvbmRzKCkgd2hpY2ggaXMgZW11bGF0ZWQgOiBPdmVyaGVhZCA9IDM2ILVzZWMuCgoJT24gUG93ZXJQQyBtYWNoaW5lcywgd2UgYXZvaWQgdGhlIGZvbGxvd2luZzoKCSAgKiBPcGVuVHJhbnNwb3J0IGlzIGF2YWlsYWJsZSBvbiBhbGwgUENJIGFuZCBzb21lIE51QnVzIFBvd2VyTWFjcywgYnV0IGl0CgkgICAgdXNlcyBVcFRpbWUoKSBpZiBhdmFpbGFibGUgYW5kIGZhbGxzIGJhY2sgdG8gTWljcm9zZWNvbmRzKCkgb3RoZXJ3aXNlLgoJICAqIElucHV0U3Byb2NrZXQgaXMgYXZhaWxhYmxlIG9uIG1hbnkgUG93ZXJNYWNzLCBidXQgYWdhaW4gaXQgdXNlcwoJICAgIFVwVGltZSgpIGlmIGF2YWlsYWJsZSBhbmQgZmFsbHMgYmFjayB0byBNaWNyb3NlY29uZHMoKSBvdGhlcndpc2UuCgoJQW5vdGhlciBQb3dlclBDIG5vdGU6IGNlcnRhaW4gY29uZmlndXJhdGlvbnMsIGVzcGVjaWFsbHkgM3JkIHBhcnR5IHVwZ3JhZGUKCWNhcmRzLCBtYXkgcmV0dXJuIGluYWNjdXJhdGUgdGltaW5ncyBmb3IgdGhlIENQVSBvciBtZW1vcnkgYnVzIC0tIGNhdXNpbmcKCXNrZXcgaW4gdmFyaW91cyBzeXN0ZW0gcm91dGluZXMgKHVwIHRvIDIwJSBkcmlmdCEpLiBUaGUgVklBIGNoaXAgaXMgdmVyeQoJYWNjdXJhdGUsIGFuZCBpdCdzIHRoZSBiYXNpcyBmb3IgdGhlIFRpbWUgTWFuYWdlciBhbmQgTWljcm9zZWNvbmRzKCkuCglVbmZvcnR1bmF0ZWx5LCBpdCdzIGFsc28gdmVyeSBzbG93IGJlY2F1c2UgdGhlIE1hY09TIGhhcyB0byAoYSkgc3dpdGNoIHRvCgk2OEsgYW5kIChiKSBwb2xsIGZvciBhIFZJQSBldmVudC4KCQoJV2UgY29tcGVuc2F0ZSBmb3IgdGhlIGRyaWZ0IGJ5IGNhbGlicmF0aW5nIGEgZmxvYXRpbmcgcG9pbnQgc2NhbGUgZmFjdG9yCgliZXR3ZWVuIG91ciBmYXN0IG1ldGhvZCBhbmQgdGhlIGFjY3VyYXRlIHRpbWVyIGF0IHN0YXJ0dXAsIHRoZW4gY29udmVydAoJZWFjaCBzYW1wbGUgcXVpY2tseSBvbiB0aGUgZmx5LiBJJ2QgcmF0aGVyIG5vdCBoYXZlIHRoZSBpbml0aWFsaXphdGlvbiAKCW92ZXJoZWFkIC0tIGJ1dCBpdCdzIHNpbXBseSBuZWNlc3NhcnkgZm9yIGFjY3VyYXRlIHRpbWluZy4gWW91IGNhbiBkcm9wCglpdCBkb3duIHRvIDMwIHRpY2tzIGlmIHlvdSBwcmVmZXIsIGJ1dCB0aGF0J3MgYXMgbG93IGFzIEknZCByZWNvbW1lbmQuCgoJVW5kZXIgTWFjT1MgOSwgIm5ldyB3b3JsZCIgTWFjcyAoaU1hY3MsIEIrVyBHM3MgYW5kIEcrVyBHNHMpIGhhdmUgYSBuYXRpdmUKCVRpbWUgTWFuYWdlciBpbXBsZW1lbnRhdGlvbjogVXBUaW1lKCksIE1pY3Jvc2Vjb25kcygpLCBhbmQgVGlja0NvdW50KCkgYXJlCglhbGwgYmFzZWQgb24gdGhlIHNhbWUgdW5kZXJseWluZyBjb3VudGVyLiBUaGlzIG1ha2VzIGl0IHNpbGx5IHRvIGNhbGlicmF0ZQoJVXBUaW1lKCkgYWdhaW5zdCBUaWNrQ291bnQoKS4gV2Ugbm93IGNoZWNrIGZvciB0aGlzIGZlYXR1cmUgdXNpbmcgR2VzdGFsdCgpLAoJYW5kIHNraXAgdGhlIHdob2xlIGNhbGlicmF0aW9uIHN0ZXAgaWYgcG9zc2libGUuCgoqLwovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwoKI2RlZmluZSBSVENUb05hbm8odykJKChkb3VibGUpICh3KS5oaSAqIDEwMDAwMDAwMDAuMCArIChkb3VibGUpICh3KS5sbykKI2RlZmluZSBXaWRlVG82NGJpdCh3KQkoKihVSW50NjQgKikgJih3KSkKCi8qIExNR2V0VGlja3MoKSBpcyBub3QgaW4gQ2FyYm9uIGFuZCBUaWNrQ291bnQoKSBoYXMgYSBmYWlyIGJpdCBvZiBvdmVyaGVhZCwKICAgc28gZm9yIHNwZWVkIHdlIGFsd2F5cyByZWFkIGxvd21lbSBkaXJlY3RseS4gVGhpcyBpcyBhIE1hYyBPUyBYIG5vLW5vLCBidXQgCiAgIGl0IGFsd2F5cyB3b3JrIG9uIHRob3NlIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIGEgbmF0aXZlIFRpbWUgTWFuYWdlciAoaWUsCiAgIGFueXRoaW5nIGJlZm9yZSBNYWNPUyA5KSAtLSByZWdhcmRsZXNzIHdoZXRoZXIgd2UgYXJlIGluIENhcmJvbiBvciBub3QhICovCiNkZWZpbmUgTXlMTUdldFRpY2tzKCkJKCoodm9sYXRpbGUgVUludDMyICopIDB4MTZBKQoKI2lmIEdFTkVSQVRJTkdQT1dFUlBDCgpzdGF0aWMgYXNtIFVuc2lnbmVkV2lkZSBQb2xsUlRDKHZvaWQpOwpzdGF0aWMgYXNtIFVuc2lnbmVkV2lkZSBQb2xsVEJSKHZvaWQpOwpzdGF0aWMgUHRyIEZpbmRGdW5jdGlvbkluU2hhcmVkTGliKFN0cmluZ1B0ciBsaWJOYW1lLCBTdHJpbmdQdHIgZnVuY05hbWUpOwoKc3RhdGljIEJvb2xlYW4JCQlnSW5pdGVkID0gZmFsc2U7CnN0YXRpYyBCb29sZWFuCQkJZ05hdGl2ZSA9IGZhbHNlOwpzdGF0aWMgQm9vbGVhbgkJCWdVc2VSVEMgPSBmYWxzZTsKc3RhdGljIEJvb2xlYW4JCQlnVXNlVEJSID0gZmFsc2U7CnN0YXRpYyBkb3VibGUJCQlnU2NhbGVVU2VjID0gMS4wIC8gMTAwMC4wOyAgICAvKiAxIC8gKCBuc2VjIC8gdXNlYykgKi8Kc3RhdGljIGRvdWJsZQkJCWdTY2FsZU1TZWMgPSAxLjAgLyAxMDAwMDAwLjA7IC8qIDEgLyAoIG5zZWMgLyBtc2VjKSAqLwoKLyogRnVuY3Rpb25zIGxvYWRlZCBmcm9tIERyaXZlclNlcnZpY2VzTGliICovCnR5cGVkZWYgQWJzb2x1dGVUaW1lIAkoKlVwVGltZVByb2NQdHIpKHZvaWQpOwp0eXBlZGVmIE5hbm9zZWNvbmRzIAkoKkEyTlNQcm9jUHRyKShBYnNvbHV0ZVRpbWUpOwpzdGF0aWMgVXBUaW1lUHJvY1B0ciAJZ1VwVGltZSA9IE5VTEw7CnN0YXRpYyBBMk5TUHJvY1B0ciAJCWdBMk5TID0gTlVMTDsKCiNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KCnZvaWQgRmFzdEluaXRpYWxpemUoKSB7CglTSW50MzIJCQlyZXN1bHQ7CgoJaWYgKCFnSW5pdGVkKSB7CgojaWYgR0VORVJBVElOR1BPV0VSUEMKCgkJLyogSW5pdGlhbGl6ZSB0aGUgZmVhdHVyZSBmbGFncyAqLwoJCWdOYXRpdmUgPSBnVXNlUlRDID0gZ1VzZVRCUiA9IGZhbHNlOwoKCQkvKiBXZSB1c2UgQ0ZNIHRvIGZpbmQgYW5kIGxvYWQgbmVlZGVkIHN5bWJvbHMgZnJvbSBzaGFyZWQgbGlicmFyaWVzLCBzbwoJCSAgIHRoZSBhcHBsaWNhdGlvbiBkb2Vzbid0IGhhdmUgdG8gd2Vhay1saW5rIHRoZW0sIGZvciBjb252ZW5pZW5jZS4gICAqLwoJCWdVcFRpbWUgPSAoVXBUaW1lUHJvY1B0cikgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoCgkJCQkiXHBEcml2ZXJTZXJ2aWNlc0xpYiIsICJccFVwVGltZSIpOwoJCWlmIChnVXBUaW1lKSBnQTJOUyA9IChBMk5TUHJvY1B0cikgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoCgkJCQkiXHBEcml2ZXJTZXJ2aWNlc0xpYiIsICJccEFic29sdXRlVG9OYW5vc2Vjb25kcyIpOwoJCWlmICghZ0EyTlMpIGdVcFRpbWUgPSBuaWw7IC8qIFBlZGFudGljIGJ1dCBuZWNlc3NhcnkgKi8KCgkJaWYgKGdVcFRpbWUpIHsKCQkJLyogSWYgd2UgbG9hZGVkIFVwVGltZSgpLCB0aGVuIHdlIG5lZWQgdG8ga25vdyBpZiB0aGUgc3lzdGVtIGhhcwoJCQkgICBhIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVGltZSBNYW5hZ2VyLiBJZiBzbywgdGhlbiBpdCdzCgkJCSAgIHBvaW50bGVzcyB0byBjYWxjdWxhdGUgYSBzY2FsZSBmYWN0b3IgYWdhaW5zdCB0aGUgbWlzc2luZyBWSUEgKi8KCgkJCS8qIGdlc3RhbHROYXRpdmVUaW1lTWdyID0gNCBpbiBzb21lIGZ1dHVyZSB2ZXJzaW9uIG9mIHRoZSBoZWFkZXJzICovCgkJCWlmICghR2VzdGFsdChnZXN0YWx0VGltZU1nclZlcnNpb24sICZyZXN1bHQpICYmCgkJCQkJKHJlc3VsdCA+IGdlc3RhbHRFeHRlbmRlZFRpbWVNZ3IpKSAKCQkJCWdOYXRpdmUgPSB0cnVlOwoJCQl9CgkJICBlbHNlIHsKCQkJLyogSWYgbm8gRHJpdmVyU2VydmljZXNMaWIsIHVzZSBHZXN0YWx0KCkgdG8gZ2V0IHRoZSBwcm9jZXNzb3IgdHlwZS4gCgkJCSAgIE9ubHkgTnVCdXMgUG93ZXJNYWNzIHdpdGggb2xkIFN5c3RlbSBTb2Z0d2FyZSB3b24ndCBoYXZlIERTTCwgc28KCQkJICAgd2Uga25vdyBpdCBzaG91bGQgZWl0aGVyIGJlIGEgNjAxIG9yIDYwMy4gKi8KCgkJCS8qIFVzZSB0aGUgcHJvY2Vzc29yIGdlc3RhbHQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlZ2lzdGVyIHRvIHVzZSAqLwoJCSAJaWYgKCFHZXN0YWx0KGdlc3RhbHROYXRpdmVDUFV0eXBlLCAmcmVzdWx0KSkgewoJCQkJaWYgKHJlc3VsdCA9PSBnZXN0YWx0Q1BVNjAxKSBnVXNlUlRDID0gdHJ1ZTsKCQkJCSAgZWxzZSBpZiAocmVzdWx0ID4gZ2VzdGFsdENQVTYwMSkgZ1VzZVRCUiA9IHRydWU7CgkJCQl9CgkJCX0KCgkJLyogTm93IGNhbGN1bGF0ZSBhIHNjYWxlIGZhY3RvciB0byBrZWVwIHVzIGFjY3VyYXRlLiAqLwoJCWlmICgoZ1VwVGltZSAmJiAhZ05hdGl2ZSkgfHwgZ1VzZVJUQyB8fCBnVXNlVEJSKSB7CgkJCVVJbnQ2NAkJCXRpY2ssIHVzZWMxLCB1c2VjMjsKCQkJVW5zaWduZWRXaWRlCXdpZGU7CgoJCQkvKiBXYWl0IGZvciB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2ZXJ5IG5leHQgdGljayAqLwoJCQlmb3IodGljayA9IE15TE1HZXRUaWNrcygpICsgMTsgdGljayA+IE15TE1HZXRUaWNrcygpOyApOwoJCQkKCQkJLyogUG9sbCB0aGUgc2VsZWN0ZWQgdGltZXIgYW5kIHByZXBhcmUgaXQgKHNpbmNlIHdlIGhhdmUgdGltZSkgKi8KCQkJd2lkZSA9IChnVXBUaW1lKSA/ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSkgOiAKCQkJCQkoKGdVc2VSVEMpID8gUG9sbFJUQygpIDogUG9sbFRCUigpKTsKCQkJdXNlYzEgPSAoZ1VzZVJUQykgPyBSVENUb05hbm8od2lkZSkgOiBXaWRlVG82NGJpdCh3aWRlKTsKCQkJCgkJCS8qIFdhaXQgZm9yIHRoZSBleGFjdCA2MHRoIHRpY2sgdG8gcm9sbCBvdmVyICovCgkJCXdoaWxlKHRpY2sgKyA2MCA+IE15TE1HZXRUaWNrcygpKTsKCgkJCS8qIFBvbGwgdGhlIHNlbGVjdGVkIHRpbWVyIGFnYWluIGFuZCBwcmVwYXJlIGl0ICAqLwoJCQl3aWRlID0gKGdVcFRpbWUpID8gKCpnQTJOUykoKCpnVXBUaW1lKSgpKSA6IAoJCQkJCSgoZ1VzZVJUQykgPyBQb2xsUlRDKCkgOiBQb2xsVEJSKCkpOwoJCQl1c2VjMiA9IChnVXNlUlRDKSA/IFJUQ1RvTmFubyh3aWRlKSA6IFdpZGVUbzY0Yml0KHdpZGUpOwoJCQkKCQkJLyogQ2FsY3VsYXRlIGEgc2NhbGUgdmFsdWUgdGhhdCB3aWxsIGdpdmUgbWljcm9zZWNvbmRzIHBlciBzZWNvbmQuCgkJCSAgIFJlbWVtYmVyLCB0aGVyZSBhcmUgYWN0dWFsbHkgNjAuMTUgdGlja3MgaW4gYSBzZWNvbmQsIG5vdCA2MC4gICovCgkJCWdTY2FsZVVTZWMgPSAoNjAuMCAqIDEwMDAwMDAuMCkgLyAoKHVzZWMyIC0gdXNlYzEpICogNjAuMTUpOwoJCQlnU2NhbGVNU2VjID0gZ1NjYWxlVVNlYyAvIDEwMDAuMDsKCQkJfQoKI2VuZGlmIC8qIEdFTkVSQVRJTkdQT1dFUlBDICovCgoJCS8qIFdlJ3ZlIGluaXRpYWxpemVkIG91ciBnbG9iYWxzICovCgkJZ0luaXRlZCA9IHRydWU7CgkJfQoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KClVJbnQ2NCBGYXN0TWljcm9zZWNvbmRzKCkgewoJVW5zaWduZWRXaWRlCXdpZGU7CglVSW50NjQJCQl1c2VjOwoJCiNpZiBHRU5FUkFUSU5HUE9XRVJQQwoJLyogSW5pdGlhbGl6ZSBnbG9iYWxzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBjYWxsZWQgKi8KCWlmICghZ0luaXRlZCkgRmFzdEluaXRpYWxpemUoKTsKCQoJaWYgKGdOYXRpdmUpIHsKCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCgkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CgkJdXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlVVNlYyArIDAuNTsKCQl9CgkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCgkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CgkJdXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlVVNlYyArIDAuNTsKCQl9CgkgIGVsc2UgaWYgKGdVc2VUQlIpIHsKCQkvKiBPbiBhIHJlY2VudCBQb3dlclBDLCB3ZSBwb2xsIHRoZSBUQlIgZGlyZWN0bHkgKi8KCQl3aWRlID0gUG9sbFRCUigpOwoJCXVzZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXNlUlRDKSB7CgkJLyogT24gYSA2MDEsIHdlIGNhbiBwb2xsIHRoZSBSVEMgaW5zdGVhZCAqLwoJCXdpZGUgPSBQb2xsUlRDKCk7CgkJdXNlYyA9IChkb3VibGUpIFJUQ1RvTmFubyh3aWRlKSAqIGdTY2FsZVVTZWMgKyAwLjU7CgkJfQoJICBlbHNlIAojZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KCQl7CgkJLyogSWYgYWxsIGVsc2UgZmFpbHMsIHN1ZmZlciB0aGUgbWl4ZWQgbW9kZSBvdmVyaGVhZCAqLwoJCU1pY3Jvc2Vjb25kcygmd2lkZSk7CgkJdXNlYyA9IFdpZGVUbzY0Yml0KHdpZGUpOwoJCX0KCglyZXR1cm4odXNlYyk7Cgl9CgovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwoKVUludDY0IEZhc3RNaWxsaXNlY29uZHMoKSB7CglVbnNpZ25lZFdpZGUJd2lkZTsKCVVJbnQ2NAkJCW1zZWM7CQoJCiNpZiBHRU5FUkFUSU5HUE9XRVJQQwoJLyogSW5pdGlhbGl6ZSBnbG9iYWxzIHRoZSBmaXJzdCB0aW1lIHdlIGFyZSBjYWxsZWQgKi8KCWlmICghZ0luaXRlZCkgRmFzdEluaXRpYWxpemUoKTsKCQoJaWYgKGdOYXRpdmUpIHsKCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCgkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CgkJbXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlTVNlYyArIDAuNTsKCQl9CgkgIGVsc2UgaWYgKGdVcFRpbWUpIHsKCQkvKiBVc2UgRHJpdmVyU2VydmljZXMgaWYgaXQncyBhdmFpbGFibGUgLS0gaXQncyBmYXN0IGFuZCBjb21wYXRpYmxlICovCgkJd2lkZSA9ICgqZ0EyTlMpKCgqZ1VwVGltZSkoKSk7CgkJbXNlYyA9IChkb3VibGUpIFdpZGVUbzY0Yml0KHdpZGUpICogZ1NjYWxlTVNlYyArIDAuNTsKCQl9CgkgIGVsc2UgaWYgKGdVc2VUQlIpIHsKCQkvKiBPbiBhIHJlY2VudCBQb3dlclBDLCB3ZSBwb2xsIHRoZSBUQlIgZGlyZWN0bHkgKi8KCQl3aWRlID0gUG9sbFRCUigpOwoJCW1zZWMgPSAoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7CgkJfQoJICBlbHNlIGlmIChnVXNlUlRDKSB7CgkJLyogT24gYSA2MDEsIHdlIGNhbiBwb2xsIHRoZSBSVEMgaW5zdGVhZCAqLwoJCXdpZGUgPSBQb2xsUlRDKCk7CgkJbXNlYyA9IChkb3VibGUpIFJUQ1RvTmFubyh3aWRlKSAqIGdTY2FsZU1TZWMgKyAwLjU7CgkJfQoJICBlbHNlIAojZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KCQl7CgkJLyogSWYgYWxsIGVsc2UgZmFpbHMsIHN1ZmZlciB0aGUgbWl4ZWQgbW9kZSBvdmVyaGVhZCAqLwoJCU1pY3Jvc2Vjb25kcygmd2lkZSk7CgkJbXNlYyA9ICgoZG91YmxlKSBXaWRlVG82NGJpdCh3aWRlKSArIDUwMC4wKSAvIDEwMDAuMDsKCQl9CgoJcmV0dXJuKG1zZWMpOwoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KClN0cmluZ1B0ciBGYXN0TWV0aG9kKCkgewoJU3RyaW5nUHRyCW1ldGhvZCA9ICJccDxVbmtub3duPiI7CgojaWYgR0VORVJBVElOR1BPV0VSUEMKCS8qIEluaXRpYWxpemUgZ2xvYmFscyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgY2FsbGVkICovCglpZiAoIWdJbml0ZWQpIEZhc3RJbml0aWFsaXplKCk7CgkKCWlmIChnTmF0aXZlKSB7CgkJLyogVGhlIFRpbWUgTWFuYWdlciBhbmQgVXBUaW1lKCkgYXJlIGVudGlyZWx5IG5hdGl2ZSBvbiB0aGlzIG1hY2hpbmUgKi8KCQltZXRob2QgPSAiXHBOYXRpdmUgVXBUaW1lKCkiOwoJCX0KCSAgZWxzZSBpZiAoZ1VwVGltZSkgewoJCS8qIFVzZSBEcml2ZXJTZXJ2aWNlcyBpZiBpdCdzIGF2YWlsYWJsZSAtLSBpdCdzIGZhc3QgYW5kIGNvbXBhdGlibGUgKi8KCQltZXRob2QgPSAiXHBVcFRpbWUoKSI7CgkJfQoJICBlbHNlIGlmIChnVXNlVEJSKSB7CgkJLyogT24gYSByZWNlbnQgUG93ZXJQQywgd2UgcG9sbCB0aGUgVEJSIGRpcmVjdGx5ICovCgkJbWV0aG9kID0gIlxwUG93ZXJQQyBUQlIiOwoJCX0KCSAgZWxzZSBpZiAoZ1VzZVJUQykgewoJCS8qIE9uIGEgNjAxLCB3ZSBjYW4gcG9sbCB0aGUgUlRDIGluc3RlYWQgKi8KCQltZXRob2QgPSAiXHBQb3dlclBDIFJUQyI7CgkJfQoJICBlbHNlIAojZW5kaWYgLyogR0VORVJBVElOR1BPV0VSUEMgKi8KCQl7CgkJLyogSWYgYWxsIGVsc2UgZmFpbHMsIHN1ZmZlciB0aGUgbWl4ZWQgbW9kZSBvdmVyaGVhZCAqLwoJCW1ldGhvZCA9ICJccE1pY3Jvc2Vjb25kcygpIjsKCQl9CgoJcmV0dXJuKG1ldGhvZCk7Cgl9CgovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwovKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqLwojcHJhZ21hIG1hcmsgLQoKI2lmIEdFTkVSQVRJTkdQT1dFUlBDCmFzbSBzdGF0aWMgVW5zaWduZWRXaWRlIFBvbGxSVENfKCkgewplbnRyeSBQb2xsUlRDIC8qIEF2b2lkIENvZGVXYXJyaW9yIGdsdWUgKi8KCW1hY2hpbmUgNjAxCkBBR0FJTjoKCW1mcnRjdQlyNCAvKiBSVENVID0gU1BSIDQgKi8KCW1mcnRjbAlyNSAvKiBSVENMID0gU1BSIDUgKi8KCW1mcnRjdQlyNgoJY21wdwlyNCxyNgoJYm5lCQlAQUdBSU4KCXN0dwkJcjQsMChyMykKCXN0dwkJcjUsNChyMykKCWJscgoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KCmFzbSBzdGF0aWMgVW5zaWduZWRXaWRlIFBvbGxUQlJfKCkgewplbnRyeSBQb2xsVEJSIC8qIEF2b2lkIENvZGVXYXJyaW9yIGdsdWUgKi8KCW1hY2hpbmUgNjA0CkBBR0FJTjoKCW1mdGJ1CXI0IC8qIFRCUlUgPSBTUFIgMjY4ICovCgltZnRiCXI1IC8qIFRCUkwgPSBTUFIgMjY5ICovCgltZnRidQlyNgoJY21wdwlyNCxyNgoJYm5lCQlAQUdBSU4KCXN0dwkJcjQsMChyMykKCXN0dwkJcjUsNChyMykKCWJscgoJfQoKLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KLyogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKioqKiAqKioqICoqKiogKi8KCnN0YXRpYyBQdHIgRmluZEZ1bmN0aW9uSW5TaGFyZWRMaWIoU3RyaW5nUHRyIGxpYk5hbWUsIFN0cmluZ1B0ciBmdW5jTmFtZSkgewoJT1NFcnIJCQkJZXJyb3IgPSBub0VycjsKCVN0cjI1NQkJCQllcnJvclN0cjsKCVB0cgkJCQkJZnVuYyA9IE5VTEw7CglQdHIJCQkJCWVudHJ5ID0gTlVMTDsKCUNGcmFnU3ltYm9sQ2xhc3MJc3ltQ2xhc3M7CglDRnJhZ0Nvbm5lY3Rpb25JRAljb25uSUQ7CgkKCS8qIEZpbmQgQ0ZNIGNvbnRhaW5lcnMgZm9yIHRoZSBjdXJyZW50IGFyY2hlY3R1cmUgLS0gQ0ZNLVBQQyBvciBDRk0tNjhLICovCglpZiAoLyogZXJyb3IgPSAqLyBHZXRTaGFyZWRMaWJyYXJ5KGxpYk5hbWUsIGtDb21waWxlZENGcmFnQXJjaCwKCQkJa0xvYWRDRnJhZywgJmNvbm5JRCwgJmVudHJ5LCBlcnJvclN0cikpIHJldHVybihOVUxMKTsKCWlmICgvKiBlcnJvciA9ICovIEZpbmRTeW1ib2woY29ubklELCBmdW5jTmFtZSwgJmZ1bmMsICZzeW1DbGFzcykpCgkJcmV0dXJuKE5VTEwpOwoJCglyZXR1cm4oZnVuYyk7Cgl9CiNlbmRpZiAvKiBHRU5FUkFUSU5HUE9XRVJQQyAqLwo=