LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19XQUtFVVAgVGVtcGxhdGUuCiAgKgogICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlcyB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCiAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBXQUtFVVAgZm9yIHRoZSB0aW1lIGJhc2UgZ2VuZXJhdGlvbjoKICAqICAgICAgICAgICArIEludGlhbGl6ZXMgdGhlIFJUQyBwZXJpcGhlcmFsIGFuZCBjb25maWd1cmVzIHRoZSB3YWtldXAgdGltZXIgdG8gYmUKICAqICAgICAgICAgICAgIGluY3JlbWVudGVkIGVhY2ggMW1zCiAgKiAgICAgICAgICAgKyBUaGUgd2FrZXVwIGZlYXR1cmUgaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IGVhY2ggMW1zCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgaW5zaWRlIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXAuYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmcweHhfaGFsX2NvbmYuaAoKICAgIFsuLl0KICAgIChAKSBIQUwgUlRDIGFsYXJtIGFuZCBIQUwgUlRDIHdha2V1cCBkcml2ZXJzIGNhbpJ0IGJlIHVzZWQgd2l0aCBsb3cgcG93ZXIgbW9kZXM6CiAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQogICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuCiAgICAgICAgQXBwbGljYXRpb24vRXhhbXBsZSBiZWhhdmlvciBpcyBubyBtb3JlIGd1YXJhbnRlZWQKICAgIChAKSBUaGUgc3RtMzJnMHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCiAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDb3B5cmlnaHQgKGMpIDIwMTggU1RNaWNyb2VsZWN0cm9uaWNzLiAKICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuPC9jZW50ZXI+PC9oMj4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGNvbXBvbmVudCBpcyBsaWNlbnNlZCBieSBTVCB1bmRlciBCU0QgMy1DbGF1c2UgbGljZW5zZSwKICAqIHRoZSAiTGljZW5zZSI7IFlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgCiAgKiBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL0JTRC0zLUNsYXVzZQogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMyZzB4eF9oYWwuaCIKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRzB4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfV2FrZVVwX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIFdha2VVcCBUZW1wbGF0ZQogICogQHsKICAqLwoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246CiAgKyBSVENfQ0xPQ0tfU09VUkNFX0hTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIHRpbWluZyBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTSTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKi8KI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0hTRQovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQojZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDQ5VQojZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDRVCiNlbHNlIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFIHx8IFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCiNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gUlRDX0hhbmRsZVR5cGVEZWYgaFJUQ19IYW5kbGU7ClJUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsKCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgUlRDX1RBTVBfSVJRSGFuZGxlcih2b2lkKTsKCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfVEFNUCBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuCiAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqICAgICAgICAgV2FrZXVwIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxbXMKICAqICAgICAgICAgV2FrZXVwIFRpbWUgPSBXYWtldXBUaW1lYmFzZSAqIFdha2VVcENvdW50ZXIgKDAgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICA9IDEgbXMKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eTogVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFCiAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQogIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMjsKI2Vsc2UKI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCgogIGlmKEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCkgPT0gSEFMX09LKQogIHsKICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKICAgIHsKICAgICAgLyogRW5hYmxlIFJUQyBDbG9jayAqLwogICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOwogICAgICBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKTsKCiAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcwogICAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSwogICAgICAgICBIU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgICAgVGltZSBiYXNlID0gKCg0OSArIDEpICogKDQgKyAxKSkgLyAyNTBraHoKICAgICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICAgICAgTFNFIGFzIFJUQyBjbG9jawogICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S2h6CiAgICAgICAgICAgICAgICAgICAgID0gfjFtcwogICAgICAgICBMU0kgYXMgUlRDIGNsb2NrCiAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktoegogICAgICAgICAgICAgICAgICAgICA9IDFtcwogICAgICAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgICAgaWYgKEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KCiAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBEaXNhYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCiAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBJbiBjYXNlIG9mIGludGVycnVwdCBtb2RlIGlzIHVzZWQsIHRoZSBpbnRlcnJ1cHQgc291cmNlIG11c3QgZGlzYWJsZWQgKi8KICAgICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLFJUQ19JVF9XVVQpOwoKICAgICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCAgKi8KICAgICAgd2hpbGUoX19IQUxfUlRDX1dBS0VVUFRJTUVSX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VUV0YpID09IDBVKQogICAgICB7CiAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA1NlUpKQogICAgICAgIHsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBDbGVhciBQV1Igd2FrZSB1cCBGbGFnICovCiAgICAgIF9fSEFMX1BXUl9DTEVBUl9GTEFHKFBXUl9GTEFHX1dVRik7CgogICAgICAvKiBDbGVhciBSVEMgV2FrZSBVcCB0aW1lciBGbGFnICovCiAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VURik7CgogICAgICAvKiBDb25maWd1cmUgdGhlIFdha2UtdXAgVGltZXIgY291bnRlciAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+V1VUUiA9IDBVOwoKICAgICAgLyogQ2xlYXIgdGhlIFdha2UtdXAgVGltZXIgY2xvY2sgc291cmNlIGJpdHMgaW4gQ1IgcmVnaXN0ZXIgKi8KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkNSICY9ICh1aW50MzJfdCl+UlRDX0NSX1dVQ0tTRUw7CgogICAgICAvKiBDb25maWd1cmUgdGhlIGNsb2NrIHNvdXJjZSAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE2QklUUzsKCiAgICAgIC8qIFJUQyBXYWtlVXBUaW1lciBJbnRlcnJ1cHQgQ29uZmlndXJhdGlvbjogRVhUSSBjb25maWd1cmF0aW9uICovCiAgICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FWFRJX0VOQUJMRV9JVCgpOwoKICAgICAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLwogICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSxSVENfSVRfV1VUKTsKCiAgICAgIC8qIEVuYWJsZSB0aGUgV2FrZS11cCBUaW1lciAqLwogICAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAgIEhBTF9OVklDX1NldFByaW9yaXR5KFJUQ19UQU1QX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX1RBTVBfSVJRbik7CiAgICAgIHJldHVybiBIQUxfT0s7CiAgICB9CiAgfQogIHJldHVybiBIQUxfRVJST1I7Cn0KCi8qKgogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBEaXNhYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBkaXNhYmxpbmcgUlRDX1RBTVAgaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIFdBS0UgVVAgVElNRVIgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQ19UQU1QIGludGVycnVwdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1Jlc3VtZVRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBFbmFibGUgIFdBS0UgVVAgVElNRVIgIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfV1VUKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgV2FrZSBVcCBUaW1lciBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfVEFNUCBpbnRlcnJ1cHQgdG9vayBwbGFjZSwgaW5zaWRlCiAgKiBSVENfVEFNUF9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjIDogUlRDIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrKFJUQ19IYW5kbGVUeXBlRGVmICpocnRjKQp7CiAgSEFMX0luY1RpY2soKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSVEMgV0FLRSBVUCBUSU1FUiBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgUlRDX1RBTVBfSVJRSGFuZGxlcih2b2lkKQp7CiAgSEFMX1JUQ0V4X1dha2VVcFRpbWVySVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8K