LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogqSAyMDE1IE1pY3JvY2hpcCBUZWNobm9sb2d5IEluYy4gYW5kIGl0cyBzdWJzaWRpYXJpZXMuCiogWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBhbmQgYW55IGRlcml2YXRpdmVzIGV4Y2x1c2l2ZWx5IHdpdGgKKiBNaWNyb2NoaXAgcHJvZHVjdHMuCiogVEhJUyBTT0ZUV0FSRSBJUyBTVVBQTElFRCBCWSBNSUNST0NISVAgIkFTIElTIi4KKiBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQgT1IgU1RBVFVUT1JZLCBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLAoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwKKiBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIElUUyBJTlRFUkFDVElPTiBXSVRIIE1JQ1JPQ0hJUAoqIFBST0RVQ1RTLCBDT01CSU5BVElPTiBXSVRIIEFOWSBPVEhFUiBQUk9EVUNUUywgT1IgVVNFIElOIEFOWSBBUFBMSUNBVElPTi4KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsCiogSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIExPU1MsIERBTUFHRSwgQ09TVCBPUiBFWFBFTlNFIE9GIEFOWSBLSU5ECiogV0hBVFNPRVZFUiBSRUxBVEVEIFRPIFRIRSBTT0ZUV0FSRSwgSE9XRVZFUiBDQVVTRUQsIEVWRU4gSUYgTUlDUk9DSElQIEhBUwoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLgoqIFRPIFRIRSBGVUxMRVNUIEVYVEVOVCBBTExPV0VEIEJZIExBVywgTUlDUk9DSElQJ1MgVE9UQUwgTElBQklMSVRZIE9OIEFMTAoqIENMQUlNUyBJTiBBTlkgV0FZIFJFTEFURUQgVE8gVEhJUyBTT0ZUV0FSRSBXSUxMIE5PVCBFWENFRUQgVEhFIEFNT1VOVCBPRgoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4KKiBNSUNST0NISVAgUFJPVklERVMgVEhJUyBTT0ZUV0FSRSBDT05ESVRJT05BTExZIFVQT04gWU9VUiBBQ0NFUFRBTkNFCiogT0YgVEhFU0UgVEVSTVMuCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiBDb250cm9sIEluZm9ybWF0aW9uIChQZXJmb3JjZSkKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiRSZXZpc2lvbjogIzEgJCAKJERhdGVUaW1lOiAyMDE2LzA0LzA4IDEwOjE4OjI4ICQgCiRBdXRob3I6IHByYW1hbnMgJApMYXN0IENoYW5nZToJVXBkYXRlZCBmb3IgdGFicwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKiBAZmlsZSBidGltZXJfYXBpLmMKKiBcYnJpZWYgQmFzaWMgVGltZXIgQVBJcyBTb3VyY2UgZmlsZQoqIFxhdXRob3IganZhc2FudGgKKiAKKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQmFzaWMgVGltZXIgQVBJIGZ1bmN0aW9ucyAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qKiBAZGVmZ3JvdXAgQmFzaWNfVGltZXIKICogIEB7CiAqLwoKI2luY2x1ZGUgImNvbW1vbl9saWIuaCIKI2luY2x1ZGUgImJ0aW1lci5oIgojaW5jbHVkZSAiLi5ccGNyXHBjci5oIgovLyNpbmNsdWRlICIuLlxpbnRlcnJ1cHRcZWNpYS5oIgoKLyoqIEJhc2ljIFRpbWVyIFNsZWVwIFJlZ2lzdGVycyAmIEJpdCBQb3NpdGlvbnMgKi8Kc3RhdGljIGNvbnN0IHVpbnQzMl90IGJ0bXJfcGNyX2lkW0JUSU1FUl9NQVhfSU5TVEFOQ0VdID0gewogICAgUENSX0JUSU1FUjAsCiAgICBQQ1JfQlRJTUVSMSwKICAgIFBDUl9CVElNRVIyLAogICAgUENSX0JUSU1FUjMsCiAgICBQQ1JfQlRJTUVSNCwKICAgIFBDUl9CVElNRVI1Cn07CgojaWZkZWYgUExJQl9CVElNRVJfQ0hFQ0tfSUQKCi8qKiBMb2NhbCBoZWxwZXIgdGhhdCBjaGVja3MgaWYgbG9naWNhbCBUaW1lciBJRCBpcyB2YWxpZC4gIAogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElEIAogKiBAcmV0dXJuIHVpbnQ4X3QgTm9uLXplcm8oVkFMSUQpLCAwKEludmFsaWQpCiAqLwpzdGF0aWMgdWludDhfdCBidG1yX3ZhbGlkKHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICBpZiAoIGJ0aW1lcl9pZCA8IChQSURfQlRJTUVSX01BWCApICkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9CgojZWxzZQoKCi8qKiBUaGlzIHZlcnNpb24gb2YgdG1yX3ZhbGlkIHNraXBzIGNoZWNraW5nIGFsd2F5cyByZXR1cm5pbmcgMS4gIAogKiAgQ29tcGlsZXIgbWF5IG9wdGltaXplIGl0IG91dC4KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRCAKICogQHJldHVybiB1aW50OF90IDEoVkFMSUQpIAogKi8Kc3RhdGljIHVpbnQ4X3QgYnRtcl92YWxpZCh1aW50OF90IGJ0aW1lcl9pZCkgeyByZXR1cm4gMTsgfQoKI2VuZGlmCgoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwovKiAgICAgICAgICAgICAgICAgQmFzaWMgVGltZXIgSW50aXRpYWxpemF0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qKiBJbml0aWFsaXplIHNwZWNpZmllZCB0aW1lcgogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElECiAqIEBwYXJhbSB0bXJfY250bCBMb2dpY2FsIGZsYWdzIGZvciBUaW1lciBDb250cm9sCiAqIEBwYXJhbSBpbml0aWFsX2NvdW50IEluaXRpYWwgQ291bnQKICogQHBhcmFtIHByZWxvYWRfY291bnQgUHJlbG9hZCBDb3VudAogKiBAbm90ZSBQZXJmb3JtcyBhIHNvZnQgcmVzZXQgb2YgdGhlIHRpbWVyIGJlZm9yZSBjb25maWd1cmF0aW9uIAogKi8Kdm9pZCBidGltZXJfaW5pdCh1aW50OF90IGJ0aW1lcl9pZCwgCiAgICAgICAgICAgICAgIHVpbnQxNl90IHRtcl9jbnRsLAogICAgICAgICAgICAgICB1aW50MTZfdCBwcmVzY2FsZXIsCiAgICAgICAgICAgICAgIHVpbnQzMl90IGluaXRpYWxfY291bnQsCiAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWxvYWRfY291bnQpCnsgICAgCgkgdWludDMyX3QgdmFsdWU7ICAgIAoKICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpIHsKCQkJCiAgICAgICAgYnRpbWVyX3Jlc2V0KGJ0aW1lcl9pZCk7IAogICAgICAgIAogICAgICAgIC8vIFVuZ2F0ZSB0aW1lciBjbG9ja3MgYW5kIHByb2dyYW0gcHJlc2NhbGUKICAgICAgICB2YWx1ZSA9ICgodWludDMyX3QpcHJlc2NhbGVyIDw8IDE2KSArIChCVElNRVJfQ05UTF9FTkFCTEUpOwkJCSAgCiAgICAgICAgcF9idGltZXJfY3RybF93cml0ZShidGltZXJfaWQsIHZhbHVlKTsKICAgIAogICAgICAgIC8vIFByb2dyYW0gUHJlbG9hZCAmIGluaXRpYWwgY291bnRlciB2YWx1ZQogICAgICAgIHBfYnRpbWVyX3ByZWxvYWRfc2V0KGJ0aW1lcl9pZCwgcHJlbG9hZF9jb3VudCk7CiAgICAgICAgcF9idGltZXJfY291bnRfc2V0KGJ0aW1lcl9pZCwgaW5pdGlhbF9jb3VudCk7CQkJCiAgICAgICAgCiAgICAgICAgLy8gUHJvZ3JhbSBjb250cm9sIHJlZ2lzdGVyLCBpbnRlcnJ1cHQgZW5hYmxlLCBhbmQgY2xlYXIgc3RhdHVzCiAgICAgICAgaWYgKHRtcl9jbnRsICYgQlRJTUVSX0NPVU5UX1VQKSB7CQkJCQkKICAgICAgICAgICAgcF9idGltZXJfY3RybF9jb3VudGVyX2Rpcl9zZXQoYnRpbWVyX2lkKTsgICAgICAgICAgICAKICAgICAgICB9CiAgICAgICAgaWYgKHRtcl9jbnRsICYgQlRJTUVSX0FVVE9fUkVTVEFSVCkgewogICAgICAgICAgICBwX2J0aW1lcl9jdHJsX2F1dG9fcmVzdGFydF9zZXQoYnRpbWVyX2lkKTsgICAgICAgICAgICAgCiAgICAgICAgfSAgICAgICAgCiAgICAgICAgaWYgKHRtcl9jbnRsICYgQlRJTUVSX0lOVF9FTikgewkJCQkJCiAgICAgICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfc2V0KGJ0aW1lcl9pZCk7IC8vIGVuYWJsZSBmaXJzdAogICAgICAgICAgICBwX2J0aW1lcl9pbnRfc3RhdHVzX2NscihidGltZXJfaWQpOyAvLyBjbGVhciBzdGF0dXMgICAgICAgICAgCiAgICAgICAgfQogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgIEZ1bmN0aW9ucyB0byBwcm9ncmFtIGFuZCByZWFkIHRoZSBCYXNpYyBUaW1lciBDb3VudGVyICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIFByb2dyYW0gdGltZXIncyBjb3VudGVyIHJlZ2lzdGVyLgogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElECiAqIEBwYXJhbSBjb3VudCBuZXcgY291bnRlciB2YWx1ZSAKICogQG5vdGUgVGltZXIgaGFyZHdhcmUgbWF5IGltcGxlbWVudCBhIDE2LWJpdCBvciAzMi1iaXQgCiAqICAgICAgIGhhcmR3YXJlIGNvdW50ZXIuIElmIHRoZSB0aW1lciBpcyAxNi1iaXQgb25seSB0aGUgbG93ZXIKICogICAgICAgMTYtYml0cyBvZiB0aGUgY291bnQgcGFyYW10ZXIgYXJlIHVzZWQuCiAqLwp2b2lkIGJ0aW1lcl9jb3VudF9zZXQodWludDhfdCBidGltZXJfaWQsIHVpbnQzMl90IGNvdW50KQp7CiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsgICAgICAgCgkJCQogICAgICAgIHBfYnRpbWVyX2NvdW50X3NldChidGltZXJfaWQsIGNvdW50KTsgICAgICAgIAogICAgfQp9CgovKiogUmV0dXJuIGN1cnJlbnQgdmFsdWUgb2YgdGltZXIncyBjb3VudCByZWdpc3Rlci4KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4gCiAqIEByZXR1cm4gdWludDMyX3QgdGltZXIgY291bnQgbWF5IGJlIDMyIG9yIDE2IGJpdHMgZGVwZW5kaW5nIAogKiAgICAgICAgIHVwb24gdGhlIGhhcmR3YXJlLiAgVGltZXJzIDAtMyBhcmUgMTYtYml0CiAqICAgICAgICAgYW5kIFRpbWVycyA0LTUgYXJlIDMyLWJpdC4KICovCnVpbnQzMl90IGJ0aW1lcl9jb3VudF9nZXQodWludDhfdCBidGltZXJfaWQpCnsgICAgCiAgICB1aW50MzJfdCBjbnQ7CiAgICAKICAgIGNudCA9IDB1bDsKICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgeyAgICAgICAgCgkJCQogICAgICAgIGNudCA9IHBfYnRpbWVyX2NvdW50X2dldChidGltZXJfaWQpOyAgICAgICAgCiAgICB9CiAgICAKICAgIHJldHVybiBjbnQ7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgRnVuY3Rpb24gdG8gcmVsb2FkIGNvdW50ZXIgZnJvbSBQcmVsb2FkIFJlZ2lzdGVyICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogRm9yY2UgdGltZXIgdG8gcmVsb2FkIGNvdW50ZXIgZnJvbSBwcmVsb2FkIAogKiByZWdpc3Rlci4gIAogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELiAKICogQG5vdGUgSGFyZHdhcmUgd2lsbCBvbmx5IHJlbG9hZCBjb3VudGVyIGlmIHRpbWVyIGlzIHJ1bm5pbmcuIAogKi8Kdm9pZCBidGltZXJfcmVsb2FkKHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsgICAgICAgIAoJCQkKICAgICAgICBpZiAocF9idGltZXJfY3RybF9zdGFydF9nZXQoYnRpbWVyX2lkKSkgLy9DaGVjayBpZiB0aW1lciBpcyBydW5uaW5nCiAgICAgICAgewogICAgICAgICAgICAgICAgcF9idGltZXJfY3RybF9yZWxvYWRfc2V0KGJ0aW1lcl9pZCk7CiAgICAgICAgfQogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICBGdW5jdGlvbnMgZm9yIHN0b3BwaW5nIGFuZCBzdGFydGluZyB0aGUgYmFzaWMgVGltZXIgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIFN0YXJ0IHRpbWVyIGNvdW50aW5nLgogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELgogKi8Kdm9pZCBidGltZXJfc3RhcnQodWludDhfdCBidGltZXJfaWQpCnsKICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgewogICAgICAgICAgICAKICAgICAgICBwX2J0aW1lcl9jdHJsX3N0YXJ0X3NldChidGltZXJfaWQpOwogICAgfQp9CgovKiogU3RvcCB0aW1lci4gCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIAogKiBAbm90ZSBXaGVuIGEgc3RvcHBlZCB0aW1lciBpcyBzdGFydGVkIGFnYWluIGl0IHdpbGwgcmVsb2FkIAogKiAgICAgICB0aGUgY291bnQgcmVnaXN0ZXIgZnJvbSBwcmVsb2FkIHZhbHVlLgogKi8Kdm9pZCBidGltZXJfc3RvcCh1aW50OF90IGJ0aW1lcl9pZCkKewogICAgaWYgKCBidG1yX3ZhbGlkKGJ0aW1lcl9pZCkgKSB7ICAgICAgICAKCQkJCiAgICAgICAgcF9idGltZXJfY3RybF9zdGFydF9jbHIoYnRpbWVyX2lkKTsJCQkKICAgICAgICAKICAgIH0KfQoKLyoqIFJldHVybiBzdGF0ZSBvZiB0aW1lcidzIFNUQVJUIGJpdC4gCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIAogKiBAcmV0dXJuIHVpbnQ4X3QgMCh0aW1lciBub3Qgc3RhcnRlZCksIDEgKHRpbWVyIHN0YXJ0ZWQpCiAqLwp1aW50OF90IGJ0aW1lcl9pc19zdGFydGVkKHVpbnQ4X3QgYnRpbWVyX2lkKQp7IAogICAgdWludDhfdCBzdHM7CiAgICAKICAgIHN0cyA9IDA7CiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsJICAKIAkJCQogICAgICAgIGlmIChwX2J0aW1lcl9jdHJsX3N0YXJ0X2dldChidGltZXJfaWQpKQkKICAgICAgICB7CiAgICAgICAgICAgIHN0cyA9IDE7CiAgICAgICAgfQkJCQkJCiAgICB9CiAgICByZXR1cm4gc3RzOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgIEZ1bmN0aW9uIHRvIHBlcmZvcm0gYmFzaWMgdGltZXIgc29mdCByZXNldCAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIFBlZm9ybSBzb2Z0IHJlc2V0IG9mIHNwZWNpZmllZCB0aW1lci4gCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQgCiAqIEBub3RlIFNvZnQgcmVzZXQgc2V0IGFsbCByZWdpc3RlcnMgdG8gUE9SIHZhbHVlcy4KICogU3BpbnMgMjU2IHRpbWVzIHdhaXRpbmcgb24gaGFyZHdhcmUgdG8gY2xlYXIgcmVzZXQgYml0LiAKICovCnZvaWQgYnRpbWVyX3Jlc2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQp7ICAgCiAgICB1aW50MzJfdCB3YWl0X2NudDsKICAgIHVpbnQ4X3Qgc29mdF9yZXNldF9zdHM7CgogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkgeyAgICAgIAoJCSAKICAgICAgICBwX2J0aW1lcl9jdHJsX3NvZnRfcmVzZXRfc2V0KGJ0aW1lcl9pZCk7ICAgIAoKICAgICAgICB3YWl0X2NudCA9IDI1NnVsOwogICAgICAgIGRvIHsKICAgICAgICAgICAgc29mdF9yZXNldF9zdHMgPSBwX2J0aW1lcl9jdHJsX3NvZnRfcmVzZXRfc3RzX2dldChidGltZXJfaWQpOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKDAgPT0gc29mdF9yZXNldF9zdHMpeyAgICAgICAgICAKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfSAKICAgICAgICB3aGlsZSAoIHdhaXRfY250LS0gKTsgCiAgICB9ICAgICAgCn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgRnVuY3Rpb25zIHRvIGhhbHQvdW5oYWx0IHRoZSB0aW1lciBjb3VudGluZyAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogSGFsdCB0aW1lciBjb3VudGluZyB3aXRoIG5vIHJlbG9hZCBvbiB1bmhhbHQuICAgCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIAogKiBAbm90ZSBBIGhhbHRlZCB0aW1lciB3aWxsIG5vdCByZWxvYWQgdGhlIGNvdW50IHJlZ2lzdGVyIHdoZW4gCiAqICAgICAgIHVuaGFsdGVkLCBpdCB3aWxsIGNvbnRpbnVlIGNvdW50aW5nIGZyb20gdGhlIGN1cnJlbnQKICogICAgICAgY291bnQgdmFsdWUuCiAqLwp2b2lkIGJ0aW1lcl9oYWx0KHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsKIAkJCQogICAgICAgIHBfYnRpbWVyX2N0cmxfaGFsdF9zZXQoYnRpbWVyX2lkKTsgICAgICAgIAogICAgfQp9CgovKiogVW5oYWx0IHRpbWVyIGNvdW50aW5nLiAKICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4KICovCnZvaWQgYnRpbWVyX3VuaGFsdCh1aW50OF90IGJ0aW1lcl9pZCkKewogICAgaWYgKCBidG1yX3ZhbGlkKGJ0aW1lcl9pZCkgKSB7IAoJCQkKICAgICAgICBwX2J0aW1lcl9jdHJsX2hhbHRfY2xyKGJ0aW1lcl9pZCk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgRnVuY3Rpb25zIGZvciBCYXNpYyBUaW1lciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogRW5hYmxlIHNwZWNpZmllZCB0aW1lcidzIGludGVycnVwdCBmcm9tIHRoZSBibG9jay4gCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuCiAqIEBwYXJhbSBpZW4gTm9uLXplcm8gZW5hYmxlIGludGVycnVwdCBpbiB0aW1lciBibG9jaywgMCAKICogICAgICAgICAgICBkaXNhYmxlLgogKi8Kdm9pZCBidGltZXJfaW50ZXJydXB0X2VuYWJsZSh1aW50OF90IGJ0aW1lcl9pZCwgdWludDhfdCBpZW4pCnsgICAgCiAgICBpZiAoYnRtcl92YWxpZChidGltZXJfaWQpKSB7ICAgICAgCgkJCQogICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfc2V0KGJ0aW1lcl9pZCk7CgogICAgICAgIGlmIChpZW4pIHsKICAgICAgICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfc2V0KGJ0aW1lcl9pZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfY2xyKGJ0aW1lcl9pZCk7CiAgICAgICAgfQogICAgfQp9CgovKiogUmVhZCBUaW1lciBpbnRlcnJ1cHQgc3RhdHVzIGFuZCBjbGVhciBpZiBzZXQgCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIAogKiBAcmV0dXJuIHVpbnQ4X3QgMSAoVGltZXIgaW50ZXJydXB0IHN0YXR1cyBzZXQpIGVsc2UgMC4gCiAqIEBub3RlIElmIHRpbWVyIGludGVycnVwdCBzdGF0dXMgaXMgc2V0IHRoZW4gY2xlYXIgaXQgYmVmb3JlIAogKiAgICAgICByZXR1cm5pbmcuCiAqLwp1aW50OF90IGJ0aW1lcl9pbnRlcnJ1cHRfc3RhdHVzX2dldF9jbHIodWludDhfdCBidGltZXJfaWQpCnsgICAgCiAgICB1aW50OF90IHN0czsKCiAgICBzdHMgPSAwOwogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkgeyAgICAgICAgCgkJCQkKCQkJCXN0cyA9IHBfYnRpbWVyX2ludF9zdGF0dXNfZ2V0KGJ0aW1lcl9pZCk7CiAgICAgICAgaWYgKHN0cykgewoJCQkJCXBfYnRpbWVyX2ludF9zdGF0dXNfY2xyKGJ0aW1lcl9pZCk7ICAgICAgICAgICAgCiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHN0czsKfQoKI2lmIDAgLy9UZW1wb3JhcnkgZGlzYWJsZSB1bnRpbCBpbnRlcnJ1cHQgbW9kdWxlCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi8qICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgQmFzaWMgVGltZXIgR0lSUSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoqIEVuYWJsZXMgR0lSUSBlbmFibGUgYml0IGZvciB0aGUgdGltZXIgCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuCiAqLwp2b2lkIGJ0aW1lcl9naXJxX2VuYWJsZV9zZXQodWludDhfdCBidGltZXJfaWQpCnsKICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpCiAgICB7CiAgICAgICAgLy9Ob3RlOiBCaXQgUG9zaXRpb24gaXMgc2FtZSBhcyBUaW1lciBJRAkJCQogICAgICAgIHBfZWNpYV9naXJxX2VuYWJsZV9zZXQoQlRJTUVSX0dJUlEsIGJ0aW1lcl9pZCk7CiAgICB9CQkKfQoKLyoqIENsZWFycyBHSVJRIGVuYWJsZSBiaXQgZm9yIHRoZSB0aW1lciAKICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4KICovCnZvaWQgYnRpbWVyX2dpcnFfZW5hYmxlX2Nscih1aW50OF90IGJ0aW1lcl9pZCkKewkKICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpCiAgICB7CQkJCiAgICAgICAgLy9Ob3RlOiBCaXQgUG9zaXRpb24gaXMgc2FtZSBhcyBUaW1lciBJRAkJCQogICAgICAgIHBfZWNpYV9naXJxX2VuYWJsZV9jbHIoQlRJTUVSX0dJUlEsIGJ0aW1lcl9pZCk7CiAgICB9CQoJCQp9CgovKiogUmV0dXJucyBHSVJRIHNvdXJjZSBiaXQgZm9yIHRoZSB0aW1lciAKICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4KICogQHJldHVybiB1aW50OF90IDAoc3JjIGJpdCBub3Qgc2V0KSwgTm9uLXplcm8gKHNyYyBiaXQgc2V0KQogKi8KdWludDhfdCBidGltZXJfZ2lycV9zcmNfZ2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICB1aW50OF90IHJldFZhbDsKCiAgICByZXRWYWwgPSAwOwogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkKICAgIHsKICAgICAgICAvL05vdGU6IEJpdCBQb3NpdGlvbiBpcyBzYW1lIGFzIFRpbWVyIElECQkJCiAgICAgICAgcmV0VmFsID0gcF9lY2lhX2dpcnFfc291cmNlX2dldChCVElNRVJfR0lSUSwgYnRpbWVyX2lkKTsJCQkKICAgIH0KCiAgICByZXR1cm4gcmV0VmFsOwp9CgovKiogQ2xlYXJzIEdJUlEgc291cmNlIGJpdCBmb3IgdGhlIHRpbWVyIAogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELgogKi8Kdm9pZCBidGltZXJfZ2lycV9zcmNfY2xyKHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICBpZiAoYnRtcl92YWxpZChidGltZXJfaWQpKQogICAgewogICAgICAgIC8vTm90ZTogQml0IFBvc2l0aW9uIGlzIHNhbWUgYXMgVGltZXIgSUQJCQkKICAgICAgICBwX2VjaWFfZ2lycV9zb3VyY2VfY2xyKEJUSU1FUl9HSVJRLCBidGltZXJfaWQpOwkJCQkKICAgIH0JCQkKfQoKLyoqIFJldHVybnMgR0lSUSByZXN1bHQgYml0IGZvciB0aGUgdGltZXIgCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuCiAqIEByZXR1cm4gdWludDhfdCAwKHJlc3VsdCBiaXQgbm90IHNldCksIE5vbi16ZXJvIChyZXN1bHQgYml0IHNldCkKICovCnVpbnQ4X3QgYnRpbWVyX2dpcnFfcmVzdWx0X2dldCh1aW50OF90IGJ0aW1lcl9pZCkKewogICAgdWludDhfdCByZXRWYWw7CgogICAgcmV0VmFsID0gMDsKICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpCiAgICB7CiAgICAgICAgLy9Ob3RlOiBCaXQgUG9zaXRpb24gaXMgc2FtZSBhcyBUaW1lciBJRAkJCQogICAgICAgIHJldFZhbCA9IHBfZWNpYV9naXJxX3Jlc3VsdF9nZXQoQlRJTUVSX0dJUlEsIGJ0aW1lcl9pZCk7CQkJCiAgICB9CgogICAgcmV0dXJuIHJldFZhbDsJCQkKfQojZW5kaWYKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLyogICAgICAgICAgICAgICAgRnVuY3Rpb25zIGZvciBCYXNpYyBUaW1lciBTbGVlcCAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKiogRW5hYmxlL0Rpc2FibGUgY2xvY2sgZ2F0aW5nIG9uIGlkbGUgb2YgYSB0aW1lciAgCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuCiAqIEBwYXJhbSBzbGVlcF9lbiAxID0gU2xlZXAgZW5hYmxlLCAwID0gU2xlZXAgZGlzYWJsZQogKi8Kdm9pZCBidGltZXJfc2xlZXAodWludDhfdCBidGltZXJfaWQsIHVpbnQ4X3Qgc2xlZXBfZW4pCnsKICAgIHVpbnQzMl90IHBjcl9ibGtfaWQ7CgkJCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIAogICAgewkJCQkKICAgICAgICBwY3JfYmxrX2lkID0gYnRtcl9wY3JfaWRbYnRpbWVyX2lkXTsJCQkKCQkJCiAgICAgICAgcGNyX3NsZWVwX2VuYWJsZShwY3JfYmxrX2lkLCBzbGVlcF9lbik7ICAgICAgICAKICAgIH0KfQoKLyoqIFJldHVybnMgY2xrIHJlcXVpcmVkIHN0YXR1cyBmb3IgdGhlIHRpbWVyIGJsb2NrCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuCiAqIEByZXR1cm4gTm9uLXplcm8gaWYgY2xrIHJlcXVpcmVkLCBlbHNlIDAKICovCnVpbnQzMl90IGJ0aW1lcl9jbGtfcmVxZF9zdHNfZ2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQp7CiAgICB1aW50MzJfdCByZXRWYWw7CiAgICB1aW50MzJfdCBwY3JfYmxrX2lkOwogICAgCQogICAgcmV0VmFsID0gMHVsOyAgIAogICAgaWYgKCBidG1yX3ZhbGlkKGJ0aW1lcl9pZCkgKSAKICAgIHsJCQkKICAgICAgICBwY3JfYmxrX2lkID0gYnRtcl9wY3JfaWRbYnRpbWVyX2lkXTsKICAgICAgICAKICAgICAgICByZXRWYWwgPSBwY3JfY2xvY2tfcmVxZF9zdGF0dXNfZ2V0KHBjcl9ibGtfaWQpOwkJCSAgICAgICAKICAgIH0KCQkKICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKiBFbmFibGUvRGlzYWJsZSByZXNldCBvbiBzbGVlcCBmb3IgdGhlIHRpbWVyIGJsb2NrIAogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELgogKiBAcGFyYW0gcmVzZXRfZW4gMSB0byBlbmFibGUsIDAgdG8gZGlzYWJsZQogKi8Kdm9pZCBidGltZXJfcmVzZXRfb25fc2xlZXAodWludDhfdCBidGltZXJfaWQsIHVpbnQ4X3QgcmVzZXRfZW4pCnsKICAgIHVpbnQzMl90IHBjcl9ibGtfaWQ7ICAgCiAgICAKICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgCiAgICB7CQkJCiAgICAgICAgcGNyX2Jsa19pZCA9IGJ0bXJfcGNyX2lkW2J0aW1lcl9pZF07CiAgICAKICAgICAgICBwY3JfcmVzZXRfZW5hYmxlKHBjcl9ibGtfaWQsIHJlc2V0X2VuKTsJCQkKICAgIH0KfQoKLyogZW5kIGJ0aW1lcl9hcGkuYyAqLwoKLyoqICAgQH0gLy9QZXJpcGhlcmFsIEJhc2ljX1RpbWVyCiAqLwo=