LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmYzeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jCiAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBSVENfQUxBUk0gVGVtcGxhdGUuCiAgKgogICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKICAqICAgICAgICAgIHRvIHVzZSB0aGUgUlRDIEFMQVJNIGZvciB0aW1lIGJhc2UgZ2VuZXJhdGlvbjoKICAqICAgICAgICAgICArIEludGlhbGl6ZXMgdGhlIFJUQyBwZXJpcGhlcmFsIHRvIGluY3JlbWVudCB0aGUgc2Vjb25kcyByZWdpc3RlcnMgZWFjaCAxbXMKICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgYXQgZWFjaCBBbGFybSBldmVudCBhbmQgdGhlIHRpbWUgaXMgcmVzZXQgdG8gMDA6MDA6MDAKICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UKIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICBUaGlzIGZpbGUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgbW9kaWZpZWQgYXMgZm9sbG93czoKICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyZjN4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtLmMnCiAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudAogICAgICAgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCBkZWZpbmUgaW4gc3RtMzJmM3h4X2hhbF9jb25mLmgKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkCiAgICAoQCkgVGhlIHN0bTMyZjN4eF9oYWxfdGltZWJhc2VfdGltIHVzZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIEFwcGxpY2F0aW9ucy9FeGFtcGxlcwogICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2RlcwoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgogICogICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgogICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCiAgKiAgICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICAqCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgogICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZjN4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjN4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUKICAqIEB7CiAgKi8KCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOgogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UKLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCgojaWYgZGVmaW5lZChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDQ5VQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgNFUKI2VsaWYgZGVmaW5lZChSVENfQ0xPQ0tfU09VUkNFX0xTRSkKICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKI2Vsc2UgLypSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDM5VQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovClJUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsKLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKTsKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQ19BTEFSTUEgYXMgYSB0aW1lIGJhc2Ugc291cmNlLgogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQKICAqICAgICAgICAgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgogICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgogICogQHBhcmFtICBUaWNrUHJpb3JpdHkgVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sgKHVpbnQzMl90IFRpY2tQcmlvcml0eSkKewogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOwoKICBSQ0NfT3NjSW5pdFR5cGVEZWYgICAgICAgIFJDQ19Pc2NJbml0U3RydWN0OwogIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgUGVyaXBoQ2xrSW5pdFN0cnVjdDsKCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0xTRQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNFOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0xTSSkKICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTSTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTSTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9IU0UpCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9IU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9IU0VfRElWMzI7CiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICBpZihIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpID09IEhBTF9PSykKICB7CiAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7CiAgICBpZihIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KSA9PSBIQUxfT0spCiAgICB7CiAgICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8KICAgICAgX19IQUxfUkNDX1JUQ19FTkFCTEUoKTsKICAgICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxVSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDFVKSkgLyBSVENfQ0xPQ0sKICAgICAgICAgSFNFLzMyIGFzIFJUQyBjbG9jayBhbmQgSFNFIDhNSHoKICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDQ5VSArIDFVKSAqICg0VSArIDFVKSkgLyAyNTBrSHoKICAgICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICAgICAgTFNFIGFzIFJUQyBjbG9jawogICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzFVICsgMVUpICogKDBVICsgMVUpKSAvIDMyLjc2OEtIegogICAgICAgICAgICAgICAgICAgICA9IH4xbXMKICAgICAgICAgTFNJIGFzIFJUQyBjbG9jawogICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzlVICsgMVUpICogKDBVICsgMVUpKSAvIDQwS0h6CiAgICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOwogICAgICBoUlRDX0hhbmRsZS5Jbml0LkhvdXJGb3JtYXQgPSBSVENfSE9VUkZPUk1BVF8yNDsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0ID0gUlRDX09VVFBVVF9ESVNBQkxFOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOwogICAgICBIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKTsKCiAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLwogICAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKTsKCiAgICAgIGNvdW50ZXIgPSAwVTsKICAgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLwogICAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IFJFU0VUKQogICAgICB7CiAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICAgICAgewogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5BTFJNQVIgPSAweDAxVTsKCiAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLwogICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwoKICAgICAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgICAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCiAgICAgIGlmKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogICAgICB7CiAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwogICAgICAgIGNvdW50ZXIgPSAwVTsKICAgICAgICB3aGlsZSgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgICAgICB7CiAgICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkRSID0gMFU7CiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5UUiA9IDBVOwoKICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX0FsYXJtX0lSUW4pOwogICAgICByZXR1cm4gSEFMX09LOwogICAgfQogIH0KICByZXR1cm4gSEFMX0VSUk9SOwp9CgovKioKICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuCiAgKiBAcGFyYW0gIE5vbmUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1N1c3BlbmRUaWNrKHZvaWQpCnsKICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CiAgLyogRGlzYWJsZSBSVEMgQUxBUk0gdXBkYXRlIEludGVycnVwdCAqLwogIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgRW5hYmxpbmcgUlRDIEFMQVJNIGludGVycnVwdC4KICAqIEBwYXJhbSAgTm9uZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIEVuYWJsZSBSVEMgQUxBUk0gVXBkYXRlIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEFMQVJNIEEgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKICAqIFJUQ19BbGFybV9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjIFJUQyBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1JUQ19BbGFybUFFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIEhBTF9JbmNUaWNrKCk7CgogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRShocnRjKTsKCiAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgaHJ0Yy0+SW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwoKICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICB7CiAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBocnRjLT5JbnN0YW5jZS0+RFIgPSAwVTsKICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgaHJ0Yy0+SW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoaHJ0Yyk7Cn0KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0LgogICogQHBhcmFtICBOb25lCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIFJUQ19BbGFybV9JUlFIYW5kbGVyKHZvaWQpCnsKICBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K