LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib3B0aW9ucy5oIgojaW5jbHVkZSAid2ludmVyLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgImNydGRsbC5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVDTEFSRV9ERUJVR19DSEFOTkVMKGZpbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChvbGUpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTChzdHJpbmcpCkRFQ0xBUkVfREVCVUdfQ0hBTk5FTCh3aW4zMikKCnN0cnVjdCBOTFNfbGFuZ2xvY2FsZSB7Cgljb25zdCBpbnQgbGFuZzsKCXN0cnVjdCBOTFNfbG9jYWxldmFyIHsKCQljb25zdCBpbnQJdHlwZTsKCQljb25zdCBjaGFyCSp2YWw7Cgl9IGxvY3ZhcnNbMTUwXTsKfTsKCnN0YXRpYyBMUFZPSUQgbHBOTFNJbmZvID0gTlVMTDsKCiNkZWZpbmUgTEFOR19CRUdJTihsLHMpCXsJTUFLRUxBTkdJRChsLHMpLCB7CgojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQkJCQkJe3R5cGUsdmFsdWV9LAoKI2RlZmluZSBMQU5HX0VORAkJCQkJIH19LAoKc3RhdGljIGNvbnN0IHN0cnVjdCBOTFNfbGFuZ2xvY2FsZSBsYW5nbG9jYWxlc1tdID0gewovKiBhZGQgbGFuZ3VhZ2VzIGluIG51bWVyaWNhbCBvcmRlciBvZiBtYWluIGxhbmd1YWdlIChsYXN0IHR3byBkaWdpdHMpCiAqIGl0IGlzIG11Y2ggZWFzaWVyIHRvIGZpbmQgdGhlIG1pc3NpbmcgaG9sZXMgdGhhdCB3YXkgKi8KCkxBTkdfQkVHSU4gKExBTkdfQ0FUQUxBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwMyovCiNpbmNsdWRlICJubHMvY2F0Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfQ1pFQ0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MDUqLwojaW5jbHVkZSAibmxzL2N6ZS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RBTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwNiovCiNpbmNsdWRlICJubHMvZGFuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfR0VSTUFOLCBTVUJMQU5HX0dFUk1BTikJCS8qMHgwNDA3Ki8KI2luY2x1ZGUgIm5scy9kZXUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fU1dJU1MpCQkvKjB4MDgwNyovCiNpbmNsdWRlICJubHMvZGVzLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0FVU1RSSUFOKQkvKjB4MEMwNyovCiNpbmNsdWRlICJubHMvZGVhLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19HRVJNQU4sIFNVQkxBTkdfR0VSTUFOX0xVWEVNQk9VUkcpCS8qMHgxMDA3Ki8KI2luY2x1ZGUgIm5scy9kZWwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0dFUk1BTiwgU1VCTEFOR19HRVJNQU5fTElFQ0hURU5TVEVJTikJLyoweDE0MDcqLwojaW5jbHVkZSAibmxzL2RlYy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUykJCS8qMHgwNDA5Ki8KI2luY2x1ZGUgIm5scy9lbnUubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VSykJCS8qMHgwODA5Ki8KI2luY2x1ZGUgIm5scy9lbmcubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9BVVMpCQkvKjB4MEMwOSovCiNpbmNsdWRlICJubHMvZW5hLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfQ0FOKQkJLyoweDEwMDkqLwojaW5jbHVkZSAibmxzL2VuYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX05aKQkJLyoweDE0MDkqLwojaW5jbHVkZSAibmxzL2Vuei5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0VJUkUpCQkvKjB4MTgwOSovCiNpbmNsdWRlICJubHMvaXJsLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfU0FGUklDQSkJLyoweDFDMDkqLwojaW5jbHVkZSAibmxzL2Vucy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX0pBTUFJQ0EpCS8qMHgyMDA5Ki8KI2luY2x1ZGUgIm5scy9lbmoubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9DQVJSSUJFQU4pCS8qMHgyNDA5Ki8KI2luY2x1ZGUgIm5scy9lbmIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9CRUxJWkUpCS8qMHgyODA5Ki8KI2luY2x1ZGUgIm5scy9lbmwubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9UUklOSURBRCkgICAgCS8qMHgyQzA5Ki8KI2luY2x1ZGUgIm5scy9lbnQubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0gpCQkvKjB4MDQwYSovCiNpbmNsdWRlICJubHMvZXNwLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfTUVYSUNBTikJLyoweDA4MGEqLwojaW5jbHVkZSAibmxzL2VzbS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX01PREVSTikJLyoweDBDMGEqLwojaW5jbHVkZSAibmxzL2Vzbi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0dVQVRFTUFMQSkJLyoweDEwMGEqLwojaW5jbHVkZSAibmxzL2VzZy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPU1RBUklDQSkJLyoweDE0MGEqLwojaW5jbHVkZSAibmxzL2VzYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BBTkFNQSkJLyoweDE4MGEqLwojaW5jbHVkZSAibmxzL2VzYS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0RPTUlOSUNBTikJLyoweDFDMEEqLwojaW5jbHVkZSAibmxzL2VzZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1ZFTkVaVUVMQSkJLyoweDIwMGEqLwojaW5jbHVkZSAibmxzL2Vzdi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX0NPTE9NQklBKQkvKjB4MjQwYSovCiNpbmNsdWRlICJubHMvZXNvLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEVSVSkJCS8qMHgyODBhKi8KI2luY2x1ZGUgIm5scy9lc3IubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9BUkdFTlRJTkEpCS8qMHgyYzBhKi8KI2luY2x1ZGUgIm5scy9lc3MubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9FQ1VBRE9SKQkvKjB4MzAwYSovCiNpbmNsdWRlICJubHMvZXNmLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfQ0hJTEUpCS8qMHgzNDBhKi8KI2luY2x1ZGUgIm5scy9lc2wubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9VUlVHVUFZKQkvKjB4MzgwYSovCiNpbmNsdWRlICJubHMvZXN5Lm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfUEFSQUdVQVkpCS8qMHgzYzBhKi8KI2luY2x1ZGUgIm5scy9lc3oubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9CT0xJVklBKQkvKjB4NDAwYSovCiNpbmNsdWRlICJubHMvZXNiLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19TUEFOSVNILCBTVUJMQU5HX1NQQU5JU0hfRUxfU0FMVkFET1IpCS8qMHg0NDBhKi8KI2luY2x1ZGUgIm5scy9lc2UubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1NQQU5JU0gsIFNVQkxBTkdfU1BBTklTSF9IT05EVVJBUykJLyoweDQ4MGEqLwojaW5jbHVkZSAibmxzL2VzaC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX05JQ0FSQUdVQSkJLyoweDRjMGEqLwojaW5jbHVkZSAibmxzL2VzaS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1BBTklTSCwgU1VCTEFOR19TUEFOSVNIX1BVRVJUT19SSUNPKQkvKjB4NTAwYSovCiNpbmNsdWRlICJubHMvZXN1Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRklOTklTSCwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwQiovCiNpbmNsdWRlICJubHMvZmluLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSCkJCS8qMHgwNDBDKi8KI2luY2x1ZGUgIm5scy9mcmEubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfQkVMR0lBTikJLyoweDA4MEMqLwojaW5jbHVkZSAibmxzL2ZyYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9DQU5BRElBTikJLyoweDBDMEMqLwojaW5jbHVkZSAibmxzL2ZyYy5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRlJFTkNILCBTVUJMQU5HX0ZSRU5DSF9TV0lTUykJCS8qMHgxMDBDKi8KI2luY2x1ZGUgIm5scy9mcnMubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX0ZSRU5DSCwgU1VCTEFOR19GUkVOQ0hfTFVYRU1CT1VSRykJLyoweDE0MEMqLwojaW5jbHVkZSAibmxzL2ZybC5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0hVTkdBUklBTiwgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQwZSovCiNpbmNsdWRlICJubHMvaHVuLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOKQkJLyoweDA0MTAqLwojaW5jbHVkZSAibmxzL2l0YS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfSVRBTElBTiwgU1VCTEFOR19JVEFMSUFOX1NXSVNTKQkvKjB4MDgxMCovCiNpbmNsdWRlICJubHMvaXRzLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfS09SRUFOLCBTVUJMQU5HX0tPUkVBTikJLyoweDA0MTIqLwojaW5jbHVkZSAibmxzL2tvci5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0RVVENILCBTVUJMQU5HX0RVVENIKQkJLyoweDA0MTMqLwojaW5jbHVkZSAibmxzL25sZC5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfQkVMR0lBTikJLyoweDA4MTMqLwojaW5jbHVkZSAibmxzL25sYi5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfRFVUQ0gsIFNVQkxBTkdfRFVUQ0hfU1VSSU5BTSkJLyoweDBDMTMqLwojaW5jbHVkZSAibmxzL25scy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX05PUldFR0lBTiwgU1VCTEFOR19OT1JXRUdJQU5fQk9LTUFMKQkvKjB4MDQxNCovCiNpbmNsdWRlICJubHMvbm9yLm5scyIKTEFOR19FTkQKTEFOR19CRUdJTiAoTEFOR19OT1JXRUdJQU4sIFNVQkxBTkdfTk9SV0VHSUFOX05ZTk9SU0spCS8qMHgwODE0Ki8KI2luY2x1ZGUgIm5scy9ub24ubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0MTUqLwojaW5jbHVkZSAibmxzL3Bsay5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRV9CUkFaSUxJQU4pCS8qMHgwNDE2Ki8KI2luY2x1ZGUgIm5scy9wdGIubmxzIgpMQU5HX0VORApMQU5HX0JFR0lOIChMQU5HX1BPUlRVR1VFU0UgLFNVQkxBTkdfUE9SVFVHVUVTRSkJCS8qMHgwODE2Ki8KI2luY2x1ZGUgIm5scy9wdGcubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MTkqLwojaW5jbHVkZSAibmxzL3J1cy5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX1NMT1ZBSywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQxYiovCiNpbmNsdWRlICJubHMvc2t5Lm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIKQkJLyoweDA0MWQqLwojaW5jbHVkZSAibmxzL3N2ZS5ubHMiCkxBTkdfRU5ECkxBTkdfQkVHSU4gKExBTkdfU1dFRElTSCwgU1VCTEFOR19TV0VESVNIX0ZJTkxBTkQpCS8qMHgwODFkKi8KI2luY2x1ZGUgIm5scy9zdmYubmxzIgpMQU5HX0VORAoKTEFOR19CRUdJTiAoTEFOR19USEFJLCBTVUJMQU5HX0RFRkFVTFQpCS8qMHg0MWUqLwojaW5jbHVkZSAibmxzL3RoYS5ubHMiCkxBTkdfRU5ECgpMQU5HX0JFR0lOIChMQU5HX0VTUEVSQU5UTywgU1VCTEFOR19ERUZBVUxUKQkvKjB4MDQ4ZiovCiNpbmNsdWRlICJubHMvZXNwZXJhbnRvLm5scyIKTEFOR19FTkQKCkxBTkdfQkVHSU4gKExBTkdfV0FMT04sIFNVQkxBTkdfREVGQVVMVCkJLyoweDA0OTAqLwojaW5jbHVkZSAibmxzL3dhbC5ubHMiCkxBTkdfRU5ECgkgICAgfTsKCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsZUluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKCWNoYXIJKm5hbWU7CglEV09SRAlpZDsKfSBsb2NhbGVfbmFtZTJpZFtdPSB7CglMT0NBTEVfRU5UUlkoSUxBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNFTkdMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKElDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0VOR0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVExBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQU5TSUNPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVE1BQ0NPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShTTElTVCksCglMT0NBTEVfRU5UUlkoSU1FQVNVUkUpLAoJTE9DQUxFX0VOVFJZKFNERUNJTUFMKSwKCUxPQ0FMRV9FTlRSWShTVEhPVVNBTkQpLAoJTE9DQUxFX0VOVFJZKFNHUk9VUElORyksCglMT0NBTEVfRU5UUlkoSURJR0lUUyksCglMT0NBTEVfRU5UUlkoSUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTkVHTlVNQkVSKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShTQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKFNJTlRMU1lNQk9MKSwKCUxPQ0FMRV9FTlRSWShTTU9OREVDSU1BTFNFUCksCglMT0NBTEVfRU5UUlkoU01PTlRIT1VTQU5EU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJSU5UTENVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoSU5FR0NVUlIpLAoJTE9DQUxFX0VOVFJZKFNEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRSksCglMT0NBTEVfRU5UUlkoU1NIT1JUREFURSksCglMT0NBTEVfRU5UUlkoU0xPTkdEQVRFKSwKCUxPQ0FMRV9FTlRSWShTVElNRUZPUk1BVCksCglMT0NBTEVfRU5UUlkoSURBVEUpLAoJTE9DQUxFX0VOVFJZKElMREFURSksCglMT0NBTEVfRU5UUlkoSVRJTUUpLAoJTE9DQUxFX0VOVFJZKElUSU1FTUFSS1BPU04pLAoJTE9DQUxFX0VOVFJZKElDRU5UVVJZKSwKCUxPQ0FMRV9FTlRSWShJVExaRVJPKSwKCUxPQ0FMRV9FTlRSWShJREFZTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElNT05MWkVSTyksCglMT0NBTEVfRU5UUlkoUzExNTkpLAoJTE9DQUxFX0VOVFJZKFMyMzU5KSwKCUxPQ0FMRV9FTlRSWShJQ0FMRU5EQVJUWVBFKSwKCUxPQ0FMRV9FTlRSWShJT1BUSU9OQUxDQUxFTkRBUiksCglMT0NBTEVfRU5UUlkoSUZJUlNUREFZT0ZXRUVLKSwKCUxPQ0FMRV9FTlRSWShJRklSU1RXRUVLT0ZZRUFSKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNQT1NJVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKFNORUdBVElWRVNJR04pLAoJTE9DQUxFX0VOVFJZKElQT1NTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSU5FR1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElQT1NTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShJTkVHU1lNUFJFQ0VERVMpLAoJTE9DQUxFX0VOVFJZKElORUdTRVBCWVNQQUNFKSwKCUxPQ0FMRV9FTlRSWShGT05UU0lHTkFUVVJFKSwKCUxPQ0FMRV9FTlRSWShTSVNPNjM5TEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNJU08zMTY2Q1RSWU5BTUUpLAoJe05VTEwsMH0sCn07Cgpjb25zdCBzdHJ1Y3QgbWFwX2xjaWQyc3RyIHsKCUxDSUQJCWxhbmdpZDsKCWNvbnN0IGNoYXIJKmxhbmduYW1lOwp9IGxhbmd1YWdlc1tdPXsKCXsweDA0MDEsIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKSJ9LAoJezB4MDgwMSwiQXJhYmljIChJcmFxKSJ9LAoJezB4MGMwMSwiQXJhYmljIChFZ3lwdCkifSwKCXsweDEwMDEsIkFyYWJpYyAoTGlieWEpIn0sCgl7MHgxNDAxLCJBcmFiaWMgKEFsZ2VyaWEpIn0sCgl7MHgxODAxLCJBcmFiaWMgKE1vcm9jY28pIn0sCgl7MHgxYzAxLCJBcmFiaWMgKFR1bmlzaWEpIn0sCgl7MHgyMDAxLCJBcmFiaWMgKE9tYW4pIn0sCgl7MHgyNDAxLCJBcmFiaWMgKFllbWVuKSJ9LAoJezB4MjgwMSwiQXJhYmljIChTeXJpYSkifSwKCXsweDJjMDEsIkFyYWJpYyAoSm9yZGFuKSJ9LAoJezB4MzAwMSwiQXJhYmljIChMZWJhbm9uKSJ9LAoJezB4MzQwMSwiQXJhYmljIChLdXdhaXQpIn0sCgl7MHgzODAxLCJBcmFiaWMgKFVuaXRlZCBBcmFiIEVtaXJhdGVzKSJ9LAoJezB4M2MwMSwiQXJhYmljIChCYWhyYWluKSJ9LAoJezB4NDAwMSwiQXJhYmljIChRYXRhcikifSwKCXsweDA0MDIsIkJ1bGdhcmlhbiJ9LAoJezB4MDQwMywiQ2F0YWxhbiJ9LAoJezB4MDQwNCwiQ2hpbmVzZSAoVGFpd2FuKSJ9LAoJezB4MDgwNCwiQ2hpbmVzZSAoUGVvcGxlJ3MgUmVwdWJsaWMgb2YgQ2hpbmEpIn0sCgl7MHgwYzA0LCJDaGluZXNlIChIb25nIEtvbmcpIn0sCgl7MHgxMDA0LCJDaGluZXNlIChTaW5nYXBvcmUpIn0sCgl7MHgxNDA0LCJDaGluZXNlIChNYWNhdSkifSwKCXsweDA0MDUsIkN6ZWNoIn0sCgl7MHgwNDA2LCJEYW5pc2gifSwKCXsweDA0MDcsIkdlcm1hbiAoR2VybWFueSkifSwKCXsweDA4MDcsIkdlcm1hbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwYzA3LCJHZXJtYW4gKEF1c3RyaWEpIn0sCgl7MHgxMDA3LCJHZXJtYW4gKEx1eGVtYm91cmcpIn0sCgl7MHgxNDA3LCJHZXJtYW4gKExpZWNodGVuc3RlaW4pIn0sCgl7MHgwNDA4LCJHcmVlayJ9LAoJezB4MDQwOSwiRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykifSwKCXsweDA4MDksIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSJ9LAoJezB4MGMwOSwiRW5nbGlzaCAoQXVzdHJhbGlhKSJ9LAoJezB4MTAwOSwiRW5nbGlzaCAoQ2FuYWRhKSJ9LAoJezB4MTQwOSwiRW5nbGlzaCAoTmV3IFplYWxhbmQpIn0sCgl7MHgxODA5LCJFbmdsaXNoIChJcmVsYW5kKSJ9LAoJezB4MWMwOSwiRW5nbGlzaCAoU291dGggQWZyaWNhKSJ9LAoJezB4MjAwOSwiRW5nbGlzaCAoSmFtYWljYSkifSwKCXsweDI0MDksIkVuZ2xpc2ggKENhcmliYmVhbikifSwKCXsweDI4MDksIkVuZ2xpc2ggKEJlbGl6ZSkifSwKCXsweDJjMDksIkVuZ2xpc2ggKFRyaW5pZGFkKSJ9LAoJezB4MzAwOSwiRW5nbGlzaCAoWmltYmFid2UpIn0sCgl7MHgzNDA5LCJFbmdsaXNoIChQaGlsaXBwaW5lcykifSwKCXsweDA0MGEsIlNwYW5pc2ggKFNwYWluLCB0cmFkaXRpb25hbCBzb3J0aW5nKSJ9LAoJezB4MDgwYSwiU3BhbmlzaCAoTWV4aWNvKSJ9LAoJezB4MGMwYSwiU3BhbmlzaCAoU3BhaW4sIGludGVybmF0aW9uYWwgc29ydGluZykifSwKCXsweDEwMGEsIlNwYW5pc2ggKEd1YXRlbWFsYSkifSwKCXsweDE0MGEsIlNwYW5pc2ggKENvc3RhIFJpY2EpIn0sCgl7MHgxODBhLCJTcGFuaXNoIChQYW5hbWEpIn0sCgl7MHgxYzBhLCJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpIn0sCgl7MHgyMDBhLCJTcGFuaXNoIChWZW5lenVlbGEpIn0sCgl7MHgyNDBhLCJTcGFuaXNoIChDb2xvbWJpYSkifSwKCXsweDI4MGEsIlNwYW5pc2ggKFBlcnUpIn0sCgl7MHgyYzBhLCJTcGFuaXNoIChBcmdlbnRpbmEpIn0sCgl7MHgzMDBhLCJTcGFuaXNoIChFY3VhZG9yKSJ9LAoJezB4MzQwYSwiU3BhbmlzaCAoQ2hpbGUpIn0sCgl7MHgzODBhLCJTcGFuaXNoIChVcnVndWF5KSJ9LAoJezB4M2MwYSwiU3BhbmlzaCAoUGFyYWd1YXkpIn0sCgl7MHg0MDBhLCJTcGFuaXNoIChCb2xpdmlhKSJ9LAoJezB4NDQwYSwiU3BhbmlzaCAoRWwgU2FsdmFkb3IpIn0sCgl7MHg0ODBhLCJTcGFuaXNoIChIb25kdXJhcykifSwKCXsweDRjMGEsIlNwYW5pc2ggKE5pY2FyYWd1YSkifSwKCXsweDUwMGEsIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKSJ9LAoJezB4MDQwYiwiRmlubmlzaCJ9LAoJezB4MDQwYywiRnJlbmNoIChGcmFuY2UpIn0sCgl7MHgwODBjLCJGcmVuY2ggKEJlbGdpdW0pIn0sCgl7MHgwYzBjLCJGcmVuY2ggKENhbmFkYSkifSwKCXsweDEwMGMsIkZyZW5jaCAoU3dpdHplcmxhbmQpIn0sCgl7MHgxNDBjLCJGcmVuY2ggKEx1eGVtYm91cmcpIn0sCgl7MHgxODBjLCJGcmVuY2ggKE1vbmFjbykifSwKCXsweDA0MGQsIkhlYnJldyJ9LAoJezB4MDQwZSwiSHVuZ2FyaWFuIn0sCgl7MHgwNDBmLCJJY2VsYW5kaWMifSwKCXsweDA0MTAsIkl0YWxpYW4gKEl0YWx5KSJ9LAoJezB4MDgxMCwiSXRhbGlhbiAoU3dpdHplcmxhbmQpIn0sCgl7MHgwNDExLCJKYXBhbmVzZSJ9LAoJezB4MDQxMiwiS29yZWFuIChXYW5zdW5nKSJ9LAoJezB4MDgxMiwiS29yZWFuIChKb2hhYikifSwKCXsweDA0MTMsIkR1dGNoIChOZXRoZXJsYW5kcykifSwKCXsweDA4MTMsIkR1dGNoIChCZWxnaXVtKSJ9LAoJezB4MDQxNCwiTm9yd2VnaWFuIChCb2ttYWwpIn0sCgl7MHgwODE0LCJOb3J3ZWdpYW4gKE55bm9yc2spIn0sCgl7MHgwNDE1LCJQb2xpc2gifSwKCXsweDA0MTYsIlBvcnR1Z3Vlc2UgKEJyYXppbCkifSwKCXsweDA4MTYsIlBvcnR1Z3Vlc2UgKFBvcnR1Z2FsKSJ9LAoJezB4MDQxNywiUmhhZXRvIFJvbWFuaWMifSwKCXsweDA0MTgsIlJvbWFuaWFuIn0sCgl7MHgwODE4LCJNb2xkYXZpYW4ifSwKCXsweDA0MTksIlJ1c3NpYW4gKFJ1c3NpYSkifSwKCXsweDA4MTksIlJ1c3NpYW4gKE1vbGRhdmlhKSJ9LAoJezB4MDQxYSwiQ3JvYXRpYW4ifSwKCXsweDA4MWEsIlNlcmJpYW4gKGxhdGluKSJ9LAoJezB4MGMxYSwiU2VyYmlhbiAoY3lyaWxsaWMpIn0sCgl7MHgwNDFiLCJTbG92YWsifSwKCXsweDA0MWMsIkFsYmFuaWFuIn0sCgl7MHgwNDFkLCJTd2VkaXNoIChTd2VkZW4pIn0sCgl7MHgwODFkLCJTd2VkaXNoIChGaW5sYW5kKSJ9LAoJezB4MDQxZSwiVGhhaSJ9LAoJezB4MDQxZiwiVHVya2lzaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiSW5kb25lc2lhbiJ9LAoJezB4MDQyMiwiVWtyYWluaWFuIn0sCgl7MHgwNDIzLCJCZWxhcnVzaWFuIn0sCgl7MHgwNDI0LCJTbG92ZW5lIn0sCgl7MHgwNDI1LCJFc3RvbmlhbiJ9LAoJezB4MDQyNiwiTGF0dmlhbiJ9LAoJezB4MDQyNywiTGl0aHVhbmlhbiAobW9kZXJuKSJ9LAoJezB4MDgyNywiTGl0aHVhbmlhbiAoY2xhc3NpYykifSwKCXsweDA0MjgsIk1hb3JpIn0sCgl7MHgwNDI5LCJGYXJzaSJ9LAoJezB4MDQyYSwiVmlldG5hbWVzZSJ9LAoJezB4MDQyYiwiQXJtZW5pYW4ifSwKCXsweDA0MmMsIkF6ZXJpIChsYXRpbikifSwKCXsweDA4MmMsIkF6ZXJpIChjeXJpbGxpYykifSwKCXsweDA0MmQsIkJhc3F1ZSJ9LAoJezB4MDQyZSwiU29yYmlhbiJ9LAoJezB4MDQyZiwiTWFjZWRvbmlhbiJ9LAoJezB4MDQzMCwiU3V0dSJ9LAoJezB4MDQzMSwiVHNvbmdhIn0sCgl7MHgwNDMyLCJUc3dhbmEifSwKCXsweDA0MzMsIlZlbmRhIn0sCgl7MHgwNDM0LCJYaG9zYSJ9LAoJezB4MDQzNSwiWnVsdSJ9LAoJezB4MDQzNiwiQWZyaWthYW5zIn0sCgl7MHgwNDM3LCJHZW9yZ2lhbiJ9LAoJezB4MDQzOCwiRmFlcm9lc2UifSwKCXsweDA0MzksIkhpbmRpIn0sCgl7MHgwNDNhLCJNYWx0ZXNlIn0sCgl7MHgwNDNiLCJTYWFtaSJ9LAoJezB4MDQzYywiSXJpc2ggZ2FlbGljIn0sCgl7MHgwODNjLCJTY290dGlzaCBnYWVsaWMifSwKCXsweDA0M2UsIk1hbGF5IChNYWxheXNpYSkifSwKCXsweDA4M2UsIk1hbGF5IChCcnVuZWkgRGFydXNzYWxhbSkifSwKCXsweDA0M2YsIkthemFrIn0sCgl7MHgwNDQxLCJTd2FoaWxpIn0sCgl7MHgwNDQzLCJVemJlayAobGF0aW4pIn0sCgl7MHgwODQzLCJVemJlayAoY3lyaWxsaWMpIn0sCgl7MHgwNDQ0LCJUYXRhciJ9LAoJezB4MDQ0NSwiQmVuZ2FsaSJ9LAoJezB4MDQ0NiwiUHVuamFiaSJ9LAoJezB4MDQ0NywiR3VqYXJhdGkifSwKCXsweDA0NDgsIk9yaXlhIn0sCgl7MHgwNDQ5LCJUYW1pbCJ9LAoJezB4MDQ0YSwiVGVsdWd1In0sCgl7MHgwNDRiLCJLYW5uYWRhIn0sCgl7MHgwNDRjLCJNYWxheWFsYW0ifSwKCXsweDA0NGQsIkFzc2FtZXNlIn0sCgl7MHgwNDRlLCJNYXJhdGhpIn0sCgl7MHgwNDRmLCJTYW5za3JpdCJ9LAoJezB4MDQ1NywiS29ua2FuaSJ9LAoJezB4MDQ4ZiwiRXNwZXJhbnRvIn0sIC8qIE5vbiBvZmZpY2lhbCAqLwoJezB4MDQ5MCwiV2Fsb24ifSwgLyogTm9uIG9mZmljaWFsICovCgl7MHgwMDAwLCJVbmtub3duIn0KICAgIH0sIGxhbmd1YWdlc19kZVtdPXsKCXsweDA0MDEsIkFyYWJpYyJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW56dnNpc2NoIn0sCgl7MHgwNDBELCJIZWJyZGlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNsZG5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybGRuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlJkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1bWRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJU/HJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkxDSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TENJRCgpCnsKCXJldHVybiBNQUtFTENJRCggR2V0VXNlckRlZmF1bHRMYW5nSUQoKSAsIFNPUlRfREVGQVVMVCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4yKQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIChPTEUyTkxTLjMpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJLyogY2FjaGluZyByZXN1bHQsIGlmIGRlZmluZWQgZnJvbSBlbnZpcm9ubWVudCwgd2hpY2ggc2hvdWxkICg/KSBub3QgY2hhbmdlIGR1cmluZyBhIFdJTkUgc2Vzc2lvbiAqLwoJc3RhdGljCUxBTkdJRAl1c2VyTENJRCA9IDA7CglpZiAoT3B0aW9ucy5sYW5ndWFnZSkgewoJCXJldHVybiBMYW5ndWFnZXNbT3B0aW9ucy5sYW5ndWFnZV0ubGFuZ2lkOwoJfQoKCWlmICh1c2VyTENJRCA9PSAwKSB7CgkJY2hhciAqYnVmPU5VTEw7CgkJY2hhciAqbGFuZywqY291bnRyeSwqY2hhcnNldCwqZGlhbGVjdCwqbmV4dDsKCQlpbnQgCXJldD0wOwoJCQoJCWJ1Zj1nZXRlbnYoIkxBTkdVQUdFIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxBTkciKTsKCQlpZiAoIWJ1ZikgYnVmPWdldGVudigiTENfQUxMIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxDX01FU1NBR0VTIik7CgkJaWYgKCFidWYpIGJ1Zj1nZXRlbnYoIkxDX0NUWVBFIik7CgkJaWYgKCFidWYpIHJldHVybiB1c2VyTENJRCA9IE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgkJCgkJaWYgKCFzdHJjbXAoYnVmLCJQT1NJWCIpIHx8ICFzdHJjbXAoYnVmLCJDIikpIHsKCQkJcmV0dXJuIE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgkJfQoJCQoJCWxhbmc9YnVmOwoJCQoJCWRvIHsKCQkJbmV4dD1zdHJjaHIobGFuZywnOicpOyBpZiAobmV4dCkgKm5leHQrKz0nXDAnOwoJCQlkaWFsZWN0PXN0cmNocihsYW5nLCdAJyk7IGlmIChkaWFsZWN0KSAqZGlhbGVjdCsrPSdcMCc7CgkJCWNoYXJzZXQ9c3RyY2hyKGxhbmcsJy4nKTsgaWYgKGNoYXJzZXQpICpjaGFyc2V0Kys9J1wwJzsKCQkJY291bnRyeT1zdHJjaHIobGFuZywnXycpOyBpZiAoY291bnRyeSkgKmNvdW50cnkrKz0nXDAnOwoJCQkKCQkJcmV0PU1BSU5fR2V0TGFuZ3VhZ2VJRChsYW5nLCBjb3VudHJ5LCBjaGFyc2V0LCBkaWFsZWN0KTsKCQkJCgkJCWxhbmc9bmV4dDsKCQkJCgkJfSB3aGlsZSAobGFuZyAmJiAhcmV0KTsKCQkKCQkvKiBGSVhNRSA6IGFyZSBzdHJpbmdzIHJldHVybmVkIGJ5IGdldGVudigpIHRvIGJlIGZyZWUoKSdlZCA/ICovCgkJdXNlckxDSUQgPSAoTEFOR0lEKXJldDsKCX0KCXJldHVybiB1c2VyTENJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgKE9MRTJOTFMuNCkKICovCkxBTkdJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCgpCnsKCXJldHVybiBHZXRVc2VyRGVmYXVsdExhbmdJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRMb2NhbGVJbmZvMTYJW09MRTJOTFMuNV0KICogSXMgdGhlIGxhc3QgcGFyYW1ldGVyIHJlYWxseSBXT1JEIGZvciBXaW4xNj8KICovCklOVDE2IFdJTkFQSSBHZXRMb2NhbGVJbmZvMTYoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVDE2IGxlbikKewoJcmV0dXJuIEdldExvY2FsZUluZm9BKGxjaWQsTENUeXBlLGJ1ZixsZW4pOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29udmVydERlZmF1bHRMb2NhbGUzMiBbS0VSTkVMMzIuMTQ3XQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUzMiAoTENJRCBsY2lkKQp7CXN3aXRjaCAobGNpZCkKCXsgIGNhc2UgTE9DQUxFX1NZU1RFTV9ERUZBVUxUOgoJICAgICByZXR1cm4gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX1VTRVJfREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJICAgY2FzZSAwOgoJICAgICByZXR1cm4gTUFLRUxDSUQgKExBTkdfTkVVVFJBTCwgU1VCTEFOR19ORVVUUkFMKTsKCX0gIAoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBHZXRMb2NhbGVJbmZvMzJBIFtLRVJORUwzMi4zNDJdCiAqCiAqIE5PVEVTIAogKiAgTEFOR19ORVVUUkFMIGlzIGVxdWFsIHRvIExPQ0FMRV9TWVNURU1fREVGQVVMVAogKgogKiAgTVMgb25saW5lIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgdGhlIHN0cmluZyByZXR1cm5lZCBpcyBOVUxMIHRlcm1pbmF0ZWQKICogIGV4Y2VwdCBmb3IgTE9DQUxFX0ZPTlRTSUdOQVRVUkUgIHdoaWNoICJ3aWxsIHJldHVybiBhIG5vbi1OVUxMCiAqICB0ZXJtaW5hdGVkIHN0cmluZyIuCiAqLwpJTlQgV0lOQVBJIEdldExvY2FsZUluZm9BKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQgbGVuKQp7CiAgTFBDU1RSICByZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCWludAlsYW5nPTA7CgogIFRSQUNFXyhvbGUpKCIobGNpZD0weCVseCxsY3R5cGU9MHglbHgsJXAsJXgpXG4iLGxjaWQsTENUeXBlLGJ1ZixsZW4pOwoKICBpZiAobGVuICYmICghIGJ1ZikgKSB7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKGxjaWQgPT0wIHx8IGxjaWQgPT0gTEFOR19TWVNURU1fREVGQVVMVCB8fCAoTENUeXBlICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSApCS8qIDB4MDAsIDB4NDAwICovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxjaWQgPT0gTEFOR19VU0VSX0RFRkFVTFQpIC8qMHg4MDAqLwoJewogICAgICAgICAgICBsY2lkID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CglMQ1R5cGUgJj0gfihMT0NBTEVfTk9VU0VST1ZFUlJJREV8TE9DQUxFX1VTRV9DUF9BQ1ApOwoKCS8qIEFzIGFuIG9wdGlvbiwgd2UgY291bGQgb2J0YWluIHRoZSB2YWx1ZSBmcm9tIHdpbi5pbmkuCgkgICBUaGlzIHdvdWxkIG5vdCBtYXRjaCB0aGUgV2luZSBjb21waWxlLXRpbWUgb3B0aW9uLgoJICAgQWxzbywgbm90IGFsbCBpZGVudGlmaWVycyBhcmUgYXZhaWxhYmxlIGZyb20gd2luLmluaSAqLwoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJCWlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQkJcmV0U3RyaW5nID0gbG9jYWxlX25hbWUyaWRbaV0ubmFtZTsKCQkJYnJlYWs7CgkJfQoJCWkrKzsKCX0KCWlmICghcmV0U3RyaW5nKSB7CiAgICAgIEZJWE1FXyhvbGUpKCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKCQlyZXR1cm4gMDsKCX0KCiAgICBmb3VuZD0wO2xhbmc9bGNpZDsKICAgIGZvciAoaT0wOyhpPDMgJiYgIWZvdW5kKTtpKyspIHsKICAgICAgaW50IGo7CgogICAgICBmb3IgKGo9MDtqPHNpemVvZihsYW5nbG9jYWxlcykvc2l6ZW9mKGxhbmdsb2NhbGVzWzBdKTtqKyspIHsKCWlmIChsYW5nbG9jYWxlc1tqXS5sYW5nID09IGxhbmcpIHsKCSAgaW50IGs7CgoJICBmb3IgKGs9MDtrPHNpemVvZihsYW5nbG9jYWxlc1tqXS5sb2N2YXJzKS9zaXplb2YobGFuZ2xvY2FsZXNbal0ubG9jdmFyc1swXSkgJiYgKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNba10udHlwZSk7aysrKSB7CgkgICAgaWYgKGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNba10udHlwZSA9PSBMQ1R5cGUpIHsKCSAgICAgIGZvdW5kID0gMTsKCSAgICAgIHJldFN0cmluZyA9IGxhbmdsb2NhbGVzW2pdLmxvY3ZhcnNba10udmFsOwoJICBicmVhazsKCSAgICB9CgkgIH0KICAgICAgICAgIGlmIChmb3VuZCkKCSAgICBicmVhazsKCX0KICAgICAgfQoJICAvKiBsYW5ndWFnZSBub3QgZm91bmQsIHRyeSB3aXRob3V0IGEgc3VibGFuZ3VhZ2UqLwoJICBpZiAoaT09MSkgbGFuZz1NQUtFTEFOR0lEKCBQUklNQVJZTEFOR0lEKGxhbmcpLCBTVUJMQU5HX0RFRkFVTFQpOwoJICAvKiBtYXNrIHRoZSBMQyBWYWx1ZSAqLwoJICBpZiAoaT09MikgTENUeXBlICY9IDB4ZmZmOwogICAgfQoKICAgIGlmKCFmb3VuZCkgewogICAgICBFUlJfKG9sZSkoIiclcycgbm90IHN1cHBvcnRlZCBmb3IgeW91ciBsYW5ndWFnZSAoJTA0WCkuXG4iLAoJCQlyZXRTdHJpbmcsKFdPUkQpbGNpZCk7CgkJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCQlyZXR1cm4gMDsJCQkKCX0KICAgIC8qIGEgRk9OVFNJR05BVFVSRSBpcyBub3QgYSBzdHJpbmcsIGp1c3QgNiBEV09SRHMgICovCiAgICBpZiAoTENUeXBlID09IExPQ0FMRV9GT05UU0lHTkFUVVJFKSB7CiAgICAgICAgaWYgKGxlbikKICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgcmV0U3RyaW5nLCAobGVuPD1zaXplb2YoRk9OVFNJR05BVFVSRSkpP2xlbjpzaXplb2YoRk9OVFNJR05BVFVSRSkpOwogICAgICAgIHJldHVybiBzaXplb2YoRk9OVFNJR05BVFVSRSk7CiAgICB9CiAgICAvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoLCBkb24ndCB0b3VjaCB0aGUgYnVmZmVyKi8KICAgIGlmIChsZW4pIGxzdHJjcHluQShidWYscmV0U3RyaW5nLGxlbik7CiAgICByZXR1cm4gc3RybGVuKHJldFN0cmluZykrMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mbzMyVwlbS0VSTkVMMzIuMzQzXQogKgogKiBOT1RFUwogKiAgTVMgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCBsZW4gInNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMgKEFOU0kgdmVyc2lvbikKICogIG9yIGNoYXJhY3RlcnMgKFVuaWNvZGUgdmVyc2lvbiksIG9mIiB3YnVmLiBUaHVzIHRoZSBudW1iZXIgcmV0dXJuZWQgaXMKICogIHRoZSBzYW1lIGJldHdlZW4gR2V0TG9jYWxlSW5mbzMyVyBhbmQgR2V0TG9jYWxlSW5mbzMyQS4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb1coTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBXU1RSIHdidWYsSU5UIGxlbikKewlXT1JEIHdsZW47CglMUFNUUiBhYnVmOwoJCglpZiAobGVuICYmICghIHdidWYpICkKCXsgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICByZXR1cm4gMDsKCX0KCglhYnVmID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKCXdsZW4gPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMQ1R5cGUsIGFidWYsIGxlbik7CgoJaWYgKHdsZW4gJiYgbGVuKQkvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoKi8KCSAgbHN0cmNweW5BdG9XKHdidWYsYWJ1ZixsZW4pOwoKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxhYnVmKTsKCXJldHVybiB3bGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlTZXRMb2NhbGVJbmZvQQlbS0VSTkVMMzIuNjU2XQogKi8KQk9PTDE2IFdJTkFQSSBTZXRMb2NhbGVJbmZvQShEV09SRCBsY2lkLCBEV09SRCBsY3R5cGUsIExQQ1NUUiBkYXRhKQp7CiAgICBGSVhNRV8ob2xlKSgiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLjQ4OV0KICovCkJPT0wgV0lOQVBJIElzVmFsaWRMb2NhbGUoTENJRCBsY2lkLERXT1JEIGZsYWdzKQp7CgkvKiB3ZSBzdXBwb3J0IEFOWSBsYW5ndWFnZS4gV2VsbCwgYXQgbGVhc3Qgc2F5IHRoYXQuLi4qLwoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzMzJXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewoJaW50CWk7CglCT09MCXJldDsKCVdDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRV8od2luMzIpKCIoJXAsJTA4bHgpXG4iLGxwZm5Mb2NhbGVFbnVtLGZsYWdzICk7CgkvKiBzZWUgaWYgd2UgY2FuIHJldXNlIHRoZSBXaW45NSByZWdpc3RyeSBlbnRyaWVzLi4uLiAqLwoJaWYgKEVSUk9SX1NVQ0NFU1M9PVJlZ09wZW5LZXlBKEhLRVlfTE9DQUxfTUFDSElORSwiU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleVcoeGhrZXksaSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKQoJCQkJYnJlYWs7CiAgICAgICAgICAgIAkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQkJYnJlYWs7CgkJCWkrKzsKCQl9CgkJUmVnQ2xvc2VLZXkoeGhrZXkpOwoJCXJldHVybiBUUlVFOwoJfQoKCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKQogICAgICAgIHsKICAgICAgICAgICAgTFBXU1RSIGNwOwoJICAgIGNoYXIgICB4YnVmZmVyWzEwXTsKICAJCgkgICAgc3ByaW50Zih4YnVmZmVyLCIlMDhseCIsKERXT1JEKWxhbmd1YWdlc1tpXS5sYW5naWQpOwoKCSAgICBjcCA9IEhFQVBfc3RyZHVwQXRvVyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeGJ1ZmZlciApOwogICAgICAgICAgICByZXQgPSBscGZuTG9jYWxlRW51bShjcCk7CiAgICAgICAgICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBjcCApOwogICAgICAgICAgICBpZiAoIXJldCkgYnJlYWs7CiAgICAgICAgICAgIGkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlczMyQQlbS0VSTkVMMzIuMjA4XQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKCWludAlpOwoJQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0VfKHdpbjMyKSgiKCVwLCUwOGx4KVxuIiwKCQlscGZuTG9jYWxlRW51bSxmbGFncwoJKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5QShIS0VZX0xPQ0FMX01BQ0hJTkUsIlN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwiLCZ4aGtleSkpIHsKCQlpPTA7CgkJd2hpbGUgKDEpIHsKCQkJaWYgKEVSUk9SX1NVQ0NFU1MhPVJlZ0VudW1LZXlBKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ2lkIT0wKSB7CgkJc3ByaW50ZihidWZmZXIsIiUwOGx4IiwoRFdPUkQpbGFuZ3VhZ2VzW2ldLmxhbmdpZCk7CgkJaWYgKCFscGZuTG9jYWxlRW51bShidWZmZXIpKQoJCQlicmVhazsKCQlpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgQ1RfQ1R5cGUyX0xVVFtdID0gewogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgOCAqLwogIEMyX1NFR01FTlRTRVBBUkFUT1IsIC8qICAgLSAgIDkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDEzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDMxICovCiAgQzJfV0hJVEVTUEFDRSwgLyogICAtICAzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogISAtICAzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogIyAtICAzNSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICQgLSAgMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAlIC0gIDM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qICYgLSAgMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICcgLSAgMzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICggLSAgNDAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICkgLSAgNDEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qICogLSAgNDIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiArIC0gIDQzICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiAsIC0gIDQ0ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogLSAtICA0NSAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLiAtICA0NiAqLwogIEMyX0VVUk9QRVNFUEFSQVRPUiwgLyogLyAtICA0NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMCAtICA0OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMSAtICA0OSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMiAtICA1MCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogMyAtICA1MSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNCAtICA1MiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNSAtICA1MyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNiAtICA1NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogNyAtICA1NSAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOCAtICA1NiAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogOSAtICA1NyAqLwogIEMyX0NPTU1PTlNFUEFSQVRPUiwgLyogOiAtICA1OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogOyAtICA1OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPCAtICA2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPSAtICA2MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPiAtICA2MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogPyAtICA2MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBAIC0gIDY0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEEgLSAgNjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQiAtICA2NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBDIC0gIDY3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEQgLSAgNjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRSAtICA2OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBGIC0gIDcwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEcgLSAgNzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSCAtICA3MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBJIC0gIDczICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEogLSAgNzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSyAtICA3NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBMIC0gIDc2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE0gLSAgNzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTiAtICA3OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBPIC0gIDc5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFAgLSAgODAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUSAtICA4MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBSIC0gIDgyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFMgLSAgODMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVCAtICA4NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBVIC0gIDg1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFYgLSAgODYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogVyAtICA4NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBYIC0gIDg4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFkgLSAgODkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWiAtICA5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogWyAtICA5MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXCAtICA5MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXSAtICA5MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXiAtICA5NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogXyAtICA5NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogYCAtICA5NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBhIC0gIDk3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGIgLSAgOTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYyAtICA5OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBkIC0gMTAwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGUgLSAxMDEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZiAtIDEwMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBnIC0gMTAzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGggLSAxMDQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaSAtIDEwNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBqIC0gMTA2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGsgLSAxMDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbCAtIDEwOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBtIC0gMTA5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG4gLSAxMTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbyAtIDExMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBwIC0gMTEyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHEgLSAxMTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogciAtIDExNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBzIC0gMTE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHQgLSAxMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdSAtIDExNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB2IC0gMTE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHcgLSAxMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeCAtIDEyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB5IC0gMTIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHogLSAxMjIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHsgLSAxMjMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIHwgLSAxMjQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH0gLSAxMjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIH4gLSAxMjYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiB/IC0gMTI3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggCAtIDEyOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIIEgLSAxMjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIIgLSAxMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyoggyAtIDEzMSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghCAtIDEzMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghSAtIDEzMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghiAtIDEzNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoghyAtIDEzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCIIC0gMTM2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogiSAtIDEzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCKIC0gMTM4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCLIC0gMTM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIwgLSAxNDAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCNIC0gMTQxICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjiAtIDE0MiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII8gLSAxNDMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCQIC0gMTQ0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCRIC0gMTQ1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCSIC0gMTQ2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCTIC0gMTQ3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCUIC0gMTQ4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCVIC0gMTQ5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCWIC0gMTUwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCXIC0gMTUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJggLSAxNTIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJkgLSAxNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmiAtIDE1NCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmyAtIDE1NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCcIC0gMTU2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyognSAtIDE1NyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJ4gLSAxNTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyognyAtIDE1OSAqLwogIEMyX1dISVRFU1BBQ0UsIC8qIKAgLSAxNjAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKEgLSAxNjEgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCiIC0gMTYyICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogoyAtIDE2MyAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKQgLSAxNjQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiClIC0gMTY1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCmIC0gMTY2ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCnIC0gMTY3ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCoIC0gMTY4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCpIC0gMTY5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCqIC0gMTcwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCrIC0gMTcxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCsIC0gMTcyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCtIC0gMTczICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCuIC0gMTc0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCvIC0gMTc1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsCAtIDE3NiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qILEgLSAxNzcgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILIgLSAxNzggKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILMgLSAxNzkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILQgLSAxODAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILUgLSAxODEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILYgLSAxODIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILcgLSAxODMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILggLSAxODQgKi8KICBDMl9FVVJPUEVOVU1CRVIsIC8qILkgLSAxODUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILogLSAxODYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILsgLSAxODcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qILwgLSAxODggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL0gLSAxODkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL4gLSAxOTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIL8gLSAxOTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwCAtIDE5MiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDBIC0gMTkzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMIgLSAxOTQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwyAtIDE5NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDEIC0gMTk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMUgLSAxOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxiAtIDE5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDHIC0gMTk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMggLSAyMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogySAtIDIwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDKIC0gMjAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMsgLSAyMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzCAtIDIwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDNIC0gMjA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM4gLSAyMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogzyAtIDIwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDQIC0gMjA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINEgLSAyMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0iAtIDIxMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDTIC0gMjExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINQgLSAyMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1SAtIDIxMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDWIC0gMjE0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiDXIC0gMjE1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINggLSAyMTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2SAtIDIxNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDaIC0gMjE4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINsgLSAyMTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3CAtIDIyMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDdIC0gMjIxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN4gLSAyMjIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3yAtIDIyMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDgIC0gMjI0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOEgLSAyMjUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4iAtIDIyNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDjIC0gMjI3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOQgLSAyMjggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5SAtIDIyOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDmIC0gMjMwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOcgLSAyMzEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6CAtIDIzMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDpIC0gMjMzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOogLSAyMzQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6yAtIDIzNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDsIC0gMjM2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO0gLSAyMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7iAtIDIzOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDvIC0gMjM5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPAgLSAyNDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8SAtIDI0MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDyIC0gMjQyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPMgLSAyNDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9CAtIDI0NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD1IC0gMjQ1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPYgLSAyNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIPcgLSAyNDcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+CAtIDI0OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD5IC0gMjQ5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPogLSAyNTAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+yAtIDI1MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD8IC0gMjUyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIP0gLSAyNTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/iAtIDI1NCAqLwogIEMyX0xFRlRUT1JJR0hUIC8qIP8gLSAyNTUgKi8KfTsKCmNvbnN0IFdPUkQgT0xFMk5MU19DVF9DVHlwZTNfTFVUW10gPSB7IAogIDB4MDAwMCwgLyogICAtICAgMCAqLwogIDB4MDAwMCwgLyogICAtICAgMSAqLwogIDB4MDAwMCwgLyogICAtICAgMiAqLwogIDB4MDAwMCwgLyogICAtICAgMyAqLwogIDB4MDAwMCwgLyogICAtICAgNCAqLwogIDB4MDAwMCwgLyogICAtICAgNSAqLwogIDB4MDAwMCwgLyogICAtICAgNiAqLwogIDB4MDAwMCwgLyogICAtICAgNyAqLwogIDB4MDAwMCwgLyogICAtICAgOCAqLwogIDB4MDAwOCwgLyogICAtICAgOSAqLwogIDB4MDAwOCwgLyogICAtICAxMCAqLwogIDB4MDAwOCwgLyogICAtICAxMSAqLwogIDB4MDAwOCwgLyogICAtICAxMiAqLwogIDB4MDAwOCwgLyogICAtICAxMyAqLwogIDB4MDAwMCwgLyogICAtICAxNCAqLwogIDB4MDAwMCwgLyogICAtICAxNSAqLwogIDB4MDAwMCwgLyogICAtICAxNiAqLwogIDB4MDAwMCwgLyogICAtICAxNyAqLwogIDB4MDAwMCwgLyogICAtICAxOCAqLwogIDB4MDAwMCwgLyogICAtICAxOSAqLwogIDB4MDAwMCwgLyogICAtICAyMCAqLwogIDB4MDAwMCwgLyogICAtICAyMSAqLwogIDB4MDAwMCwgLyogICAtICAyMiAqLwogIDB4MDAwMCwgLyogICAtICAyMyAqLwogIDB4MDAwMCwgLyogICAtICAyNCAqLwogIDB4MDAwMCwgLyogICAtICAyNSAqLwogIDB4MDAwMCwgLyogICAtICAyNiAqLwogIDB4MDAwMCwgLyogICAtICAyNyAqLwogIDB4MDAwMCwgLyogICAtICAyOCAqLwogIDB4MDAwMCwgLyogICAtICAyOSAqLwogIDB4MDAwMCwgLyogICAtICAzMCAqLwogIDB4MDAwMCwgLyogICAtICAzMSAqLwogIDB4MDA0OCwgLyogICAtICAzMiAqLwogIDB4MDA0OCwgLyogISAtICAzMyAqLwogIDB4MDQ0OCwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgMHgwMDQ4LCAvKiAjIC0gIDM1ICovCiAgMHgwNDQ4LCAvKiAkIC0gIDM2ICovCiAgMHgwMDQ4LCAvKiAlIC0gIDM3ICovCiAgMHgwMDQ4LCAvKiAmIC0gIDM4ICovCiAgMHgwNDQwLCAvKiAnIC0gIDM5ICovCiAgMHgwMDQ4LCAvKiAoIC0gIDQwICovCiAgMHgwMDQ4LCAvKiApIC0gIDQxICovCiAgMHgwMDQ4LCAvKiAqIC0gIDQyICovCiAgMHgwMDQ4LCAvKiArIC0gIDQzICovCiAgMHgwMDQ4LCAvKiAsIC0gIDQ0ICovCiAgMHgwNDQwLCAvKiAtIC0gIDQ1ICovCiAgMHgwMDQ4LCAvKiAuIC0gIDQ2ICovCiAgMHgwNDQ4LCAvKiAvIC0gIDQ3ICovCiAgMHgwMDQwLCAvKiAwIC0gIDQ4ICovCiAgMHgwMDQwLCAvKiAxIC0gIDQ5ICovCiAgMHgwMDQwLCAvKiAyIC0gIDUwICovCiAgMHgwMDQwLCAvKiAzIC0gIDUxICovCiAgMHgwMDQwLCAvKiA0IC0gIDUyICovCiAgMHgwMDQwLCAvKiA1IC0gIDUzICovCiAgMHgwMDQwLCAvKiA2IC0gIDU0ICovCiAgMHgwMDQwLCAvKiA3IC0gIDU1ICovCiAgMHgwMDQwLCAvKiA4IC0gIDU2ICovCiAgMHgwMDQwLCAvKiA5IC0gIDU3ICovCiAgMHgwMDQ4LCAvKiA6IC0gIDU4ICovCiAgMHgwMDQ4LCAvKiA7IC0gIDU5ICovCiAgMHgwMDQ4LCAvKiA8IC0gIDYwICovCiAgMHgwNDQ4LCAvKiA9IC0gIDYxICovCiAgMHgwMDQ4LCAvKiA+IC0gIDYyICovCiAgMHgwMDQ4LCAvKiA/IC0gIDYzICovCiAgMHgwNDQ4LCAvKiBAIC0gIDY0ICovCiAgMHg4MDQwLCAvKiBBIC0gIDY1ICovCiAgMHg4MDQwLCAvKiBCIC0gIDY2ICovCiAgMHg4MDQwLCAvKiBDIC0gIDY3ICovCiAgMHg4MDQwLCAvKiBEIC0gIDY4ICovCiAgMHg4MDQwLCAvKiBFIC0gIDY5ICovCiAgMHg4MDQwLCAvKiBGIC0gIDcwICovCiAgMHg4MDQwLCAvKiBHIC0gIDcxICovCiAgMHg4MDQwLCAvKiBIIC0gIDcyICovCiAgMHg4MDQwLCAvKiBJIC0gIDczICovCiAgMHg4MDQwLCAvKiBKIC0gIDc0ICovCiAgMHg4MDQwLCAvKiBLIC0gIDc1ICovCiAgMHg4MDQwLCAvKiBMIC0gIDc2ICovCiAgMHg4MDQwLCAvKiBNIC0gIDc3ICovCiAgMHg4MDQwLCAvKiBOIC0gIDc4ICovCiAgMHg4MDQwLCAvKiBPIC0gIDc5ICovCiAgMHg4MDQwLCAvKiBQIC0gIDgwICovCiAgMHg4MDQwLCAvKiBRIC0gIDgxICovCiAgMHg4MDQwLCAvKiBSIC0gIDgyICovCiAgMHg4MDQwLCAvKiBTIC0gIDgzICovCiAgMHg4MDQwLCAvKiBUIC0gIDg0ICovCiAgMHg4MDQwLCAvKiBVIC0gIDg1ICovCiAgMHg4MDQwLCAvKiBWIC0gIDg2ICovCiAgMHg4MDQwLCAvKiBXIC0gIDg3ICovCiAgMHg4MDQwLCAvKiBYIC0gIDg4ICovCiAgMHg4MDQwLCAvKiBZIC0gIDg5ICovCiAgMHg4MDQwLCAvKiBaIC0gIDkwICovCiAgMHgwMDQ4LCAvKiBbIC0gIDkxICovCiAgMHgwNDQ4LCAvKiBcIC0gIDkyICovCiAgMHgwMDQ4LCAvKiBdIC0gIDkzICovCiAgMHgwNDQ4LCAvKiBeIC0gIDk0ICovCiAgMHgwNDQ4LCAvKiBfIC0gIDk1ICovCiAgMHgwNDQ4LCAvKiBgIC0gIDk2ICovCiAgMHg4MDQwLCAvKiBhIC0gIDk3ICovCiAgMHg4MDQwLCAvKiBiIC0gIDk4ICovCiAgMHg4MDQwLCAvKiBjIC0gIDk5ICovCiAgMHg4MDQwLCAvKiBkIC0gMTAwICovCiAgMHg4MDQwLCAvKiBlIC0gMTAxICovCiAgMHg4MDQwLCAvKiBmIC0gMTAyICovCiAgMHg4MDQwLCAvKiBnIC0gMTAzICovCiAgMHg4MDQwLCAvKiBoIC0gMTA0ICovCiAgMHg4MDQwLCAvKiBpIC0gMTA1ICovCiAgMHg4MDQwLCAvKiBqIC0gMTA2ICovCiAgMHg4MDQwLCAvKiBrIC0gMTA3ICovCiAgMHg4MDQwLCAvKiBsIC0gMTA4ICovCiAgMHg4MDQwLCAvKiBtIC0gMTA5ICovCiAgMHg4MDQwLCAvKiBuIC0gMTEwICovCiAgMHg4MDQwLCAvKiBvIC0gMTExICovCiAgMHg4MDQwLCAvKiBwIC0gMTEyICovCiAgMHg4MDQwLCAvKiBxIC0gMTEzICovCiAgMHg4MDQwLCAvKiByIC0gMTE0ICovCiAgMHg4MDQwLCAvKiBzIC0gMTE1ICovCiAgMHg4MDQwLCAvKiB0IC0gMTE2ICovCiAgMHg4MDQwLCAvKiB1IC0gMTE3ICovCiAgMHg4MDQwLCAvKiB2IC0gMTE4ICovCiAgMHg4MDQwLCAvKiB3IC0gMTE5ICovCiAgMHg4MDQwLCAvKiB4IC0gMTIwICovCiAgMHg4MDQwLCAvKiB5IC0gMTIxICovCiAgMHg4MDQwLCAvKiB6IC0gMTIyICovCiAgMHgwMDQ4LCAvKiB7IC0gMTIzICovCiAgMHgwMDQ4LCAvKiB8IC0gMTI0ICovCiAgMHgwMDQ4LCAvKiB9IC0gMTI1ICovCiAgMHgwNDQ4LCAvKiB+IC0gMTI2ICovCiAgMHgwMDAwLCAvKiB/IC0gMTI3ICovCiAgMHgwMDAwLCAvKiCAIC0gMTI4ICovCiAgMHgwMDAwLCAvKiCBIC0gMTI5ICovCiAgMHgwMDA4LCAvKiCCIC0gMTMwICovCiAgMHg4MDAwLCAvKiCDIC0gMTMxICovCiAgMHgwMDA4LCAvKiCEIC0gMTMyICovCiAgMHgwMDA4LCAvKiCFIC0gMTMzICovCiAgMHgwMDA4LCAvKiCGIC0gMTM0ICovCiAgMHgwMDA4LCAvKiCHIC0gMTM1ICovCiAgMHgwMDAxLCAvKiCIIC0gMTM2ICovCiAgMHgwMDA4LCAvKiCJIC0gMTM3ICovCiAgMHg4MDAzLCAvKiCKIC0gMTM4ICovCiAgMHgwMDA4LCAvKiCLIC0gMTM5ICovCiAgMHg4MDAwLCAvKiCMIC0gMTQwICovCiAgMHgwMDAwLCAvKiCNIC0gMTQxICovCiAgMHgwMDAwLCAvKiCOIC0gMTQyICovCiAgMHgwMDAwLCAvKiCPIC0gMTQzICovCiAgMHgwMDAwLCAvKiCQIC0gMTQ0ICovCiAgMHgwMDg4LCAvKiCRIC0gMTQ1ICovCiAgMHgwMDg4LCAvKiCSIC0gMTQ2ICovCiAgMHgwMDg4LCAvKiCTIC0gMTQ3ICovCiAgMHgwMDg4LCAvKiCUIC0gMTQ4ICovCiAgMHgwMDA4LCAvKiCVIC0gMTQ5ICovCiAgMHgwNDAwLCAvKiCWIC0gMTUwICovCiAgMHgwNDAwLCAvKiCXIC0gMTUxICovCiAgMHgwNDA4LCAvKiCYIC0gMTUyICovCiAgMHgwMDAwLCAvKiCZIC0gMTUzICovCiAgMHg4MDAzLCAvKiCaIC0gMTU0ICovCiAgMHgwMDA4LCAvKiCbIC0gMTU1ICovCiAgMHg4MDAwLCAvKiCcIC0gMTU2ICovCiAgMHgwMDAwLCAvKiCdIC0gMTU3ICovCiAgMHgwMDAwLCAvKiCeIC0gMTU4ICovCiAgMHg4MDAzLCAvKiCfIC0gMTU5ICovCiAgMHgwMDA4LCAvKiCgIC0gMTYwICovCiAgMHgwMDA4LCAvKiChIC0gMTYxICovCiAgMHgwMDQ4LCAvKiCiIC0gMTYyICovCiAgMHgwMDQ4LCAvKiCjIC0gMTYzICovCiAgMHgwMDA4LCAvKiCkIC0gMTY0ICovCiAgMHgwMDQ4LCAvKiClIC0gMTY1ICovCiAgMHgwMDQ4LCAvKiCmIC0gMTY2ICovCiAgMHgwMDA4LCAvKiCnIC0gMTY3ICovCiAgMHgwNDA4LCAvKiCoIC0gMTY4ICovCiAgMHgwMDA4LCAvKiCpIC0gMTY5ICovCiAgMHgwNDAwLCAvKiCqIC0gMTcwICovCiAgMHgwMDA4LCAvKiCrIC0gMTcxICovCiAgMHgwMDQ4LCAvKiCsIC0gMTcyICovCiAgMHgwNDA4LCAvKiCtIC0gMTczICovCiAgMHgwMDA4LCAvKiCuIC0gMTc0ICovCiAgMHgwNDQ4LCAvKiCvIC0gMTc1ICovCiAgMHgwMDA4LCAvKiCwIC0gMTc2ICovCiAgMHgwMDA4LCAvKiCxIC0gMTc3ICovCiAgMHgwMDAwLCAvKiCyIC0gMTc4ICovCiAgMHgwMDAwLCAvKiCzIC0gMTc5ICovCiAgMHgwNDA4LCAvKiC0IC0gMTgwICovCiAgMHgwMDA4LCAvKiC1IC0gMTgxICovCiAgMHgwMDA4LCAvKiC2IC0gMTgyICovCiAgMHgwMDA4LCAvKiC3IC0gMTgzICovCiAgMHgwNDA4LCAvKiC4IC0gMTg0ICovCiAgMHgwMDAwLCAvKiC5IC0gMTg1ICovCiAgMHgwNDAwLCAvKiC6IC0gMTg2ICovCiAgMHgwMDA4LCAvKiC7IC0gMTg3ICovCiAgMHgwMDAwLCAvKiC8IC0gMTg4ICovCiAgMHgwMDAwLCAvKiC9IC0gMTg5ICovCiAgMHgwMDAwLCAvKiC+IC0gMTkwICovCiAgMHgwMDA4LCAvKiC/IC0gMTkxICovCiAgMHg4MDAzLCAvKiDAIC0gMTkyICovCiAgMHg4MDAzLCAvKiDBIC0gMTkzICovCiAgMHg4MDAzLCAvKiDCIC0gMTk0ICovCiAgMHg4MDAzLCAvKiDDIC0gMTk1ICovCiAgMHg4MDAzLCAvKiDEIC0gMTk2ICovCiAgMHg4MDAzLCAvKiDFIC0gMTk3ICovCiAgMHg4MDAwLCAvKiDGIC0gMTk4ICovCiAgMHg4MDAzLCAvKiDHIC0gMTk5ICovCiAgMHg4MDAzLCAvKiDIIC0gMjAwICovCiAgMHg4MDAzLCAvKiDJIC0gMjAxICovCiAgMHg4MDAzLCAvKiDKIC0gMjAyICovCiAgMHg4MDAzLCAvKiDLIC0gMjAzICovCiAgMHg4MDAzLCAvKiDMIC0gMjA0ICovCiAgMHg4MDAzLCAvKiDNIC0gMjA1ICovCiAgMHg4MDAzLCAvKiDOIC0gMjA2ICovCiAgMHg4MDAzLCAvKiDPIC0gMjA3ICovCiAgMHg4MDAwLCAvKiDQIC0gMjA4ICovCiAgMHg4MDAzLCAvKiDRIC0gMjA5ICovCiAgMHg4MDAzLCAvKiDSIC0gMjEwICovCiAgMHg4MDAzLCAvKiDTIC0gMjExICovCiAgMHg4MDAzLCAvKiDUIC0gMjEyICovCiAgMHg4MDAzLCAvKiDVIC0gMjEzICovCiAgMHg4MDAzLCAvKiDWIC0gMjE0ICovCiAgMHgwMDA4LCAvKiDXIC0gMjE1ICovCiAgMHg4MDAzLCAvKiDYIC0gMjE2ICovCiAgMHg4MDAzLCAvKiDZIC0gMjE3ICovCiAgMHg4MDAzLCAvKiDaIC0gMjE4ICovCiAgMHg4MDAzLCAvKiDbIC0gMjE5ICovCiAgMHg4MDAzLCAvKiDcIC0gMjIwICovCiAgMHg4MDAzLCAvKiDdIC0gMjIxICovCiAgMHg4MDAwLCAvKiDeIC0gMjIyICovCiAgMHg4MDAwLCAvKiDfIC0gMjIzICovCiAgMHg4MDAzLCAvKiDgIC0gMjI0ICovCiAgMHg4MDAzLCAvKiDhIC0gMjI1ICovCiAgMHg4MDAzLCAvKiDiIC0gMjI2ICovCiAgMHg4MDAzLCAvKiDjIC0gMjI3ICovCiAgMHg4MDAzLCAvKiDkIC0gMjI4ICovCiAgMHg4MDAzLCAvKiDlIC0gMjI5ICovCiAgMHg4MDAwLCAvKiDmIC0gMjMwICovCiAgMHg4MDAzLCAvKiDnIC0gMjMxICovCiAgMHg4MDAzLCAvKiDoIC0gMjMyICovCiAgMHg4MDAzLCAvKiDpIC0gMjMzICovCiAgMHg4MDAzLCAvKiDqIC0gMjM0ICovCiAgMHg4MDAzLCAvKiDrIC0gMjM1ICovCiAgMHg4MDAzLCAvKiDsIC0gMjM2ICovCiAgMHg4MDAzLCAvKiDtIC0gMjM3ICovCiAgMHg4MDAzLCAvKiDuIC0gMjM4ICovCiAgMHg4MDAzLCAvKiDvIC0gMjM5ICovCiAgMHg4MDAwLCAvKiDwIC0gMjQwICovCiAgMHg4MDAzLCAvKiDxIC0gMjQxICovCiAgMHg4MDAzLCAvKiDyIC0gMjQyICovCiAgMHg4MDAzLCAvKiDzIC0gMjQzICovCiAgMHg4MDAzLCAvKiD0IC0gMjQ0ICovCiAgMHg4MDAzLCAvKiD1IC0gMjQ1ICovCiAgMHg4MDAzLCAvKiD2IC0gMjQ2ICovCiAgMHgwMDA4LCAvKiD3IC0gMjQ3ICovCiAgMHg4MDAzLCAvKiD4IC0gMjQ4ICovCiAgMHg4MDAzLCAvKiD5IC0gMjQ5ICovCiAgMHg4MDAzLCAvKiD6IC0gMjUwICovCiAgMHg4MDAzLCAvKiD7IC0gMjUxICovCiAgMHg4MDAzLCAvKiD8IC0gMjUyICovCiAgMHg4MDAzLCAvKiD9IC0gMjUzICovCiAgMHg4MDAwLCAvKiD+IC0gMjU0ICovCiAgMHg4MDAzICAvKiD/IC0gMjU1ICovCn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlMTYJW09MRTJOTFMuN10KICovCkJPT0wxNiBXSU5BUEkgR2V0U3RyaW5nVHlwZTE2KExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMTYgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTMyQQlbS0VSTkVMMzIuMzk2XQogKi8KQk9PTCBXSU5BUEkgR2V0U3RyaW5nVHlwZUEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhBKGxvY2FsZSxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlRXgzMkEJW0tFUk5FTDMyLjM5N10KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeEEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5BKHNyYykrMTsKCSAgCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUxOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV0gPSAwOwoJICAgIGlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCSAgICBpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkgICAgaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJICAgIGlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCSAgICBpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkgICAgaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJICAgIGlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KCSAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCSAgICAvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwoKCWNhc2UgQ1RfQ1RZUEUyOgoJICBmb3IgKGk9MDtpPGNjaFNyYztpKyspIAoJICB7CgkgICAgY2hhcnR5cGVbaV09KFdPUkQpQ1RfQ1R5cGUyX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMzoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPU9MRTJOTFNfQ1RfQ1R5cGUzX0xVVFtpXTsKCSAgfQoJICByZXR1cm4gVFJVRTsKCglkZWZhdWx0OgoJICBFUlJfKG9sZSkoIlVua25vd24gZHdJbmZvVHlwZTolbGRcbiIsZHdJbmZvVHlwZSk7CgkgIHJldHVybiBGQUxTRTsKCX0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0U3RyaW5nVHlwZTMyVwlbS0VSTkVMMzIuMzk5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlVyhEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLElOVCBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXhXKDAvKmRlZmF1bHRsb2NhbGUqLyxkd0luZm9UeXBlLHNyYyxjY2hTcmMsY2hhcnR5cGUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRTdHJpbmdUeXBlRXgzMlcJW0tFUk5FTDMyLjM5OF0KICoKICogRklYTUU6IHVuaWNvZGUgY2hhcnMgYXJlIGFzc3VtZWQgY2hhcnMKICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeFcoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPWxzdHJsZW5XKHNyYykrMTsKCQoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMjoKCQlGSVhNRV8ob2xlKSgiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRV8ob2xlKSgiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJZm9yIChpPTA7aTxjY2hTcmM7aSsrKSB7CgkJY2hhcnR5cGVbaV0gPSAwOwoJCWlmIChpc2RpZ2l0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9ESUdJVDsKCQlpZiAoaXNhbHBoYShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQUxQSEE7CgkJaWYgKGlzbG93ZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0xPV0VSOwoJCWlmIChpc3VwcGVyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9VUFBFUjsKCQlpZiAoaXNzcGFjZShzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfU1BBQ0U7CgkJaWYgKGlzcHVuY3Qoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1BVTkNUOwoJCWlmIChpc2NudHJsKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9DTlRSTDsKLyogRklYTUU6IGlzYmxhbmsoKSBpcyBhIEdOVSBleHRlbnNpb24gKi8KLyoJCWlmIChpc2JsYW5rKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsgKi8KICAgICAgICAgICAgICAgIGlmICgoc3JjW2ldID09ICcgJykgfHwgKHNyY1tpXSA9PSAnXHQnKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOwoJCS8qIEMxX1hESUdJVCAqLwoJfQoJcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBXSU5FX0dldExhbmd1YWdlTmFtZSAgIFtpbnRlcm5hbF0gCiAqLwpzdGF0aWMgTFBDU1RSIFdJTkVfR2V0TGFuZ3VhZ2VOYW1lKCBVSU5UIGxhbmdpZCApCnsKICAgIGludCBpOwogICAgZm9yICggaSA9IDA7IGxhbmd1YWdlc1tpXS5sYW5naWQgIT0gMDsgaSsrICkKICAgICAgICBpZiAoIGxhbmdpZCA9PSBsYW5ndWFnZXNbaV0ubGFuZ2lkICkKICAgICAgICAgICAgYnJlYWs7CgogICAgcmV0dXJuIGxhbmd1YWdlc1tpXS5sYW5nbmFtZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuNzA5XVtWRVJTSU9OLjldCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lQSggVUlOVCB3TGFuZywgTFBTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgY2hhciAgICBidWZmZXJbODBdOwogICAgTFBDU1RSICBuYW1lOwogICAgRFdPUkQgICByZXN1bHQ7CgogICAgLyoKICAgICAqIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgogICAgICogZnJvbSB0aGUgcmVnaXN0cnkuCiAgICAgKi8KCiAgICBzcHJpbnRmKCBidWZmZXIsCiAgICAgICAgICAgICAiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCiAgICAgICAgICAgICB3TGFuZyApOwoKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVBKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGJ1ZmZlciwgc3pMYW5nLCAoTFBEV09SRCkmblNpemUgKTsKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkEoIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi43MTBdW1ZFUlNJT04uMTBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGNoYXIgICAgYnVmZmVyWzgwXTsKICAgIExQV1NUUiAga2V5bmFtZTsKICAgIExQQ1NUUiAgbmFtZTsKICAgIERXT1JEICAgcmVzdWx0OwoKICAgIC8qCiAgICAgKiBGaXJzdCwgY2hlY2sgXFN5c3RlbVxDdXJyZW50Q29udHJvbFNldFxjb250cm9sXE5sc1xMb2NhbGVcPGxhbmdpZD4KICAgICAqIGZyb20gdGhlIHJlZ2lzdHJ5LgogICAgICovCgogICAgc3ByaW50ZiggYnVmZmVyLAogICAgICAgICAgICAgIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCUwOHgiLAogICAgICAgICAgICAgd0xhbmcgKTsKCiAgICBrZXluYW1lID0gSEVBUF9zdHJkdXBBdG9XKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXIgKTsKICAgIHJlc3VsdCA9IFJlZ1F1ZXJ5VmFsdWVXKCBIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIHN6TGFuZywgKExQRFdPUkQpJm5TaXplICk7CiAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwga2V5bmFtZSApOwoKICAgIGlmICggcmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MgfHwgcmVzdWx0ID09IEVSUk9SX01PUkVfREFUQSApCiAgICAgICAgcmV0dXJuIG5TaXplOwoKICAgIC8qCiAgICAgKiBJZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlCiAgICAgKi8KCiAgICBuYW1lID0gV0lORV9HZXRMYW5ndWFnZU5hbWUoIHdMYW5nICk7CiAgICBsc3RyY3B5bkF0b1coIHN6TGFuZywgbmFtZSwgblNpemUgKTsKICAgIHJldHVybiBsc3RybGVuQSggbmFtZSApOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmczMkEuICBDaGFyYWN0ZXJzIAogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNTeW1ib2wodW5zaWduZWQgY2hhciBjKSAKewogIC8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBMQ01hcFN0cmluZzMyQS4gIENoYXJhY3RlcnMgCiAgICAgZm9yIHdoaWNoIGl0IHJldHVybnMgdHJ1ZSBhcmUgaWdub3JlZCB3aGVuIG1hcHBpbmcgYQogICAgIHN0cmluZyB3aXRoIE5PUk1fSUdOT1JFU1lNQk9MUyAqLwogIHJldHVybiAoIChjIT0wKSAmJiAhSXNDaGFyQWxwaGFOdW1lcmljQShjKSApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlpZGVudGl0eQlbSW50ZXJuYWxdCiAqLwpzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQp7CiAgcmV0dXJuIGM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBMQ01hcFN0cmluZzMyQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmczMkEsCiAqICAgIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBmb3IgdGhpcyBmbGFnLgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ0EoCglMQ0lEIGxjaWQgLyogbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOyAKCQkgICAgIExPQ0FMRV9TWVNURU1fREVGQVVMVCBhbmQgTE9DQUxFX1VTRVJfREVGQVVMVCBhcmUgCiAgICAgICAgICAgICAgICAgICAgIHByZWRlZmluZWQgdmFsdWVzLiAqLywKCURXT1JEIG1hcGZsYWdzIC8qIGZsYWdzICovLAoJTFBDU1RSIHNyY3N0ciAgLyogc291cmNlIGJ1ZmZlciAqLywKCUlOVCBzcmNsZW4gICAvKiBzb3VyY2UgbGVuZ3RoICovLAoJTFBTVFIgZHN0c3RyICAgLyogZGVzdGluYXRpb24gYnVmZmVyICovLAoJSU5UIGRzdGxlbiAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8pIAp7CiAgaW50IGk7CgogIFRSQUNFXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlJfKG9sZSkoIihzcmM9JXMsZGVzdD0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbiA9PSAtMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuQShzcmNzdHIpICsgMSA7ICAgIC8qIChpbmNsdWRlIGZpbmFsICdcMCcpICovCgojZGVmaW5lIExDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MgKExDTUFQX1VQUEVSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9MT1dFUkNBU0UgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTENNQVBfU09SVEtFWSAgICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1JNX0lHTk9SRU5PTlNQQUNFIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09SVF9TVFJJTkdTT1JUICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFV0lEVEgpCgogIGlmIChtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTKQogIHsKICAgIEZJWE1FXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCSAgbGNpZCwKCSAgbWFwZmxhZ3MsCgkgIHNyY3N0ciwKCSAgc3JjbGVuLAoJICBkc3RzdHIsCgkgIGRzdGxlbiwKCSAgbWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUwogICAgICk7CiAgfQoKICBpZiAoICEobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSApCiAgewogICAgaW50IGksajsKICAgIGludCAoKmYpKGludCkgPSBpZGVudGl0eTsgCiAgICBpbnQgZmxhZ19pZ25vcmVub25zcGFjZSA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRTsKICAgIGludCBmbGFnX2lnbm9yZXN5bWJvbHMgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFU1lNQk9MUzsKCiAgICBpZiAoZmxhZ19pZ25vcmVub25zcGFjZSB8fCBmbGFnX2lnbm9yZXN5bWJvbHMpCiAgICB7CiAgICAgIC8qIEZvciBzb21lIHZhbHVlcyBvZiBtYXBmbGFncywgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIAoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOyAgCiAgICAgIGlmIChkc3RsZW48c3JjbGVuKSAKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIGVsc2UgLi4uIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICAqLwogIHsKICAgIGludCB1bmljb2RlX2xlbj0wOwogICAgaW50IGNhc2VfbGVuPTA7CiAgICBpbnQgZGlhY3JpdGljX2xlbj0wOwogICAgaW50IGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBjaGFyICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudDsKICAgIGludCByb29tLGNvdW50OwogICAgaW50IGZsYWdfc3RyaW5nc29ydCA9IG1hcGZsYWdzICYgU09SVF9TVFJJTkdTT1JUOwoKICAgIC8qIGNvbXB1dGUgaG93IG11Y2ggcm9vbSB3ZSB3aWxsIG5lZWQgKi8KICAgIGZvciAoaT0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgaW50IG9mczsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhciA9IHNyY3N0cltpXTsKICAgICAgaWYgKHNvdXJjZV9jaGFyIT0nXDAnKSAKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0JICAKICAgICAgfQoJICAKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47IAoKICAgICAgb2ZzID0gc291cmNlX2NoYXIgLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBOT1JNX0lHTk9SRUNBU0UpCiAgICAgIGNhc2VfbGVuPTA7ICAgICAgICAgICAgICAgICAgIAogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRSkKICAgICAgZGlhY3JpdGljX2xlbj0wOwoKICAgIHJvb20gPSAgMiAqIHVuaWNvZGVfbGVuICAgICAgICAgICAgICAvKiAidW5pY29kZSIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGRpYWNyaXRpY19sZW4gICAgICAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgICAgICAgLyogImNhc2UiIGNvbXBvbmVudCAqLwogICAgICArICAgICA0ICogZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4gIC8qIHB1bmN0dWF0aW9uIGluIHdvcmQgc29ydCBtb2RlICovCiAgICAgICsgICAgIDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hbCAnXDAnICovCiAgICBpZiAoZHN0bGVuPT0wKQogICAgICByZXR1cm4gcm9vbTsgICAgICAKICAgIGVsc2UgaWYgKGRzdGxlbjxyb29tKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSXyhzdHJpbmcpKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBjYXNlX2NvbXBvbmVudCA9IGRpYWNyaXRpY19jb21wb25lbnQgKyBkaWFjcml0aWNfbGVuIDsKICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCA9IGNhc2VfY29tcG9uZW50ICsgY2FzZV9sZW4gOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWludCB0eXBlLGxvbmdjb2RlOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIE9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpIAoJewoJICBVSU5UMTYgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi40OTNdCiAqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogTk9URQogKgogKiBTZWUgTENNYXBTdHJpbmczMkEgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKIAogIFRSQUNFXyhzdHJpbmcpKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuKTsKCiAgaWYgKCAoKGRzdGxlbiE9MCkgJiYgKGRzdHN0cj09TlVMTCkpIHx8IChzcmNzdHI9PU5VTEwpICkKICB7CiAgICBFUlJfKG9sZSkoIihzcmM9JXAsZHN0PSVwKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwgc3Jjc3RyLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuVyhzcmNzdHIpKzE7CiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgRklYTUVfKHN0cmluZykoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgICByZXR1cm4gMDsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAKICAgIGlmIChkc3RsZW48c3JjbGVuKSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nMTYgICAgICAgKE9MRTJOTFMuOCkKICovClVJTlQxNiBXSU5BUEkgQ29tcGFyZVN0cmluZzE2KERXT1JEIGxjaWQsRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1NUUiBzMSxEV09SRCBsMSxMUENTVFIgczIsRFdPUkQgbDIpCnsKCXJldHVybiAoVUlOVDE2KUNvbXBhcmVTdHJpbmdBKGxjaWQsZmR3U3R5bGUsczEsbDEsczIsbDIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nMzJBCVtLRVJORUwzMi4xNDNdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqIAogKiBCVUdTCiAqCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqCiAqIEZJWE1FCiAqIAogKiBRdWl0ZSBpbmVmZmljaWVudC4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgRFdPUkQgbGNpZCwgICAgIC8qIGxvY2FsZSBJRCAqLwogICAgRFdPUkQgZmR3U3R5bGUsIC8qIGNvbXBhcmlzb24tc3R5bGUgb3B0aW9ucyAqLwogICAgTFBDU1RSIHMxLCAgICAgIC8qIGZpcnN0IHN0cmluZyAqLwogICAgRFdPUkQgbDEsICAgICAgIC8qIGxlbmd0aCBvZiBmaXJzdCBzdHJpbmcgKi8KICAgIExQQ1NUUiBzMiwgICAgICAvKiBzZWNvbmQgc3RyaW5nICovCiAgICBEV09SRCBsMikgICAgICAgLyogbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0VfKG9sZSkoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2EgKHMxKSwgZGVidWdzdHJfYSAoczIpKTsKCiAgaWYgKCAoczE9PU5VTEwpIHx8IChzMj09TlVMTCkgKQogIHsgICAgCiAgICBFUlJfKG9sZSkoIihzMT0lcyxzMj0lcyk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHMxLCBzMik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQoKICBpZihmZHdTdHlsZSAmIE5PUk1fSUdOT1JFU1lNQk9MUykKICAgIEZJWE1FXyhvbGUpKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwogIAkKICBtYXBzdHJpbmdfZmxhZ3MgPSBMQ01BUF9TT1JUS0VZIHwgZmR3U3R5bGUgOwogIGxlbjEgPSBMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsTlVMTCwwKTsKICBsZW4yID0gTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLE5VTEwsMCk7CgogIGlmICgobGVuMT09MCl8fChsZW4yPT0wKSkKICAgIHJldHVybiAwOyAgICAgLyogc29tZXRoaW5nIHdyb25nIGhhcHBlbmVkICovCgogIHNrMSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjEpOwogIHNrMiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbjIpOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUl8ob2xlKSgiQnVnIGluIExDbWFwU3RyaW5nMzJBLlxuIik7CiAgICByZXN1bHQgPSAwOwogIH0KICBlbHNlCiAgewogICAgLyogc3RyY21wIGRvZXNuJ3QgbmVjZXNzYXJpbHkgcmV0dXJuIC0xLCAwLCBvciAxICovCiAgICByZXN1bHQgPSBzdHJjbXAoc2sxLHNrMik7CiAgfQogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazEpOwogIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzazIpOwoKICBpZiAocmVzdWx0IDwgMCkKICAgIHJldHVybiAxOwogIGlmIChyZXN1bHQgPT0gMCkKICAgIHJldHVybiAyOwoKICAvKiBtdXN0IGJlIGdyZWF0ZXIsIGlmIHdlIHJlYWNoIHRoaXMgcG9pbnQgKi8KICByZXR1cm4gMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZzMyVwlbS0VSTkVMMzIuMTQ0XQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZzMyQS4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgczEsIERXT1JEIGwxLCBMUENXU1RSIHMyLERXT1JEIGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCQlGSVhNRV8ob2xlKSgiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FXyhvbGUpKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9sc3RybGVuVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW5XKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KCQlDUlRETExfX3djc25pY21wKHMxLHMyLGxlbikgOiBDUlRETExfd2NzbmNtcChzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApIHJldHVybiByZXQrMjsKCS8qIHNhbWUgbGVuLCByZXR1cm4gMiAqLwoJaWYobDE9PWwyKSByZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICBSZWdpc3Rlck5MU0luZm9DaGFuZ2VkICBbT0xFMk5MUy4xMF0KICovCkJPT0wxNiBXSU5BUEkgUmVnaXN0ZXJOTFNJbmZvQ2hhbmdlZDE2KExQVk9JRC8qRklYTUUqLyBscE5ld05MU0luZm8pCnsKCUZJWE1FXyhvbGUpKCJGdWxseSBpbXBsZW1lbnRlZCwgYnV0IGRvZXNuJ3QgZWZmZWN0IGFueXRoaW5nLlxuIik7CgoJaWYgKCFscE5ld05MU0luZm8pCgl7CgkJbHBOTFNJbmZvID0gTlVMTDsKCQlyZXR1cm4gVFJVRTsKCX0KCWVsc2UKCXsKCQlpZiAoIWxwTkxTSW5mbykKCQl7CgkJCWxwTkxTSW5mbyA9IGxwTmV3TkxTSW5mbzsKCQkJcmV0dXJuIFRSVUU7CgkJfQoJfQoKCXJldHVybiBGQUxTRTsgLyogcHRyIG5vdCBzZXQgKi8KfSAKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRV9HZXRGb3JtYXRBCVtJbnRlcm5hbF0KICoKICogRklYTUUKICogICAgSWYgZGF0ZWxlbiA9PSAwLCBpdCBzaG91bGQgcmV0dXJuIHRoZSByZWd1aXJlZCBzdHJpbmcgbGVuZ3RoLgogKgogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHN0dWZmIGZvciBHZXREYXRlRm9ybWF0KCkgYW5kIAogR2V0VGltZUZvcm1hdCgpLgoKICBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAgZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAgZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAgTU1NICBzaG9ydCBtb250aCBuYW1lCiAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKICB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICB5eSAgIHR3by1kaWdpdCB5ZWFyCiAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKICBnZyAgIGVyYSBzdHJpbmcKICBoICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogIGhoICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBIICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogIEhIICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBtICAgIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBtbSAgIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBzICAgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBzcyAgIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICB0ICAgIHRpbWUgbWFya2VyIChBIG9yIFApCiAgdHQgICB0aW1lIG1hcmtlciAoQU0sIFBNKQogICcnICAgdXNlZCB0byBxdW90ZSBsaXRlcmFsIGNoYXJhY3RlcnMKICAnJyAgICh3aXRoaW4gYSBxdW90ZWQgc3RyaW5nKSBpbmRpY2F0ZXMgYSBsaXRlcmFsICcKCiBUaGVzZSBmdW5jdGlvbnMgUkVRVUlSRSB2YWxpZCBsb2NhbGUsIGRhdGUsICBhbmQgZm9ybWF0LiAKICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdEEoTENJRCBsb2NhbGUsCgkJCSAgICBEV09SRCBmbGFncywKCQkJICAgIERXT1JEIHRmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1NUUiBfZm9ybWF0LCAJLyppbiovCgkJCSAgICBMUFNUUiBkYXRlLAkJLypvdXQqLwoJCQkgICAgSU5UIGRhdGVsZW4pCnsKICAgSU5UIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgY2hhciBmb3JtYXRbNDBdOwogICBjaGFyICogcG9zOwogICBpbnQgYnVmbGVuOwoKICAgY29uc3QgY2hhciAqIF9kZ2ZtdFtdID0geyAiJWQiLCAiJTAyZCIgfTsKICAgY29uc3QgY2hhciAqKiBkZ2ZtdCA9IF9kZ2ZtdCAtIDE7IAoKICAgLyogcmVwb3J0LCBmb3IgZGVidWdnaW5nICovCiAgIFRSQUNFXyhvbGUpKCIoMHglbHgsMHglbHgsIDB4JWx4LCB0aW1lKGQ9JWQsaD0lZCxtPSVkLHM9JWQpLCBmbXQ9JXAgXCclc1wnICwgJXAsIGxlbj0lZClcbiIsCiAgIAkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBfZm9ybWF0LCBfZm9ybWF0LCBkYXRlLCBkYXRlbGVuKTsKICAKICAgaWYoZGF0ZWxlbiA9PSAwKSB7CiAgICAgRklYTUVfKG9sZSkoImRhdGVsZW4gPSAwLCByZXR1cm5pbmcgMjU1XG4iKTsKICAgICByZXR1cm4gMjU1OwogICB9CgogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CiAgICAgIAogICBzdHJjcHkoZm9ybWF0LF9mb3JtYXQpOwoKICAgLyogYWx0ZXIgdGhlIGZvcm1hdHN0cmluZywgd2hpbGUgaXQgd29ya3MgZm9yIGFsbCBsYW5ndWFnZXMgbm93IGluIHdpbmUKICAgaXRzIHBvc3NpYmxlIHRoYXQgaXQgZmFpbHMgd2hlbiB0aGUgdGltZSBsb29rcyBsaWtlIHNzOm1tOmhoIGFzIGV4YW1wbGUqLyAgIAogICBpZiAodGZsYWdzICYgKFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjptbSIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIGlmICh0ZmxhZ3MgJiAoVElNRV9OT1NFQ09ORFMpKQogICB7IGlmICgocG9zID0gc3Ryc3RyICggZm9ybWF0LCAiOnNzIikpKQogICAgIHsgbWVtY3B5ICggcG9zLCBwb3MrMywgc3RybGVuKGZvcm1hdCktKHBvcy1mb3JtYXQpLTIgKTsKICAgICB9CiAgIH0KICAgCiAgIGZvciAoaW5wb3MgPSAwOzsgaW5wb3MrKykgewogICAgICAvKiBUUkFDRShvbGUsICJTVEFURSBpbnBvcz0lMmQgb3V0cG9zPSUyZCBjb3VudD0lZCBpbnF1b3RlPSVkIHR5cGU9JWMgYnVmLGRhdGUgPSAlYywlY1xuIiwgaW5wb3MsIG91dHBvcywgY291bnQsIGlucXVvdGUsIHR5cGUsIGJ1ZltpbnBvc10sIGRhdGVbb3V0cG9zXSk7ICovCiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zICs9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7IC8qIHdlIGRpZCBub3RoaW5nIHRvIHRoZSBvdXRwdXQgKi8KCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICBkYXRlW291dHBvcysrXSA9ICdcMCc7CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsKCSB9IGVsc2UgewoJICAgIGRhdGVbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBkYXRlW291dHBvcy0xXSA9ICdcMCc7IC8qIHRoaXMgaXMgdGhlIGxhc3QgcGxhY2Ugd2hlcmUKCQkJCQkgaXQncyBzYWZlIHRvIHdyaXRlICovCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCBjb3VudCA9PSA0CgkJICAgfHwgKGNvdW50ID09IDIgJiYgc3RyY2hyKCJnaEhtc3QiLCB0eXBlKSkgKQogICAgICAgewoJICAgIGlmICAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU0RBWU5BTUUxCgkJCQkgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCQkgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJCSAgICBMT0NBTEVfU0FCQlJFVkRBWU5BTUUxIAoJCQkJCSAgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCQkgICAgYnVmLCBzaXplb2YoYnVmKSk7CgkJICAgICAgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53RGF5KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgICAgIGlmIChjb3VudCA9PSAzKSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIAoJCQkJICAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxCgkJCQkgICArIHh0aW1lLT53TW9udGggLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSA0KSB7CgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk5fKG9sZSkoInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUVfKG9sZSkoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wLlxuIik7CgkJICBzdHJjcHkoYnVmLCAiQUQiKTsKCSAgICB9IGVsc2UgewoJCSAgc3RyY3B5KGJ1ZiwgImciKTsKCQkgIFdBUk5fKG9sZSkoInVua25vd24gZm9ybWF0LCBjPSVjLCBuPSVkXG4iLCB0eXBlLCBjb3VudCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAgICAvKiBnaXZlcyB1cyBob3VycyAxOjAwIC0tIDEyOjAwICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgICAgIC8qIDI0LWhvdXIgdGltZSAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53SG91cik7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICggdHlwZSA9PSAncycpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1NlY29uZCk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMSkgewoJCSAgc3ByaW50ZihidWYsICIlYyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAnQScgOiAnUCcpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMikgewoJCSAgLyogc3ByaW50ZihidWYsICIlcyIsICh4dGltZS0+d0hvdXIgPCAxMikgPyAiQU0iIDogIlBNIik7ICovCgkJICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsCgkJCQkgICAoeHRpbWUtPndIb3VyPDEyKSAKCQkJCSAgID8gTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfQoJICAgIH07CgoJICAgIC8qIHdlIG5lZWQgdG8gY2hlY2sgdGhlIG5leHQgY2hhciBpbiB0aGUgZm9ybWF0IHN0cmluZyAKCSAgICAgICBhZ2Fpbiwgbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQgKi8KCSAgICBpbnBvcy0tOwoJICAgIAoJICAgIC8qIGFkZCB0aGUgY29udGVudHMgb2YgYnVmIHRvIHRoZSBvdXRwdXQgKi8KCSAgICBidWZsZW4gPSBzdHJsZW4oYnVmKTsKCSAgICBpZiAob3V0cG9zICsgYnVmbGVuIDwgZGF0ZWxlbikgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7IC8qIGZvciBzdHJjYXQgdG8gaG9vayBvbnRvICovCgkJIHN0cmNhdChkYXRlLCBidWYpOwoJICAgICAgIG91dHBvcyArPSBidWZsZW47CgkgICAgfSBlbHNlIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOwoJICAgICAgIHN0cm5jYXQoZGF0ZSwgYnVmLCBkYXRlbGVuIC0gb3V0cG9zKTsKCQkgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwoJCSBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CgkgICAgICAgV0FSTl8ob2xlKSgiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFXyhvbGUpKCJPTEVfR2V0Rm9ybWF0QSByZXR1cm5zIHN0cmluZyAnJXMnLCBsZW4gJWRcbiIsCgkgICAgICAgZGF0ZSwgb3V0cG9zKTsKICAgcmV0dXJuIG91dHBvczsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEVfR2V0Rm9ybWF0VyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICBMUFdTVFIgb3V0cHV0LCBJTlQgb3V0bGVuKQp7CiAgIElOVCAgIGlucG9zLCBvdXRwb3M7CiAgIGludCAgICAgY291bnQsIHR5cGU9MCwgaW5xdW90ZTsKICAgaW50ICAgICBPdmVyZmxvdzsgLyogbG9vcCBjaGVjayAqLwogICBXQ0hBUiAgIGJ1Zls0MF07CiAgIGludCAgICAgYnVmbGVuPTA7CiAgIFdDSEFSICAgYXJnMFtdID0gezB9LCBhcmcxW10gPSB7JyUnLCdkJywwfTsKICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICBXQ0hBUiAgKmFyZ2FyclszXTsKICAgaW50ICAgICBkYXRldmFycz0wLCB0aW1ldmFycz0wOwoKICAgYXJnYXJyWzBdID0gYXJnMDsKICAgYXJnYXJyWzFdID0gYXJnMTsKICAgYXJnYXJyWzJdID0gYXJnMjsKCiAgIC8qIG1ha2UgYSBkZWJ1ZyByZXBvcnQgKi8KICAgVFJBQ0VfKG9sZSkoImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDolcyAoYXQgJXApLCAiCiAgIAkgICAgICAiJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZGVidWdzdHJfdyhmb3JtYXQpLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKICAgCiAgIGlmKG91dGxlbiA9PSAwKSB7CiAgICAgRklYTUVfKG9sZSkoIm91dGxlbiA9IDAsIHJldHVybmluZyAyNTVcbiIpOwogICAgIHJldHVybiAyNTU7CiAgIH0KCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CiAgIAogICAvKiB0aGlzIGxvb3AgaXMgdGhlIGNvcmUgb2YgdGhlIGZ1bmN0aW9uICovCiAgIGZvciAoaW5wb3MgPSAwOyAvKiB3ZSBoYXZlIHNldmVyYWwgYnJlYWsgcG9pbnRzICovIDsgaW5wb3MrKykgewogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09IChXQ0hBUikgJ1wnJykgewoJICAgIGlmIChmb3JtYXRbaW5wb3MrMV0gPT0gJ1wnJykgewoJICAgICAgIGlucG9zKys7CgkgICAgICAgb3V0cHV0W291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsKCSAgICB9CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gMDsKCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7ICAvKiAgbm9ybWFsIGV4aXQgKHdpdGhpbiBhIHF1b3RlKSAqLwoJIH0gZWxzZSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107IC8qIGNvcHkgaW5wdXQgKi8KCSAgICBpZiAob3V0cG9zID4gb3V0bGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIG91dHB1dFtvdXRwb3MtMV0gPSAwOyAKCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8ICggKGNvdW50PT00ICYmIHR5cGUgPT0neScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J00nKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdkJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nZycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdIJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nbScpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3MnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSd0JykgKSAgKSB7CgkgaWYgICAgICAgICh0eXBlID09ICdkJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQl4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJCWJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIHh0aW1lLT53RGF5ICk7CgkgICAgfTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSA0KSB7CgkgICAgICAgd3NucHJpbnRmVyhidWYsIDYsIGFyZ2FyclsxXSAvKiAiJWQiICovLAoJCQkgeHRpbWUtPndZZWFyKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAieXl5IiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNiwgYXJnYXJyW2NvdW50XSwKCQkJICAgIHh0aW1lLT53WWVhciAlIDEwMCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnZycpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCSAgICAgICBGSVhNRV8ob2xlKSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXBsZW1lbnRlZFxuIik7CgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgIkFEIiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICAvKiBXaW4gQVBJIHNleiB3ZSBjb3B5IGl0IHZlcmJhdGltICovCgkgICAgICAgbHN0cmNweW5BdG9XKGJ1ZiwgImciLCA1KTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgIC8qIGhvdXJzIDE6MDAtMTI6MDAgLS0tIGlzIHRoaXMgcmlnaHQ/ICovCgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCAKCQkJIHh0aW1lLT53SG91cik7CgkgfSBlbHNlIGlmICh0eXBlID09ICdtJyApIHsKCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53TWludXRlKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnICkgewoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndTZWNvbmQpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAndCcpIHsKCSAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9Cn0KCgkgLyogbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQsICB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgbmV4dCAKCSAgICBjaGFyYWN0ZXIgdGhlIG5leHQgdGltZSB3ZSBsb29wIHRocm91Z2ggKi8KCSBpbnBvcy0tOwoKCSAvKiBjYXQgYnVmIG9udG8gdGhlIG91dHB1dCAqLwoJIG91dGxlbiA9IGxzdHJsZW5XKGJ1Zik7CgkgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewogICAgICAgICAgICBsc3RyY3B5Vyggb3V0cHV0ICsgb3V0cG9zLCBidWYgKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOXyhvbGUpKCIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgVFJBQ0VfKG9sZSkoIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0MzJBCVtLRVJORUwzMi4zMTBdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBUaGlzIGZ1bmN0aW9uIHVzZXMgZm9ybWF0IHRvIGZvcm1hdCB0aGUgZGF0ZSwgIG9yLCAgaWYgZm9ybWF0CiAqIGlzIE5VTEwsIHVzZXMgdGhlIGRlZmF1bHQgZm9yIHRoZSBsb2NhbGUuICBmb3JtYXQgaXMgYSBzdHJpbmcKICogb2YgbGl0ZXJhbCBmaWVsZHMgYW5kIGNoYXJhY3RlcnMgYXMgZm9sbG93czoKICoKICogLSBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogKiAtIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAqIC0gZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAqIC0gZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICogLSBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogKiAtIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAqIC0gTU1NICBzaG9ydCBtb250aCBuYW1lCiAqIC0gTU1NTSBmdWxsIG1vbnRoIG5hbWUKICogLSB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICogLSB5eSAgIHR3by1kaWdpdCB5ZWFyCiAqIC0geXl5eSBmb3VyLWRpZ2l0IHllYXIKICogLSBnZyAgIGVyYSBzdHJpbmcKICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQgZGF0ZWxlbikgCnsKICAgCiAgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZTsKICBJTlQgcmV0OwoKICBUUkFDRV8ob2xlKSgiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7CiAgCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIHsKICAgICB0aGlzbG9jYWxlID0gbG9jYWxlOwogICB9OwoKICBpZiAoeHRpbWUgPT0gTlVMTCkgewogICAgIEdldFN5c3RlbVRpbWUoJnQpOwogICAgIHRoaXN0aW1lID0gJnQ7CiAgfSBlbHNlIHsKICAgICB0aGlzdGltZSA9IHh0aW1lOwogIH07CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm9BKHRoaXNsb2NhbGUsICgoZmxhZ3MmREFURV9MT05HREFURSkgCgkJCQkgICA/IExPQ0FMRV9TTE9OR0RBVEUKCQkJCSAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfSBlbHNlIHsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH07CgogIAogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIGZsYWdzLCAwLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwgCgkJICAgICAgIGRhdGUsIGRhdGVsZW4pOwogIAoKICAgVFJBQ0VfKG9sZSkoCgkgICAgICAgIkdldERhdGVGb3JtYXQzMkEoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgICAgICByZXQsIGRhdGUpOwogIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXQzMlcJW0tFUk5FTDMyLjMxMV0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXQzMkEoKSwgIGV4Y2VwdCB0aGF0IGl0J3MgVW5pY29kZS4KICogQWNjZXB0cyAmIHJldHVybnMgc2l6ZXMgYXMgY291bnRzIG9mIFVuaWNvZGUgY2hhcmFjdGVycy4KICoKICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdFcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICB1bnNpZ25lZCBzaG9ydCBkYXRlYXJyW10gPSB7JzEnLCc5JywnOScsJzQnLCctJywnMScsJy0nLCcxJywwfTsKCiAgIEZJWE1FXyhvbGUpKCJTVFVCIChzaG91bGQgY2FsbCBPTEVfR2V0Rm9ybWF0VylcbiIpOyAgIAogICBsc3RyY3B5blcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyQQkoS0VSTkVMMzIuMTk4KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzQSgKICBEQVRFRk1UX0VOVU1QUk9DQSBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsICBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUVfKG9sZSkoIk9ubHkgVVMgRW5nbGlzaCBzdXBwb3J0ZWRcbiIpOwoKICBpZighbHBEYXRlRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FXyhvbGUpKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0czMyVwkoS0VSTkVMMzIuMTk5KQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVygKICBEQVRFRk1UX0VOVU1QUk9DVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiKCVwLCAlbGQsICVsZCk6IHN0dWJcbiIsIGxwRGF0ZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0czMyQQkoS0VSTkVMMzIuMjEwKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzQSgKICBUSU1FRk1UX0VOVU1QUk9DQSBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRV8ob2xlKSgiT25seSBVUyBFbmdsaXNoIHN1cHBvcnRlZFxuIik7CgogIGlmKCFscFRpbWVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRV8ob2xlKSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAogICAgfQogIAogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwoKICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHMzMlcJKEtFUk5FTDMyLjIxMSkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUVfKG9sZSkoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0MzJBCShLRVJORUwzMi4zNTUpCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBOVU1CRVJGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogRklYTUVfKGZpbGUpKCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixscHZhbHVlKTsKCiBsc3RyY3B5bkEoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IGxzdHJsZW5BKCBscE51bWJlclN0ciApIDogMDsKfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdDMyVwkoS0VSTkVMMzIueHh4KQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgY29uc3QgTlVNQkVSRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiBGSVhNRV8oZmlsZSkoIiVzOiBzdHViLCBubyByZWZvcm1hdGluZyBkb25lXG4iLGRlYnVnc3RyX3cobHB2YWx1ZSkpOwoKIGxzdHJjcHluVyggbHBOdW1iZXJTdHIsIGxwdmFsdWUsIGNjaE51bWJlciApOwogcmV0dXJuIGNjaE51bWJlcj8gbHN0cmxlblcoIGxwTnVtYmVyU3RyICkgOiAwOwp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRTJOTFNfQ2hlY2tMb2NhbGUJW2ludGVybl0KICovIApzdGF0aWMgTENJRCBPTEUyTkxTX0NoZWNrTG9jYWxlIChMQ0lEIGxvY2FsZSkKewoJaWYgKCFsb2NhbGUpIAoJeyBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7Cgl9CiAgCglpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgCiAgCXsgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIAoJeyByZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cgl9CgllbHNlCgl7IHJldHVybiBsb2NhbGU7Cgl9Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdDMyQQlbS0VSTkVMMzIuNDIyXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIHRpbWUKICoKICogRm9ybWF0cyBkYXRlIGFjY29yZGluZyB0byBmb3JtYXQsICBvciBsb2NhbGUgZGVmYXVsdCBpZiBmb3JtYXQgaXMKICogTlVMTC4gVGhlIGZvcm1hdCBjb25zaXN0cyBvZiBsaXRlcmFsIGNoYXJhY3RlcnMgYW5kIGZpZWxkcyBhcyBmb2xsb3dzOgogKgogKiBoICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICogaGggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogSCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAqIEhIIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIG0gIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogbW0gbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBzICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIHNzIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogdCAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICogdHQgdGltZSBtYXJrZXIgKEFNLCBQTSkKICoKICovCklOVCBXSU5BUEkgCkdldFRpbWVGb3JtYXRBKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENTVFIgZm9ybWF0LCAgICAgIC8qIGluICAqLwoJCSBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIG91dCAqLwoJCSBJTlQgdGltZWxlbiAgICAgICAvKiBpbiAgKi8pIAp7IGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU9MDsKICBEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFydCB0aW1lZm9ybWF0ICovCiAgSU5UIHJldDsKICAgIAogIFRSQUNFXyhvbGUpKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCx0aW1lc3RyLHRpbWVsZW4pOwoKICB0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKICBpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQogIHsgRklYTUVfKG9sZSkoIlRJTUVfTk9USU1FTUFSS0VSIG9yIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQgbm90IGltcGxlbWVudGVkXG4iKTsKICB9CiAgCiAgZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgogIGlmIChmb3JtYXQgPT0gTlVMTCkgCiAgeyBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKnVzZSBzeXN0ZW0gZGVmYXVsdCovCiAgICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfQogICAgR2V0TG9jYWxlSW5mb0EodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgdGhpc2Zvcm1hdCA9IGZvcm1hdF9idWY7CiAgfQogIGVsc2UgCiAgeyB0aGlzZm9ybWF0ID0gZm9ybWF0OwogIH0KICAKICBpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSovCiAgeyBHZXRMb2NhbFRpbWUoJnQpOwogICAgdGhpc3RpbWUgPSAmdDsKICB9IAogIGVsc2UKICB7IHRoaXN0aW1lID0geHRpbWU7CiAgfQogIHJldCA9IE9MRV9HZXRGb3JtYXRBKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKICByZXR1cm4gcmV0Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0VGltZUZvcm1hdDMyVwlbS0VSTkVMMzIuNDIzXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0VyhMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBpbiAgKi8KCQkgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCUxQU1lTVEVNVElNRSB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwoJSU5UIHJldDsKCSAgICAKCVRSQUNFXyhvbGUpKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQoJeyBGSVhNRV8ob2xlKSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJfQogIAoJZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FXyhvbGUpKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=