LyoKICogQ29weXJpZ2h0IChjKSAyMDEyLTIwMTMsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCiAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCiAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAogKiBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTIsIFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBQcmV2aW91c2x5IGxpY2Vuc2VkIHVuZGVyIHRoZSBJU0MgbGljZW5zZSBieSBRdWFsY29tbSBBdGhlcm9zLCBJbmMuCiAqCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yCiAqIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlCiAqIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbAogKiBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwKICogV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCiAqIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUgogKiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2lmICFkZWZpbmVkKCBfX1dMQU5fUUNUX1BBTF9USU1FUl9IICkKI2RlZmluZSBfX1dMQU5fUUNUX1BBTF9USU1FUl9ICgovKio9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgCiAgXGZpbGUgIHdsYW5fcWN0X3BhbF90aW1lci5oCiAgCiAgXGJyaWVmIGRlZmluZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0cyBQQUwgZXhwb3J0cy4gd3B0ID0gKFdsYW4gUGFsIFR5cGUpIHdwYWwgPSAoV2xhbiBQQUwpCiAgICAgICAgICAgICAgIAogICBEZWZpbml0aW9ucyBmb3IgcGxhdGZvcm0gaW5kZXBlbmRlbnQuCiAgCiAgIENvcHlyaWdodCAyMDEwLTIwMTEgKGMpIFF1YWxjb21tLCBJbmNvcnBvcmF0ZWQuICBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAKICAgUXVhbGNvbW0gQ29uZmlkZW50aWFsIGFuZCBQcm9wcmlldGFyeS4KICAKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKI2luY2x1ZGUgIndsYW5fcWN0X3BhbF90eXBlLmgiCiNpbmNsdWRlICJ3bGFuX3FjdF9wYWxfc3RhdHVzLmgiCiNpbmNsdWRlICJ3bGFuX3FjdF9vc190aW1lci5oIgoKCnR5cGVkZWYgdm9pZCAoKndwYWxfdGltZXJfY2FsbGJhY2spKHZvaWQgKnBVc2VyRGF0YSk7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgIHdwdF9vc190aW1lciB0aW1lcjsKICAgd3BhbF90aW1lcl9jYWxsYmFjayBjYWxsYmFjazsKICAgdm9pZCAqcFVzZXJEYXRhOwp9IHdwdF90aW1lcjsKCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVySW5pdCAtIGluaXRpYWxpemUgYSB3cHRfdGltZXIgb2JqZWN0CiAgICBQYXJhbToKICAgICAgICBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CiAgICAgICAgY2FsbGJhY2sgLSBBIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgcFVzZXJEYXRhIC0gQSBwb2ludGVyIHRvIGRhdGEgcGFzcyBhcyBwYXJhbWV0ZXIgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxUaW1lckluaXQod3B0X3RpbWVyICogcFRpbWVyLCB3cGFsX3RpbWVyX2NhbGxiYWNrIGNhbGxiYWNrLCB2b2lkICpwVXNlckRhdGEpOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHdwYWxUaW1lckRlbGV0ZSAtIGludmFsaWRhdGUgYSB3cHRfdGltZXIgb2JqZWN0CiAgICBQYXJhbToKICAgICAgICBwVGltZXIgLSBhIHBvaW50ZXIgdG8gY2FsbGVyIGFsbG9jYXRlZCB3cHRfdGltZXIgb2JqZWN0CiAgICBSZXR1cm46CiAgICAgICAgZVdMQU5fUEFMX1NUQVRVU19TVUNDRVNTIC0gc3VjY2Vzcy4gRmFpbCBvdGhlcndpc2UuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCndwdF9zdGF0dXMgd3BhbFRpbWVyRGVsZXRlKHdwdF90aW1lciAqIHBUaW1lcik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVyU3RhcnQgLSBzdGFydCBhIHdwdF90aW1lciBvYmplY3Qgd2l0aCBhIHRpbWVvdXQgdmFsdWUKICAgIFBhcmFtOgogICAgICAgIHBUaW1lciAtIGEgcG9pbnRlciB0byBjYWxsZXIgYWxsb2NhdGVkIHdwdF90aW1lciBvYmplY3QKICAgICAgICB0aW1lb3V0IC0gdGltZW91dCB2YWx1ZSBvZiB0aGUgdGltZXIuIEluIHVuaXQgb2YgbWlsbGktc2Vjb25kcy4KICAgIFJldHVybjoKICAgICAgICBlV0xBTl9QQUxfU1RBVFVTX1NVQ0NFU1MgLSBzdWNjZXNzLiBGYWlsIG90aGVyd2lzZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kd3B0X3N0YXR1cyB3cGFsVGltZXJTdGFydCh3cHRfdGltZXIgKiBwVGltZXIsIHdwdF91aW50MzIgdGltZW91dCk7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgd3BhbFRpbWVyU3RvcCAtIHN0b3AgYSB3cHRfdGltZXIgb2JqZWN0LiBTdG9wIGRvZXNuknQgZ3VhcmFudGVlIHRoZSB0aW1lciBoYW5kbGVyIGlzIG5vdCBjYWxsZWQgaWYgaXQgaXMgYWxyZWFkeSB0aW1lb3V0LgogICAgUGFyYW06CiAgICAgICAgcFRpbWVyIC0gYSBwb2ludGVyIHRvIGNhbGxlciBhbGxvY2F0ZWQgd3B0X3RpbWVyIG9iamVjdAogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxUaW1lclN0b3Aod3B0X3RpbWVyICogcFRpbWVyKTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICB3cGFsU2xlZXAgLSBzbGVlcCBmb3IgYSBzcGVjaWZpZWQgaW50ZXJ2YWwKICAgIFBhcmFtOgogICAgICAgIHRpbWVvdXQgLSBhbW91bnQgb2YgdGltZSB0byBzbGVlcC4gSW4gdW5pdCBvZiBtaWxsaS1zZWNvbmRzLgogICAgUmV0dXJuOgogICAgICAgIGVXTEFOX1BBTF9TVEFUVVNfU1VDQ0VTUyAtIHN1Y2Nlc3MuIEZhaWwgb3RoZXJ3aXNlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwp3cHRfc3RhdHVzIHdwYWxTbGVlcCh3cHRfdWludDMyIHRpbWVvdXQpOwoKCgojZW5kaWYgLy8gX19XTEFOX1FDVF9QQUxfVElNRVJfSAo=